July 10, 2019

Eternity projects

“The beginning of wisdom is this: Get wisdom, and whatever you get, get insight. Prize her highly, and she will exalt you; she will honor you if you embrace her. She will place on your head a graceful garland; she will bestow on you a beautiful crown.”

— Proverbs 4:7–9

When I first started learning programming I was humbled. Since my first programming language was C++, humbled is too kind of a word. The compiler took my beautfully crafted code and tore it to shreds, stomped on the remains and then taunted my intelligence for making such obvious stupid mistakes. It was with C++ I first learnt how bad we humans are at thinking logically. Sloppy thinking is what most of us do, and we don't even realize it.

Be constantly growing

Growth comes from two things: nurture and protection. In order for something to grow, such as your programming knowledge, you need to nurture it. And then you need to protect that nurturing against anything that would threaten to stop or destroy it.

In practice, we stretch a bit outside our comfort zone until we get comfortable with that. We then stretch out a bit more, cue rinse and repeat.

If we're lucky we have jobs that constantly challenge us on this, but in my experience it is a bit of a hit and miss. Business typically want to train you to become really good at one thing that they then can sell, and so make the maximum amount of money on you. When you're completely new this is mostly OK, as you will be learning new things all the time. After some years you start to experience diminishing returns, as what was new has become routine. You end up standing on top of a plateau, which can be very comfortable, but also means you have reached the end of your growth.

Grow deliberately

Side projects is one way to grow. They offer a number of benefits as you can choose tech stack, problem to work on, pacing and how ambitious it is to be. Here I would like to propose eternity projects as a way of growing well beyond what you think is possible.

In order to qualify as an eternity project it has to meet two criteria.

  1. It has to take a long time to complete. This practically forces you to pick something big and daunting as a project.
  2. It has to be big and daunting. This practically forces you to give yourself a lot of time to complete it.

You should now ignore my circular logic and instead focus on what this will give you. Big and daunting is good as it will give you ample room to stretch in. Since you have also given yourself a long time to complete it there is no need to feel stressed. Think of it as your own personal RnD project.

Want to become really good at a new language? Pick an eternity project and start to program in your new language. Want to learn how certain systems work? Do the research and write one yourself.

A good eternity project will force you to grow in more than one area. An even better eternity project will force you to grow in more than one area, but in stages so that you don't have to learn five things all at the same time. The best type of eternity project will let you expand into new domain areas.

Ideas

Coming up short on what an eternity project might look like? Here's a short list of proposals along with which areas they cover (not an exhaustive list).

  • Write a CMS
    • Lifecycle management
    • Versioning
    • Publishing
    • Authorization (authz)
    • Authentication (authn)
    • Caching
    • Rendering
    • Routing
    • Databases
  • Write a database
    • I/O
    • Serialization
    • Availabilty
    • Parsing (unless you're clever and pick data structures as a query language)
  • Write a front end framework
    • Design
    • Extensibility
    • CSS (can you design something that can take any CSS framework?)
    • Widgets
    • Event driven
    • Callback hell (if you write in JS)
    • Hell (if you write it in JS)
  • Write a game
    • Graphics
    • Performance
    • Animation
    • Game logic (different since the goal is for the game to be fun)
    • Lots of really cool algorithms
    • Serialization
    • I/O
  • Write an AI that can play Starcraft: Brood War
    • AI
    • I/O
    • Seralization
    • Algorithms
  • Write a spreadsheet program
    • I/O
    • Formats
    • Serialization
    • UX
    • GUI
    • Macros (aka DSL)
  • Write a social network
    • Distributed computing
    • I/O
    • Performance
    • Databases
    • UX
    • Authz
    • Authn
    • Network traffic
    • Taxonomy

Got more ideas? Send them to me at <emil @ this domain com> and I'll add them.


    Thus spake the Master Programmer:

    "A well-written program is its own Heaven;
    a poorly-written program is its own Hell."
Tags: category-error thoughts