skip to content

Peculiar intellectual life of an autodidact

Is a university degree necessary to become an engineer? Short answer - no. Long answer - keep reading.


There’s a famous story about George Dantzig, a renowned mathematician, who, in 1939, while still a student, arrived late for the statistics class and wrote down two problems from the chalkboard his professor, Jerzy Neyman, had written. He naturally assumed those were homework assignments. Several days later, he handed in completed solutions for both problems, believing they were overdue assignments. Six weeks later, an excited Neyman eagerly told him that the “homework” problems he had solved were two of the most famous unsolved problems in statistics. They published Dantzig’s solutions in “The Annals of Mathematical Statistics.”

I love this story as it shows that an unmolded mind, unbothered by conventional rules and strengthened neural paths, can sometimes produce astonishing results.

I did something similar many years ago while being in high school. No, I haven’t found a solution to the famous mathematical problem, but I wrote a microkernel.

Feeding the inner monster

There was a competition called “Talents School” in Serbia, where every year, high school students would create some interesting projects and present them to the committee of professors. The year before, I was playing with some low-level networking software and, as a project, wrote a RAT. I was pleased with the results, but the next year, I was about to blow everybody away. I thought, “What’s the hardest thing I could build?” With some C skills and a limited understanding of my lack of computing knowledge, I found an operating system to be the perfect answer. Yeah, that will be my magnum opus. Today, after many years of being a professional software engineer, I wouldn’t dare to do this again. But being 16 years old and stupid, I rolled up my sleeves and threw myself into the unknown.

Needless to say, I didn’t sleep very much for the next couple of months. It took me about a month and a half of pain before I had a proper bootloader that printed “Hello world” on the screen from the floppy drive. After that, it took me another month to have a simple microkernel executable that runs in the protected mode. It may sound like a small feat, but remember, this was almost 20 years ago. There was no ChatGPT, information on Google was limited, and Terry Davis went wild on OSDev forums. There was only me, a couple of outdated books I found in the city library, and my burning passion to build something beautiful.

A week before the competition, my little OS was booting, drawing a cute ASCII art logo in the video memory, and accepting keyboard inputs with a cute little prompt and a green blinking cursor on the black background (we all loved Hackers back then). It didn’t have a file system, process scheduler, network drivers, or anything fancy, but it had bugs, lots of bugs. However, I could not be happier. It was a proper kernel, happily running in the computer memory, and it was mine. In the background, my grades deteriorated severely to the point I was almost kicked out of school (and home), but I couldn’t care less.

I was told several times during my professional career that I should work on my presentation skills. I cannot deny that this assessment is correct. This plagued me since childhood, as I was only interested in sharing my ideas once that became a necessary part of my job. Unfortunately, this trait manifested itself on the day of the competition. I was talking about interrupt routines, IRQs, GDTs, and magic numbers at the end of my boot sector, leaving the committee confused. Those poor people couldn’t understand what I was talking about, so I got only a participation award.

This hit me pretty hard, and I lost the motivation to participate next year. I didn’t want to code anymore or compete (which was a poor choice on my end, as the organization was giving university scholarships as awards the following year.)

Eventually, I got a scholarship to Metropolitan University in Belgrade, thanks to my other achievements. Still, due to my financial situation, I dropped out after my second year to work full-time as a developer.

And that’s how my academic career ended. Instead of university, I was left to the industry to evaluate my knowledge and skills. Although we’re lucky to work in a sector that awards ability, there’s no better judge than the holy temples of human brilliance we collectively call academia.

The Pain

One of the most valuable things in education, IMHO, is the grades. No, I’m serious. Without the authority competent enough to tell you if you have mastered a specific subject, how can you know if your skills are good enough?

As an autodidact, you’re forever left with the question, “Am I good enough?” If you went through the formal training, the professor, a mentor, or any other authority figure answered and sealed that for you. If you pass your algorithmics class with good grades, you’ll have a firm belief that you have mastered algorithms to a satisfying degree, and you won’t doubt yourself (unless you’re pretty gifted and want a Ph.D. in the subject).

Being an autodidact is a challenging path. The software development world is fast-moving, rough, and competitive, and you need confidence in your skills to survive. Especially if your engagement includes some leadership role. You will be looked upon, and the expectation to know all the answers is a heavy burden. Excellent conditions for burnout and the impostor syndrome attack.

Someone might ask: “What about the mentorship?” Indeed, what about it? It is fantastic if you’re a beginner, but after almost 15 years of professional software development, I cannot put myself quickly in the position of a devoted pupil. I would need a mentor with significantly more experience and knowledge, and those people are either not interested in mentorship or just plain expensive, especially when it comes to things I’m interested in. So, I was left with books, tutorials, and courses. The road simply has too many viable paths.

The Suffering

A couple of years ago, I had an idea of designing a domain-specific language for data integrations and transformations, similar to Spring Integration Java DSL, but purely functional, following functional paradigm to the last bit. While searching for the proper type system for my pet, I stumbled upon dependent types as a new concept in PL theory. It was a hot new subject in the programming languages; Idris 2 was about to be released, and Daniel Friedman and David Thrane Christiansen had just published their beautiful “The Little Typer” book. The moment was ideal, and dependent types were the perfect solution for my problem. However, never being adequately trained, I kept hitting the math wall. As much as I wanted, and no matter how hard I tried, I could not penetrate the type theory notation, as the concepts it relied on required a deep understanding of the formal logic. So, I packed that idea under the rug and continued with my life.

One day, I was sitting at my desk at work, and by accident, I pulled that little thing under the rug that was itching in my brain and started contemplating the design of my new pet language again. Should I compile it into the binary, or is it enough to write an interpreter? For my use case, performance is essential, so it must be binary. How to do that? Would LLVM be enough? If so, I need to sharpen up my C++ skills. How should I do that? Let me think of a pet C++ project. But wait, you know what would be cool? Writing a compiler in Rust from scratch. Oh yeah, that’s an excellent idea. But I’m not very good at Rust, let me check how I could learn it fast. Damn, this wouldn’t be easy. How about choosing a different language? Look, Haskell looks promising. Oh, what is that, Racket? Fascinating! I should learn that one. Curry–Howard isomorphism? What? Damn, it’s math again. I should order some books.

Before I knew it, I had lost an hour daydreaming about something I’d need to fully dedicate my life for the next 5 years. I told my brain to shut up and, heartbroken continued implementing some random Spring microservice I was working on. Sometimes, cash and professional responsibility are more important than pipe dreams.

Light at the end of the tunnel

But not all is lost. The fact that I spent some time trying to penetrate complex subjects helped me absorb at least some knowledge. Although I haven’t built my dream language (yet), the PL theory I picked up along the way helped me understand the languages I was already using much better.

Looking back, the passion for building stuff is the only drive that puts you through all the difficult questions you might encounter. When you don’t have a defined path to mastering a specific subject, you must find your own. I used to have a habit of solving about 50 Project Euler problems whenever I was learning a new language before starting a pet project. It might not be the best strategy, but it gave me the confidence to move on. And eventually, I had to develop my own inner systems for rating my mastery. Of course, from time to time, I still find fundamental gaps in my knowledge. But that’s okay; I can learn and connect it with other concepts I already mastered.

Another strategy I found very useful is hoarding textbooks (and even reading them sometimes). Universities often have a public curriculum with a list of books supporting specific subjects, and combined with Amazon and GoodReads rating analysis, you can distill out quality material. Of course, it will take longer to go through dense textbooks without the professor’s assistance, but there’s always the internet. StackOverflow, Quora, Reddit, you name it. Smart people are willing to help, and you should use that fact to advance. Ultimately, I cannot stress this enough - always give back to the supporting community.


So, you might be wondering, what’s the point of this blog post? Is it just a rambling of a guy approaching an early middle-life crisis with a delusion of grandeur? Yeah, maybe a bit. But the bottom line is - against all odds, I believe the life of an autodidact is a life worth living.

If you’re an autodidact, let me join the online motivational circlejerk trend that’s been going on in professional circles (looking at you, LinkedIn) and leave you with the following advice:

Learn how not to be afraid of the monster of the unknown. Embrace it, tame it, and make it work for you. Do stupid stuff - write your own compiler (or OS), invent a new protocol, build your own database engine, dabble in malware. Share your buggy code on GitHub, and let the elitists laugh at you. Suffer, learn, and grow. Let the impostor syndrome hit you harder than anyone else, but endure it and never let your obsessive passion die. At the end of the day, you have a sacred duty and responsibility to yourself to be who you want to be, despite your title, grades, or failures. The world is your playground. As Bukowski said in Roll the Dice:

you will ride life straight to
perfect laughter,
it’s the only good fight
there is.

Thank you for your attention, dear reader.