Honestly? I think the answer is "the one you already know". Most of the languages covered in the article are capable of doing 90+% of what the average tech startup needs (a web site, an API, database connectivity). Save yourself the trouble of heading towards the latest hip technology and just write with the stuff you already know how to use. Worry about how flexible and scalable it is once you've actually proven your idea works.
OP here, when you build a company, you need more than one person so you also need to think about your product needs (what tech better fitted) and who you will hire to help you build it.
That still seems backwards. Hire developers. Use a language those developers are comfortable with. Don't choose a language then hire developers for it.
In any case, I'm not sure that many (any?) product needs could dictate choice of language in the vast majority of cases. Yes, if you need to do a ton of realtime stuff then maybe think about Node etc., but most people want the same standard stuff.
"hire developers, use a language those developers are comfortable with."
So you can use that method when hiring the first developer.
When it's time to hire the second developer, are you looking for only developers that are comfortable with the same languages as the first developer? If so, you are hiring developers based on language, and no longer following your advice. If not.... then you get a bunch of developers comfortable with different languages, and now what?
Often the answer might be "good developers can learn to be effective at any language." Which while on the whole (if not always) true, nevertheless only sometimes works for an enterprise (sometimes you don't have time to wait for them to learn it). But even so, now that turns into different advice: Hire your first developer, have her use a language she's comfortable with, then hire subsequent developers that either already know that language or are capable of learning it, and have them learn it. Which doesn't sound quite so obvious as your original advice, although it's not neccesarily an unreasonable approach.
So use what you are comfortable with - as long as it's not something that's so completely obscure that no one else knows it. If you just chase popularity, you're also probably likely chasing mediocrity. On the other hand, no, Visual Object Forth ++ from Borland is probably not the best thing to build a web site with.
I think that the article would have been helped by defining what a "startup" is more clearly. "Two guys in a garage toiling away at an MVP" is not the same kind of company as "post A round, just moved into slick offices and we're hiring a dev team." (The article seems to be more about the latter than the former.)
Getting something up & running is more important that everything else put together (except maybe determining what that something is.)
It's hard enough to get from "thought" to "thing" without worry about all the details. For an MVP, almost any technology can do almost anything you need. So just do it.
Although not ideal, you can always refactor, rewrite, rearchitect, or redeploy. But unless you have a time machine, you can't go back and do it again. So listen to untog and use what you already know.
I can't remember where I read it, maybe even HN, but I'm regularly reminded of this quote:
"Never use a new language for the first time for a project you love or that's important to you - you'll end up hating both the language and the project."
Biased Java guy here. Completely disagree. Yes VS lets you build nice UIs with drag and drop. But if you compare bare bones Intellij IDEA to bare bones Visual Studio, Intellij IDEA wins everywhere else. All things being equal (that includes programming languages), you can be more productive in Intellij IDEA because its got the fundamentals down and has intuitive shortcuts for doing everything.
Of course I haven't used VS for about 5 years. Keep that in mind. But back then IDEA was light years ahead and .NET devs still thought VS was better.
As long as the .NET guys don't have Maven they can't win.
I can check-out a Java project that contains pom.xml using the big 3 Java IDEs out there (Eclipse, IntelliJ, NetBeans), compile, build, run unit-testing, integration-testing, navigate my codebase like crazy.
But you know, I'm gettin tired singing the same choir of Java. .NET guys can sing how great their C# languages and VS.NET are but we know Java ecosystems win hands down End-To-End; we got it cover from distributed systems, big-data, enterprise, "service oriented", dependency management, build, validation (findbugs, checkstyle).
Eclipse + essential plugins are more than enough for me (albeit I'm using IntelliJ these days) and it's free.
I wouldn't call myself a Java lovers as I'm moving away from Java lately but so far I haven't found a comparable tool to build+dependency that Maven provides nor I have found a good ecosystems that adhere to non-breaking fundamental building-block standards (Servlet, JSP, JPA2, EJB3-lite, JMS, etc).
Yes, Maven could be painful to start with especially without someone who had previous experience on your team but feature-wise, nothing competes with it yet. Ruby needs RubyGems and Bundler (and Rake to that extends) to compete with Maven. I heard the philosophy of "Do one thing and do it well" but if you're using those tools altogether every time (Rails) then what's the point...?
I don't understand what you mean by "ruby needs RubyGems and Bundler to compete with maven."
Sure, and Java needs maven to compete with RubyGems and Bundler.
?
Oh wait, you think it's significant that on ruby it's two cooperative tools with two different names, compared to one tool on Java? I don't see how that matters too much in practice. (But it does, in real life, is it really just maven, or is it maven, and definitely ant, and maybe ivy too? heheh.)
I will admit that I find bundler a lot easier to use than maven, but I'm definitely a rubyist more than a javaite. I _think_ that someone who only occasionally needs to use ruby will find bundler easier than someone who only occasionally needs to use java will find maven. But maybe that's just my own prejudice, I could be wrong there.
Oh I'm not referring to which one is easier to use but merely on the features.
Maven = Bundler + RubyGems + Rake
Maven = Ant + Ivy
Maven = not-sure-what-the-equiv-in-python (pip is more along rubygems?)
I don't think Maven is easy to use if you have to write from scratch (you need an IDE or something to generate the initial POM first ).
I'm also questioning if it's necessary to have RubyGems separated from Bundler when in real-life, you'd almost always use both anyway (along with Rake) to have a more productive workflow.
Yeah, it probably would lead to less bugs and easier to follow documentation if they were joined, but such is open source sometimes. And it ends up being not a huge problem in practice, I think.
Don't people similarly often use ivy _with_ maven, as an extra layer that makes certain aspects of maven easier? Maybe I had that wrong. And I thought maven use almost always included using ant. Maybe I had that wrong too. So not a java guy.
Ah, from the Ivy project's own documentation, sounds like I did have it wrong:
> First, the most important difference is that they aren't at all the same kind of tools. Apache Maven is a software project management and comprehension tool, whereas Apache Ivy is only a dependency management tool, highly integrated with Apache Ant™,
That does make it seem like maven isn't neccesarily the "do one thing and do it well" tool you were suggesting it was though! That might be more what ivy is trying to do?
People use Ivy with ANT because ANT solves part of the SCM issue: build. Ivy gives ANT dependency management.
Many people keep saying that Maven is a bloated software but the Maven core itself is rather small, everything else is a plugin.
Compile Java? Plugin.
Compile Scala? Plugin.
Unit-test runner? Plugin (surefire).
WAR packaging? Plugin.
Run your CSS/JS via YUI Compressor? Plugin.
The reason why occasionally you see ANT TASK inside Maven may have something to do with the situation where there's no Maven plugin for that particular task and there's already an ANT TASK for that particular job so people just call that ANT TASK from within Maven. All these tools can work together nicely.
BTW, executing ANT TASK from inside Maven? that's a Maven plugin.
So Maven does one thing and do it well: orchestrating plugins. Each plugins does one thing and do it well: solve a particular need. It does make Maven look bloated because it gives the illusion that Maven does everything... like your Operating Systems.
When people refer to Apache Maven as a Software Project Management it is because it can also generate a website for that particular module/sub-modules/the whole projects.
So you can put everything under your source control and have them build by maven to generate a complete website + documentation + javadoc + release notes for your modules/libraries/javadoc along with other goodies as well (code-coverage result as part of your project website).
Example of the goodies that the maven site plugin can generate:
1. Display dependencies of your libraries/projects
VS.NET comes in many editions with some limitations.
For example: VS.NET Express does not allow you to have any plugins (or used to, never checked anymore) which means you can't run your NUnit from there and expect code-coverage instantly show up once you ran them.
Their NuGet solution somehow seems limited compare to Maven eclipse plugin where it can download the JAR, JavaDoc, and Source if required whenever someone needs to navigate the source code of 3rd-party lib.
You shouldn't be using the Express version for professional development anyway, you really need to use the paid version - that's a whole different Java vs .NET debate running into OS vs proprietary that will never end.
As for NuGet, as soon as you build, all code, docs, etc are right there and it's up to the creator of the library to have created the info. It manages versioning and updating for you as well.
Unfortunately the whole debate of OSS vs Proprietary does matter when it comes to "which tools is better". I know it'll never end but it affects the playing fields.
The fact that you can get up to speed very very quickly without spending money or talking to Finance, MS Sales/re-sellers using Eclipse+plugins and Java+OSS libraries/frameworks that were more mature is probably a significant point on this debate.
The money thing is a semi-moot point at this stage due to BizSpark. Yeah, it's a bit "drug dealer"-esque with the whole "first hit's free" thing, but you can use the full MS stack/toolset for free for 2-3 years or until you've got 1 million in yearly revenue. At that point, you can easily afford the relatively minor premium MS extracts from companies using the platform.
We don't really use designers anymore outside of quick low volume enterprisey data driven apps. It's all about the MVC3/4 and EF5 (6 soon!) stuff. We have Resharper now, made by JetBrains, the Intellij guys, and it kicks total ass. Refactoring is a breeze, and it really helps with dealing with legacy code.
I was reared on Java, but at this point I don't think I could go back. C# is just so far ahead of java in terms of language design and features at this point, and Linq is bloody amazing. It's far easier for me to transfer the ideas in my head to my C# code than pretty much any other language I've used at this point, excepting Python for simple algorithmic problems.
Just FYI, if I were in your boat I'd probably feel the same way. I chose my words very carefully:
1. I compared bare-bones IDEs because I know resharper levels the playing field.
2. When I said, "All things being equal (that includes programming languages)" I meant I feel that C# is a better language, but I'm choosing to ignore that so I could compare IDEs apples to apples.
My first thought too, being an Intellij IDEA user (and mostly java developer) I was annoyed with that affirmation. I had the need to use Visual Studio recently and I can say it is still light years behind Intellij.
As someone who started using Java during college for a side job and after getting a job at the company afterwards switching to C# mostly: IntelliJ vs VS? IntelliJ wins (though VS got way closer). But with plugins? Or mainly one plugin: ReSharper (for those who don't know it's a plugin for VS made by the guys who make IntelliJ). VS with ReSharper has become my favorite IDE.
I used to work for MS in 2007. I used VS.NET for a while in 2010 (for couple months, mostly writing code and unit-tests via NUnit) and in 2012 doing mostly Sharepoint so I may be outdated.
Back in 2008-2010, I used Eclipse exclusively with Maven (and m2clipse), FindBugs, Checkstyle, PMD, Hudson (Jenkins nowadays), Spring, GWT, with some exposure to HBase and Hadoop. I never had to wrestle with any licensing issues at all. If I want to use something I would go to the internet and download them (IDE, plugins, tools, libraries or whatnot). They're also high-quality grade tools and not toys or something with serious limitation that forces you to buy the commercial offerings.
Feel free to invalidate my opinions. Love to see a better version of NuGET. Love to see VS.NET Express to support plugins. Love to see what great cool plugins exist for VS.NET. Love to see any heavy-weight framework/libraries from .NET that are being used in large-scale and in may areas. It wouldn't hurt if you can list them here for the benefit of everybody else as well.
PS: Mylyn is a very underrated tool. I heard they're going to port Mylyn to VS.NET but haven't seen it from their product page yet as of today.
If I'm so clueless, why don't you enlighten me by telling me what makes VS better than Intellij IDEA? I suspect a bit of the Blub paradox (applied to IDEs instead of programming languages) is occurring here.
I don't see what a lack in .net experience has to do with anything. I'll be the first to admit C# is a better language than Java. This is a comparison between two IDEs. I've used both. I was shocked at what VS couldn't do.
The whole "C#, VS and MSDN reek of licenses" is getting a bit staid. I'm writing a thick client/desktop app (almost 300k LoC) using Visual Studio Express , SQL Express and online MSDN. Yes, I paid money for Windows and Office, but that has little bearing on being able to write shrink-wrap quality apps with free tools from Microsoft.
Agree. Discounting C# on prejudice against Microsoft "reeks". Ignoring the Bizspark programme, the Microsoft development ecosystem is now so large you can actually avoid Microsoft licences.
Look at the success of Xamarin moreover their tools that can be used to create systems in Mono in F#, C# et al hosted on Linux with Nancy behind Nginx using Postgres.
The OSS ecosystem is growing too look at Edge.js for a good example of some innovation where C# and F# can strengths can be utilised in conjunction with other ecosystems with more focus on web.
It may not be perceived as trendy but there's plenty of developers familiar with that ecosystem. If you're in London for example finding decent C# devs is not a tall order.
People either not aware or pretend not to aware or have their biases set already when it comes to Mono.
I'm not sure if people aware that the commercial entity behind Mono is focusing on Mobile heavily than enterprise and I'm not sure if these people are aware of the repercussion of that.
I think Xamarin are quite clear that their focus is entirely on their mobile offering. A side effect to Xamarin's success and investment is the tooling. The whole ecosystem is benefiting from the cross platform focus driven almost entirely by Xamarin's drive to own cross platform mobile development. Many OSS developers are releasing PCL and mono compatible versions of their software for this very reason.
My comments are to highlight comments made by others too; that language and platform familiarity weigh very heavily in the decision process and that discounting the entire Microsoft ecosystem based on licencing is not a cut-and-try process as it perhaps once was.
The ecosystem is diversifying and growing. It may not be as mature, advance, diverse as other platforms but for those already familiar with the technology it is a viable option.
Well, the article is written from a web app perspective, in which there is a big scaling tax when you go MS (windows server and sql server licenses). I know there's bizspark but it doesn't cover growth hacking startups well(limited prod SQL Server use, 3yrs only).
I left the .Net world about 3 years ago. There were plenty of things to complain about, but licensing was never one of them. Most of the stack is free until you get to the point where you should be able to pay for it anyway.
I recently decided it might be worthwhile to learn the Microsoft stack, and had heard similar things about how you can just get whatever you need for free until you've scaled up. So I went poking around Microsoft's site for this free stuff. Half an hour later I gave up without having gotten my hands on anything but an impenetrable white paper about different versions of Visual Studio. So it seems that either people are exaggerating how free this stuff is or Microsoft is very good at hiding this.
Ah, I didn't realize that when people say they give their stuff for free, they meant they're giving a different product away for free. That is…weird. I can't figure out what this includes. Is this actually enough to deploy a web app with the full Microsoft stack?
It is fairly normal for companies that produce commercial products to offer different editions of their products at different price points. Microsoft is not a weird exception.
The Express products are completely functional although they lack certain non essential features. The main limitation of the Express editions is that you can't use third party plugins with them. Third party plugins are used to enhance Visual Studio itself and are not to be confused with third party libraries which you can download conventionally or with the built in package manager Nuget.
The Express editions are distributed by task so you only download what you need. If you don't want to create Windows Phone apps, for example, you don't have to download that functionality.
To develop web apps you have to download Visual Studio Express 2012 for Web.
It allows you to develop ASP.NET MVC and ASP.NET WebForms apps with C# or VB.NET right out of the box but you can also use it to develop web services with WebAPI, regular HTML5 websites, etc. And out of the box you can deploy by using FTP, WebDeploy and Azure but you can also use whatever external tool that you like.
The product includes a copy of MS SQL Express that runs as a process but you're not limited to using Microsoft databases.
> It is fairly normal for companies that produce commercial products to offer different editions of their products at different price points. Microsoft is not a weird exception.
Oh, no, you're definitely right about that. What I meant was weird was that nobody seemed to describe it in those terms, so I was looking for the wrong thing.
Thanks for the rundown! Now that I actually have some idea what I'm doing, I'll have to give it another go once I get a bit of free time.
> they meant they're giving a different product away for free
To get the other software free, you need to sign up for BizSpark (which requires jumping through a few hoops). http://www.microsoft.com/bizspark/
The express apps should be sufficient for building apps (I'm using them for a desktop app right now) and should allow you to learn the Microsoft stack with minimal effort.
Last time I dealt with Windows development (for the desktop) as a small shop, I was completely unable to understand the licensing. It ended up occupying a significant part of my attention.
I'm sure someone will just "lol, use your MSDN (or whatever it is now) subscription", and when you have that and it's being paid for that's fine, and the tools are nice. But it's way too much for small shops to bother with, IMO.
"Erlang based systems obtain many of the aforementioned properties from the Erlang concurrency model. Erlang handles the concurrency itself instead of relying on the OS. A concurrent entity in Erlang, called Erlang process, is much lighter than a standard OS process or thread, initially using about 3 KB of memory on a 64bit system. In a typical Erlang systems, you can easily create hundreds of thousands or maybe even millions of Erlang processes. The Erlang virtual machine uses its own scheduler which ensures that each process gets a fair share of execution time. The scheduler also distributes processes over available CPU cores, using as few OS threads as possible (by default only as much as the number of available CPU cores)."
It is kind of like Node in that it is very easy to do concurrent stuff, except instead of nested callbacks and all that jazz, you write 'processes' which are designed to share nothing. They run akin to OS threads in that one process crashing won't bring down the whole system (unlike Node). As no state is shared it also means that they can easily (i.e. it is built into the VM, and switched on by default) be scaled up to run over many cores. If you are interested, you might want to look at Elixir (a language built on top of the Erlang VM) which has a more Ruby-esque syntax: http://elixir-lang.org/
EDIT: Should also point out that I think "Jessica's" comment was just trolling, however it isn't far from the truth :)
Is ``Jessica's'' comment not far from the truth because Scala and Go have shared memory for their Actors/Processes? I know Erlang doesn't share memory between their processes which leads to concurrency; is this what she was getting at?
In general (apart from run time code loading) one can accomplish a lot of things Erlang does in any language.
Her "how much pain and when" I think implies that she only accepts concurrency as practical when units of concurrency are isolated as that would reduce the number of shared data structures being updated, lock contentions and so on. There is some truth in there that I agree with.
But then again maybe she was just trolling. I for one do not like her tone her comment.
Good question. Hopefully you have not been put off by that comment. It comes off kind of harsh.
She wasn't right about lack of concurrency. Go, Scala, Python, hell all of them I guess can do "concurrency". They all have facilities to launch concurrent requests/actors/callback threads/other processes.
Now maybe what she was going to say (and her "how much pain and when" kind of hints in that direction) is that once you start handling large scale concurrency, things get very complicated. Anything that lets you share memory will eventually bite you back in terms of debugging and downtime.
Erlang's concurrency is unique because its concurrency units are isolated. They are as isolated as possible. Each has its own memory. Garbage collection can happen concurrently. One such what they are called process will not damage or interfere with other processes. That is invaluable.
Erlang's concurrency just like (Go's and Rust's I think) is also a mix of both CPU and IO. So behind the scenes Erlang spawns an operating system thread for each CPU core and then it dynamically scales your concurrency units over them. You need to run better, just add more cores.
Another (and this should be the main differentiation) is fault tolerance. This was and is the raison-d-etre for Erlang. Nothing practical out there matches it. Processes can and will crash and Erlang has standard ways to supervise and restart. Even crazier it provides built in facilities to reload the code while the system is running. That is of course possible in other frameworks and languages but in Erlang is baked in and battle tested over many years.
That sort of makes Erlang a unique tool. It doesn't come without trade-offs. It doesn't for example has terribly fast sequential speed. So if your task is to multiply matrices for example, or computer lots of numbers. Erlang won't be the fastest in that regard. It is also a functional language. It is beautiful I think, especially if you like pattern matching, but some people don't like that.
But if you don't like the syntax, there is way out, the same Erlang virtual machine called BEAM can run other languages. For example a nice new one is Elixir http://elixir-lang.org/ check it out, it is rather similar to Ruby in syntax but includes all the concurrency features from Erlang.
As for resources I would recommend the wonderful and funny online book called:
Erlang has a very nice concurrency approach, particularly if you are into distributed and fault tolerant systems.
But it's ridiculous to say that "only Erlang can do concurrency". Many other languages do concurrency very well in slightly different ways (Clojure, Scala and Go, for example).
I have a different stance on this. The technology that drives the company is strategic business decision, not a technical decision. Sure - create the MVP in whatever you want, the technology is less import - but don't do that for Rev 2. Rev 2, the true architecture of the company should be based on A) what's the right tools for the use case B) are the resources with that talent available to keep from hindering the company? For example, I wouldn't start a company with Go/Rust/etc anywhere but in SanFran - because to most of the country these languages are still fads.
Interesting take, but I'm disappointed that Groovy wasn't broken out into a separate entry. Groovy is a great choice in that you can leverage the entire world of Java libraries, while using a modern, dynamic language that is mostly backwards (syntax) compatible with Java - but without the verbosity. And Grails is a first-class convention-over-configuration framework for building webapps.
IMO, Groovy is absolutely one of the top platform choices a startup could make. We've been using Groovy and Grails at Fogbeam for 2+ years and haven't regretted the decision at all, FWIW.
Because Groovy has unfortunately turned into a mere appendage to Grails, with very little independent use, it's generally not considered as a viable standalone language by many people anymore.
Clojure seems to get a lot of attention, but don't forget Common Lisp. If you're tired of the reinvention treadmill and want a great language that is actually mature, CL can be excellent. CL also has great runtime support: SBCL (for super performance) and ABCL (if you need the JVM).
There is only one answer to this question: whatever your people are best with. Whether have any "people" (including yourself) who can code or not, you don't need to worry about the technology, you need to worry about your team.
If we're talking about Web apps, technology is much less relevant than the team's abilities. If you're also going for native apps, your options are mostly limited anyway (especially on mobile), but the same principle still applies.
Another reason for going with a familiar technology is that it will be easier for you to find future team members, as you will (presumably) already know the local community, thus avoiding what happened to Reddit.
I have similar views to the author, however I generally respond with "LOLCODE, all the cool kids are using it" because its clear they need to do the work themselves to figure it out.
If they ask "is it sane to use XYZ" I could give them some actually useful information, but sadly people often want to be given the answer rather than get advice.
I'd say this question ranks up there with "Can I ask you a question?" to which I usually respond "You just did...". If you want useful information, just ask for it, your friends and peers are not your parents.
NB: I ported a lolcode interpreter so I do actually encourage people to use it... sometimes...
Asking this question for many readers is like asking "What kinds of shoes should your startup use?"
Value is important. Say that about a thousand times. Once you are creating value, then you can write long blog posts about various tool choices -- or spend time reading them. Until then? These issues are so trivial as to almost not be worthy of discussion.
The interesting thing is that this is exactly backwards from the way most folks are taught programming. You pick the tool first, learn it's secrets, then set about making someone happy. This is a great paradigm if you want to be a corporate programmer, but if you're looking to form a startup you've got the cart in front of the horse. Sure, bring the skills to use all kinds of tech. But don't spend a millisecond focusing on that crap when nobody wants what you're offering.
A lot of guys who say they're in startups are like a severely overweight and out of shape guy who sits around reading running magazines and ordering expensive gear. Yeah sure, that stuff can be dreadfully important. But only in the context of actually doing something. Otherwise it's just bike shedding.
I clicked through in the hope that it would say "it barely matters, just get started and fix mistakes as you go". It started off with promise when he asserted that the people asking this question usually didn't actually care about his answer and that other factors are much more important, but then for some reason we got the long list of languages and bullet points anyway.
> My problem with Clojure is that ... Exceptions are often meaningless and trying to debug someone else’s code is challenging since the language itself is complex and it can be extended by macros. Finally, the Clojure community isn’t really web-oriented, most of the work done in Clojure seems to be data-centric.
You really nailed it here. I really like the language but I really struggled with debugging code and I'd shit my pants every time I refactored.
I had a much nicer experience with Haskell: If your code compiles, it probably works. With Clojure: If your code compiles, it probably doesn't work. I'll tell you something's wrong, but you'll spend most of your development time discovering the cause. That's very frustrated. But to give Clojure the benefit of the doubt, I never felt like my development pipeline was efficient. Unfortunately, I couldn't find a canonical example of a good development pipeline.
I thought this lesson was already learned. You should use the one you're more comfortable with to build an MVP even if it doesn't scale well. You will take care about that later.
I don't know what you mean by Clojure being data-centric rather than web centric. Requests are data, responses are data. Plenty of people are doing web-dev in Clojure.
Edit: I would also disagree with the language being complex. I think the only languages that compete with its level of simplicity are mostly other lisps/schemes.
The point about complexity is probably fair from the perspective of someone just getting started with Clojure.
Sure, the syntax itself is very simple and regular (like any Lisp). The complexity is in all the other stuff - macros, code-as-data, vars, namespaces, metadata, managed references, persistent data structures, leiningen, paredit etc.
Once you've got up the steep learning curve, I find Clojure is unbelievably productive. It's just a bit tough getting there. I think it's all solvable, but the Clojure community does need to listen and learn from constructive criticism.
> Does this technology fit my company’s core values?
This is actually a fantastic way of looking at it. All programming languages have philosophies, and certain "cultures" that they bring along with them.
It's important to realize that technology choices are not just about the technology.