Life works in mysterious ways. Sometimes, you need to take a decades-long detour before going back to some unfinished business you need to tend to. Or at least that was my case with programming! So let me tell you my storyā€¦

Nobodyā€™s Fault but Mine

My very first experience with programming goes back to 2006 when I was still in Middle School. My french professor at the time asked us to make a student magazine as a group assignment. Having enjoyed working on that assignment, I wanted to keep my groupā€™s project active, but I couldnā€™t commit to the costs and challenges associated with producing a paper magazine. So I figured creating a website would be the next best solution.

I then started learning xHTML, CSS, and PHP through a french learning platform called Le Site du ZĆ©ro (which literally translates to ā€œThe Zeroā€™s Websiteā€, now OpenClassrooms). Doing so, I also discovered the joys of open source, especially when I first received a CD copy of Kubuntu, which at the time you could order from Canonicalā€™s website and receive by mail for free.

But it wasnā€™t long before I discovered that you could build an entire, dynamic website using WordPress, and barely write any code in the process. Knowing that, I couldnā€™t find purpose into learning how to build a website from scratch anymore, as I was foolish enough to think that a CMS voids the need for programming skills. In hindsight, I completely overlooked that WordPress itself was merely the product of skilled programmers who mastered the very languages that I just started learning.

Fairly discouraged, I started exploring other areas of technology, and found interest in ā€œhackingā€. I was so intrigued by how malware worked that I started naively downloading viruses, worms, key-loggers, etc., to the family computer, in an attempt to understand their inner workings. Of course, I knew that I wasnā€™t supposed to be doing any of that and tried to hide my activities from my parents, with no success. One day, they tricked me into leaving my session open so my father can check what I was doing. Obviously, it wasnā€™t very hard to figure out, and as a result, I was grounded and denied access to the computer for weeks.

Shortly after that incident, Moroccan teen hacker Farid Essebar, a.k.a. Diabl0, who was responsible for the Zotob worm targeting many large organizations in 2005, was sentenced to prison for authoring and distributing malware, after an investigation that required the collaboration of the FBI, Moroccan, and Turkish authorities. His spectacular prosecution made me realize how my adventures with malware could have jeopardized my future, and I naturally feared knowing the same fate.

This chain of events effectively put a stop to my musings with programming, and led me abandon it in favor of other hobbies (mostly playing guitar, reading science and philosophy, and writing). However, I was still very interested in technology, and kept entertaining my curiosity by reading blogs, specialized magazines, books, etc., for the years to come.

One Too Many Mornings

Many years later, I would graduate from University with a Masterā€™s Degree in Marketing, and join the workforce as a young and eager professional. Being somehow biased towards getting things done properly and efficiently beyond my specific areas of responsibility, I slowly drifted away from marketing and communications in favor of project management, which I came to realize was more technical than I had thought the more I worked on projects of different scales across many fields.

In the process, I realized that I was drawn to the technical side of things and I often found myself trying to automate the tedious and repetitive tasks the best I could, knowing however that thereā€™s a better wayā€¦ if only I knew how to program it!

As time went by, the itch to learn programming again was slowly building up, but years passed before I finally decided to act on it after a frustrating experience at work: The organization I was working for at the time decided to create a collaboration platform for some of our external users and partners, which would require some custom development to cater to our specific needs. Being the most tech-savvy of the team, I was involved in the early stages of the project, contributing to the requirements definition phase and making some suggestions on how to best address them.

The contract was awarded to a software development agency to implement the solution, but the project slowly fell behind schedule, budget went out of control, and the company in question ultimately failed to deliver a working product. I was very frustrated about the situation because I really wanted to see that project succeed, but I was even more frustrated by the fact that, being a long time observer of the technology and software development space, I knew what needed to be done to implement the solution, but not howā€¦ I would later quit that job for unrelated reasons, but with the firm intent to learn programming and never feel the same frustration again.

Learning To Fly

More determined than ever, I started learning web development again around February 2023 through the Odin Project, of which I must admit that I only completed the Foundations course. And although I really liked the curriculum, I still felt like I didnā€™t understand concretely how computers really work under the hood, and how that translates in terms of programming. I was, so to say, too high up the stack, and felt the need to go at least one level down.

Enter Harvardā€™s CS50 courses on edX. I first took CS50x, their general introduction to Computer Science. The first weeks learning the C programming language were the most challenging and illuminating at the same time. Not only did I learn the basic syntax of the language, but more crucially, suffered through my first segmentation faults, understood how memory works (to some extent), and studied some data structures and algorithms. On the following weeks, the course briefly introduced various topics and technologies like Python and Flask, databases and SQL, web technologies (HTML, CSS, and JavaScript), and cyber-security. Just enough to get me started and leave me asking for more, thanks to engaging lectures, focused written materials, and excellent practical assignments and projects.

The experience was so amazing that I decided to take most of the other CS50 courses, starting with CS50P for Python, CS50W for web development with Django, CS50SQL for databases, and most recently CS50CS for cyber-security. Iā€™m also planning to take CS50AI for Artificial Intelligence and CS50GD for game development in the near future, and perhaps even the upcoming CS50R for statistical computing, since I figured it would only make me a well-rounded programmer with at least a basic understanding of a few different sub-fields of computer science.

Working through the CS50 courses, it became very clear that I really loved programming, as I often found myself asking questions that never would have occurred to me before, and falling down endless rabbit holes to answer them: why is it that C arrays are of a fixed length, but not Python lists? how come the first only accept values of a predefined type, but not the latter? are Python lists implemented as a linked list under the hood? and if the Python interpreter is implemented in C, does it mean the C compiler must be implemented in Assembly? what makes a programming language anyway? and how do you even implement a compiler / interpreter? The questions never endā€¦

Having experienced the joys of programming, I decided to go back to University for a Computer Science degree, and get some of my questions answered. This choice made me even more motivated to take other courses on my own, often dedicating as much as 10 hours a day to programming practice with the University of Helsinkiā€™s courses on Java and Python on MOOC.fi, among others on Linux, networking and other topics. And while itā€™s sometimes challenging to find balance between work, studies, and all of the rest, my experience going back to school has been a pure enjoyment.

Another significant milestone in my learning journey so far was being accepted into the All In Africa program, where I met a lot of Open Source enthusiasts across the world, had the opportunity to learn about building software in the open, and contribute to a few OSS projects. Going through the program, I wanted my contributions to the open source ecosystem to be meaningful and not a burden to the maintainers. Thus, most of my contributions were simple, straight-forward enhancements (mostly related to documentation) for tools and libraries I was already familiar with. However, one significant ā€“ and quite honestly unexpected ā€“ code contribution was to a machine learning library for quantum physics: NetKet.

At last, 12 months after my second first programming course, I was able to make two iterations on the project that sparked this whole adventure, and to some extent get past the frustrations that put me on the track to learn programming again. To be perfectly candid, these two implementations (using different technology stacks) didnā€™t meet all the requirements that were set for the project, but they were nonetheless important for me, since Iā€™ve been treating this project as a learning ground that Iā€™ll probably continue working on in the foreseeable future.

Do What You Like

The main takeaway from this story is that itā€™s never too late to go back to something you really enjoyed, even if that was nearly two decades ago. In my case, I started my programming adventure a bit later in life, but I know that I have come a long way during the last year, and Iā€™m pretty satisfied with my overall evolution so far. Now Iā€™m more motivated and focused than ever to continue learning and building things, knowing perfectly well that growth is a never-ending journey. But thatā€™s exactly why I decided to launch this blog, document the adventure, and hopefully get some useful feedback from my peersā€¦

Thank you for reading!

Sincerely,
Oussama