The Big Idea
Decisions on which technology stack to pick are so crucial. It is all together possible that you are signing the organization up for a world of hurt. It is also possible that you’re just used to doing things a certain way and that you’re not putting much thought into it. We want to be thoughtful in which technology stack we go with.
The role of CTO is essential in picking the right tools for the job. Although the tech stack is seen as a technology decision, it is also very much a people and community decision. The tech stack we choose is a vote for the communities that support that technology and the developers that love to build things inside it.
“A tech stack is the combination of technologies a company uses to build and run an application or project. Sometimes called a “solutions stack,” a tech stack typically consists of programming languages, frameworks, a database, front-end tools, back-end tools, and applications connected via APIs.” ~ Heap.io
What’s included in the Tech Stack?
A tech stack is the combination of software tools, languages, and technologies used to build and run a web or mobile application. Each layer of the application requires different tools and technologies.
Here are the main components of a tech stack:
- Frontend (Client Side):
- Programming Languages: These are used to design the interface that users interact with. Commonly used languages include HTML, CSS, and JavaScript.
- Libraries and Frameworks: These provide pre-written code to aid in building applications. Examples include React, Angular, and Vue.js for JavaScript.
- User Interface (UI) Components: These can include libraries of design elements (e.g., Material-UI or Bootstrap) that help in building the user interface.
- Backend (Server Side):
- Server-side Languages: These languages are used to create the logic of the website or application. They can include Python, Java, Ruby, PHP, .NET, Node.js, and more.
- Server-side Frameworks: These provide structured ways of building server-side code. Examples include Django for Python, Express.js for Node.js, Rails for Ruby, etc.
- Database and Data Stores: This is where the application's data is stored and retrieved. Common database technologies include MySQL, PostgreSQL, MongoDB, and SQL Server. When deploying into the cloud, data can often also be stored in cloud object storage areas like AWS S3, Azure Blob, or GCP Object Storage.
- Server: This is the hardware or virtual machine running the application, as well as the software used to serve the application to users. Examples of server software include Apache, Nginx, and Microsoft's Internet Information Services (IIS). Its also becoming more common to utilize serverless hosting constructs such as AWS Lambda, GCP Cloud Functions, etc.
- DevOps Tools:
- Version Control Systems: These tools help manage changes to the code base, allowing developers to work concurrently. Git is a common example.
- Test and Build Tools: These are used to automate tasks like testing code for bugs and building ready-to-deploy versions of an application. Examples include Jenkins, Travis CI, and CircleCI.
- Containerization and Orchestration Tools: These help create and manage containers, which are standardized executable components that include application code along with all its dependencies. Docker and Kubernetes are examples of such tools.
- Observability Tools: These include monitoring, log management, application performance management (APM), and tracing tools. They provide visibility into system health, performance, and the journey of requests through the application. Tools such as Prometheus, Grafana, Nagios (monitoring); Splunk, Logstash, Graylog (log management); New Relic, etc can help identify bottlenecks, performance issues, and enable efficient troubleshooting.
- Cloud Services:
- Infrastructure as a Service (IaaS): This includes virtual machines, servers, storage, load balancers, and networks provided by services like Amazon Web Services (AWS), Google Cloud Platform (GCP), and Microsoft Azure.
- Platform as a Service (PaaS): This is a complete development and deployment environment in the cloud. Examples include AWS Elastic Beanstalk, Google App Engine, and Heroku.
- Software as a Service (SaaS): This includes web-based applications provided over the internet. Examples include Google Apps, Salesforce, and Microsoft 365.
Each layer in the tech stack interacts with the others to create a complete application, and each can have a significant impact on the application's performance, scalability, and ease of development.
Picking the “right” tech stack
Choosing the right tech stack is crucial for any organization as it directly influences the application's performance, scalability, security, and ease of development. As a CTO, you need to consider various factors before making this critical decision:
- Project Requirements: Understand the nature of the project, its complexity, and its specific requirements. For instance, a simple web application might require a completely different tech stack than a complex, AI-driven one. Analyze your project requirements thoroughly before choosing your tech stack. Examples of specific types of needs to consider are:
- User Interface (web, mobile, desktop, device, etc)
- Storage (structured and unstructured data, files, logs, etc)
- Asynchronous processing (queues, batch, etc)
- Synchronous processing (application backend, workflow, events, etc)
- Machine Learning
- Scalability: Your chosen tech stack should support both horizontal and vertical scalability to handle potential growth in the future. It's important to choose technologies that can scale with your business and accommodate a growing user base and increased data processing needs.
- Horizontal Scalability:
- Horizontal scalability, also known as scaling out or in, involves adding more nodes (machines, servers, or instances) to a system to distribute the load more evenly. This approach is often used in cloud computing and distributed systems.
- It's beneficial for handling increased traffic or workload by spreading it across multiple machines, thus enhancing the system's capacity to handle more requests or transactions.
- Horizontal scalability is generally easier to implement in cloud-based environments and is well-suited for applications that can easily distribute tasks across multiple servers.
- Vertical Scalability:
- Vertical scalability, also known as scaling up or down, refers to adding more power (CPU, RAM, storage) to an existing node in the system. This doesn't involve adding more machines but rather upgrading the existing ones.
- It is useful for applications that require more computing power or resources but are constrained by database or architecture designs that don’t distribute well across multiple machines.
- Vertical scaling can be more straightforward in terms of management because it involves fewer physical or virtual machines, but it has limitations in terms of how much a single node/server can be upgraded.
- Performance: The tech stack directly influences the speed and responsiveness of your application. Be sure to consider how different technologies can affect performance and choose those that can deliver the speed and responsiveness your project needs.
- Security: Given the importance of data protection, your tech stack should include robust security features. Consider technologies that have proven track records in security and come with good security support and updates.
- Availability of Talent: The availability of developers who are proficient in the chosen technologies is a practical consideration. Picking a technology that has a scarce talent pool can lead to staffing difficulties and increased development costs.