The Programmer's Workbench
Tags: tools, coding
Published: 2018-11-13 16:26:53

---
title: The Programmer's Workbench
published: true
description: When assembling your coding tools, the IDE is just the beginning.
tags: tools, coding
cover_image: https://thepracticaldev.s3.amazonaws.com/i/gv5nyen9tnqnffasm9fu.jpg
---

One doesn't have to look far to find discussions on the merits of various editors and IDEs, which are undeniably the most important application in a programmer's toolkit. Many expert coders recommend putting serious thought and effort into selecting an IDE or editor. Once one has found their editor, it is worth spending time learning it, customizing it, and then truly *mastering* the power user features it offers. That time investment pays huge dividends in the long run!

Meanwhile, it can become rather easy to overlook many other applications which can be invaluable to a programmer. I believe we should put the same thought, training time, and customization into these as we do into selecting an IDE!

Which tools a programmer requires varies from one discipline to the next. Most of these are tools I've used. Please add your own in the comments!

Side note: There are a lot of real world tools (and skills!) that can be quite helpful to the development experience. A great article and discussion about that can be found here:

{% link https://dev.to/theoutlander/how-to-improve-your-development-experience-ldl %}

# Calculator

It's no surprise, programming involves a LOT of math! While the majority of us (hopefully) are quite proficient with mental algebra and whatnot, when we're holding sixty-some-odd threads of programming logic in our minds, we really don't want to have to clear out some more available mental memory to do multiplication.

A good calculator should be capable of more than basic calculation, however! I've found all of the following fairly essential in a coding calculator:

* Copy/Paste support
* Computer Algebra System (CAS)
* Base conversions, e.g. decimal to hex, octal to binary, whatever.
* Trigonometry functions
* User-defined functions and variables

**[SpeedCrunch](https://speedcrunch.org/)** fits the bill, and has long been my favorite calculator. It's one of the first things I install on any computer I'm working on. Of course, I still have my trusty TI-89, but the copy-and-paste convenience makes SpeedCrunch far more practical in many cases.

I wind up using my TI mainly for graphing, which is quite useful in algorithmic analysis. If I need the same functionality on the computer, I recommend **[ZeGrapher](https://www.zegrapher.com/)**.

# eReader

I love books...maybe a little too much. I'm liable to be reading through 3-5 different books at any given time, as my Goodreads profile can attest to. While I favor print books, especially as it's *one less thing* to take up screen space while I'm coding, I can appreciate a good eBook as well. Thanks to a couple of Humble Bundles, various free e-books, a bunch of random purchases, and [Packt's daily free ebook](https://www.packtpub.com/packt/offers/free-learning/), I have...hundreds.

That's why I know the value of a good eReader! Because I don't own a Kindle, Nook, or any such eReader device, I have to rely on my computer for that. A good eReader application does more than just display the books; I want to be able to manage and search my collection, bookmark pages, and (due to my dyslexia) control the page display colors and fonts.

In my experience, **[Calibre](https://calibre-ebook.com/)** handles all of those tasks quite well. I can store ePub, Mobi, and PDF eBooks, maintain the catalog metadata thereof, and (of course) read 'em all.

While we're on the topic, you should also find a PDF viewer you like. Being a Linux user, I adore **[Okular](https://okular.kde.org/)**. 

# Note-Keeper

I have entirely too many sticky notes and paper scraps on my desk. That might not be such a bad thing, except I seldom sort them. Scientists have begun to study their migration patterns, as they move in herds from my desk to my large metal "inbox", bottom drawer, and back to the desk.

Actually, I think they've formed a primitive society. I'm worried.

I am a strong believer in the analog, but notes are one exception I make. A good note-keeping application helps me with population control on the paper herd.

I've tried a few dozen, but I finally settled on **[Simplenote](https://simplenote.com/)**. It's a free, open-source, cloud-based service, meaning I can keep my notes synced across multiple devices.

Before that, I had fairly good experience with **[RedNotebook](https://rednotebook.sourceforge.io/)**, which I still use from time to time. It lacks cloud sync, but the tagging and calendar features are quite helpful.

# Music Player

Raise your hand if you hate music. ...Yes, I see the two people in the back there. Hi. You can tune out until the next heading. There are cookies back there if you want to snack until then.

Most of us programmers cannot live without *complete control over our audio environment*. We invest in good headphones for a reason! Personally, I'm blasting *TobyMac — The Elements* in my noise-cancelling JVCs at the moment.

It's equally important to find the right media *player*: something that lets you quickly find the music you want, build playlists your way, and control it easily - preferably with those handy media keys on your keyboard.

I'll be honest, no music player quite fits the bill for me, but [until I finish my own](https://github.com/codemouse92/elements), I have to settle for second best.

Because I own a LOT of actual CDs, MP3s, and OGGs, I use **[Rhythmbox](https://wiki.gnome.org/Apps/Rhythmbox)** a lot of the time, mainly because it just gets out of my way. (I miss Banshee, but it's suffering from serious bitrot).

As far as streaming music goes, I'm a **[Spotify](https://www.spotify.com/us/)** loyalist. Their free plan lets me play whatever I want on my desktop, and manage my hundreds of carefully curated playlists. (Sure, I have to hear commercials periodically, but this is what the mute button is for!)

I've also had pretty good experience with **[Pandora](https://www.pandora.com/)** and **[iheart](https://www.iheart.com/for-you/)** for customized internet radio.

# Communication Tools

Obviously, you have no choice but to use whatever chat service your team prefers, whether that be Slack, Telegram, Gitter, Discord, whatever. But what about where *your* community is?

I have a lot of great friends on IRC, so my chat client is an essential part of my toolbox. **[HexChat](https://hexchat.github.io/)** is my favorite, although a huge majority of my friends like **[Irssi](https://irssi.org/)**. There are, of course, many more IRC clients to choose from. I arrived at my own favorite by experimentation; HexChat just meets my needs, and I've got it the way I want it.

For all the other chat services you might be lurking on, **[Rambox](https://rambox.pro/)** is a real sanity saver! Any time I need Slack, Discord, Mattermost, Gitter, whatever...I just add it to my Rambox client. It lives up in my notification area, and merely lights up when something needs my attention. If I'm feeling distracted by a particular service, I can temporarily close out of that one tab; it'll be there next time I sign in.

Quick note: if you're relatively experienced in netiquette, USENET is still a thing...and it's a thing well worth signing up for! I use the **[Pan Newsreader](http://pan.rebelbase.com/)** to access USENET. (To get *on* USENET, see [Eternal September](https://www.eternal-september.org/).)

# Web Browser

If you do web development, this was probably first on your mind. It's really quite essential to have as many mainstream browsers as possible installed on your machine, just for testing, but you should also decide on one for your own *personal* use.

Here are the things I look for in a browser:

* Reasonably fast, without eating all available memory.
* Low on interface distractions.
* Works well with my essential websites, especially video chat services!
* Bookmark tools that fit my workflow.
* Developer tools I like using. (Effectively puts this into the IDE category.)
* Support for my essential plugins: anti-distraction (Leechblock or StayFocusd), adblocker (uBlock Origin), privacy (Privacy Badger, HTTPS Everywhere), safety (Web of Trust), and stylesheet control (Stylus).

At the moment, Firefox Quantum fits that purpose well, but I also have an appreciation for Vivaldi and Brave! (Let's face it - Chrome is a memory hog.)

# Text Editor

If you're an IDE user, it is actually quite important to decide on a lightweight text editor *as well*! I tend to use a text editor alongside my IDE for...

* Quick edits; I don't want to fire up a new IDE tab just to fix a simple typo,
* Reading and editing files *outside* of an IDE project,
* Viewing an old version of your code while you completely rewrite it,
* Working with file formats your IDE doesn't play well with.

Don't skimp on this. The differences between text editors is MASSIVE. I like **[Geany](https://www.geany.org/)** for this purpose, although I have fond memories of my experience with **[Notepad++](https://notepad-plus-plus.org/)** on Windows. (The Linux equivalent now exists! Check out **[Notepadqq](https://notepadqq.com/)**.

You should also find a text editor you like in the terminal; you never know when you'll need it. Emacs and Vim and the obvious options, although there are advocates for Nano and Tilde as well. Experiment!

# UML and Flowchart

Diagramming is far more important than some would have you believe. UML diagrams, flowcharts, and the like, can save you a lot of time when you're planning complex code. Nothing is faster than paper-and-pencil for this, of course, but sometimes you want an end result that is sleeker, more polished...and a lot more editable.

I've had a lot of good experiences using with **[Dia](http://dia-installer.de/)**. I can whip out a decent diagram in a matter of minutes, and export it to a PDF or image for continual reference while coding. In addition to all the standard symbols, Dia allows you to create or download custom shape sets.

By the way, if you work with the networking or engineering disciplines, Dia supports all those diagrams as well! It's quite versatile.

# Terminal

Most programmers, especially those on Linux systems, spend an immense amount of time in the command-line, so it's important to find a terminal one actually *likes* using. There are dozens to choose from, with proponents of each, so the best way to find which one meets your needs is to experiment. Don't just settle for the system default; explore your options, and find one you can fall in love with.

I actually have three I like:

* **[Guake](http://guake.org/)** is my general-use terminal. I can customize it to my heart's content, and bring it up with a simple tap of `F12`. Plus, tabs. ;)

* **[Terminator](http://www.linuxandubuntu.com/home/terminator-a-linux-terminal-emulator-with-multiple-terminals-in-one-window)** is my primary full-screen terminal. Split-window and full customization are the main things that I like about it.

* **[Cool Retro Terminal](https://github.com/Swordfish90/cool-retro-term)** is designed to emulate the old CRT TTYs, making it my favorite terminal when I want to *feel* cool. You can customize all the display settings, so you can design the terminal of your dreams. It lacks a lot of the more practical features of Guake and Terminator, but it looks *awesome* full screen!

# GUI Prototyping

Before I build a GUI, I like to figure out what it should look like. The first step is almost always paper-and-pencil; the second step is **[Pencil Project](http://pencil.evolus.vn/)**!

While there are other GUI prototyping applications, I've had the best experience with Pencil. The Pages feature is especially helpful; not only can I create multiple views in one mockup, I can reuse and layer them!

# Merge Tool

Whether you use a repository or not, sooner or later you will need to see the differences between two files. **[Meld](meldmerge.org)** is my favorite visual diff and merge tool, probably because the interface just makes sense.

# Other Stuff

There are plenty of other tools I use, depending on what I'm doing. Here's a few:

* **[Shutter](http://shutter-project.org/)** for screenshots,
* **[GIMP](https://www.gimp.org/)** for image manipulation,
* **[MyPaint](http://mypaint.org/)**, with a Wacom tablet, for digital whiteboarding,
* **[Kazam](https://launchpad.net/kazam)** for lightweight screencasting.
* **[Redshift](http://jonls.dk/redshift/)** to reduce eyestrain.
* **[Redstring](https://mousepawmedia.com/projects/software/redstring)** for repetitive code generation.

What about you? What tools have you found essential to your coding journey?