← Return home

Choosing the right tech stack

Having studied computer science in college, and after learning several languages and building out personal projects, I've accrued a playbook for how to choose the right technology for the right project. I am all too familiar with the analysis paralysis around choosing the "right tech stack". I am often approached by budding entrepreneurs and builders who spend a lot of time debating their choice of tools. So, I'd like to share some advice to help people in their work. Let me know if you find any of this useful or have any comments. You can reach out to me on hello@sarim.work.

General advice

The first comment I have on this topic is that the importance of choosing the right stack depends on how far you've gotten with building out your product. If you are in the early stages, I recommend building out prototypes with XD or Marvel instead of worrying about the right technology. While it's true that knowing what technologies are out there can help you feel out the possibilities, it's also useful to ideate without these constraints.

If you're at the stage where you are starting to write code, I will first offer this piece of advice: there is no one right tech stack. Sure, there are some popular technologies out there that have gained popularity and might even be called "defaults", but you should play to your strengths and write code in whatever language or framework you feel comfortable with. One of the most valuable pieces of advice I've received from other engineers is: don't become a gearhead. In other words, don't get so caught up in the tech hype that you keep writing and rewriting code - a Sisyphus with a keyboard - all the while your product remains unreleased.

With that said, below are a few concrete pieces of advice that can help you in your research.

GitHub

Let's assume you've done some preliminary Googling and have felt out the lay of the land. You might have encountered some terms like "React", "Swift", "GraphQL". It's worth reading quite generally about how all the pieces fit together. What are the ways in which these technologies are commonly used? What do they achieve compared to known alternatives? Work off of your existing knowledge if you can, and if something doesn't make sense, take a step away from your computer and read it again later. You'll know that you've read enough if you can understand why some people might be excited about that technology, or better yet if you become excited about it.

With most open source software residing on GitHub, it makes sense to start your search there. Use the advanced search option and type in a few terms. Filter by your preferred programming language. If there are a lot of obscure results, put a threshold for the number of stars. Sort by "Most recently updated" or "Most stars". There will be a few libraries that surface again and again that will be far more popular than the rest.

There are a few signals to judge a repository's quality. See if it has detailed documentation, and more importantly if it is well written with examples. Check the most recent commit. Has the author abandoned this repo? Check the most recent issues and see what the prevailing issues are. Are issues being closed or are they piling up? If the repository is part of the JavaScript ecosystem, compare the number of downloads at npmtrends.com.

Unfortunately, maintaining open source software is HARD, and you are probably better off sticking with code supported by a company or group of volunteers, rather than a solo effort. You might also want to opt for a repo that has been around for a while. The longer a piece of code has been around, the greater the likelihood that it has been tested well and bugs have been eliminated. Of course, the threshold for repository age varies based on the needs of your project; it might be worth springing for a newer or lesser known technology if it provides a convenient new feature, as long as you are prepared to stomach additional debugging time in uncharted waters.

Let me illustrate my GitHub advice with a personal search. I recently needed a tree view component for React (a frontend JavaScript framework). I searched for "tree view react" on GitHub, filtered by TypeScript, and checked the default, "Most recently updated" and "Most starred" results. I made a shortlist of ten libraries and scanned their documentation. I discarded those which did not have the particular feature I needed (drag-and-drop). For the rest, I checked the quality of examples, the number of issues and the date of most recent commit. Finally, with three libraries remaining, I tried them all to see which one worked best for me. Although I was searching for a UI component, this same procedure can apply to your search for a framework, build tool or programming language.

Communities

You might be a solo founder or developer, but that doesn't mean you can't benefit from the wisdom of your colleagues or other engineers. I used to build out my web apps with Flask, until a colleague showed me that using React and Firebase could be a faster way of prototyping ideas. And now those technologies are my first choice when I want to build something.

Serendipitous interactions in the real world are at a bit of a premium right now, but there are also online communities where debates rage about the latest technology or framework. If you are not sure about your choice of technology, you can look at anecdotal evidence at Hacker News or Reddit. Hacker News has Algolia search where you can punch in keywords about your stack. Just be prepared to shield yourself from the occasional toxicity in these communities.

Instead of consulting GitHub, Hacker News etc. at the moments you need them, it might be useful to subscribe to a diet of tech news from a mix of forums and blogs. GitHub Explore, Stratechery, Hacker News, TechCrunch, ProductHunt, subreddits; all of these outlets can provide information at varying levels of generality (some of them deal with trends, others with bare-metal specifics) and usually provide RSS feeds. On macOS/iOS, I use Reeder to aggregate these feeds, and open the app every morning to educate myself on what's new.

Learning something new

So after all that, you have identified a few technologies that you want to build your product with. How can you learn and use them effectively?

Having been a teaching assistant and having worked with a lot of other engineers in my classes, I think it's hard to provide advice in this area that uniformly applies to everyone. Different people learn differently. Some like poring over documentation and reading dense manuals (to which I say NOPE), others feel out a technology by building out toy examples or by rewriting a non-critical/personal app in the latest technology (my preferred approach). I have rewritten my personal website many, many times, which was a great excuse to learn about Flask, Gatsby, Next, Nuxt, TypeScript etc.

I will repeat the adage that practice makes perfect. It took me many months before I was able to grasp some of React's advanced concepts, and I am still learning. Not knowing a technology completely should not preclude you from building out an amazing product. As your understanding of the tech matures, you can replace pieces of your app with code written with best practices. In the meantime, it's important to continuously conduct user testing and gather feedback. It's a delicate balancing act, but one that ensures your product vision matures along with the code.

I personally learn best with some guided structure. I have found Udemy to be an invaluable resource, especially since most courses are on sale and about $10. In this way I have learned Vue, React and TypeScript. But not everyone has the financial resources to access these courses. Your institution might provide you with access to Udemy or Lynda for free, or you may also look at Scrimba, Fireship and assorted YouTube tutorials, which are free and can be of very high quality.

I would caution against reliance on one-off Medium (or similar blogs') posts which often seem hastily put together. I might be biased against Medium, but the tutorials are often snippets of code that do not encourage understanding of the tech. They can also be outdated, especially since some spheres of the engineering world are fast moving targets (frontend engineering in particular). Sometimes, looking at these posts is unavoidable though, so I recommend sorting your Google Search results by the past month or past year so that there is a higher likelihood that these web tutorials are up to date.

Final words

It's important to approach your project with realistic expectations. There is no perfect tech stack, and any library you choose will have its own bugs or limitations. The trick is to figure out how to circumvent those limitations or abuse the library so that it works for you. If you're stumped, it's worth posting to Stack Overflow or submitting an issue on that library's GitHub repo. In my experience, maintainers on GitHub are pleasant and responsive (at most, they will respond within a few days). Always make sure to thank others for their work/help! In this way you can play your part in growing an online community, while making progress on your awesome app! Good luck!