It’s important for programmers to challenge themselves.
Creative and technical retardation only alternative.
In the spirit of the new year, I’ve compiled twelve month-sized resolutions.
Each month is an annually renewable technical or personal challenge:
- Go analog.
- Stay healthy.
- Embrace the uncomfortable.
- Learn a new programming language.
- Learn more mathematics.
- Focus on security.
- Back up your data.
- Learn more theory.
- Engage the arts and humanities.
- Learn new software.
- Complete a personal project.
Programmers obsess over the discrete and the digital well past the point of diminishing returns.
Thus, small investments in the analog yield comparatively large gains.
Here’s a starter list of analog activities to try, each of which takes about a month of dedicated effort to transition out of the novice (and into the seasoned beginner) stage:
- Weight lifting.
- Martial arts.
Programmers tend to live sedentary lives, and we face unique health challenges from our occupation.
We tend to ignore these challenges.
Spend a full month each year tuning your exercise, diet and environment to promote durable healthy habits.
Go to a clinic each year to get your blood pressure, cholesterol and blood sugar checked. Watch how these values change over time.
If your wrists are starting to hurt or have been hurting, stop now and take action to combat RSI.
Focus on improving your posture, with an emphasis on your shoulders and neck.
Embrace the uncomfortable
Since my early twenties, I’ve looked at my older peers and tried to figure out why some stagnate and how others stay vibrant.
The answer is comfort.
Comfort breeds technical fossilization.
We find a system that works for us, and we stick with it.
But, technology advances, and those that stay in their comfort zone never realize the gains from these advances.
Practice becoming comfortable with being uncomfortable.
Here’s a list of things that might make you uncomfortable at first:
- Switch to Dvorak.
- Switch from emacs to vim or vice versa.
- Stop using a mouse.
- Use a different window manager.
- Switch from cream and sugar to black coffee or straight tea.
- Try out that “popular new piece of crap” for the full month.
- Turn your cellphone off for one day a week.
- Learn a one-handed input device.
- Try a different OS.
- Try a different version control system on a small project.
- Forcibly abstain from the internet for one day a week.
- Try a dietary restriction: go vegan, vegetarian, dairy-free, etc.
- Eat a food you don’t like every day.
- Put your dominant arm in a sling.
- Learn to write with your non-dominant hand.
- Start a blog.
- Sign up for public speaking.
- Listen to a kind of music you don’t like for a month.
- Volunteer at a hospital or retirement home.
- Fast once a week.
- Travel to a country with a different language and/or culture.
- Read an acclaimed novel from a genre that you don’t like.
- Watch an acclaimed movie/show from a genre that you don’t like.
- Learn to drive stick.
- Argue against something you believe.
After a month of doing something different, decide whether you want to keep doing things differently or whether there are ways to blend the best of the new and the old.
For instance, when I switched to vim after ten years of emacs, I set up the emacs-style key-bindings for insertion mode but kept vim.
Update: Reader Shae Erisson wrote to relay the “rule of 3” for embracing the uncomfortable: when a third person recommends you try something, you must try it.
He also provide a “15 minute rule”: give something (such as a movie or TV show) the benefit of the doubt for 15 minutes. If you don’t want to continue after 15 minutes, drop it.
I like both of these rules.
Learn a new programming language
Programming languages rise and fall.
Programmers that only know one language will restrict their problem-solving abilities and their career prospects.
Spend a full month absorbing a new language or a new language paradigm.
Write a modest program in it.
Here are a few less mainstream languages to learn:
If you’re feeling particularly brave, take a crack at dependently-typed programming languages / theorem-proving systems:
If you’re out of programming languages to learn, implement one.
The most powerful underexploited skill programmers possess is the ability to automate both the virtual and the physical.
If you’ve never built a robot, build a robot.
At the very least, play with LEGO Mindstorms:
or hack on an Arduino board:
Survey the routine tasks you perform, and determine which can be automated in full or in part.
Home automation technology has advanced considerably, and much is possible with DIY systems like Insteon.
Take a month to invest in an automation project:
- Tune your mail filters or set up procmail.
- Set up shell scripts to automate the frequent.
- Create shell scripts to help your writing.
- Learn how to use the cron tool.
- Link closet lights to motion detectors.
- Replace wires with wireless where possible.
- Stop manual syncing: Move it to the cloud.
- Set up a remotely controllable sound system.
- Control your thermostat from your server.
- Set up digital security cameras.
- Create a digital intercom/baby monitor.
- Have your coffee maker turn on automatically.
- Set up a self-refilling water dish for pets.
- Build a sensor-controlled pet door.
- Hack a Roomba into a personal courier.
Learn more mathematics
At its heart, computer science is a mathematical discipline.
Good mathematicians make good programmers.
Do not let your mathematical faculty wither.
Consider an annual one-month brush-up on one of these topics:
- Discrete mathematics.
- Abstract algebra.
- Number theory.
- Category theory.
- Order theory.