Like many software engineers in the industry, I became one by happy accident. Growing up, I always loved computers, played video games, experimented with game mods and add-ons, and configured the computer in unusual ways. I even got in trouble in middle school for hacking into the administrative area of the network storage (it really wasn't that secure) and gaining access to software that allowed me to view and control every student laptop and computer lab computer in the school. I remember renewing my friends' library books using the administrative library software I found there to show off.
My computer obsession has always centered around exploration and curiosity. I never formally attended university to study computer science. Instead, I pursued a degree in Information Technology and Business Information Systems, which, although it taught some programming languages like Java and JavaScript, did not cover the fundamentals of computer science such as algorithms, data structures, operating systems, discrete mathematics, and other theoretical concepts. Rather, it emphasized hardware maintenance, server setup, network servicing, and security engineering. While this was initially interesting, it quickly became dull since I could pass almost every class without attending.
Although my degree didn't focus on software development, that's where my attention was directed. I would work on projects like creating a website for my friend Bajheera, who is a Twitch streamer, or developing stream interfaces, such as a fun little battle game involving Bits (donations integrated into Twitch), where viewers could donate to support either Vegeta or Goku. These small, enjoyable projects made me fall in love with programming. Are you telling me that everything I can imagine, I can bring to life through programming on a computer?
My first job was offered to me by my professor in one of the few web development courses of my degree. I excelled in his class, assisting other students and submitting our final project weeks ahead of schedule. This marked the start of my career as a software engineer. I worked at his small startup, Monimus, a collaborative drawing web app, where I spent three brief months while still in school, using ReactJS to create an impressive app before they lost all their funding. Although my time there was short-lived, it ignited my passion for programming. Creating things provided me with a sense of accomplishment and fulfillment, unlike any other subjects I had studied in school.
My next job after that came through connections, working for a home healthcare LMS system that provided educational content and certifications for home healthcare aides and nurses. This was where I got my first glimpse of what a true software artisan could accomplish. The lead developer, The Budiman, adhered to TDD (test-driven development) and emphasized well-written code. He provided incredibly detailed code reviews, demonstrating that while my code functioned, it could be improved in a cleaner and faster way. To this day, I credit much of my coding style to "Budi."
Looking back, this would have been the perfect time to start studying computer science. Algorithms, data structures, the intricacies of operating systems, interpreters, the mathematics behind it all, and lower-level programming are all vital. While I am confident in developing well-written, efficient software, I lack the language to describe my work. I want to learn how everything functions and expand my experience from working professionally with NodeJS to becoming a well-rounded software developer capable of coding everything from embedded systems and CLI applications to desktop and mobile apps.
In a time when AI-aided development is taking off, and there are whispers that software developers will be replaced soon entirely by AI, I think one has to either double down and become a true master of the craft or give up and work in a different industry.
So, I am starting over. What does that mean? I'm approaching learning computer science with an open mind, free of prior assumptions. I plan to read through a list of books frequently recommended across the internet to self-teach myself Computer Science—all credit to teachyourselfcs.com for the list.
The list includes:
- Structure and Interpretation of Computer Programs by Harold Abelson and Gerald Jay Sussman (Finished)
- Computer Systems: A Programmer's Perspective by Randal E Bryant and David R O'Hallaron (Reading this now)
- The Algorithm Design Manual by Steven S Skiena
- Mathematics for Computer Science by Eric Lehman
- Operating Systems: Three Easy Pieces by Remzi H Arpaci-Dusseau and Andrea C Arpaci-Dusseau
- Computer Networking: A Top-Down Approach by Jim Kurose
- Readings in Database Systems
- Crafting Interpreters by Robert Nystrom
- Designing Data-Intensive Applications by Martin Kleppmann
I plan to continue documenting my journey through this curriculum by reviewing each book, as the best way to learn is to try to teach others.