Development environment of a polyglot programmer

5 minute read

Disclaimer: Everyone has an opinion on this subject. This is mine. I am not saying this is the best way of doing things, just the set up that suits me the best. This post is gonna cover the environment where I actually work. I won't be discussing whether to use Mac or Linux, which framework is best or whether apps should be written natively or with React Native. That is up to you and should be decided on a project by project basis.

My dotfiles can be found here.

First a little about me. I'm a full stack developer and spend most of my time writing Javascript in some shape or form, on both the front and backend. I am also heavily involved in mobile development making use of React Native, Java and swift, depending on the needs of the project. In my free time, I like messing with hardware and the IoT, and hacking on CTFs.

What I am highlighting here is that my interests are pretty broad and that a single working environment might not be the best. I am all for becoming a master of my tools but not at the expense of working in software that is not fit for purpose.

My day to day

I'm a terminal man at heart, therefore have spent a considerable amount of time getting it just right, collecting tools that meet my needs and combining them into an environment where I can work comfortably and productively. A large portion of my day will be spent here so I want it to fit like that favourite hoody.

Tmux

Running it all is iTerm2 with ZSH as my shell. I have added oh-my-zsh which adds a ton of extra functionality.

A delightful community-driven (with 1,200+ contributors) framework for managing your zsh configuration.

I use Tmux to give me the ability to have lots of windows and split those windows in a way I feel I need to. Tmux is a terminal multiplexer. I definitely don't use it to its fullest but it suits my workflow. I extend Tmux with Teamocil which allows me to script layouts and commands that I use regularly.

A couple of other must haves are:

I use NeoVim for a lot of my daily programming. It is a huge improvement over the original version of Vim. The async nature of NeoVim streamlines the development experience. Gone are the days of waiting for autocompletion to finish blocking other Vim processes. I have spent a long time getting Vim to work in the way I want it. I won't go into it all as it suits me and might not suit you. If you are interested take a look at my init.vim config file.

For git, I split my time between Magit, command-line git and Git Kraken. My general git workflow makes use of Magit and command-line git. For complex merges and when committing lots of files in separate commits, I like to use Git Kraken. I find it much easier to visualise the flow of code in a GUI.

Magit is a fantastic Vim plugin that opens your current changes in a new pane where you can selectively add files/lines and run all your other common git commands.

Native Development

Whether I am working on a strictly native project or having to delve into the native side of things in a React Native project, each of the respective platforms has there own coding environments. It is unavoidable really. Both are ok. Neither is great.

Android has Android studio, iOS has Xcode. Both offer excellent IntelliSense type completion of their respective SDKs. These SDKs are so extensive that this autocompletion is essential. They also handle the provision of simulators and build tools. Even if they don't provide the best working environment they are hard to do without.

If I am working on a React Native project then I will be in Vim unless working on a native module. React Native Debugger is an indispensable tool when writing RN apps.

Hardware and the IoT

I spend most of my time tinkering with ESP** boards and Raspberry Pis. This means C, python and javascript.

I have found that VSCode supports these languages really well and that the frameworks I use have VSCode extensions that greatly simplifies working on these platforms.

I obviously have the Vim extension that simulates the Vim experience. It does an ok job but it is just not quite right. It is sometimes a little slow and the configuration options are not quite on point.

If I am honest. If the Vim support improved I would probably move to VSCode for the majority of my work but it is not quite there. One day, maybe.

CTFs

For CTFs (capture the flags) I will run Kali Linux in a VM and the vulnerable system in another VM. Running Kali this way gives me access to all the tools that I might need, in an environment that is disposable. I can do anything I need to do and just dump it when I am finished. Both NeoVim and VSCode are easily installed so I have a familiar coding environment at my fingertips.

Conclusion

What I am trying to get over in this post is that you have to adapt. People are often so concerned about what environment that they work in that they miss the fact that in certain situations other tools might serve them better. They are doing a disservice to themselves. Have an open mind and use the tools that let you work in the most productive way.

My dotfiles can be found here.