Tech Stack

You want to hire a company or build your own in-house team for your next project and startup.

And you already reached out to a few companies searching on Google or posted it on Facebook, LinkedIN.

There are so many different alternatives offered just for the backend lets say Javascript Node.js, .NET, Java, Ruby, Python, Go and the never ending list.

Confused – who to believe and not?

This one question comes in different ways over and over again and is all over the community forums, blogs, and more.

  • How can I choose the best technologies for my web application?
  • What are the tips to choose the best technology stack?
  • How to Choose the Right Technologies for my Software Project?
  • How to choose the right Tech Stack for my App?
  • Nodejs Versus Java, what should I use?
  • I want to build a social network, What technology should I use for it?
  • How to find (Perfect) Technology for my next idea?

They don’t make any sense at all in the way they have been asked.

It is impossible to give recommendations about the technologies without knowing more about the qualities, priorities and goals of the system.

By the end of this post, you’ll have a crystal clear sense of what needs to be done, if you want to choose the technology stack for your next Application.

Lets begin!

A Basic Web Application Tech Stack

A tech stack is a combination of software products and programming languages used to create a web or mobile application. Applications have two software components: client-side and server-side, also known as front-end and back-end.

One of my favourite definitions of Tech Stack is:

A tech stack is simply a description of the technologies that your company uses.

A business plan might be a good non-technical analogy.

A description of the core of what you do that you can condense into an elevator pitch if needed, but you could rattle off details for hours to anyone who will listen.

There are two sides to web development Client-end programming and Server-end programming.

Client-end is also known as Frontend.

Frontend code runs on your users’ devices – their Desktop, Laptop, Tablets, Mobile Phones.

It is built using HTML, CSS, and Javascript.

HTML tells a browser how to display the content of web pages, while CSS styles that content.

Bootstrap is a helpful framework for managing HTML and CSS.

JavaScript (JS). JS makes web pages interactive.

There are many JavaScript libraries (such as jQuery, React.js, and Zepto.js) and frameworks (such as Angular, Vue.js, Backbone, and Ember) for faster and easier web development.

Server-end is also known as Backend.

A backend runs on your company’s servers, either in your own datacenter (computers you own or rent) or in a cloud provider like Amazon Web Services (AWS).

Some popular languages and frameworks are Python/Django, Ruby/Rails, Javascript/Node.js, Java (no relation to Javascript), and PHP.

Frameworks for programming languages are time savers.

A database stores information.

Your web application needs a place to store its data, and that’s what a database is used for.

There are 2 types of databases. Relational like MySQL, PostgresSQL and Non-relational like MongoDB.

Cache provides faster access to key data and reduces the load on database. Memcached and Redis are the most widespread caching systems.

*****Heres an example. Make a youtube video explaining the frontend and backend. https://twitter.github.io/typeahead.js/examples/

The Functional and Non-functional requirements

A functional requirement describes what a software system should do. Non-functional requirements place constraints on how the system will do so.

For Example, A banking application. Able to create a new account, update or delete an account, etc. is a functional requirement.

Availability of the application should be available 24/7 with no down time if possible is a non-functional requirement.

Typically non-functional requirements fall into “ility”.

ility is an abstract quality that good software should exhibit.

Accessibility
Extensibility
Interoperability
Maintainability
Scalability
Supportability
Testability

A more complete list is available at Wikipedia’s entry for non-functional requirements.

And now, since you know what Tech Stack is lets dive deeper into choosing the perfect one for your next project.

Whether you’re bootstrapping a startup or the overseer of a tech empire, there comes a time when you have to make tough decision.

You’re getting ready to build (or rebuild) a new application that will be vital to your company’s continued success.

Web applications can be simple or complicated based on its complexity.

It is classified based on the relationship between tasks, planning, task interdependencies.

Knowing the type of web app you’re developing isn’t enough; you should take its business goals into account as well.

Business Goals

Business goals are the foundation on which software systems are justified, analyzed, and built.

If you’d go to stakeholders and ask them about business goals they’d just say they want performance, availability, scalability etc. but that’s not really helpful.

According to the study report by Rick Kazman and Len Bass using an example of utility tree they have tried explaining the business goals appearing at the upper levels and quality attribute scenarios derive directly from business goals.
https://resources.sei.cmu.edu/asset_files/TechnicalReport/2005_005_001_14621.pdf

Example. Lets say social network, this system technically it can be built within one huge single C++ file that is compiled into one huge single art effect.

Will this system be functionally be complete?

It might be… But will this system be maintainable?

Oh no it will be totally impossible to do something with this code…

Will you be able to find new developer somewhere in the market to work on that code?

Well no not at all….

So you see the system that is functionally complete will be so far away from the system that you wanted to receive right?

So the quality attributes are how our system should behave and how you should develop it?

This is what defines the choice of the technology as you see.

And usually at this point someone jumps in and says that Nodejs is so amazing…

I have heard about it asynchronous I/O and saw the benchmarks that Nodejs is like 70 times more performance than Java so lets all use Nodejs.

Well Nodejs is a great technology I like it but you need to stop thinking about performance.

So you are saying you need performance… you want your system to be fast thats great.

And my next question is what exactly is fast for you? Can you define fast? Is it like 50 secs, 100 msecs, 1000 msecs fast?

What are you building?

Are you building a system that will look out into the internet or you’re building an alto trading application that is resource intensive and needs to calculate each and every microsecond?

Most of the people are building things for internet and then I say you know what the perceived performance of your system will be dominated by the network conditions so your mobile operator will define more about the performance of your system than your backend technology.

And even in the perfect network conditions;

Your database will most likely be the bottleneck so you will need to think about optimising the data structure may be adding some cache if you want to really optimise the performance.

And in the most case after this type of a discussion turns out that performance is not a critical attribute at all and most of the frameworks, most of the backend technologies will satisfy the performance requirements for a particular system.

But than if the performance is not an issue what are the others?

No matter which technology you choose? Will it be Java, Nodejs, Python, C++, C# – whatever you’re making a compromise to trade one attribute over other quality attributes and thats exactly how you approach this decision.

So you stop from writing down the quality attributes of the system that you want to receive.

If you say I want performance don’t forget you can just write I want fast and be as specific as possible so write down I want my system to answer within 100 msecs to the 90% of the requests. Other 10% of requests I am okay to answer within 1.5 secs.

If you are talking about this aspects don’t forget things like

The volumes of data that you are dealing with, the amount of the concurrent users that are connected to be as specific as you can one defining those right? And than talk about the other quality attributes.

Time to Market

Time to Market (TTM) is the time required to realise a product: from the idea generation to the market launch.

It includes the full cycle of design, development and delivery of the new product to the market.

  • Align project requirements with budgets and set priorities in a product plan.
  • Focus only on those projects that can be carried out with available resources. Fewer is better.
  • Models are great, but try to plan a project with a tailored development process.
  • Involve team members in project planning to enhance their understanding and commitment.
  • Make use of a Cross-Functional Team.
  • Ask project team members for a full-time engagement.
  • Accurately plan and manage resources, avoiding overloading any personnel.
  • Identify risks and take into account that additional resources may be needed at certain points of the process.

Technical is one aspect of it and finally we need to assess the marketing environmental conditions too.

Example, although we may have developed a product that offers great appeal for consumers, a recession may cut demand dramatically.

So time to market can create a chicken and egg situation. One example of describing it by USC Marshall School of Business is

https://www.consumerpsychologist.com/images/chicken-and-egg_problems.jpg

And yes quick time to market has its own benefits.

  • Premium Price, as a consequence of being the first market mover. When a company launches a product that is not yet available in the competitors’ product portfolio the market justifies a higher price.
  • Competitive Advantage, by being the first to launch a product.
  • Longer Life Cycle of the Product.
  • Earlier Break-Even, Higher Return on Investment and profitability.

Development Cost

$28,329

Just kidding – but it as well can be around that sum.

Create user stories collecting all Known Knowns and the rest, then use them to develop possible user journeys and engineering tasks.

Ask questions, Clarify the scope. Each team expert need to know their tasks.

Estimate each task.

Estimate the most optimistic, most likely, and pessimistic time for development to know the estimated time.

Example. Say, you want an online ordering system for burger delivery.

We know that for such a project, the user will need to

  1. Log in
  2. Navigate through the menu
  3. Checkout the cart.

To implement each feature, we will need this many days:
There’s also such a thing as Standard Deviation.

Here’s how it’s calculated:

So with 95% confidence interval. So, the final formula will be like this
So,
to

implement the most fun feature – Cart checkout, we will need 10 ± 3 days.

Communication, Creative Process, Project Management, Additional Tasks. Maintenance Costs…

Security

Security should never be neglected.

May be its the most important or may be NOT.

Determine why you need to secure something before deciding how to secure it.

But remember, technology isn’t everything — keep in mind that security depends primarily on the skill set of your developers, the work environment and the policies you implement.

Evaluating Technologies

I would just simply dig into different technologies and what they’re good at.

Asking questions looking at tools that I might like to use.

  • Is the technology well-documented?
  • Is there an active community around it?
  • If it’s a new framework, how quickly is it changing?
  • Does it have a corporate backer? If so, what is their track record in supporting technologies?
  • Is it easy to test?
  • How difficult will it be to hire developers to work on it?
  • What does the ramp-up time for learning it look like?
  • Is there something unique about your business needs that only this technology can provide?
  • When it comes to hosting and DevOps, do you have resources?

Since lets say you have Javascript and Java background and comparing both however yes you can do the same exercise for the other technologies as well.

Example. lets say you are going to build an application for a hackathon with other 4 team mates. And you need to do this in 24 hours.

What will be the dominating quality attribute in this case?

First will be your background, your technology background because you don’t have anytime at all to learn something new.

Second will be how fast can you deploy the new features. How fast you can rebuild, redeploy and see the changed code working already on the server.

So in this case I will I might vote NodeJS because Nodes is starting up so quickly and if you restart the application you see the changes instantly.

While with Java you need to package a Jar file and deploy to a Tomcat server.

Another case you have to build sometime different, totally different system.

Say you have to build enterprise system with a reporting solution that will not have any frontend at all.

It will just have backend which will take the data from and huge oracle database that hasn’t exist in structure database.

I need to take the data and generate the report and generate the pdf and send it to the recipients.

And you don’t have just 24 hours. May be significantly more and years to develop.

So this design should will be dominated by the price of support right?

Technology Stacks Behind Successful Web Projects

https://rubygarage.org/blog/technology-stack-for-web-development

Conclusion

May be you’re just picking up the technology stack because of competitors experiences, personal preferences or previous projects.

Don’t Choose Based on Competitors’ Experiences, Personal Preferences and Previous Projects

Trusting sources of information on internet is difficult. Which source to believe?

Be realistic and study the pros and cons.

The main rule: don’t rush, and be careful with your wants.

STAY CONNECTED!