In this article, I will talk a bit about my personal tech stack and related tools for Web Development.
But, before starting, let me just do a brief introduction about myself.
I am Web Engineer, working atm in an E-Commerce/Payment company where I do mostly Backend development, using Golang and Java as core technologies.
I started programming in 2011 after graduating in Computer Science.
I was still looking for my real passion, and working in a very small startup as my first job, forced me to do a little bit of everything from frontend to backend and some basic ops, in the old days where HTML, CSS, and jQuery were enough to build a frontend.
Over the years I specialized more in Backend development, mostly using PHP and Symfony.
Backend development, software architecture and engineering practices are my main focus and passion, but I want to understand all the areas of the Software Development Life cycle and be able to build and launch any product on my own, "from idea to production".
That´s what I aim for, and try to balance my learnings to reflect that.
It´s almost impossible to be a complete expert full-stack dev these days. The tech world is just too broad. but I also don't believe in "Single Language" developers.
The ability to learn and adapt fast is an essential skill.
I think the sweet spot is somewhere in between. I identify a lot with the concept of T-Shaped developer.
Nowadays, the term full-stack developer is also very subjective as there are many more areas besides the traditional Frontend/Backend.
I like this definition by Adam Wathan:
Adam Wathan@adamwathan@tlakomy @laurieontech Being full stack doesn’t mean you know every single thing about every technology you could possibly use to create software for the web. It means you can create and deploy a web application by yourself. Rails + jQuery + Heroku is “full stack” by my definition.21:06 PM - 21 Oct 2019
And this is the kind of full-stack I want to be.
In the next sections, I will present some of my favorite technologies and tools for all the areas of Web Development.
Bear in mind, that I am not an expert on all of these. Far from it.
The backend technologies and some infrastructure yes, I have deep experience and use them a daily basis.
Others, it´s more a theoretical knowledge from reading articles and books and small experiments, but I am convinced of the value of these and plan to use them in real projects when I have a chance.
So let's start with my main area of expertise, Backend development.
I have two main languages in my stack. PHP and Golang.
PHP and Symfony are the technologies that I am more comfortable with, since I worked with them for the most part of my career, from the old PHP 5.3 and Symfony 1.4 to the shiny PHP 7.3 and Symfony 4.
PHP might not be the most popular and pretty language today, far from it, but it´s a very mature language that has received some great improvements in the past few years. It also has some great libraries and frameworks and a strong community.
It´s a "boring" language and IMO, having a boring language in your stack, that you can rely upon to build working software fast without thinking too much is a must-have for any developer.
I wouldn't probably be so keen on PHP without Symfony tough.
Symfony is an amazing and mature framework that focuses on good OOP design and Design patterns. It has very good documentation and a strong focus on Developer experience and performance.
If you like OOP, Design patterns and Clean code, Symfony is a joy to work with.
I am not working with Symfony anymore at work, but I have worked for many years and I can build products very fast with it.
I have been working with Golang professionally for more than one year and it´s been a fantastic experience.
I think it complements PHP really well, as some of the strong points of Go are precisely some of the PHP weakest points like concurrency and long-running processes.
Go it's incredibly light-weight and strongly typed, which I like. It´s not really an OOP language but has some powerful concepts like interfaces that help to build well structured and modular codebases.
Goroutines are awesome for building highly concurrent applications.
Being a compiled language makes it easy to distribute and install, making it one of the best languages ideal for Command-line applications, System Tools, and utilities and microservices and APIs.
I am writing more and more Go and it´s becoming my primary language.
With Symfony and Go in my stack, I believe I can solve 99% of problems related to Backend development.
I will continue using more and more Go, but I will always have Symfony in a special place in my heart.
Typescript is a language that I have an eye on as it gets more and more popular.
I have never really done everything with it, but if one day I want to replace PHP as the OOP language in my stack, Typescript is looking like a strong candidate.
I would also like to play with a more functional language. Scala, Haskell, not sure yet.
One of my goals for next year is to improve my front-end skills.
With a new JS framework every week, and me not wanting to become a frontend developer, choosing a stack that is stable and mature, with good backward compatibility records, good documentation, and a big community around it, are very important factors to look into.
I choose Vue because I prefer the way it is designed with templates instead of JSX for example and I think it´s easier to understand.
Vue has a great ecosystem of tools and libraries.
I could even hook Nativescript to build native mobile applications.
Some of the React tools are more mature, like Gatsby compared with Gridsome, but still, I hoping them to catch up.
A big pain for many backend developers is CSS. I also really suck at design.
Or you could go with classic Bootstrap and buy some themes from sites like Themeforest.
Every developer needs to do some kind of utility scripts once in a while, from data migration utilities to deployment scripts.
Python is one of the most popular languages for these kinds of scripts because it´s really simple to learn and comes pre-installed in many systems.
But Go also fits really nice on this. You can run it locally with a simple "go run" and you can compile it in a single binary with all the bundled dependencies (which is a pain in python), to run on a remote system.
I can write Python, but since I have much more experience with Go, it´s becoming a natural choice for this kind of scripts.
With a little help of bash for more basic things ;)
Almost every application needs to store data in some form.
Cloud Firestore is really interesting when I don't want to worry about setup a database and NoSQL storage is enough. It´s really great for prototypes, small personal apps, and frontend/mobile-focused applications.
There are many use cases where a Message Queue system is useful like long-running processes or communication between different services.
At my current job, I use Apache Kafka and it works great for complex, event-driven systems.
Another great service, more specialized in media upload is Cloudinary.
Code that is not in production is not really useful.
I believe every developer should understand the basic concepts of infrastructure and application deployment.
I am a big fan of the concepts of "Operate what you build" and "Full-Cycle developers" of Netlfix, where the team that develops a system is also responsible for operating and supporting that system.
You can read more about it in this blog post.
Cloud services make all this easier for developers by abstracting the low-level complexities of networking, storage, etc.
For generic all-purpose hosting, DigitalOcean is my platform of choice. It´s very developer-friendly and provides great services at affordable prices.
Their services offering is not as rich as bigger players like AWS or Google Cloud, but the introduction of managed Kubernetes clusters and managed databases were a great step forward.
In the cases where DigitalOcean doesn't cover all my needs, I go to Google cloud.
These tools have a great free tier, allowing building small projects for free.
When I just need to deploy a frontend or a static site, I use Netlify.
For monitoring, both Google Cloud and DigitalOcean offer good basic monitoring built-in.
I am still looking for a good Logging Solution. Logz.io looks nice and it´s based on the ELK stack which is very popular and what I use at work. Their Community plan is also very generous for small projects.
I am using GitLab for private projects and CI/CD, but with the available free plan for private repositories and the introduction of GitHub Actions and Package registry, I might move everything to GitHub. It´s a tough decision as I love the Product vision of GitLab, but GitHub is still more polished in some areas.
Codacy gives me automated code reviews & code analytics and it´s free for 4 users.
I really like my stack and I believe I can build almost anything web-related with it.
It´s not a static list.
In tech, everything evolves at a very fast pace.
It´s important to keep updated and experiment with new tech on a regular basis and my stack will keep evolving based on that.
But it´s very important to avoid "Hype Driven development".
Always have some "boring" mature tools in your stack, which allow you to keep building things in a fast and sustainable way.
In the end, people are what matters, so focus on building useful things that improve people´s lives, independent of the stack!