If you ever want to be the center of controversy in a room packed with developers, declare that one programming language is better than another. Banners will be raised and battle cries will be heard from various fiefdoms pontificating:
"Java is the greatest language ever and powers the Internet," "Ruby on Rails is the fastest way to get to MVP," "Python is more sophisticated," "I only program in Scala, bask in the glory of my multi-paradigmed awesomeness,"
And so on. But the fact is, as the technical co-founder of a startup company, one of the earliest questions you will need to answer will be: What is the best programming language for my startup? To answer that question at a high level you can concentrate on three aspects related to programming stacks: the Characteristics of the Language, your Local Ecosystem and the Problem Domain you are solving.
Characteristics of the Language
Many startup customers using Amazon Web Services (AWS) tell us the reason they choose AWS is because we are developer-centric and offer a comprehensive set of software development kits (SDKs) for multiple popular programming languages including .NET, Java, and the JVM, Python, Ruby, PHP and Node.js. Although there are many different languages available within the programmers' toolbox, let's restrict the discussion to the languages just listed as developers creating cloud-based applications actively use them. Each language has different characteristics, communities, support, and ecosystems to consider when making your choice:
Microsoft's .NET platform is heavily used in business applications running the Microsoft Windows operating system. For Linux users, there is a port providing a subset of features via the Mono project
. Although C# and various other parts of .NET are open standards, .NET is more or less a closed ecosystem controlled by Microsoft. Widely adopted by enterprises, the documentation and the support services for the language are comprehensive. Because .NET is a framework running on a virtualized platform known as the Common Language Infrastructure, or CLI, people have a choice of which language to use such as C#, VB.NET, C++, and even Python and Ruby. C# is the most popular language by far, followed by somewhat distant second VB.NET. In addition, .NET is also the technology used to create Windows mobile applications and integrates well with enterprise systems either running on Windows or through web services.
It's worth noting that although some free tools and libraries are available for .NET, the ecosystem is based on a licensed software model. This means that when third-party tools are required, somebody somewhere will need to pay for a license and that eventually will fall upon you. Additionally, if you plan to use Windows as your OS for .NET, that will add costs (in contrast to the free license for most flavors of Linux), although Microsoft has programs that can offset or help to defer them. At the end of the day, choosing .NET is likely to cost more than choosing an open source platform.
Finally, many .NET programmers come from an enterprise background; developing internal systems and some may find adapting to the pace and the lifestyle of a start-up environment challenging.
Java has been around since 1995 and is a core tool for creating enterprise applications since the advent of J2EE. The long commercial life and wide adoption of Java have created a robust ecosystem of documentation, libraries, and frameworks many of which are aimed at e-commerce, security, and complex transactional architectures. There are experienced Java developers readily available regionally and globally both as contractors and full-time employees. The open source community embraced Java early on, creating an abundant free marketplace of Java solutions and tools.
The original goal of Java was to "write once, run everywhere", although there is some debate about whether this was ever accomplished. Additional concern over licensing rights since the acquisition of Sun by Oracle has cast some doubt for the future of the language and given rise to the phrase "Java is dead, but the JVM lives on". This has fuelled the adoption of languages like Scala that runs on top of the JVM and can still take advantage of third-party libraries. Java can also be resource-intensive, requiring more memory for example, as compared to another language. Java is used for Android devices and should be considered if that platform is part of your rollout strategy.
Python is an open source interpretive language that has been embraced by many in the scientific community for its ease of learning and a large set of scientific libraries. Django is a Python framework created for online newspaper publishers and powers popular start-ups such as Pinterest, Instagram, and Eventbrite. Django and Python together are mostly platform independent, although developers must still design programs specifically for independence in order to run on both Windows and Linux platforms. There has been a trend in the Python community to improve code quality by dictating "one right way" to write Python, which is documented in the Python Enhancement Proposal
One caution is that Python is notoriously difficult to scale across multiple cores on a single machine. This is due to the limitations of the Global Interpreter Lock (GIL). However, it is very suited to applications that scale horizontally across stateless servers, making it a good solution for applications that take advantage of the cloud. Libraries such as Boto, IPython, and Fabric also make it useful as an administrative scripting tool, allowing automation and infrastructure as code. This provides increased productivity for teams that have limited hands on keyboards.
Ruby and particularly the web framework, Ruby on Rails, is also a popular interpreted language for start-ups. Ruby has some comprehensive training available online, both for beginners, with no coding experience, and experts in the field. Check out Try Ruby
for newbies and Rails for Zombies
for experienced programmers. The high adoption rate has meant the availability of many web-based libraries and tools to help web developers create applications rapidly. Ruby has a repository of reusable libraries easily maintained and deployed in the form of RubyGems. Like Python, Ruby is suitable for automation with Puppet, which is an open source configuration management tool written natively in the language. Ruby powers popular web properties, including Airbnb, Github, and Groupon.
One valid concern is that Ruby does not scale up well on the server side for large numbers of requests to the application. As reported in InfoQ
, Twitter famously made a migration from Ruby to Scala in 2010 in order to handle the back-end requirements of their explosive growth. Additionally, because Ruby is open source and community driven, quality documentation and support can be more difficult to find. You may need to rely on Ruby experts to accomplish sophisticated solutions. There is some industry concern that Ruby becomes harder to maintain as the number of libraries and lines of code grow.
One of the early popular languages for Internet applications and websites, PHP has a vast ecosystem of developers, frameworks, and libraries. Major companies including the likes of Facebook, WordPress, Twitpic, Flickr, and Imgur are part of the PHP alumni. Because of the age of PHP and its long history, the quality of PHP code has a great variance. PHP doesn't have rules like compiled languages or strict standards as seen with Python, but rather guidelines available from the developer community. As a result, larger projects that do not have a strict structure can become difficult to read and maintain, a problem known as "Spaghetti Code."
Dynamic, Static, Interpretive and Compiled
All of the languages above can be put into two categories: Statically compiled and strongly typed on the one hand or dynamic and interpretive on the other. Older, traditional enterprise languages usually fit into the former group. Code created in this manner provides developers with compile-time errors rather than runtime errors, ensuring safer, well-documented code with clean interfaces. However, applications using statically compiled code will take longer to build. This trade-off made sense when these languages were initially introduced. At that time computing power was difficult to obtain and costly. Today, however, the availability of cloud computing with AWS for instantly available, pay-as-you-go compute capacity has drastically changed the industry.
Now, compute power is faster and cheaper, while Integrated Development Environments (IDEs) are readily available to simplify development using interpretative languages and including support for sophisticated debugging and refactoring functionality. The advantages provided by compiled languages over dynamic languages have narrowed over the last few years, with dynamic languages proven to deliver high-quality code and to be naturally suited to rapid development cycles. This is why many successful startups are gravitating towards the dynamic/interpretative side of the spectrum when choosing their development languages.
Outsourcing is fine for a proof of concept or when you have a specific one-off skill you do not have in-house, but to be successful you will want skilled talent from your local ecosystem. Finding good teams, ramping up projects and extending your efforts to offshore takes time, instead if you invest in the expertise you'll need in-house it will enable you to shorten development cycles and increase the agility of your start-up. The availability of a skilled workforce will vary by geography. Some areas, for example, have many PHP developers with little or no access to Node.js people. To better understand the popularity of the languages where you are located and therefore the ultimate cost of obtaining the skills you'll need, check out langpop.com for language use statistics globally and search meetup.com to see what meetings are active and have high numbers of attendees. This will give you a better understanding of the skills of your local workforce. Additionally, research the level of support that will be available to your employees by participating in meetups, user groups, and co-working spaces to engage with local talent. Ultimately, your costs for developers will go up if the skills you need are not readily available or are in high demand.
Some languages are clearly more suitable for solving different problems, which can make the decision process more straightforward. For example, if you are integrating heavily with MS Office and other Windows applications, then you should consider .NET on your list of possible choices. If you are performing functions, such as forecasting weather patterns, Python might be a better option because of its precise math libraries and ability to scale well with Hadoop. If enterprise-level security for a business-to-business application is critical; you will likely want to explore using Java. In any case, your evaluation will need to take into account the problems you need to address as well as your business case and type of customers.
So Which is Best?
Good question! This article covered the three main decision points that can provide assistance in your decision-making process.
- Language Characteristics: If you are developing for the cloud, stick with interpretative, dynamic, open source languages for rapid and more cost-effective development. For enterprise applications that have critical security requirements or must integrate with legacy environments, compiled languages may be better.
- Problem Domain: Take a look at what languages are being used to solve your similar business problems and what is supported by the expanse of libraries. Somebody might have already solved 80% of your problem and have a general license available for you to build on.
- Local Ecosystem: Research your local community to understand if you have a ready supply of skilled workers that can be tapped for affordable talent.
AWS developers often tell us they use the three points above to come up with a short list, and then make their final selection by identifying which language will allow them to iterate the quickest. They feel that this is the most important aspect because the nature of start-ups is to fail fast and fail forward. Fast iterations enable you test ideas, determine your problem space and provide you with solutions as you propel towards MVP. Do not worry too much about scaling up today. If your startup is lucky enough to have similar issues to Twitter, determining how to scale Ruby to meet exploding user demand, you are well on the road to success.