What I Wish I Could Tell Myself Before Learning to Code

Myths, mistakes, and mindset shifts that separate those who succeed in learning to code from those who give up.

M
Mohammad Najib Bahrudin /
10 min read
CategoryProgramming
AuthorMohammad Najib Bahrudin
PublishedJul 26, 2026
min read10 min read
Tags4 topics
CareerLearningDeveloper MindsetSoftware Engineering

I once spent an afternoon staring at a screen full of competitive programming logic in C++. The code ran smoothly, the matrices were calculated, and all test cases were successfully passed. I felt very proud. However, that moment of pride crumbled when I tried to build my first web application and realized that translating a seamless design from Figma into a truly functional React component was an entirely different world.

That moment encapsulated everything that was wrong with my early learning method: I could write lines of code to solve algorithms, but I didn't yet know how to think about building a complete software ecosystem. The gap between those two activities is where most beginners stop, and no one talks about it honestly. No one prepares you for the middle phase—the months where you can get a program running on localhost, but can't explain why it works when deployed.

Here are the things that would have saved me from months of confusion.

The first month will lie to you

There is a certain euphoria when your first program prints "Hello, World" or when your first Tailwind CSS styling successfully makes a web page look neat. That feeling is real, but also misleading. Early victories come quickly because the problems are tightly constrained: follow these steps, get this result. You are doing pattern-matching, not problem-solving.

I remember that transition period vividly. When I first learned the React ecosystem, I could follow any tutorial and reproduce the results. Then I closed the tutorial, opened a blank file, and tried to build a simple application from scratch. Blank. The syntax was in my head, but the way of thinking was not.

That gap—between recognizing code and producing code—is the first real wall. Even experienced developers often get stuck, but they have built mental models to diagnose problems. That intuition comes from hundreds of hours of writing bad code and fixing it. There are no shortcuts to get past it.

Depth is more important than FOMO (and framework-hopping will destroy you)

The tech world is designed to make you feel left behind. Framework updates appear every week. Someone on social media will declare that the tool you just spent three months learning is already "dead." Resist the gravitational pull of new things while you are still building fundamentals.

The result of constantly switching technologies is that you become mediocre at many things, instead of becoming competent at one thing. The accumulated knowledge from one framework never develops because you never stick around long enough. When I finally committed to the Next.js and React ecosystem, and stayed there—building projects, designing UI/UX prototyping, and deploying on Vercel—everything accelerated quickly. Depth in one ecosystem teaches you transferable concepts.

Don't worry about having to know everything. Master one thing well, and the rest will become easy to learn.

Tutorial hell is the cousin of framework-hopping. Both feel productive when they are actually avoidance strategies. The solution is indeed uncomfortable: build something before you feel ready. Pick a project you care about and fumble your way through it.

That is what happened when I decided to build Bamboosa—a smart logistics platform with an integrated dashboard panel to simplify my family's seasonal parcel business in Trenggalek. I learned more about routing, state management, and data flow from that real project than a dozen tutorials combined.

Motivation is the spark, systems are the engine

I have never met a self-taught developer who is consistently motivated every day. Motivation fluctuates. There will be weeks where you can code for hours tirelessly, and days where opening VS Code feels incredibly heavy. The people who manage to survive are not those who are more motivated—they simply have better systems.

Here is what worked for me when the initial enthusiasm started to fade:

Set goals with a clear finish line
"Learning React" is abstract. "Finishing the portfolio code refactoring and deploying it to Vercel to apply for the Apple Developer Academy before the June deadline" is a clear goal. Small completions build momentum. You cannot feel progress from vague goals.

Protect your daily minimums
Thirty minutes of focused coding every day always beats an eight-hour marathon on the weekend. Daily habits keep the context fresh in your brain. When you skip three days, you will spend the first hour of your next session just trying to remember where you left off. Consistency compounds; sporadic intensity evaporates quickly.

Find your community or tribe
Accountability is crucial when motivation dips. Being in a campus environment like ITS, being active in communities, joining a Discord server, or simply having a friend learning at the same pace—all of that helps immensely. The process won't feel so lonely when there is someone else who understands why you spent two hours just to debug a messy Tailwind CSS layout. (By the way, spending two hours on CSS is not a beginner problem. It is a universal experience for all developers).

You (probably) don't need god-tier math

This myth stops more people from starting to code than anything else. Although my background in data structures, algorithms, and competitive programming in C++ and Python did require computational and mathematical understanding, the reality of building digital products is often different.

When I designed system architectures like Djokiin Aja (a web profile with WhatsApp route integration for tutoring services), I realized that most web development, API design, and UI integration rely on logic and problem decomposition, not linear algebra. Math can be learned later when your work actually demands it—and it will stick much faster when there is a concrete application for it.

Collaboration and Code Reviews teach you faster than any course

The biggest accelerator in my learning was not a book or a YouTube playlist. It was the experience of collaborating directly in a team and reading other people's code.

This experience was very pronounced when I participated in a hackathon and built #SeasForUs. Collaborating to bridge Next.js and Laravel in one platform to help volunteers find coastal beach cleanup events really opened my eyes. Reading team members' pull requests, piecing together different parts, and debating the best way to structure data forced me to articulate why I made a certain decision. That is ultimately what led us to win the awards.

Start before you feel ready. Being in a campus environment like ITS or being active in a community gives you the space to ask "Why did you choose X over Y?". It teaches you so much more than just reading in silence.

The "No Experience" vicious cycle can be broken

"We need someone with experience."
"How do I get experience if no one will hire me?"

This cycle sounds unavoidable, but it is not. Companies hire based on demonstrated ability, not just work history. Build projects that solve real problems—not just a to-do list app, but a tool you would actually use.

This was proven when I secured a full-stack remote contract with an international client in September 2024. It all started from cold outreach via LinkedIn. A portfolio with well-documented projects (like the ImogiCode image compression app or the Ajarin mentoring platform) is far more valuable than a resume filled only with buzzwords and no proof of execution.

AI is a Power Tool, not a replacement for understanding

GitHub Copilot and ChatGPT have fundamentally changed what it feels like to learn coding. You can describe a problem and get working code in seconds. This is incredible, but it can also be a deadly trap if not used carefully.

The goal isn't just to produce code (shipping code)—the goal is to become someone capable of producing code without a crutch. AI raises your skill floor, but it won't raise your ceiling unless you understand the output well enough to modify and debug it. Before you commit AI-generated code: can you explain every line? If not, you haven't learned—you're just delegating tasks.

The Dunning-Kruger curve is real, and the valley is where growth happens

As someone who loves outdoor activities and mountain climbing, I always compare learning to code to climbing Mount Lawu.

You start overly confident at the base camp—"I already understand HTML and Tailwind, how hard could the rest be?" Then you start the ascent and face real problems: messy state management, a deployment pipeline that fails without clear error messages, or out-of-sync database systems. Your confidence plummets. You enter the "valley of despair" where you know just enough to realize how much you don't know. This feels worse than when you just started, because at least in the beginning you had momentum.

That valley is where most people give up (or decide to turn back down the mountain). But, it is also where the real learning happens, because you are finally facing problems complex enough to force you to build a deep understanding. The turning point comes when debugging stops feeling like magic and starts feeling like logical detective work.

This middle part—where you can write code that runs but can't explain why—won't last forever. If you are in that valley right now, the only difference between you and the people who make it to the top is that they didn't stop walking.