Every developer has their own tools and set of applications that they use on a daily basis. Let me show you how I work and which tools I use every day while writing code or working on my pet projects or work projects. Grab your tea or coffee, and enjoy reading!
How I prepare my work station
I use a set of tools to configure and set up my development machine. For achieving this, I use Git and Ansible, which help me install all the required software, its configs, and other stuff to get my machine ready in 10-15 minutes.
If you are following me on Twitter, you might have heard I got scammed a few weeks ago, and it forced me to reinstall my operating system and set up my machine from scratch.
How much time do developers usually waste configuring their laptops? Hours or even days. For me, it took about 10 minutes. The rest of the settings I do manually, like installing crypto wallets, configuring browsers, and so on. Of course, it could be automated as well.
How do I do that?
I just clone my dotfiles repo from GitHub and run an installation script, which does all the required work, such as placing configs in their directories, installing software and tools, and configuring my macOS settings from the terminal (including TimeMachine settings!).
What is inside?
Here, I install Xcode, set up TimeMachine to add folder exclusions, remove temporary directories and Node modules from OS backups, install HomeBrew with its packages, and provision everything with Ansible scripts.
Just run and wait a bit. Magic!
HomeBrew (package manager)
As a Mac user, I manage almost all my software and tools using Homebrew (of course, I love SetApp as well). It’s a package manager that helps me keep my apps updated and fresh. When I set up my new laptop, the first thing I do is install Homebrew and download my config from GitHub.
Just take a look at the list of available applications out there: https://formulae.brew.sh/formula/. It’s absolutely incredible.
If I need to install new software, first of all, I try to install it using Homebrew. If there is an available formula, I just update my GitHub repo and execute the provisioner. Everything stays updated.
Vim (text editor)
My number 0. When I started programming in 2000s, I began with Norton Commander and its internal editor. For many years and across various programming languages, I’ve used different code editors and IDEs: NC -> Notepad -> MC -> Vi -> Notepad Plus Plus -> Vim -> Emacs -> Visual Studio -> Sublime Text -> NVim -> Sublime Text -> Atom -> VS Code -> NeoVim.
Here is what my Vim looks like:
I started with Vi on FreeBSD in 2001 or 2002 and still use it almost every day. From time to time, I gave other editors a chance, trying to find the best one for my needs. However, I always come back to my motherland – Vim. I can’t explain why, but Vim is like a third hand, or even two more hands, for me. I tried to use internal Vim bindings in other editors, but it doesn’t work for me.
In my development career, Vim is everything: coding, infrastructure, writing posts, taking notes, managing tasks per project.
I’m too old to switch to Lua settings in NeoVim, so I’m stuck with my old setup, and it still works best for my needs.
My go-to plugins:
Plug 'vim-scripts/TaskList.vim'
Plug 'tpope/vim-fugitive'
Plug 'gregsexton/gitv'
Plug 'airblade/vim-gitgutter'
Plug 'vim-airline/vim-airline'
Plug 'godlygeek/tabular'
Plug 'ap/vim-css-color'
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
Plug 'vim-syntastic/syntastic'
Plug 'tomtom/tcomment_vim'
Plug 'editorconfig/editorconfig-vim'
Plug 'terryma/vim-multiple-cursors'
Plug 'vim-ctrlspace/vim-ctrlspace'
Plug 'rking/ag.vim'
Plug 'tpope/vim-endwise'
Plug 'jiangmiao/auto-pairs'
Plug 'tomasr/molokai'
Plug 'ekalinin/Dockerfile.vim', { 'for': 'Dockerfile' }
Plug 'neoclide/coc.nvim', { 'branch': 'release' }
Plug 'zivyangll/git-blame.vim'
Plug 'rhysd/git-messenger.vim'
Plug 'tomlion/vim-solidity'
Plug 'neoclide/vim-jsx-improve'
Plug 'pantharshit00/vim-prisma'
Plug 'elzr/vim-json'
Plug 'plasticboy/vim-markdown'
And the following plugins I activate when I need to work on specific projects or with programming languages, such as Go, Ruby, or PHP:
Plug 'pearofducks/ansible-vim'
Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries', 'for': 'go' }
Plug 'vim-ruby/vim-ruby', { 'for': 'ruby' }
Plug 'majutsushi/tagbar'
Plug 'Xuyuanp/nerdtree-git-plugin'
Plug 'yaegassy/coc-intelephense', {'do': 'yarn install --frozen-lockfile'}
Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']}
Don’t be afraid to give Vim a chance. It’s worth it.
iTerm 2 (terminal)
Terminal (or command line) is essential tool in my arsenal.
When I switched from Windows to Linux and then to macOS in 2014, I started with the default macOS Terminal. One day I found iTerm 2, and that’s the final boss for me. It has Vim bindings that work great out-of-the-box!
The only things I configure in my iTerm 2 are:
- Access from the applications to my clipboard
- FiraCode with ligatures for my terminal
It looks amazing!
This setting is needed to have access from my Vim and ZSH to the macOS clipboard:
ZSH (shell)
Being a FreeBSD and Linux user for many years, I used many shells. I started with simple sh, then migrated to bash, csh, tcsh, and finally to ZSH. I heard a lot about the Fish shell, but I don’t like it.
ZSH covers everything I want to have from a native shell. It has its own auto-completion, a bunch of plugins (git, bundler, Ruby, Docker, etc.), is highly customizable, with different settings to make it better.
Here is my config on GitHub.
And here is how my ZSH is configured:
tmux (multiplexer)
A long time ago, when I worked as a system administrator, I used the screen tool to work on my remote servers. It allowed me to keep my programs running, even if I got disconnected for any reason. When I connected back, I just used a terminal command to attach to my screen session. Easy.
In 2015, one of my colleagues showed me tmux as a great replacement for screen. And I fell in love with it. Back in those days, I hadn’t thought that one day I would start using tmux every day. Now it’s my must-have tool, and here is why.
When you switch to tmux, you don’t need to use tabs or multiple windows in your terminal app; you just use tmux virtual windows and panes, which have their own bindings (as any terminal does), but for me, it’s a more convenient way to organize my development spaces.
I run multiple projects at the same time and can just use my pre-defined combinations or key bindings to switch between these windows.
Look at this screenshot. Here I have multiple virtual windows (terminal sessions), each of them has its own unique name, and I can easily jump from one to another by pressing CTRL+B W.
I’m more keyboard-addicted than a mouse or touchpad user. Many times I tried to configure the default terminal app to have something like that, but I had no luck. So, I’m stuck with tmux and keep using it.
Tmux has a bunch of plugins that can help you organize your behavior and have a better experience. You can save and restore your windows with applications, and you can have multiple panes inside one virtual window. It’s super useful!
Ansible (infrastructure tool)
Ansible is such a great infrastructure tool that helps me with managing my laptop and remote servers. I use it for any automation: preparing a web server, installing or upgrading required software, deploying my apps from GitHub, and many other tasks.
You just need to prepare your YAML instructions once, pass your server address with your SSH key, and wait for the installation process to end. I don’t need to keep in mind all installed software out there and versions that are installed elsewhere. What I need is multiple Ansible configs, which keep everything and save my time.
When installing a new operating system, how do you manage your preferences? I mean, in my setup, the Dock on macOS should autohide itself and stay on the left side, Network volumes must be hidden in a Finder sidebar, and all hidden files must be visible in Finder.
It’s easy to forget how to reach these settings in the macOS UI. I use Ansible for such a configuration, and I don’t need to keep in mind my settings, just execute the script and… that’s it.
Look at this repo by driesvints on GitHub. Looks crazy, right? And almost everything can be automated.
Docker (containerization)
Most developers already use Docker. Somebody may hate it or think that Docker is overhead for development and can be used only on production or staging servers. I can’t agree with that.
All my applications are containerized: WordPress plugins & themes, Ruby/Rails applications, Go tools, Next.js with or without the web3 stack. Everything is running inside Docker containers. It’s easy to configure, easy to use, and easy to manage.
If you want to contribute to any of my projects – all you need is to run make dockerize or other commands to start dockerized applications. On every operating system, it will work the same.
Makefile (automation)
It’s a must! A Makefile gives us the easiest way to run commands that can be executed for a specific application.
Let’s say I’m working on my marketplace, and there are many commands which I run frequently: running a web server, running a test suite, linting, and other actions.
I don’t care about the syntax of these commands or how to use npx to apply a migration to my database. I just use commands make run, make db-migrate, make test, etc.
My typical Makefile for a Next.js application looks like this:
.DEFAULT_GOAL := help
NPM := npm
NPM_RUN := ${NPM} run
NPX := npx
DOCKER_COMPOSE := docker compose
help: # Show this help
@egrep -h '\s#\s' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?# "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
setup: # Install dependencies
@${NPM} install
@${NPX} husky install
prepare-dev-env:
@cp .env.development .env
run: prepare-dev-env # Run dev server
@${NPM_RUN} dev
lint: # Run linters
@${NPM_RUN} lint:prisma
@${NPM_RUN} lint
db-start: prepare-dev-env # Start dockerized database only
@${DOCKER_COMPOSE} -f docker-compose.yml up -d dev_db
db-stop: prepare-dev-env # Stop dockerized database only
@${DOCKER_COMPOSE} -f docker-compose.yml stop dev_db
db-migrate: prepare-dev-env # Apply available migrations
@${NPM_RUN} db:migrate
db-seed: prepare-dev-env # Seed database
@${NPX} prisma db seed
#
# Test environment
#
test: # Run test
@${NPM_RUN} test:db:prepare
@${NPM_RUN} test
test-db-start: # Up test database
@${DOCKER_COMPOSE} -f docker-compose.test.yml up test_db
test-db-stop: # Stop dockerized database only
@${DOCKER_COMPOSE} -f docker-compose.test.yml stop test_db
You can check out another example for smart contracts from my web3 marketplace: https://github.com/futusho/contracts/blob/master/Makefile.
Of course, you can use bash scripts or other shell scripts, but do you really need all of these if we have a Makefile? Think about it; you will love using a Makefile.
DBeaver (database manager)
I tried many tools to work with databases, and DBeaver is the best for me. It’s absolutely free and has a user-friendly interface.
DBeaver support so many databases and storages:
Markoff -> Marked (markdown viewer)
I love writing documentation and keep everything in Markdown. Even this article was written in markdown format, which was then checked for typos and converted to a WordPress post.
I have a plugin in Vim, but I don’t like it so much, as I do love Markoff (now Marked). They don’t have any extra features, just rendering your markdown files with code highlighting.
Amphetamine
You don’t need it, but I like this tool. It keeps my laptop working for a specific period of time and prevents it from hibernation. When you work on a remote server, you don’t want to lose your connection because you left your laptop to grab a coffee.
Amphetamine keeps the OS in an active mode for a specific amount of time.
1Password
I don’t know how many people still don’t use or trust password managers. My choice is 1Password. I’ve been using it since 2015 when it was a one-time payment, and then they decided to change their payments to a subscription model.
By the way, it’s the best password manager that I use on my laptop, mobile phone, tablet, and browsers. I know they even have a command-line interface, but I haven’t tried it yet and don’t want to.
My wife uses our family 1Password, and we can share our passwords with ease. I just need to keep in mind my master password because other passwords have about 25+ symbols in length 😀
Camtasia Studio
First time I tried Camtasia in 2015 or so. And I keep using this application. I tried Adobe products, tried other tools, but Camtasia is my passion. I love how it works, love using it, everything is intuitive and available within 1-2 clicks.
All my videos were recorded using Camtasia; I can add a few effects, audio filters, and then export my video file to the appropriate format and upload it on YouTube.
Yes, the price is expensive. But it’s worth it.
News Explorer (RSS reader)
I’m too old to stop using RSS. I fell in love with this format a long time ago. Some of you might not know (or have forgotten) about Google Reader, which was my first app that I opened when I opened my laptop in the 2010s.
I tried many clients, like Tiny Tiny RSS, or other web-based tools. And after all, I purchased News Explorer and keep using it every day. My feed has about 200 websites which send me updates every morning. Super useful to stay updated in IT.
OBS (streaming and video recording)
I do streaming on YouTube from time to time, not as much as I want to, but it is what it is. For my activity, OBS is the best tool for streaming on Twitch or YouTube. I spent many hours and days configuring it properly, and now I have my own setup for macOS and Windows.
The big time-waster in my life was when I decided to stream on YouTube while working on a balcony and smoking shisha. No, nothing went wrong, and my MBP is still working well, but I didn’t realize how difficult it could be to stream while working on battery without a power adapter.
If you do streaming as I do, feel free to drop your links in the comments below.
Conclusion
I haven’t covered my other tools, such as Camtasia Studio, MindMode, because there are plenty amazing applications I don’t want to explain everything in this long post.
Thanks for reading guys!
I think you forgot about 2FA such as Authy and Web3 based allrounder notetaking such as Anytype. Notice both starts with the letter A which fits your name astonishingly.
You are right! I use 2FA with 1Password on Desktop and Google Authenticator on my phone. I tried Authy as well, but I feel comfortable with 1Password 🙂
I see, as FOSS advocate I went ahead with Bitwarden and almost opted for [Aegis](https://github.com/beemdevelopment/Aegis) for 2FA, it just that I use Twilio and Authy just works for me right now. I think, if I ever to change my 2FA, I would gladly use Aegis.