Complex Systems All The Way Down

As part of running Underjord I’ve done both mentorship and some teaching. Both in the form of a working relationship where I have seniority and am responsible for supporting their learning as well as mentoring entirely external people of varying experience levels. I find it incredibly hard to transmit everything I think people need to get familiar with when they want to do development. Why?

Well, I learned it all incrementally. HTML on Geocities, then some CSS, some JS. Oooh, PERL. Some XML. Local web server, exciting! Bam! PHP, MySQL, Linux. Years of Linux desktop use along with running my own server because young and no money. jQuery and AJAX. Onward to first paid work, paid hosting and CMS:es. WordPress, Joomla, Drupal, all of it. Tried to build web applications with those. That sucked. Better servers, Python, web frameworks, SPAs. Onwards to clouds. And on it goes to this day.

Note: This post is a refinement of an essay from my newsletter. Issue 15 to be specific. If you enjoy the read, consider signing up for a weekly hit of opinions and tech.

It has been unending learning. And most of it has built on but also replaced most of what came before. I don’t really like traditional CMS:es. I think they make empty promises and sneak up on you with hidden costs. But they are a pretty accessible place to start and learn. I don’t like cheap hosting providers, but, again, they are accessible. The choices I make today are choices I can make because of my past experiences. I already know many of the tradeoffs. My choices might not make sense to a newbie. “WordPress is a huge and influential project. Surely they know what they are doing?” Yeah, but they can’t change their design without breaking their golden goose of extensions. I bet they have some thoughts.

When a student asks me “What are your thoughts on MongoDB?” the answer is only simple if I lie. I know some people like it. I have heard enough to distrust it. The answer “Just use Postgres” isn’t exactly right, “It’s probably fine” feels dishonest and if I add “but I’d never choose it for anythingā€¯ that’s hardly helpful. There is enormous context and choosing what to bring into a learning person’s world is genuinely difficult.

At the time I was learning, I didn’t have access to any kind of bigger picture. I had limited resources. Limited documentation. I had so many limitations. I ran into them constantly and eventually found the next thing I could use to do cool stuff. If you try to teach someone to use an HTML form today, you will need to decide if you are talking about the basic idea or reality. Do we need to cover CSRF, captchas and how to do it in React? How about the backend? Starting out, I didn’t hear about half of the things I didn’t know; I think that made things easier.

For example, I think every developer working in open tools benefits from being comfortable in a terminal and on a remote Linuxish server. So that brings some POSIX and some Bash. But then you get SSH and public key crypto. And then you have basic networking, potentially firewall configuration, at the very least Nginx, a database or maybe a bunch of Docker and cloud native tools that abstract everything away .. until you have to customize something and the complexity comes tumbling back in. The domain of knowledge just sprawls out into countless dimensions.

Yet people are supposed to get into this with a bootcamp. Or even with two years in school. I’m glad I started in my teens and don’t have to feel like I’m playing catch-up any more than I am. If it feels overwhelming to you, regardless of experience level, that’s because it is. It’s fractal; look closer at any of it and there is always more you could understand and benefit from. There are always more concerns you could absorb into your full-stackness.

Suddenly we run face first into the thing where companies are only hiring “senior” developers and everyone starts out being a “junior” developer. I’ve even seen “making senior” become a thing on Twitter because it is now an arbitrarily codified level in the orgs career progression. And in some ways that might be good. The profession probably needs to mature. But let me be clear and honest, I got my first senior and tech lead titles simply because I was the most experienced in the room, not because I was particularly experienced. But someone needed to wrangle the server, someone needed to stick their neck out. That was it.

But where the hell are people supposed to learn? Is it always going to be the WordPress shops of the world that teach juniors? Because websites are lower stakes and in the CMS world poor technical choices go unnoticed?

I keep trying to find better ways to bring people onboard and up to speed, and to hand them the tools they need. If I try to boil it down I get this:

If you want to do this stuff and build your skills, you have to know how to learn new things, and you have to be able to sit with discomfort.

The learning part is pretty commonly stated, the discomfort is not necessarily mentioned as frequently. You will never know the stack top to bottom to some specific granularity. You have uncertainty in every part of the profession. Your strongest guarantees build on top of systems on systems of unclear guarantees. All these things are learnable on their own, but the entire system of a full-stack web developer is not. You are dealing with uncertainty, and you need to be able to sit with the discomfort of that to get your work done with what you know right now.

I’d wager there’s a case to be made that the discomfort is what makes us move forward and try to find new solutions that solve our particular discomfort. And at the very least, we get to zoom deeper into that part of the fractal.

Hand someone a fish and they’ll never know that the ocean is vast. Teach them how to fish and they’ll be forever lost at sea.

Does this match your experience? Is it hopeful or distressing? You can reach me over email at or find me on Twitter as @lawik. If you enjoyed the read, it spawned from the newsletter.