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.
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 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/
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.
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 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 (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.
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.
$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
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 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.
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.
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.
Post a Comment