My tech stack in 2020
I'm a bit reflective today; I guess because we are approaching the end of this so-odd year. Therefore, I'd like to share what has been my preferred tech stack in 2020 and what most likely continue to be in 2021.
React for building web frontends
I like React's approach to building declarative UIs. The React's movement led to an explosion of community components that make building UIs feel like LEGO, and great tools and processes like CSS-in-JS that save you a lot of time and improve the developer experience. I haven't tried Vue myself; therefore, I can't say much about it. I'm not a huge fan of Facebook steering the framework, but I'm optimistic it'll become (if it hasn't been done already) a community-driven project.
Gatsby for building static websites
Netlify for deploying static websites
Netlify is an excellent example of an abstraction that improves the experience of putting a static website on production. They provide an environment where my Gatsby websites can be built, and placing the resulting HTML artifacts in a CDN network that I can point my domains to. One of its breakthrough features is deploy previews. They deploy PRs to temporary environments so that people reviewing your PRs can check out the changes live. They provide many other features, but I haven't used them yet.
Rails for building web services
These are the Gems that I usually add to projects: Devise for authentication, Pundit for authorization, Sidekiq for running background jobs, GraphQL Ruby for defining a GraphQL API, Webpacker for using React as a frontend that interacts with a GraphQL API, and Rubocop for code linting.
Heroku for deploying web services
I'm not an infrastructure person, so I appreciate services that put my code into production. Netlify is that service for statically-generated websites, and Heroku is its counterpart for long-running services like Rails applications. I can create a new project, link it to a repository that contains a Rails app, and in a matter of minutes, I have a Rails app up and running on production. I can add a PostgreSQL database and a Redis instance that I can point Sidekiq to through add-ons.
As a side note,
I have to say I like the
which allows me to open a Rails console with the production instance and debug issues in production:
heroku run rails console
GitHub Actions for continuous integration
Since GitHub introduced it, GitHub actions became the go-to continuous integration service. I like it because it's integrated into GitHub's UI. The user interface is fluid compared to other services that I've used in the past, and it's straightforward to reuse CI logic across projects by defining actions. It took a long for GitHub to step into the business, but I have to say they beat the market with an extremely high-quality product.
TailwindCSS for styling web interfaces
TailwindCSS is probably the discovery of the year. The framework introduced me to the concept of utility classes in CSS; after learning a set of semantic HTML classes that match to CSS styles, you can easily style your HTML without having to jump back and forth between HTML and CSS files. Moreover, classes delimit properties such as color and margin to a pre-defined set of values. As a result, UIs look more consistent and harmonious.
After coming across the framework, I followed the authors of it, x and y, and I've been a massive fan of the work that they've been doing. Another masterpiece from them is the RefactoringUI book, which teaches you ideas to build beautiful and clean UIs. I also paid for a license for TailwindUI, their set of pre-defined layouts implemented with TailwindCSS.
Ruby for command line tools
Even though I'm building Tuist in Swift to make it easier for users to contribute, Ruby is my programming language for building CLI tools. It comes with the system, I'm incredibly familiar with it, and there are many useful Gems from the community that I can reuse. Moreover, its dynamism makes it very suitable for experimenting with ideas and workflows. Doing something like that in Swift would require going through Xcode and its compilation cycles, which takes the focus away from prototyping and hacking.
VSCode for editing code
I love VSCode. It's a masterpiece from Microsoft. I can use it with multiple programming languages like Ruby and Typescript, extend it through community-built extensions, and configure it through workspace settings. Even though it's built with Electron, which inevitably means using more computer resources than other editors built natively, I haven't tried any other editor that is as close to as significant as VSCode is. Between developer experience and efficient computer resource usage, I lean more towards the former in this domain.
React Native for building apps
I like Swift and Apple's direction with SwiftUI, but I can't reuse the work that I do for Apple platforms in other platforms like Android and Windows. Shopify's adoption of React Native has taught me that you can build great products in React Native; you need to make the technology an implementation detail and focus on the product. In recent years I've shifted from treating technology as a goal to using it as a means to build tools that solve users' problems. To achieve this, I think React Native is the most suitable option, and I can apply all the concepts and learnings from building web UIs with React.
...and this is my preferred stack. What about yours? If you write a blog post about it and share it on Twitter, don't forget to tag me (@pedropbuendia); I'm curious to see what other folks in the industry are using.