Go analog
Programmers invest in the discrete and the digital well past the point of diminishing returns.
As a result, 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 beginner) stage:
- Cooking.
- Hiking.
- Skiing.
- Astronomy.
- Jogging.
- Cycling.
- A team sport.
- Weight lifting.
- Carpentry.
- Martial arts.
- Dance.
- Meditation.
- Table-top and/or card games.
- Reading.
- Community service / volunteering.
Stay healthy
(2023 note: Now 41, I’m grateful I took my health seriously over a decade ago – not long before I wrote the original version of this article. By following this advice, I’m stronger, leaner and healthier than I’ve ever been.)
Programmers tend to live sedentary lives, and we face specific health challenges from our occupation.
Each subsection here is a possible a month-long focus for your health.
Focus on primary care
Take the time to get a primary care physician.
Schedule an annual physical.
Track your labs (e.g., cholesterol, blood pressure, blood glucose) over time.
Make a habit of contacting your primary care physician about any sustained irregularities you notice in your health.
Protect your wrists and your back
If your wrists have been hurting, stop now and take action to combat RSI.
Focus on improving posture, with an emphasis on your shoulders and neck.
These days, there are plenty of posture correctors to help.
Set up tools to track diet and exercise
Track your weight, caloric intake and caloric burn. If necessary, reshape your environment and lifestyle to promote healthier eating and weight loss.
If you’re already trim, consider a one-year experiment in packing on strength and muscle.
Mold your environment to support healthy habits
Spend a full month each year optimizing your environment to promote durable healthy habits by default.
In 2019, I switched to a treadmill + standing desk, and it’s become my single biggest health hack ever, burning hundreds (and occasionaly over 1,000 calories per day) while working.
I’ve taken this approach to an extreme, combining a walking pad treadmill and a motorized standing desk to create an environment that enables me to combine constant low-grade exercise with work all day long:
There are combined treadmill and desk solutions as well:
I’ve used bike desks in the past and while they offer superior caloric burn rates to treadmills, I find them hard to use for more than an hour at a time.
For my work office, I slid an under desk elliptical machine in front of my chair, and this allows me to maintain a constant rate of low-grade exercise even there:
Be mindful of mental health
If you are struggling in any way with mental health, I highly encourage you to seek out qualified mental health counseling.
I’ve personally benefited from having a counselor, and I wish I’d sought out help sooner.
Whether you are struggling or not, I have found meditation to significantly benefit my wellness.
Undergoing a full cognitive assessment and receiving a formal diagnosis of ADHD at age 40 has also made a significant difference in my personal and professional life.
Embrace the uncomfortable
Since my early twenties, I’ve looked at my older friends and colleagues to figure out why some stagnate intellectually while others stay vibrant.
The answer seems to be 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.
So, 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.
- Try using only a Raspberry pi (or equivalent) for a week.
- Use only the console for a week.
- Switch from cream and sugar to black coffee or straight tea.
- Try out something you’re resisting because it seems trendy or popular.
- 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, retirement home or a homeless shelter.
- 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 a stick shift.
- 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.
Reader Shae Erisson relayed 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.
Automate
The most powerful underexploited skill programmers possess is the ability to automate both the virtual and the physical.
Survey the routine tasks you perform, and determine which can be automated in full or in part.
Home automation
Home automation technology has advanced considerably since I first started tinkering with it in college.
Widely supported standards such as HomeKit for Apple and Google Home make it a seamless and integrated experience.
For example, I’ve enjoyed fully automating (and coloring!) all my lights with the Philips Hue system.
Because it integrates with HomeKit and Google Home, I can use my phone or my watch or wireless mic+speakers to control everything in my house.
When I started adding Lutron Caseta light switches and Level smart locks, it all worked with Siri and the Apple Home app right away, since both support HomeKit.
For example, if I forget to lock my front door when I leave my house, HomeKit locks it for me. And, I can ask Siri to open it for me when I pull up.
Lights shift between scenes based on time of day and sunrise/sunset and who is home.
Shortcuts for macOS / iOS automation
The built-in Shortcuts programming language on macOS / iOS has come a long way since it was first an independent automation app.
While it can feel overly simplified at times for seasoned programmers, it enables a lot of powerful automations, integrations with Siri and connections between apps.
For example, I created a Shortcuts script that resets my “Habits” list each morning in Reminders.
I have another Shortcuts script I run each morning to automatically set a T-2 minute alarm for every calendar event that day, which is a lifesaver given my propensity to forget about isolated video conference meetings.
Hack on robotics
If you’ve never built a robot, build a robot, or hack on a Raspberry pi or an Arduino board.
Other possible automations
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
While it seems possible to avoid learning mathematics and still learn to program, at its heart, computer science is a mathematical discipline.
Mathematics provides a rich set of abstractions from which to draw while programming, and improving your mathematics will certainly improve your programming.
Consider an annual one-month brush-up on one of these topics:
- Logic.
- Discrete mathematics.
- Calculus.
- Probability.
- Statistics.
- Abstract algebra.
- Number theory.
- Category theory.
- Order theory.
During the early days of the COVID19 pandemic, I even set aside an hour each day to work all the way through Mathematics: From the birth of numbers:
And, I can’t help but feel it gave me a much deeper appreciation for computation in the process – even though that’s not the intent of the book!
Focus on security
Few programmers practice good security habits.
If you’re conscious of your own digital security, you’ll be more conscious of the security of the code you write.
Check that you’re using unique, strong passwords for every site.
Manage your passwords with an encrypted password manager like PasswordSafe:
If you don’t already practice whole-disk encryption, set aside time to do it. (On a Mac, it’s painless to set this up.)
Each year, study the top ten vulnerabilities for the past 12 months. How did they happen? What coding practices could prevent them in your code?
Here are other security tasks you can try out:
- Learn the other stuff SSH can do.
- Set up an SSL certificate in Apache (or the httpd of your choice).
- Implement a cryptosystem like RSA or AES.
- Try to crack the key to your wireless network.
- Snoop your network traffic with WireShark.
- Set up passwordless, key-based ssh login.
- Run nmap on yourself. Configure your firewall.
- Set up port-knocking.
- Create an encrypted USB drive.
- Set up log file monitors.
- Set a cronjob to upgrade your packages regularly.
- Enable automatic security upgrades on your Linux distribution.
If you have never set up a free SSL certificate with Let’s Encrypt, I highly recomend doing so – and donating to them whatever you might have paid a commercial certificate provider.
Back up your data
Each year, review your backup strategy.
Invest a month in minimizing the cost of making backups, and consider having two independent back up systems, such as cloud and disk-based backups.
I use DropBox for my cloud-based backup, and it’s already proven itself during one unexpected hardware failure.
Opt for defense in depth by assigning an individual back up hard drive to each computer and enabling automatic backups with tools like Time Machine.
Keep critical files in a version control system with a geographically remote repository.
And, do not neglect backing up and securing your physical paper files.
Critical documents like passports and birth certificates need a fireproof safe.
And, you should keep scanned copies of all critical documents as well in a secure, encrypted digital enclave.
I keep a ScanSnap on my desk, so that I can quickly scan paper documents.
And, for any document that doesn’t need to have an original physical copy archived (e.g. an instructional manual), I trash it immediately.
The end result has been more access to my documents and far less clutter.
Learn more theory
Computer science has rich theoretical structure.
Keep abreast of new developments and renew your mastery of the classics.
Spend a month each year on topics like the following:
- Formal languages.
- Automata and computability theory.
- Complexity theory.
- Formal methods.
- Semantics.
- Algorithms and data structures.
- Machine learning, computational statistics and data science.
For starters, you might want to take a look at these posts:
- Writing CEK-style interpreters (or semantics) in Haskell.
- Parsing with derivatives.
- Missing method: How to delete from Okasaki’s red-black trees.
- Pattern-matching regular expressions in Scheme using derivatives.
- Converting regular expressions into NFAs.
Engage the arts and humanities
Engineers tend to look down on the arts.
What engineers fail to realize is that the arts and humanities augment technical excellence.
Steve Jobs was fond of pointing out the importance of connecting technology and the humanities, and rightly so.
Art and design have principles applicable to human-computer interaction.
Don’t be ignorant of these principles.
The arts and humanities train and sharpen intuition in a way that is difficult to quantify, yet is indispensible to of us whom work in quantified fields.
Engineers need to learn how to measure what they can’t count, instead of counting only what they can measure.
For at least one month per year, learn more about topics like the following:
- Industrial design.
- Philosophy.
- Photography.
- Painting.
- Sketching.
- Music and music theory.
- Film.
- Literature.
- History.
- International relations.
Social sciences have much to offer computer scientists as well, and economics and psychology in particular.
Learn new software
A good way to get ideas for your own software is to learn a new application or a new kind of application.
For instance, if you’ve never used 3D modeling software, try Blender.
Or, if you’ve never learned LaTeX, give it an honest effort.
As you learn, note what you like and don’t like.
Ask yourself honestly whether these observations are reflected in the software that you create.
It’s hard to spot bad practice in your own work, but easy to spot in others'.
Learn a new programming language
Programming languages rise and fall, so spend a full month absorbing a new language or a new language paradigm.
Write at least a modest program in it.
To take this to an extreme, I used 26 languages over 25 days to complete Advent of Code and wrote about the process:
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.
Complete a personal project
If you spend all day writing code for someone else, remember why you became a programmer by writing a program for yourself.
Spend a month each year on a project of your choosing.
Bring the nucleus of that project to fruition.
Open source it and release it to the world.
Translations
This page is also available in:
Twitter: @mattmight
Instagram: @mattmight
LinkedIn: matthewmight
Mastodon: @mattmight@mathstodon.xyz
Sub-reddit: /r/mattmight