I keep going back and forth on which language to use. I know it doesn't really matter, but I'm trying to make the best use of my time by learning something that is also in high demand in the job market.
I have experience with Java, so on one hand my thought is that the demand for Java continues to lead the pack, so I'll use that and learn Spring framework since that seems to also be in demand. Then I'll read something about how Spring is overkill for a lot of projects and how good Django is for rapid development. I know the majority of the advice out there is "just pick something" but since I'd be investing a good chunk of time in becoming more proficient with the language and its libraries as well as the framework, I think it's worth more thought than just a coin flip. They both seem to have strong communities and a ton of support, so maybe it is just a coin flip? Or maybe I'm missing something I should be taking into consideration up front? I'm not sure if this is a question or just me venting.
It doesn't f__ing matter. Just learn something. It's easier to learn new languages after you master one. The switching costs are lower than the opportunity cost of not starting now.
Learn JS (and Node). It works serverside. It works for front-end. You can build apps, websites, APIs, and random scripts. And it's not super hard.
I wouldn't say "it doesn't matter", but it doesn't deserve the amount of time people spend on it. If the goal is to launch as fast as possible, then building in a language you already know is almost guaranteed to help you launch faster. Don't get distracted by the new hot language or framework.
For people completely new to programming and looking to build a company on the internet, you can't go wrong with learning JS.
Agreed. It does matter, but there are a lot of good options, and as long as you pick one swiftly and learn to work within its constraints, you'll be fine.
So much this. If you already have a general programming language down (like Java), your time to productivity with most languages, doubly so with web apps, is going to be nominal. Find a niche or programming language that you want to learn then build your solution.
Within days you will likely be moving as fast as Java and be having more fun with the overall build. This will likely leave you much less mentally drained when solving hard, business oriented problems/keep you rejuvenated to sprint to the finish line.
All people say that you should make an MPV fast. So you should use a language that you already know and code quickly.
But I think it depends. Well, if you are building a new business, to deliver the stuff fast, is an excellent advice. However, if you are developing a side project to make some money (maybe), I think it should also be fun.
I'm having fun with Elixir right now and learning a lot of things. If my side projects are not going to anywhere, it's not a problem because I will have learnt a lot of new and useful things.
If it helps, I totally disagree with that assessment. Spring is not overkill. Spring Boot is just as easy to bootstrap as Django and scales up better. Doubly so if you're more comfortable in Java. If you want to be a cool kid, I'd actually say use Spring Boot with Kotlin.
When I started out, I went with the it just doesn't matter approach. And while that is true to some extent, that also means that the product you build has to be a winner straight off, and you have to be OK with that being a dominant tech stack for you into the future.
I think it was generally bad advice. I went with .net in the early days, as I'd been learning on that, didn't have access to a mac, and regularly used software that wasn't available on linux (adobe CC, various audio programs).
C# for what it is, is a terrific language of that kind.
But even today, with Microsoft doing it's mega cool revival (always had a lot of respect for them, since reading a lot of Joel Spolsky) I would say that it's a fundamentally bad bet to go with MS or Java as your stack.
(I'm assuming some kind of web based business here?)
Rather than give advice, I'll just say what I do, and you can see if you agree or disagree with me.
I use django as my go-to web framework, have probably done 200-300 projects in it by now. I pretty much never have a problem with it, but there is a learning curve, like anything. Learning django-rest-framework will be an important step.
I prefer djangos modular folder/app approach to design, rather than folders with a bunch of unrelated files in (controllers/models/views). Organise by feature.
I like using python because it feels like it has more applications outside of the web sphere. I like that a design goal is that there is one way to do things. I like that it is slightly more verbose, but less magic than it's equivalents. I like that it seems to be a lot faster than ruby to startup, just in terms of waiting around when working on concurrent projects.
I don't really use intense debuggers much any more. Only when something really doesn't work. I relied on visual studies debugger a lot in the day, but these days, I just print strings or entire objects to the console and go from there.
I also couldn't really imagine working anywhere than the osx or linux command line. It just feels like things come out there first and there is an emphasis on being lightweight / terminal based.
I do use a proper IDE (pycharm, or anything from Jetbrains) because I want insanely good code analysis as I type, in whatever dynamical language I'm writing in. I'm sure you can make Vim or whatever be as good, but I've never found it to be quite good enough. I probably need to put in more than 2-3 hours work at this, but I find the products excellent and very fast, so that's fine.
I do use vim for relatively simple text editing, but I'm not a master. But I do enjoy it for some strange reason.
I also write shit tones of javascript. These days in the browser via browersify & beefy, and a lot of the time I just write plain objects and jquery type stuff. I've gone through backbone/marionnete, angular & vue, and a tiny bit of react. They're all fine, but really they are just combinations of patterns of components/pubsub/routing/templating/2 way binding/etc.. I'd say if you get to a large project, then fine, use a framework, if only becuase it means all devs know how to write in that framework.
Also, if you are going to want to do native cross platform apps, then you are going to want to use react native / Expo. I've hand written both ios & android apps, and while that is fine, you can see it would end up being a big pain to keep them both in sync. Xamarin is a world of pain becuase of the build/preview cycle and the view systems aren't well abstracted. I think it may die at some point.
I don't use javascript on the backend becuase I like writing in python and javascript at the same time, but there probably is nothing wrong with doing the backend in javascript, and you get everything non blocking and event driven, although this is in python 3.4+ now.
Django channels 2 is also a really nice implementation of doing sockets that should scale.
I would not write in c# or java, unless you are going to want to pickup typical c# or java devs, which might make for an easier hiring market. The coding and build processes are just too painful compared to the alternatives.
Just a thing to say, I learnt a huge amount, while getting things done, by using frontend frameworks. And also building ios/android apps. At some point it all just clicks and you see all frameworks as doing the same stuff and you don't really need them any more. But until that lightbulb goes off, you can learn a huge amount from framworks. So probably react, or vue are the best choices these days. Modern angular is ok, but has some sizing problems that I think are fixed. But it's all quite magic and a lot of moving parts in side webpack (I think?) again, all fine. If your first idea is going to be perfect, and definitely a solid business model, it doesnt' really mater.
https://muut.com/blog/technology/frameworkless-javascript.html
For the MVP, use what you know and do it fast (if the main goal is to validate the idea).
For the next version, this is what I recommend for most projects:
Language: TypeScript (JavaScript with types)
Web: React
Mobile: React Native (sharing code with web)
Server: Node.js
API: GraphQL
Database: Postgres or MongoDB
Host: Heroku
Why: Great stack using modern technologies, big community with lot's of packages and people willing to help, awesome developer experience and high productivity.
Do not recommend MongoDB to people. They have a tendency to ship security holes and at high loads their replication is not atomic, so you end up with partial records in the replicas that never get corrected.
That's a huge amount of complexity that's just not needed for most projects. That's a stack I might migrate to after getting big enough to have an engineering team of 20.
This is a good idea to for an overall longer term goal. apologies for the newbie question - but doesnt MongoDB require a great deal more admin that Google Cloud stack? and where do recommend you actually host the DB?
My mental checklist is:
Here's a few examples (I had to omit 5 because I don't deal with any of these day to day and I'm not going to go do the Google searches right now).
Spring: 1. It has a lot of components that add onto Spring to provide everything I could want. 2. Plenty of StackOverflow answers. 3. Yup, lots of use. 4. You already know Java.
Node.js: 1. Pretty much everything is implemented. 2. Lots of blog posts and StackOverflow questions. 3. No. Changes quickly, packages regularly break. 4. JavaScript is something you'll have to learn, but you don't need to block yourself while you do.
Ruby on Rails: 1. Everything is implemented. 2. Lots of blog posts and the like. 3. Pretty well established now. 4. You would have to learn Ruby, which is annoying. (See my criticism at http://madhadron.com/posts/2013-02-25-a-criticism-of-ruby.html)
Flask: 1. There are projects that provide boilerplates with all of these on top of Flask, so you'll have to replace Flask with Flask + some boilerplate. 2. With the boilerplate? No. 3. With the boilerplate? Probably fast. 4. You have to learn Python.
Django: 1. It has everything. 2. Lots of documentation and answers. 3. Stable. 4. You have to learn Python.
For the database, use PostgreSQL managed by your cloud provider. That's the right answer 95% of the time.
From an overview standpoint: Just use the language your most familiar with. If you already know Java then go for it. If you need to learn Spring, this might be overkill as this framework is really complex. If you want rapid development with Java, just use Play Framework. It's also much faster than Sping.
On the other hand you should know what your project demands are. Java applications require better hosting solutions and from my experience all Java applications crash randomly after a few months 24/7 usage. So if i would go with Java, i would definately go with a Loadbalanced / Autoscaling Solution with at least 2 Servers running all the time, to prevent your site becomming unavailable if the application server crashes. In AWS that's at least 50$ monthly + the database.
Solutions like PHP are less cost intensive and don't need high hosting requirements. On the other hand they might not be well suited if high traffic is expected.
If you don't know if your project will be generating revenue anytime soon i would highly recommend going Serverless. With that solution you pay only for what you use. So if no one uses your app, you don't pay anything.
As Java has a longer cold start in Serverless environments like AWS Lambda, it's best to use Node here. And probalby go with a NoSQL database like AWS DynamoDb.
I work in SF and I don't know anyone using Spring. Everyone I know uses Python, Ruby, PHP, and JavaScript. I agree at the end of the day it doesn't matter what you pick but in SF there is more demand for the languages I listed than there is for Java and Swing.
I tried starting around 5 tech business and only my latest one made it to the stage where it was released and obtained users. The main key to this was picking a tech stack that had a low barrier to getting an environment up and running and allowed for rapid development. I personally use a MEAN (Mongo Express Angular Node) for my projects now. One of the main benefits is its javascript through the entire stack. It's great not having to context switch between languages when working back and forth on the backend and front end.
Javascript as a language is also extremely popular right now and there is a high demand for it. In the past Javascript had its problems with it not being a typed language, but with the introduction of Typescript, it's made it a lot more attractive.
So, I like using side projects as a chance to learn something, so I understand this. So the question becomes: what is the point of the side project? Do you just want the product made, or do you want to learn a new thing?
If you just want the product made, go with what you know. AWS/Heroku run Java apps pretty easily. I will say that Java is considered a "slow" language to develop in, but it won't be slower than learning a new language for a small project.
If you want to learn something new: I'm a Laravel fanboy, it makes my life in PHP-land so much better. Python with Django was also really nice to program in, but the Python 2/3 split was starting to grate on my nerves with certain things. I haven't used it in a while, though. Node.js is also an option for rapid development.
Ruby is a cult.
A couple minor points:
For my part, any new project I start begins with Go now. PHP used to be my go-to (hah) language for server-side, but it's just not enough anymore for me. YMMV.
Yes, you are correct on the "just pick something" part and would recommend you to do that.
But, yes, you can also be smart with your time and learn something that you could reuse later on developing something else. For this, I would recommend you to learn Javascript with a library like React, or a framework like Angular. In this day and age you can use Javascript anywhere. You can develop desktop apps (Linux, Windows, MacOS), Android, iOS and web apps of course. Not to mention that you can use NodeJS to develop your back-end code.
In my opinion Javascript frameworks are the best for bootstrapping
digital products. The bad thing about these is that the learning curve might be high with some of the libraries like React since there are lots of articles about how to use it and you can get lost in the sea of different "best practices".
I just made a post in this thread that is pretty much saying "Just Pick Something": https://www.indiehackers.com/forum/are-you-on-top-of-your-tech-stack-aae45255ef.
You simply need good system design which you can begin to learn here: https://github.com/donnemartin/system-design-primer
To help you more, I do suggest learning one of the more "modern" stacks. Django/Flask, NodejS or Laravel/Lumen are going to be quick for you to iterate.
Schedule some time to refactor (A good start but not everything: https://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672) and you will never be afraid of your choices again :D
My 2 cents several months after the question. I noticed no one has mentioned cost. The problem w/ Java apps is unfortunately that they use a lot of memory. And so when it comes time to host the app, you'll pay that price. That's one reason why Go is so popular. I would actually recommend that. It's also "something ... in high demand in the job market".
I was in a similar situation 3 years back when I was planning to do a startup. I was java experienced in desktop world and wanted to build a webapp. I went with Grails and Angular at that time (Spring boot was not as cool as it is now). Our startup failed badly but we were able to switch back into consultancy / freelancing and started earning better. So I'd suggest if freelancing / consultancy is your plan B, go with java ecosystem (Spring Boot, Grails) as you already know the language but don't spend time on frontend frameworks. Just use JQuery. After working on angular for 3 years, we've decided to kill it in next projects and so far we are happy with this choice.
It doesn't actually really matter that much. You have to get out there as fast as possible with minimal effort just to validate your idea by putting something in the hands of the users and receive real feedback.
Just imagine spending years to build the "perfect" product with the latest technological stack just to discover that nobody actually need it.
I've been in the same place as you, I wanted to build something big with microservices and distributed databases and spent way too much time thinking about it and designing the whole system with diagrams n stuff. In the end, I went with Python and Django and invalidated my idea in less than a month. After that I just went to the next idea and so on.
My advice is to stick with what you are already familiar, at least in the beginning, so that you move as fast as you can. You don't know if it will work and if it is worth investing more time and effort in the current stage.
Django is great for building apps quickly. Django Rest Framework is fantastic for pumping out APIs.
That said, as someone whose used Python and Django for the past ~10 years, I seldom turn to it for new project work because its way more than I need. If I'm doing new work, and its Python, I'd choose one of the many awesome micro web frameworks.
I use Go for most new project work if I have a choice. I've made enough apps with it that it feels pretty systematic. Plus, typed languages have many other nice benefits when you're iterating a lot (type checking, refactoring).
So if you're already pretty seasoned with Java, I'm definitely +1 on running with what you're comfortable with (especially if time is of any concern).
An interesting stack to check out is Clojure / Clojuresript. Clojure compiles to the JVM, Clojurescript compiles to Javascript, and to a significant degree, the syntax is the same, giving a developer the luxury of programming both server and client side apps in the same language.
Clojure(script) is a functional language with immutable data structures and relatively simple semantics for dealing with concurrency. The entire Java ecosystem is available from within Clojure, there are Clojurescript libraries that compile to both React and React Native. And there is a very interesting immutable database engine to go with it all called Datomic. In Datomic, data is stored in tuples containing entity, attribute, value, transaction and a boolean flag that indicates added/retracted. No tables, just datoms.
It's a bit more challenging to learn, but pays very well, and the community is intelligent, helpful, and kind.
If you want to learn something new and know java well (and by well I mean you know quite a bit about the eco-system, the build tools, the application servers, databases, etc), then you might want to stretch out into something like spring mvc.
If by knowing java, you mean you just know the basics, then I would suggest something lighter weight. Django is powerful, but I wouldn't call it light-weight or something with a low conecptual surface area.
If you just wanted to get an MVP quickly, right now I'd recommend firebase and plain javascript in the client (or maybe vue). Very little to understand and a nice gentle introduction to javascript without the need to master a lot of complex tooling.
Assuming you're building it yourself, use whatever will be easiest for you so that you can get past it quickly and focus on all the product-based problem solving that lies ahead of you!
Django is essentially a slightly inferior and less productive clone of Rails that has a smaller ecosystem. Python is a great language to learn in general, though.
Honestly, if you just want to get the MVP out of the door ASAP, Rails and Laravel are the only real choices. Both are also good for later indiehacking and okay in terms of job prospects.
Just don't get sucked into wasting your time on front-end frameworks unless it's really needed for the product. If it is, I'd go with Vue, which is by far the fastest to get going with.
The worst thing (other than just staying in analysis paralysis for months) would be to go for an overly complex stack involving react, redux, webpack, babel, graphql, etc, etc, etc...
My background is enterprise Java, so I use Java/Spring Boot for everything. Knowing the Spring ecosystem deeply well is quite valuable given the sheer amount of power to create solutions with it even though it can be "overkill" for some things it's a durable work horse. Also using Spring Boot and H2 database you can do rapid prototyping easy enough. PHP/laravel is hyper focused on web apps so it has a lot of great stuff out if the box but seems like a real one trick pony IMO. Python/Django actually sounds like a very good offering and Pythons popularity is growing so if you need to hedge for job prospects it could be well worth playing with this to see how you like it. Ruby/Rails has some neat sounding stuff too.
I suffer from this as well and have tested a lot of frameworks. Meteor.js, .Net Core, Ruby on Rails, Elixir/Phoenix, Java/Spring, Python/Flask/Django, and that's just on the backend. Needless to say the result is that I never become a real expert in any stack, since I will always switch to something else.
I've come to the conclusion that I should focus on a productive but boring stack, as long as the goal is to ship something, not just to learn something new. For me that stack is Python/Django with PostgreSQL and TypeScript/React on the frontend (only if needed). The upside of a boring/matuere framework such as Django is that it has acceptable performance, there exists a lot of documentation, solutions are easily googleable, and there exists a wealth of libraries for Python.
This comment was deleted 7 years ago
This comment was deleted 3 years ago
Just don't use Iris. The guy that wrote it is a real a-hole.
Do you have a link to the full story? I'm in to GoLang these days but hadn't heard about that.
Not handy, but you can find a long discussion on Reddit. Basically he took a bunch of other people's code, relicensed it, then squashed a bunch of commits to cover it up.
When the community called him out on it, he was a real asshole and used a bunch of sock puppets to create drama.
There are a lot of other great frameworks. Just use those. I really like chi.
This comment was deleted 3 years ago