A photograph of a road and rail line Between Hapuku and Mangamaunu, South Island, New Zealand
Hamster Wheel /ˈhamstə wiːl/

A monotonous, repetitive, unfulfilling activity, especially one in which no progress is achieved.1

Like other rodents, hamsters are highly motivated to run in wheels. Likewise, as a programmer in the early stages of your career you may be highly motivated to run in wheels too. Aside from your paid work, you'll dig deep into as many languages, libraries and frameworks you can get your hands on, building stuff using whatever happens to be popular this month and working insane hours either on the job, or at home after work and on weekends until stupid o'clock.

As time goes on, it appears more developers are concerned about their future in the industry if they don't keep running on that hamster wheel full-tilt and play, build or learn each new technology that comes along for fear of being left behind. This lifestyle is not sustainable, not healthy and certainly not the way to hone one's craft.

An image depicting a little hamster asleep at the bottom of his hamster wheel as a crude metaphore for programmer burnout



Burnout

If there is one thing experience teaches you as a developer, it is that you will burn out. Possibly many times. Devoting your life to the pursuit of learning yet another short lived framework or niche language to the exclusion of other physically, emotionally and mentally stimulating activities that aren’t programming is the fast track to unhappiness and burn out. You’ll be asleep at the wheel. It’s unavoidable that the older you get, the less motivation and capacity you will have to stay up late every evening burning the midnight oil.

Limited Time, Unlimited Scope

Avoid learning like-for-like frameworks and rehashes of similar works in different languages. Learn object oriented programming, functional programming, logic and rule based programming principles. Learn a dynamic language and static type systems. Learn synchronous vs asynchronous invocation and message passing patterns, learn parallel programming and concurrency and know the difference between them. Learn how to decouple functionality and function composition, single responsibility principles, open/closed principles, learn how to abstract and generalise concepts, also learn the trade offs, costs, benefits and efficiencies of these things. Generalise rather than specialise.

Learn how to organise your code base and use version control. Learn how to test and debug. Learn to recognise anti-patterns and code smells. Read up on various design patterns, architecture and methodologies. Read a little about state machines, AI and machine learning topics. Play around with some geospatial stuff. If you’re a web developer, build some desktop or server apps and vice versa.

These things add incredible breadth and flexibility to your knowledge base and will help you deal with most programming and design situations you’re likely to encounter, no matter the language or library, and if not, you’ll have the background knowledge to be able to find the tools you need for the job. Sharing what you know and helping others also keeps your skills sharp.

For some subjects, reading up on and understanding the concepts behind them is enough. Others will require a little more investigation and practical use and sometimes, they’ll take you on a wild ride into the depths of a mentally stimulating journey to the centre of a new abstract universe of revelation. With the web at your disposal you can learn anything but not everything. Choose what interests you and the amount of effort you’re willing to invest.

Simplicity

Many software systems have an overwhelming amount of complexity added by developers using numerous frameworks and libraries for only small pieces of functionality inherent in each. Do you really need an ORM for a simple application with a handful of database queries? Do you really need to use a MVC framework for a simple website or application? Simplicity has been forgotten. Only introduce structure, generalisation and abstractions as you design, build and recognise the need. Use modularisation to divvy up work if you’re working in a team. Don’t build for hypothetical future use cases. Learn when and when not to use frameworks and libraries. Build the minimal functionality that covers your specs.

Simplicity is the ultimate sophisticationUnknown.

Is that it?

When I started writing this article I didn’t realise I’d be suggesting so much stuff to learn! Anyway, you have the rest of your career to learn and each problem you tackle and your natural interest will guide you on what to learn next. Focusing on theory, design principles, patterns and programming fundamentals, and implementing them in real systems will teach you much more than learning every new language, library or framework that comes along. Read blogs, articles, code and books (and don’t restrict this reading to programming!), review your previous work and always be building things.

Early in your career you’ll most likely tend to spend as much time as possible coding, however, as you mature you need to spend less time coding and more time reading and thinking. Programmers need to take some time out of their coding each day for reading and thinking. You’re a knowledge worker, your value is your powers of deduction, logic and abstraction, your value is your ability to build complex (no more than needed!) systems from abstract concepts using nothing but your mind. You will write better code in a shorter period of time by spending less time coding and more time reading and thinking.

Unless for need, interest or fun, do not learn like-for-like frameworks and languages in a vain effort to keep up. Instead learn to abstract and generalise the relevant benefits and technologies behind them, and if need be, learn those concepts. Only learn what languages and frameworks you want and need to learn and apply your deeper knowledge within those.

Unplug

Spend your weekends doing other fulfilling activities which, no matter what they are, tangentially broaden your mind and expand your knowledge and experience as a human being. This is bound to improve your skills as a programmer and present serendipitous opportunities in ways that cannot be predicted.

Enjoy the ride

Along your journey you will develop your own style and taste. You’ll develop the instincts to know when and how to break the rules. Your knowledge will become so ingrained that recognition and execution of such concepts becomes second nature. The journey is that of continual learning, working smarter not harder, and it is a journey you should enjoy. Learn theory and technique, gain a deeper and fundamental knowledge and forget about every new language, framework or library that comes along. Get off the hamster wheel!

Notes





Related Articles

Code Incomplete
The Forgotten User