http://www.spinellis.gr/pubs/jrnl/2005-IEEESW-TotT/html/v30n6.html
This is an HTML rendering of a working paper draft that led to a publication. The publication should always be cited in preference to this draft using the following reference:

This document is also available in PDF format.

The document's metadata is available in BibTeX format.

Find the publication on Google Scholar

This material is presented to ensure timely dissemination of scholarly and technical work. Copyright and all rights therein are retained by authors or by other copyright holders. All persons copying this information are expected to adhere to the terms and constraints invoked by each author's copyright. In most cases, these works may not be reposted without the explicit permission of the copyright holder.

Diomidis Spinellis Publications


© 2013 IEEE. Personal use of this material is permitted. However, permission to reprint/republish this material for advertising or promotional purposes or for creating new collective works for resale or redistribution to servers or lists, or to reuse any copyrighted component of this work in other works must be obtained from the IEEE.

The Frictionless Development Environment Scorecard

Diomidis Spinellis

The environment we work in as developers can make a tremendous difference on our productivity and well-being. I’ve often seen myself get trapped in an unproductive setup through a combination of inertia, sloth, and entropy. Sometimes I put-off investing in new, better tools, at other times I avoid the work required to automate a time-consuming process, and, also, as time goes by, changes in my environment blunt the edge of my setup. I thus occasionally enter into a state where my productivity suffers death by a thousand cuts. I’ve also seen the same situation when working with colleagues: cases where to achieve a simple task they waste considerable time and energy jumping through multiple hoops.

A stressful couple of years gradually drew my development environment into an unproductive disarray. Over the past few months I recovered from this state with many small and medium-scale investments. This column is based on my personal experience and observations as well as suggestions from colleagues. So here’s a scorecard we can use to evaluate and fix the environment we work in. Some fixes involve tweaks in our setup, others may require us to install new tools, others to learn new skills, and others to negotiate with our managers. They’re all worthwhile investments.

Workstation setup

Are my personal settings and preferences consistent on all the computers I am using? Are they stored under version control? Can I install them on a new computer with a single command?
Are my GUI tools configured to launch with the font, size, position, colors that suit me?
Are my favorite key bindings configured to be the same for the shell, command-line tools, and GUI environments?
Can I access the GUI clipboard from the command line?
Can I edit any file with my favorite editor / IDE using single simple shell command? With a single mouse click?
Can I open a shell window in the directory I am browsing?
Can I launch the file explorer for the shell’s current directory?
Is sufficient context (user name, host name, directory path) visible on my shell’s command-line? Is it displayed on the window’s title bar?
Does my environment offer command / command argument / file name completion?
Can I view / edit / search previously entered commands?
Are my files getting backed up? Is the backup tested, accessible, off-site, in multiple media, with regularly retained copies?

Work environment

Do I have a keyboard, mouse, and chair that match my preferences? Are they comfortably positioned?
Can I easily take notes and draw by hand?
Is my real desk and my screen desktop free from clutter?
Is my workplace quiet or can I isolate myself from distractive sound?
Do I have sufficient screen real estate? Is it positioned at the height of my eyes, free from glare, and facing in a direction with low light?
Do I wear the reading glasses / contact lenses I need?
Can I work free from interruptions from other people, phone calls, and messaging pop-ups?
Do I have the CPU power, main memory, disk space, software, administrative permissions, communication tools I need for working efficiently?
Do I have access to a meeting room? Does it have a whiteboard, a screen projector, a flip chart?
Do I keep sensible working hours?
Do I get along well with my colleagues?
Can I easily access my line manager, clients, key people in other teams?
Does my line manager help me set SMART goals and prevent other work from distracting me?
Am I getting the food and sleep I need?
Do I have a mentor? Someone who can review my code? Someone I can discuss design?
Am I getting appropriate training?

Remote hosts

Can I use a remote host with a simple command? Without re-entering my password?
Can I easily execute a command on the remote host from my local environment?
Can I easily synchronize my files between the two?
Can I easily launch a GUI application?

General-purpose tools

Can I search for a string in a set of files?
Recursively down a directory tree? Ignoring case? Only in a subset of files? Specified by a regular expression?
Displaying only matching files names? Displaying only matching part? Displaying context? Highlighting match?
Can I obtain the difference between two files?
Recursively down a directory tree? Ignoring blanks? With a graphical display? With textual output?
Can I package regularly-executed commands in a script?
Can I quickly locate a file by its name?

Editing

Can I use the same editor for all my code and documentation editing tasks?
Can I search (and replace) with regular expressions?
Is all my code syntax highlighted?
Can I view multiple files or parts of a file side by side?
Can I see and edit previous commands and searches?
Can I get context-sensitive help and auto-completion for my code?
Can I spell-check what I write?
Is auto-indentation and spacing correctly configured for all types of files I’m editing?

Debugging

Can I step through my code?
Can I set a breakpoint in the code?
Can I set a data breakpoint?
Can I see the value of local and global variables?
Can I see the result of a function call?
Can I navigate through data structures?
Can I evaluate the value of an expression or function?
Can I attach my debugger to a running or a remotely running process?
Can I debug a crashed process?
Do I obtain telemetry on processes that have crashed in the field?
Can I trace system calls / library calls / network packets / IPC calls?
Can I filter and process the results of these traces?

Application development

Can I quickly build the application I’m working on after a change?
Do I have access to a test environment that mirrors the production one?
Can I test the application with a single command?
Can I profile the code?
Can I do the above on all supported platforms and versions?
Can I perform test coverage analysis on the code?
Can I automatically check my code for common or tricky errors? Are these checks run by default? Are they clean?
Does the application log its actions? Is the log detail level easily configurable?
Are all the application elements (source code, scripts, documentation) under version control?
Can I easily create a branch to work on my changes?
Can I see who changed each line of the code and why?
Is there a two way link between the issue database and the version control system?
Are tests and tools allowing me to refactor code with confidence?
Can I commit comments and style fixes without bureaucratic interference?
Do I have access to the specialized tools I need to perform my job?
Is documentation for the tools and APIs I’m using readily available? Is it hyperlinked, searchable, available off-line?

Problem at hand

Have I understood the problem? Am I working on the correct one?
Are the allocated resources (time, people) realistic?
Is there a test case (set) for what I am building or trying to fix? Can I run it with a single command?
If it’s for a fix, is it minimal?
If it’s for a new feature, does it cover all corners?
If it’s a performance problem is it a representative workload?
Can I enter the debugger with a single command?
Can I obtain the application logs I need with a single command?
Can I easily see the data I want in a friendly textual or graphical format?

Finally…

Do I regularly monitor my development environment to pinpoint and alleviate sources of friction?
Do I help my colleagues to do the same?