On Relearning to Code as an Adult
My journey's been a long one, but what finally got me off my butt was working in dev tools/coding education at Replit, which reignited my passion for coding, and then taking some time off of work, which has given me the time to focus on learning.
This'll be a long post. I'll share my journey and some of the things I've tried along the way (including some dead-ends/distractions). Hopefully these experiences are helpful for other learners. If you're at all feeling the pull, go for it!
(Click here if you want to skip my back story and go straight to the learning.)
There's nothing in the world quite like feeding instructions into a computer, messing around, and trying to get something cool to come out. After years of dabbling, the magic still hasn't worn off.
Learning to code has of course been challenging and frustrating at times, especially when spending hours debugging CommonJS/ES Modules at the start and now trying to wrap my head around RxJS. But most of the time it's fun. I lose track of time and hours disappear. And at the end I've got something (in)tangible to show for it!
Who says learning through play is just for kids?
My on-again off-again obsession with computers started (as I'm sure it did for many others) in the awkward years of middle school, when I joined my school's C++ club. My first program played louder and louder and higher- and higher-pitched beeps on an old computer in our lab. It was dumb, but my friends loved it. I was hooked.
But even before writing my first line of code, the seeds had been planted. My dad was always tinkering on Mac computers after work. And I had a "cool" uncle, who played video games and worked as a computer programmer. Naturally, he taught me and my brother fun kid things like polymorphism.
I was lucky to go to a science-and-tech magnet high school where I took as many computer science classes as I could. We learned Java, C, Assembly, and Ruby. I even got to take an AI class and learned about genetic algorithms and neural networks (this was before GPU's unlocked all the really cool stuff we're seeing today). We worked on Sun Microsystems and Dell computers running Linux. The Unix and FOSS philosophies really grabbed me.
One summer, inspired by all those great Flash games in the early 2000s, I made a game for our high school game website. (And many years later I uploaded the semi-functional code to Replit.)
Then in college, I took just three CS classes (Linux, Python, and Microsoft VBA). I was getting pulled in other directions. I wanted to go work in finance on Wall Street and prioritized making lots of money and getting a "high-status" resume-building job above all else (oh the follies of youth...)
It wasn't long before I figured out I wasn't a good fit for Wall Street. I decided to try something in "tech" and next took a job at a mid-size data & analytics company in Chicago doing "strategy" and "ops." I loved the work but yearned for something with impact.
My next job was at an early stage ed-tech startup in San Francisco. In the early days, I insisted on documenting bugs in Github and fixing typos by submitting untested PRs. I'd joke that I was flying blind like Luke Skywalker in the Death Star trench. But really I was making more work for the real engineers... :^/
As the company grew, I got increasingly pulled into sales and finance work.
When I was ready for my next gig, I came across Replit and loved the coding education angle. At the start, I asked a few of the engineers to teach me some basics, and they graciously did. But again I kept getting pulled into sales, finance, and management work. (and the same old pattern repeats itself ;^))
Luckily I got to do a bit of coding for some marketing projects (e.g. this questionably helpful YouTube tutorial on web scraping). And I also got to write about the joys of coding (e.g. this overly-long blog post) and to speak about coding education (e.g. this panel on CS as a modern fluency at ASU+GSV, which was thinly attended vs. the following year's standing-room-only panel on web3 – go figure...).
The good times I had at Replit reignited my passion for coding. It just takes a spark to start a fire!
So obviously I wasn't starting completely from scratch, but I pretty much only remembered a few high level concepts (like what a for loop was, but not how to write one). And let me tell you, it's frustrating to know that your high school self was better than you at something.
Plus best practices have changed a lot. What ever happened to Java and OOP?
It's a blessing and a curse that things move so fast in software. I would have had to forget all my old bad habits anyway. Now it was time to start learning some new bad habits!
I started my (re)learning journey with some online tutorials. I'm fairly self-motivated (and tend to dramatically overestimate how quickly I'll be able to learn things...) so I wanted to avoid the time and money cost of classes, bootcamps and MOOCs. (Although in retrospect I sure could have used the help...)
But I fell into a trap that I'm betting a lot of self learners fall into – I didn't code. More often than not I was skimming tutorials and videos rather than coding along, which of course is a big no no.
I did this on and off for a couple years while working. I'd code a couple hours here, watch a video there, and then months would go by with no progress before I was back at it.
A friend recently told me, you're better off spending one day a week learning to code than even one hour a day. You have to get deep into a project, get stuck, and then get yourself unstuck. I think that's 100% true.
I suppose I was passively picking up knowledge, but I think that's actually a bit dangerous. My confidence grew, while my ability stayed mostly flat.
Then when I left my job last summer, I decided to get serious again.
Now let me take a second to talk about my planned setup this time around. I wanted to code on an iPad (beginners, don't do it) because I wanted to make things harder for myself. So I found some actually very helpful YouTube videos to get set up with a Raspberry Pi and iPad.
Then I decided I would go through that old SICP textbook because again I wanted to make things harder for myself. I couldn't get MIT Scheme working easily on the latest version of Ubuntu running on the Pi (I eventually found Racket which would have made things easier), but I was procrastinating on going through the book anyway. I never finished chapter 1.
Then one day, when I was coding on a train, I smelled something funny. My overclocked Raspberry Pi started smoking, so I immediately unplugged everything and waited until my heart rate slowed down.
Once I was calm again, I set up a Digital Ocean Droplet and SSH'd in from my iPad and kept coding there. I went through some DO tutorials, which are also great btw, and set up a little nginx server, plus learned some SQL. But I still hadn't built any "real" projects...
The whole iPad thing was a "brief" distraction of 2-3 months, and then I caved and bought a laptop and got back to structured tutorials. And real progress was made. (I also picked up some other short-term work during this time.)
With respect to the Odin Project tutorials, where I was mostly focused this time around, I was also learning older material (even just 5+ years old) that was already somewhat out-of-date. Now that's not a huge problem since the old stuff still works and critical programs are of course still running on decades' old technology (see floppy disks in aviation).
But as a beginner (overly) reliant on copy/pasting code from Stack Overflow until I got something to work and then after trying to understand why it worked, I was running into old answers that didn't always "just work, out of the box." And it made things tough(er than necessary)!
I underestimated the importance of being at least on the periphery of an active and up-to-date community of professional engineers.
Which leads me to my next blunder...
After spending hours and hours browsing programming education videos on YouTube and taking extensive notes about which things I'd eventually go learn once I started building real stuff, I settled on using Neovim as my editor (hardcore! groan...) and Svelte as my framework (cutting edge! groan...). Seriously the videos are endless (and pretty convincing).
With the hard work of picking my tools complete /s I started trying to build stuff. And... I spent way more time working on my .vimrc file than writing any programs. I sunk hours into trying to get nvim to look and act like VS Code because for some reason I didn't want to just use VS Code...
My short-term work came to an end, I still hadn't made much progress, and I was finally over myself enough to ask for help. So I asked a close friend who's a software engineer what I should do to learn.
And finally, I listened.
(If there's a moral in all of this, it's to actually write code, to ask for help, and to get started with popular tools. But it's hard for me to totally discourage others from taking a meandering path like I did. At the end of the day, it was a lot of fun!)
So what did my friend tell me?
- Learn React.
- Then learn NextJS.
- And if you care at all about making progress, please please switch to VS Code.
So I did. (Except stubbornly I kept the vim keybindings on in VS Code. Jury's out if it's making me faster or slower.)
Which brings us to about the middle of December 2022. And within a week, I had a blog with no content on it hosted on my own domain and available to the entire internet. I held off on sharing it because the first versions were so bad, so of course "the entire internet" actually meant "none of the internet."
Over the next couple months (up until now), I made incremental improvements to the blog and wrote some posts too. It's only marginally better now. But I'm happy with it. I'm making real progress. And I'm starting to share it with people.
Feeling limited by what I could learn on my own, I also asked my friend to pair code with me a few times a week on a side project we'd work on together. We're both learning foreign languages, and we were craving a better learning tool than what was out there, so we had our idea. (More to come on this soon.)
Getting to play around inside of a talented engineer's codebase, to get unblocked within a day or two when I'm totally stuck, and to see how someone else debugs/solve problems has been unbelievably helpful. I feel like my rate of progress is, no joke, 100x what it was before.
In another month or so, we'll release the MVP of the language learning app. My friend has done most of the real work, but I've been able to contribute a lot on the frontend/UI/UX stuff (and have gotten to mess around a bit with an NLP algorithm).
And I've learned a ton and am already using the app to study Japanese. Hey, even if nobody else uses it, I'll still be a weekly active user and net promoter! ;^)
As someone who's worked in startups for a long time (and knows a thing or two about scaling) but never as a software engineer and never during the pre-product-market-fit days, I have a whole new appreciation for what it takes to create something new. And I gotta say, I'm loving it.
For those who are curious, here are the languages, frameworks, and tools we're using (links to docs/tutorials for each):
- NextJS (serverless framework) (highly recommend this tutorial)
- TailwindCSS (styling)
- MUI (buttons, forms, etc.)
- Vercel (hosting/deployment)
- Firebase (cloud functions, database, auth, etc.)
- Github (version control)
- VS Code (editor)
- Github Copilot (AI code completion) (I was a doubter at first, but am now a real fan)
- Tuple (pair programming) (shoutout, great product!)
Why this stack? Why not some other stack?
Well my friend recommended it, he's helping me, and it's all pretty popular stuff. There are lots of other languages, frameworks, and tools out there. Some are better for other types of projects (e.g. Python for data science, AI/ML). But I think the most important thing is to work on a real project (ideally with someone else who knows more than you). If you have to pick something, ask someone you trust, and then just get started!
And if all these tools are too much and you just want one thing, sign up for Replit. You can go from zero knowledge to building real deal applications all in one place.
If, like me, you're an adult already years into a different career and now you're trying to learn to code, you'll probably get the "but why are you doing this?" question a fair amount. In these moments (and in particularly brain-melting debugging sessions) you'll probably be asking yourself the same question.
Have a reason. Write it down. And keep looking at it to remind yourself. It'll keep you going.
At first, I wanted a rational reason that I could proudly whip out when justifying myself to others. "I want to build the MVP of an app and then go hire developers." "If I know some coding, I'll be able to talk to engineers and make better hires." etc. etc.
But that always felt like a shadow of the real truth.
If I'm being honest, my why is this: I'm having fun.
I'm just trying to find something that I enjoy and that I hope will help pay the bills. I know the fun may wear off (and I've already hit some slumps), but I'm here chasing it while it lasts.
Some other advice to take or leave:
- Take a break from social media (to hide for awhile from everyone else's successes (real and feigned))
- Be patient with yourself — think in years and decades, not days and hours
- Cultivate a beginner's mind
- Root for fellow underdogs – that's you right now!
- Get comfortable making stuff that looks childish (and love it)
- As Dory and others say, "just keep shipping"
Sometimes on your journey, you'll find yourself stuck with no wind in your sails. You'll make no progress. You'll fill up with doubt. And you'll want to quit. It's pretty tough to be bad at something as an adult (if it helps to commiserate I'm pretty meh at coding right now tbh).
This is the doldrums. When you find yourself here, remember the wind picks up again.
Short answer: who knows?
I'm going to keep working on this blog and adding new features (i.e. bloat). At some point, I'll write a post about some of the tech I've used (in case it's helpful for others who are learning too). In the meantime, feel free to check out the source code.
In a month or so, my friend and I will launch the language learning app. Stay tuned!
And I'll keep building and learning and see where it takes me. If you want to get in touch, my email and socials are in the footer.
If you're a fellow learner, good luck on your own journey. Anyone and everyone can do it.