I am a "self-taught" programmer; I never got a degree, so far, or took any courses to start making apps. And what I learnt recently is that learning by doing is not enough for programming... And I made production apps while fundamentally misunderstanding basic programming concepts...
The start
I used to play with Scratch when I was incredibly young, but I didn't accomplish much, which is a reason for me not counting Scratch as the start of my coding journey. Rather, I used to play Roblox during the COVID-19 pandemic (nostalgic, I know) and liked the concept of making my own games and pushing them onto the platform... That's when I learned about Roblox Studio, and started using ready-made assets and scripts to put together and form games. The most coding I did was modifying a few variables and implementing a few if statements in Lua, the language Roblox Studio used.
The most "successful" game I made was called "escape the impossible obby" (yes, I cringe about it myself), without any word capitalisation. The game has had 245 visits since its creation until now.
And earned me the single Robux that remains to this day
Getting Started
Later, I met some people and was introduced to CS50, who make what are arguably the best CS courses ever. So I took CS50's "Web programming with Python and JavaScript" course, and that was all I needed to take off. I learnt how to "think" like a programmer, and that was enough...
With only that course (and not its certificate), I proceeded to make what I would now call "basic" websites. With a local-only to-do list app and a chatting app that's copied 99% from a Medium post [with me not understanding anything but the HTML and a bit of the JS, and not even knowing what NodeJS is], I felt very proud of projects that would actually be trivial to someone who took a few courses more than I did.
Breakthrough moment
But then, a lot of things happened, probably because the "basic" websites taught how to deal with code... There was some sort of "take off": I made websites such as this:
And I made games like this:
I also made Discord bots on Discord.js with relatively complex mechanics...
All of that happened on a laptop with these specs: GeForce GT 630M, Intel Core i5 3210M, and 8 GBs of RAM!
Just to put this into perspective, here's the comparison between that laptop's GPU and my current one's:
And between that laptop's CPU and my current one's:
So that's good and all, I did all of that without taking any courses (except that one CS50 course that got me started), on a potato PC, and without studying anything! Right? Wrong...
The problem and realisation
At the end of 2023, I wanted to make a mobile app, and I was under one too tight of a time constraint to learn both Java/Kotlin and Swift, and I didn't have a Mac. So I discovered React Native, and I thought that this would be the perfect opportunity to deal with React and make a mobile app at the same time. I had previously interacted with React while revamping Diva Hosting's (now called Galactic Hosting, having a much laggier panel that still contains some remnants of my design decisions) panel, but I'd only dealt with the parts that were almost identical to plain HTML/CSS/JS, so I saw this as an opportunity to learn React properly.
And then: It was too weird and overwhelming to know how components, building and EAS (on Expo applications) work... Or knowing how React "rerendered" things, which would help me make my apps more performant...
I had an easy time with HTML, CSS and JavaScript because I was introduced to the core principles, I had an easy time with Unity because I watched the legend Brackeys's videos, and I had an easy time with Discord bots because a member of my game dev team, @lulu5239 on Discord, taught me how to do it while making a Discord bot for the team's server.
My brain had gotten sort of "wired" to these platforms... The core principles of React and any other framework that is more advanced would be much more complicated than the core principles of HTML, and beyond that: I had other human beings teach me the basics of the other two platforms: Brackeys for Unity and Lulu5239 for Discord.js (through which I also got the hang of general-purpose NodeJS).
The missing foundation
I eventually resorted to taking a course on React Native, and although it was a bit outdated, it acted as the CS50 course (although nowhere near as good as the lovely CS50 courses) but for React Native... I used it to make another "take off" and continued to finish a fully functioning production app. The same happened with React on the web, I managed to get started on it by taking another course.
And yet, that wasn't enough for me to find myself able to talk expertly about the CS topics I was interested in... When I would sometimes be told about some CS principles, I would go blank. Only to later realise that I understood these concepts by practice, but was never able to communicate them clearly or explain them since I never "learnt" them, rather, I simply tried them once by chance and saw that they worked, so I kept repeating them.
One example would be the "separation of concerns" principle, or modularity as we commonly say: I did not understand what that was! But I wrote relatively modular code simply because I intuitively didn't like cluttered code.
I had to more-or-less "study" by doing extensive research on topics to be able to understand them...
For example, my knowledge of encryption led me to make up what I thought was a "novel" theory of how to manage my app's security. Only to later realise that the "theory" existed as a bunch of principles that everyone knew, but I didn't; rather, I unknowingly used them after trial and error.
The fix
So I now know that I wouldn't have really made it in a job interview before actually researching topics and taking courses. For example, I took Google's Cybersecurity professional certificate, and while taking it, I noticed bits of information that I knew would've taken me ages to discover if I'd gone with the same way of "self-learning" cybersecurity. And especially considering the fragility of advanced things, like React or Cybersecurity, it's becoming more reasonable to want to take courses or study curricula, so that I don't make miserable programs that are built on a weak foundation.
And I'm not saying you should take courses and spend money for everything, I now know much more information than these few courses would give me... It's because nowadays we have the powers of Google Search, YouTube and AI combined! You can learn about pretty much anything through a free CS50 course, a few articles, or a YouTube video! The most important thing is that you are intentionally searching for things that teach concepts, not just methods of doing something.
But yet, there are many "aha!" moments that I experience where studying or researching theory explains practice... Especially regarding software architecture and design: Previously, I overhauled one of my apps' API to make it more performant and simply cleaner, and I later discovered that the principles I "made up" to make this API were already existent and could've been implemented from the start (e.g. separation of concerns and duties, least privilege, single responsibility, etc)! Now, these wouldn't require courses or deep research to learn. But you wouldn't specifically remember them if you just hear them a few times over the hundreds of YouTube videos that you watch about CS, you need to specifically target clean code and security principles to be able to engrave them into your brain, and constantly think about them while writing code.
Bridging the gap
Well, I still personally prefer learning by doing over anything else. And it's important to start with it, and after you get good and proper experience with making functional apps, start learning about the design, coding, and security principles needed to improve these apps. And while doing that, you will learn to apply these principles everywhere.
But it will always remain important to write clean, secure, and optimised code when writing your programs — which wouldn't necessarily happen if you never researched algorithms, or cybersecurity, or CI/CD pipelines! — so that you may actually work in large teams or pass interviews!
Conclusion
Practical experience is very important — and in my opinion, the most important — because it gets you started: You find out whether or not programming is for you by actually building stuff, and you learn how to build with practical experience. But theoretical knowledge is what makes you build well, and intentionally well...
If you're self-taught, then don't abandon the hands-on way of learning that got you started. Rather, I just want you to make sure that you always account for the theoretical as long as it fits your project(s). Your tendency to get your feet wet and experiment with new concepts is why you're special, why you're "self-taught". But when you hit the wall that I hit with React Native, recognise that intuition is not always enough, and that you need to understand the why behind your code.
And this is what I would call the "sweet spot": Knowing how to switch between doing and studying. To start by building to motivate yourself, then learn the theory to reinforce your experience and improve existing projects.
What I do now is that I immediately get started with a new technology if I want to learn it, no courses or research beforehand, and I immediately start working on my project idea rather than prototyping random things. After I finish it, or scrap it in favour of a better version or idea, I start to read documentation, take courses, or watch videos... And after that, I become capable of not only implementing what I learnt well, but also learning new aspects of the technology that I hadn't learnt before. And that makes all the difference in teams, interviews, and building scalable software!
Key takeaways
This took long to write, and I think it's worthwhile to summarise everything:
- Learning by doing is what builds confidence and practical skills
- Theoretical knowledge is what builds the vocabulary and context to build apps that are intentionally good
- Both together form a knowledgeable programmer That's it for today, everyone. Please share your opinions, and Happy Hacking!
Top comments (2)
Yeah I’ve been there too, building stuff by trial and error and then realizing how much I didn’t really get till things broke down. Honestly the blend of just starting and then digging into theory hits way harder than either alone.
Yep! That's why I thought I could share my experience with people... This story happened years ago, yet I just reflected on it now and thought I could write about it
Some comments may only be visible to logged-in visitors. Sign in to view all comments.