2016 State of the Tools

My software toolbox evolves quite a bit, and I keep trying new things (a good or a bad habit, depending on who you ask; I'm grateful that my Ph.D adviser encouraged a reasonable amount of this tinkering). I've written about some of these tools before, but thought I'd compile a list of some of the important ones in my current stack.

I also maintain lists of some of the open source software I am using on OpenHub.

One of the themes in the most recent round of changes to my stack is reducing technical distance: making it easier to be able to recommend the software that I use to others, so that they can obtain a productive environment quickly. This means picking widely-available, usable software that works well (and provides modern conveniences) out-of-the-box. There are definitely places where I make exceptions to this, but I select a lot of user-facing software and development tools with this in mind.

Hardware and Operating Systems

My client operating system, across the board, is Windows 10 (Pro or Education). With the Anniversary Update, I get a Linux environment when I need it (although I don't wind up using it that much, really). I use Scoop to install command-line packages.

For my portable computing, I'm using the Surface Pro 4, and I have an i7 Dell workstation at my office.

Server-side computing at work is all Red Hat, because that's what Boise State IT provides us, and at home I'm using NixOS on our NAS. This particular decision is decidedly not distance-friendly, but I'm not recommending most people run custom NAS software stacks anyway. Its primary benefit — backups — should generally be provided by services such as Backblaze.

When I need random Linux things, I often run them on Docker or occasionally Vagrant; Docker works really well on Windows these days, so it's a snap to spin up some server or test a package prior to deployment on ‘real’ infrastructure. It also means I don't clutter up my main infrastructure with the dependencies for a dozen things I tried.

My phone is a Lumia 650 with Windows 10 Mobile. I will be sad if the present trajectory of Windows 10 Mobile winding down continues, because it's mostly a good platform and a duopoly does not seem to me to be a good market structure. With the Windows phones, you can get a phone from the OS developer with security updates for under $200 unlocked, something that neither Google nor Apple are beating right now.

Browsing and E-mail

I'm still using Firefox as my primary web browser, with UBlock Origin, Self-Destructing Cookies, and a few other add-ons of less general interest.

I use Chrome for Google apps, and Edge from time to time.

Boise State is a Google campus, so I use Gmail there, and occasionally access it from Windows Mail. For my personal e-mail, I am mainly using Outlook.

Writing

I am doing a lot of my writing in Word these days, using Zotero for managing my bibliographic references.

Other writing is generally in Markdown (using a variety of parsers) or AsciiDoc. I'm starting to move more of my formatting-intensive text-based writing from Markdown to AsciiDoc, because the latter provides more features without needing to have Pandoc installed.

I use Google Docs for quick documents at work, and for collaborating on drafts. Once something intended for publication has the text mostly drafted, I generally move to Word.

Programming Languages

My main programming languges at present are:

  • JavaScript (under Node) for general hacking and scripting. npm, performance, and excellent cross-platform support are the major things that draw me to this platform, as well as JavaScript just being a fun language.
  • Java for working on LensKit and related software, which is still my biggest development project. It's also my go-to language for other ‘substantial’ programs.
  • Groovy for scripting Java and Gradle.
  • R for data analysis and statistics.
  • Rust for experimenting with low-level, high-performance things, and rustr to pull it in to R. My current primary use case for Rust is optimizing R functions; I wish I had more work to do in it.

I also use Python, Unix shell, PowerShell, and Perl to varying degrees depending on the project and available libraries. I am not writing any Scala, ML, or Haskell these days.

Editing and Developing

I do heavy-duty development in JetBrains IDEs; mostly IntelliJ IDEA, but some with WebStorm and PyCharm as well.

For general text editing, I am using Visual Studio Code for the most part. I used Emacs or Vim for many years, but do like a GUI and modern editors (Sublime, Atom, VS Code, etc.) provide professional-grade features with a much gentler learning curve than Vim or Emacs for new users. Search working out-of-the-box is fantastic. I was using Atom for about a year, but switched to VS Code this fall because it is much faster.

I'm using GNU Nano for my terminal text editor; it's installed on most Linux systems these days, and doesn't have the arcane commands of vi or Emacs. I'm still comfortable in vi, and am faster there than Nano, but I have a hard time recommending that a new programmer invest the time in learning one of those classical editors these days (unless of course they really want to — I wouldn't discourage them), and want to be familiar myself with the standard newbie-friendly terminal editor. I don't do a whole lot of terminal-based editing anyway.

Unix Shell

I still do a number of things in the Unix shell, particularly on servers, and have adopted a number of tools that make that easier:

  • The fish shell provides a great out-of-box experience for nice prompts, good autocomplete, etc. I used zsh for a while, but if I'm going to use & recommend a nonstandard shell, fish does almost as much with less configuration.
  • direnv, a shell hook that lets me set environment variables in a .envrc file to have per-project environments. In conjunction with rbenv, nvm, and conda, this also provides me with a unified way to select the software environment needed for any particular project.
  • autojump, a command and shell hook that remembers directories I've visited and lets me quickly jump with short substrings of directory names.
  • tmux, a terminal multiplexer that's like GNU Screen rebuilt with modern sensibilities.

I'm usually using either PuTTY or MobaXTerm to access my *nix machines.

PowerShell

For the Windows command line, I generally use PowerShell. I trick it out with a few niceties:

  • scoop, as mentioned above.
  • Jump.Location, a PowerShell version of autojump.
  • posh-git for Git status in my shell prompts.

Other Utilities

Some other utilities I use on a semi-regular basis, in no particular order:

  • WinDirStat
  • Allway Sync
  • Excel
  • f.lux
  • WinCompose
  • Gradle