← Back to blog

My Basic Advice

2026-02-15

A few times a week I receive an email from an approximately 20-year-old developer currently enrolled in college or planning to be shortly. Sometimes they are interested in biomedical, but most express a desire to enter a cross-domain STEM field with software expertise.

I find myself giving a lot of the same advice, so I want to distill that here for everyone.

Your goal should be to artificially recreate the circumstances that permitted an elementary education for previous generations. To this end, I suggest finding a PDF of "The C Programming Language" by K&R (a trivial feat) then reading it cover-to-cover and doing all of the exercises. Without AI.

Why without AI? It's because ChatGPT et al really don't know when to stop with an explanation and often just give you the right answer. Even if you're a prompting wizard and can design a well-behaved programming tutor, you're missing out on the core experience of interacting with other developers as a newbie. Back in my day, when I had a problem I couldn't solve, I had to politely ask ##c on irc.freenode.net, respectfully tolerate whatever verbal whipping came my way, and show appreciation for real people taking time out of their day to help me. This community has helped innumerable developers acquire C competency. Resources like this still exist and ought to be utilized.

"I did all of K&R without AI" is also a flex; many older devs read K&R in their teens and 20's, so they have a much more precise understanding of your skill level and capabilities given this disclosure. It also demonstrates understanding on your part that an "AI-enhanced" CompSci education confers an air of "I take shortcuts whenever possible, even when it comes to foundational knowledge." This is not an area where you can afford to sell yourself short, and the industry is coming to this realization.

Modern software engineering, for as long as I've been at it, has never been something you can learn effectively by locking yourself in a closet without internet. Times were different pre-internet, but system complexity has since exploded, and many developer workflows tend to assume you have an internet connection. This has long been the case, even with man pages available. The handful of environments that ship with stellar offline documentation and no network dependencies are the exception, not the rule.

I think this is why the directive "do it without AI" is less intuitive than it seems. We now have younger devs who were experts at using ChatGPT even before gaining an interest in programming. "It's just a finely tuned search engine; what's the big deal?" The problem is that if this one tool is taken away, your means of learning the craft also goes away. Copilot / agentic workflows are meant to be a force multiplier, not a crutch.

Software development isn't merely about knowledge. It requires the ability to recognize when something is seriously wrong, which may manifest as a task taking way too much time or some bizarre anti-pattern that doesn't pass the smell test. At minimum, you need to be able to estimate task difficulty and maintainability. Neither of these things can be done reliably without manually inspecting code, and the only way to get better at that is with practice.

There is also the executive function aspect of software development. As an aside, I want to point out that there is a type of genius that arises from insanely high executive function. This amounts to knowing exactly what to do in every situation without needing to think about it. Emergency Medicine physicians, for example, exemplify this type of genius; they don't have to spend 15 minutes (like I have to do) deciding if really bad skin lesions are autoimmune or infectious in origin. Yet they can give you a lecture on the spot about why they came to that conclusion: five minutes of explanation for something that took them five seconds to decide authoritatively.

Software is the same way. When I hear an idea for a system, I immediately think "We have at least three conceptually distinct services that we're combining here, one of them needs persistence, and one of them is an abstraction over a vendor API with extra steps." This is not how I thought a decade ago. Just like the EM physician, the only way to get here is through years of deliberate practice - practice you can't get if you're constantly fed the answers.

So my advice echoes exactly what I was told in 2010 when I wanted to learn programming: do it the way everyone else did it. Get your hands on a PDF of K&R, download a C compiler, and get to work. You'll find that K&R is actually quite fun. The moment you find yourself enjoying it is when you know with confidence that software engineering is right for you.

-Tom