No secret that choosing the right technologies, platforms and programming languages for your upcoming development project can be a real challenge. Based on our experience working with different company types from various industries, most of companies looking to kick off their project development choose technologies based on the following criteria:
- Personal preferences
- Recommendation from peer companies
- Online research
- Experience using technology in the previous project
However, personal preferences are very subjective and can lead you in the wrong direction. What if technology you like doesn't support required features or requires expensive and rare specialists to deploy? Or what if your favorite technology is becoming dated? Although peer companies can indeed provide some good technology references, it's important to know who exactly makes a recommendation. Is it a CTO or a marketing director? Or maybe it's an HR consultant? Can you really guarantee they're competent enough to recommend technology solutions for your business and particular project?
Today, we can find a lot of comparison charts and graphs online that delve into pros and cons of different technologies and provide solid arguments for or against their choice. Yet, even if you have a technical background, you need time to figure out what will work best for your project case and make the right choice out of plethora of solutions available in the market.
Speaking about historical context of technology use cases, many now famous sites were built long time ago when they were pretty much limited in choice. If Facebook were to choose a programming language for their social platform now, I doubt they'd have chosen PHP for development. Also, some technologies are better promoted / known than the others and it can be tricky to choose the right one without in-depth knowledge and understanding of modern platforms ecosystem.
That being said, none of the above methods of technology choice is objective enough for final decision making.
Technology choice criteria
For starters, let's determine objective criteria that should be used when choosing technology / language for your project development.
- Project scope and type
- Project complexity
- Speed of development
- Cost of specialists
- Availability of specialists
- Available toolsets
- Out of the box solutions
- Scalability
- Developer community
- Fault tolerance
- Evolution trends
- Documents and specifications
- Cost of maintenance and support
- Load requirements
- Security
- Cross-platform coverage
- Integration with other 3rd party solutions
When you choose technology for the future project based on these criteria, you'll be able to save both time and money and attain appropriate ROI at post-release stage.
Types of projects
All software development projects are divided into 3 main types:
- Simple projects (e.g. landing pages, plain web stores and applications) - usually based on out of the box solutions, CMS and web templates
- Med-level projects (e.g., complex online stores and marketplaces, enterprise solutions) - usually based on frameworks
- Complex projects (large portals and eCommerce solutions, social networks, innovative data-based apps) - usually based on a mix of pure programming, frameworks and accelerators
For most of in-demand software solutions there're packaged solutions already put in place, so there's no need to re-invent a bicycle.
Programming languages
All programming languages can be divided into 3 main types:
- Pure programming languages that allow building solutions from scratch. All of the world's top sites such as Instagram, YouTube, Pinterest, Tumblr, Dropbox, Twitter, Facebook, Amazon, LinkedIn were developed with pure programming.
- Frameworks that provide developers with pre-built tools and ready-to-implement rules. On the one hand, frameworks significantly accelerate development; on the other hand, they put certain restrictions. Most of medium-level projects are based on frameworks.
- CMS that is a packaged solution, or a website builder comprised of different modules. CMS is not about programming, but rather it's about setup and configuration. It puts a lot of limitations on development process, and it's highly inefficient to go beyond CMS limits. However, CMS allows for building simple sites able to attract millions of visitors on a monthly basis.
These types are often rather interwoven, i.e. frameworks are programmed in a pure language, while CMS's are based on frameworks. Each popular language already has a lot of frameworks and CMS's available.
The more robust the project, the higher scalability and fault tolerance requirements, which means it's much easier to build everything from scratch than utilize ready-made solutions with a lot of hidden flaws and bumps in the road. For instance, if your goal is to deliver an application that will attract 10,000 daily visitors, it'll be more cost-effective to base it on CMS that will consume 3x more server resources and set up an addition server for $50/mo to make it work. However, if you're looking to build a website able to attract 100 million daily visitors, the cost of additional servers will be too high, so it's much easier and more cost-effective to build everything from scratch and tailor all features to your particular project needs.
The larger the project, the larger the tech stack to be used on it. You may need to use several languages to develop a large and complex portal. Oftentimes, one language can help solve only certain issues. Since most of enterprise projects are very large, they're divided into different parts, each working on a different server, with different domain names and technologies used. You shouldn't be afraid of using technologies mix for your project development; however, you should only use it if there's a clear need for this. Google is an excellent example of the project using such technologies mix. It's so large that its different parts are programmed in C/C++, Java, Python, JS, etc. In addition, Google actively invents new technologies such as AngularJS and many more.
Let's distinguish some of today's most popular languages:
- PHP is used for simple and medium-level projects and it contains a lot of boxed solutions. PHP is rather an inexpensive technology with a broad global developer community.
- Python is a modern language that provides fast and quality programming. It's mainly used on medium-level and large projects. However, Python developers are not that many and are quite expensive.
- Ruby is a fast modern language that's mainly used on simple and medium-level projects and that's so much favorited by startups. Developer community is scarce and cost of development is high.
- Java is a hardcore language that's very expensive and slow in development. It's mainly used on projects with some very specific and sophisticated requirements.
- C# is close to Java and is used on complex projects such as FinTech.
- JavaScript (JS) is the latest trend in software programming. It's used extensively on all types of projects including game development. Note that JS developers are hard to find and are rather expensive.
Project development use cases
- PHP: Facebook
- Python: Instagram, Pinterest, Reddit
- Ruby: 500px, Groupon, Airbnb
- Java: Ebay, Amazon, Alibaba
- C#: Guru, Stack Overflow, Bank of America
- JS: LinkedIn, Walmart, PayPal
Technology stack on large and complex projects
Your choice of technology will depend on suggested project architecture. Software architect outlines the main building blocks of the future solution and sets a roadmap for languages to be used, cache system, databases, and how it all will work together.
For example, let's review Instagram technologies (based on Insight IT data):
- Main server OS: Ubuntu Server 14.04 LTS
- Main server programming: Python
- Framework: Django
- HTTP load balancing: nginx
- WSGI-server: gunicorn
- Load balancing inside system: HAProxy
- Object-Relational DBMS: PostgreSQL
- Geo support: postgis
- Log reports: pgfouine
- Connection pooler: pgbouncer
- Auxiliary in-memory data structure store: Redis
- Caching: Memcached
- Job server that lets PHP do multiple jobs in parallel: Gearman
- Geo search: Solr
- Monitoring: munin, statsd, pingdom
- Cluster management: Fabric
- File system: xfs
It's quite an adequate technology stack for building a product like Instagram which, by the way, isn't the most complicated development project out there!
Cost of talent
Cost of specialists is one of the most important factors that should be considered when choosing technology stack for your project development. Let's compare the average cost of programmers and engineers in Ukraine where Intersog runs 2 R&D centers and in the United States where we're headquartered (based on dou.ua and indeed.com):
Now let's translate it into human language. Although Java is an old programming language, this skill has always been one of the most expensive ones. PHP was always one of the cheapest languages with a huge global developer base. Scala is one of the newest and most trendy languages which makes cost of talent very high (and talent availability is pretty low). Another expensive language that's most sought in Silicon Valley is JS; growing popularity of JS-based frameworks such as Node.js and Angular.js adds up the cost.
That being said, if you're looking to save costs, you should better consider PHP due to rather low cost and good availability of talent. Yet, if you're looking to build a robust application with sophisticated features and a high quality look and feel - turn your eyes upon Scala that's often referred to as the future of web development (however, you'll have hard time finding Scala talent, that's for sure!).
Speed of development is another factor to take into account. Python and Ruby will significantly accelerate your development process, while Java will slow it down. That's one of the reasons why we haven't seen a lot of Java based mega-projects in the past 10 years, while the number of Python projects has skyrocketed lately.
Trends
When you choose technologies for your project, you should always look ahead, especially if you're planning a complex and long-term project. Programming languages' popularity changes every 5-7 years, frameworks change every 2-3 years, and CMS's - every 1-2 years. As such, you need to choose technology that will remain popular and well supported in the near future, otherwise you're at risk of having to modify your entire project soon and paying through nose for your software development.
TIOBE Index is a great source for trendwatching as far as programming languages and their popularity / developer mindshare.
And what other technology choice recommendations would you add here?