Jeff

environment

The environment of a software developer is a very personal thing. It is where we spend a majority of our time working, it is our kitchen, our car shop, our workbench. Like how a chef likes to have everything in its place (mise en place), developers like to have everything in its place. I have become very specific about things like directory structure, command shortcuts, keybindings, etc. Some people prefer Windows, others OS X, and even others Linux, each for their own reason: comfort, customization, community, etc. Then within those systems, people prefer different tools, things like web browser, editor, window manager (for Linux users), languages, etc. The longer you spend time developing, the more your environment evolves. The speed in which I use my system is very efficient for me, but probably not much for anyone else. It is my kitchen, everything is mise en place.

In my “kitchen” I use Linux, specifically Arch Linux. I like this distro/flavor of Linux because it is pretty vanilla, meaning it doesn’t change a whole lot. It plays by normal conventions and relies on standard systems (if I want to install a python library, I will use pip, if I want to build something from source, it plays nicely and may even have a Arch specific make script). I also like that it comes with nothing out of the box. Just a TTY into the base OS. I can install the xorg server and setup the window manager I want, I don’t have to live with GNOME living and updating because the distro comes with it. The window manager I use is XMonad, a tiling manager written in Haskell. I was turned onto this by a former coworker who used it. A tiling manager (as opposed to a stacking window manager that most people are used to, where you normally drag, resize, and stack windows as desired) naturally splits the window between windows as they form tiles. So if I have two windows open, it will split the screen in half and give each window half the screen (vertically split or horizontally split, I can change with a simple keybinding). I can hop to a specific screen, workspace, and window with the press of a few keys, never needing to grab the mouse (this will be a big theme). The window manager and OS are my kitchen, they are the core of where I work, but not the tools I work with, not my knives and cutting board.

My tools of choice vary and evolve a lot more. They are a lot more modular, you can take a seasoned chef and give him a new knife and he will function with little change, but you put him in a new kitchen, with a new layout, and he will slow significantly. My tools of choice are vim for my text editor (I am still learning), tmux for my multiplexing (I just switched from GNUScreen) which allows for me to keep a bunch of stuff in a single terminal (and detach it if needed), Chromium as my browser (learning luakit, but not good enough to use it regularly, soon hopefully), irssi as my IRC client (weechat is looking really awesome, have been using it on the train, need to customize some more and it’ll take over), mutt as my e-mail reader (this is new and is not replacing anything, has a lot of work needed still), and zsh as my shell along with urxvt (or rxvt-unicode) for my terminal emulator.

With these “tools” in this “kitchen” I have become a fairly efficient and capable software developer, but I am continually learning new tools and techniques to streamline my development. I am trying to use TDD principles in my personal projects right now, which is hard because I really don’t have interfaces figured out for what I am writing, but I am continually trying to upkeep unit tests to simplify the testing of what I write. Hopefully this gives some insight into thinking about how to streamline your workspace both physically and digitally. You would be surprised some of the quick shortcuts you can learn/setup and how much it will speed up your usage of your computer.

The configs should all be on my github (link at the bottom).