A shell is important for professional software development. Most of the interesting tools to manipulate a computer are available via a shell command.
I’m comfortable with and use Bash occasionally, but I use zsh if given the choice.
Source Control Management
Git, the best source control solution out there, is critical for modern software development.
I personally believe that “two heads are better than one”; therefore tools that enable others to work together better are paramount to the delivery of high-quality digital products.
Git is one of those tools. It’s fast and efficient, exposes well thought out concepts via a sensible interface, and is free and open-source.
The internal data structures are excellent — pursuits towards learning how Git works rewarded me with a better understanding of building great software.
I love Git. It makes the experience of building software more fun because it’s so reliable and consistent. I’m almost never scared I’ll lose code with Git which encourages me to try different things.
I use a text editor to modify the code of the digital products that I’m working on.
Modifying code is an important part of my work so I’ve made sure to try most of the mainstream text editors including:
- Vi, Vim, Neovim
- Visual Studio Code
- Sublime Text
- JetBrains’ suite of Integrated Development Environment (IDE) tools
Choosing just one editor is complicated. I personally have most of the aforementioned tools always installed in my development environments as I can appreciate some of their differing strengths in specific situations.
For example, sometimes I just want to browse code.
Maybe I’m investigating a bug.
I find that the JetBrains’ suite’s Cmd + Click shortcut to go to the definition of variable, function, etc. to be the most efficient way for me to get to the root of the bug. I can do it on other editors, but the JetBrains’ suite is usually faster for me.
Writing code? Vim’s modal nature, combined with word objects, and other unique ideas makes it the best choice for editing code (for me) every time.
I’m aware of Vim emulation plugins. None of them are full-featured enough for my personal standard.
If I had to call something my default editor, then it’ll probably be Neovim. It’s the only one that I’ll be the happiest to use if a one-editor life is forced on me.
I’m happy, though, that in reality, I can choose whichever editor I deem best for whichever situation happens to be at hand.
Neovim is, in my opinion, a better version of Vim but I use regular Vim where it’s not possible to use Neovim (e.g. limited server environments).
Out of curiosity, I tried Vi and found it to be a stripped down Vim with the nice parts missing.
My favourite programming language to use to build digital products for the web is Ruby.
Furthermore, the Node ecosystem is vast and powerful — especially for software developers.
Build tools such as Webpack go hand-in-hand with the Ruby and Rails world and allow you to combine something like React with Rails if you want.
Anyone who knows me will know I love Postgres. It’s a brilliant general purpose fully-featured database with great performance and reliability. It’s familiar to the Ruby on Rails world who have embraced it with open arms.
Redis a flexible key-value data store that is commonly used as a cache or message broker. You can even use it as a very basic database.
Elastic Search is excellent for those who want to implement a custom search engine.
Kafka is a powerful, reliable, and consistent distributed log. Kafka enables an application to support event sourcing, stream processing, website activity tracking (the reason it was originally built), and more advanced techniques required to be performant at scale.
GUIs I don’t shy away from software with GUIs and, just like my philosophy on multiple editors, I have GUI programs installed for things that I do in the command line. Sometime I like to visualise my git commits in a dedicated app, or use a GUI client for Postgres. For the way I work, they’re a “nice to have sometimes” and not “required”.
The programming aspect of building digital products is a complex one. The level that I’ve looked at the tools does not paint the full picture.
For example, there are development tools that the Node and Ruby ecosystem introduces (e.g npm, bundler, yarn, babel, etc.), that are just as critical as the programming languages themselves, that I chose not to go into for the sake of brevity.
Hopefully this serves as a good high-level overview of the types of tools that I use every day to help towards building high-quality digital products.
P.S. it’s also neat that every tool I mentioned — sans the JetBrains IDEs which can be opted out of — are free and open-source.
I paid for all the software I tried but ended up gravitating towards the free and open-source ones. Cool.