If you haven’t read the rest of the devlogs, you can find them here. You might be missing some context if you don’t.

“The test of the machine is the satisfaction it gives you. There isn’t any other test. If the machine produces tranquility it’s right. If it disturbs you it’s wrong until either the machine or your mind is changed.”

― Robert M. Pirsig, Zen and the Art of Motorcycle Maintenance: An Inquiry Into Values

I’ve been working on this version of the CTF for a good long while now: Since May 2nd on this version, which means about 2 months; and since last year on the concept, which means about 9 months. And I’ve finally released it!

So, what have we learned?

Effective tooling leads to a motivated process

I had a BLAST running my generate-new-level script. The marvel of seeing my hard planning and development work pay off made me WANT to create more levels and to continue working on the Challenge in the future as well.

Testing is worth its weight in gold

Had a few friends test out the challenge, and the feedback was invaluable:

Pull Request

Releasing is exciting and fun

Having people that I don’t know playing my challenge live and sending me PMs on Twitter was super cool. A very humbling experience to know that I actually helped someone who wants to study:

Twitter DM

Releasing in COVID-19 is bittersweet

This CTF was a part of a workshop with a lecture as well. While it can be done 100% online no problem (and in fact this format is incredibly productive in remote work), I love the feeling of interacting with my players one-on-one. Obviously since the importance of social distancing can’t be overstated and this CAN be done remotely, it should; but ignoring the fact that I’m actually missing that human connection will be dishonest.

I’m sure that there are lonelier experiences than this, but releasing the CTF only to my computer + Zoom calls and then moving from my workstation to the couch (in 3 steps) is sort of a hollow happiness.

Analytics can be important

I skipped analytics this time, and I regret it. I would love to get an estimation of how many players are playing my challenge hourly, and I’ve scripted it pretty easily:


# $1 is key file, $2 is username
echo "$(date): $(ssh -i $1 $ 'docker ps | grep mgb | wc -l') players"

But it doesn’t really connect to anything, so I’m not really using it. Would have been better to run this every X on the machine and export the results into some AWS DB - but I want to keep costs down, so I gave up on this.

A successful release just creates more tasks

Since release, I’ve created 21 new issues:

  • 14 New level ideas, including:
    • branch
    • fsck
    • More rebase
    • submodule
  • 2 Bugs 🐛
  • 5 New features/improvements

And I feel like if I release version 1.1 with all the new levels and features, I’ll just want to do version 1.2, and then 1.3, and then….


People enjoy learning if it’s fun

All you need to see is the Hall Of Fame - a lot of people enjoyed the CTF enough to actually finish it!

Side projects are great if you don’t let them die, and also if you do

It took 3 dead side projects to get to this one. Is this the natural process of working on passion projects? I hope not, but I hope it is at the same time. Now that this project is out, I would want to keep it alive, keep maintaining it, keep nurturing it. So I wouldn’t want too many side projects to “tie me down”.

I’ve improved technically, as well

Uncle bob wrote in his book “Clean Coder”:

Practice. Practice. Practice. True professionals keep their skills sharp and ready. Musicians don’t get better by performing (doing your job), they get better by practicing (outside of work). That same rule applies to engineers.

My project enables others to practice, but it also helped me learn and train. So, what did I learn/practice?

  • more git
    • How to write complex server-side hooks
    • How to set up a git server with ssh
    • What people want to learn, and what do they find copmlicated
  • Rust
    • New language! 🦀
    • Read the book (up to chapter 15 or so, still need to finish it sometimes)
    • Learned about ownership
  • Programming
    • Recursion
    • Graph algorithms
    • Configuration parsing
    • Good logging
    • Good packaging
    • Developer documentation
  • Docker
    • The dockerfile for the server is pretty complicated all things considered: good practice to write it.
    • How to invalidate docker build cache
  • AWS
    • Always nice to practice setting up an EC2 instance
    • Learned how to get an Elastic IP address and assign it to a machine
  • JavaScript
    • Practiced more with vis.js to do the level graph

What now

Kick up my feet