All articles
Learning Notes10 min read

Should You Still Learn to Program?

AI can write more code than ever, but that does not make learning to program obsolete. It makes understanding what you build even more important.

ProgrammingArtificial IntelligenceLearningSoftware Engineering

I have been watching a ridiculous number of videos about whether people should still learn to program.

Some say absolutely. Others say there is no point because AI will write all the code in the future.

A lot of the loudest claims come from leaders at major AI companies. That makes sense when you think about it. They have set enormous goals for their companies. They are building products around the belief that AI will become dramatically more capable, so of course they are going to talk about a future where AI writes most or even all of the code.

I don’t necessarily blame them for believing in what they are building. I also don’t think you should base your entire future on a technology executive’s prediction of what programming might look like several years from now.

We have already seen that AI is extremely capable. We have also seen that it is not magic.

So, should you still learn to program?

Absolutely. Learn, learn, learn, and then keep learning.

But don’t learn blindly.

AI Is Good, but It Is Not Everything

AI is already incredibly useful for software development. It can generate boilerplate, explain unfamiliar code, identify bugs, help design features, compare approaches, write tests, and dramatically speed up development.

It is especially accessible in web development and other areas built around higher-level languages, established frameworks, and common architectural patterns. That is where most of the “vibe coding” content I see is concentrated.

Someone describes a web application, lets an AI generate large parts of it, and gets something running without understanding every decision underneath it.

That can be useful. It can also be dangerous.

I see far fewer people casually vibe coding kernel modules, embedded systems, low-level networking software, operating-system internals, or other environments where small mistakes can have serious consequences.

I am not saying engineers in those fields do not use AI. They absolutely do. The difference is that working in those areas requires a deeper understanding of the software, hardware, constraints, and fundamentals underneath the generated code.

The same principle applies to web applications, even if the consequences are sometimes less immediate.

AI can produce code that looks clean, runs successfully, and is still insecure, inefficient, or fundamentally wrong. If you don’t understand what it generated, you may not recognize the problem until real users or an attacker find it for you.

Pick a Language and Go Deep

When I decided to learn programming, I picked Python.

I originally wanted to build AI chatbots and appointment-setting workflows. I had been working with no-code AI tools, and at the time, they were terrible. Bots repeated themselves, conversations felt unnatural, and the systems never worked quite how I wanted them to.

I decided I wanted to build better systems myself.

Around the same time, I returned to school for cybersecurity. I started realizing that Python was also heavily used for security tools, system-administration scripts, DevOps tasks, automation, networking, APIs, and backend applications.

After that, I was dead set.

Python became my language.

I can write JavaScript. I can build React applications with JSX. This portfolio is built with Next.js. However, frontend development does not hold my attention the way Python and backend systems do.

The point is not that everyone should choose Python. The point is to choose a language that connects to what you actually want to build, then go deep enough to understand it.

Don’t jump between five programming languages because someone online released another “best language to learn this year” video.

Pick one. Build with it. Study it. Get frustrated with it. Learn its strengths, limitations, common patterns, and strange little behaviors.

Once you understand one language deeply, learning another becomes much easier.

Separate AI Building Time From Learning Time

I think it is important to separate time spent building with AI from time spent practicing without it.

Both are valuable, but they develop different skills.

Sometimes I want to build something large and see how the entire system fits together. I will use AI to move faster, compare architectural decisions, generate repetitive code, and help me work through unfamiliar parts of the stack.

Other times, I open an editor with a notebook beside me, choose a project or problem, and write the code myself.

No copying an entire solution from AI.

No searching Google for the exact answer.

I’ll search for documentation, methods, error messages, and individual concepts—but I try not to search for someone else’s finished solution to the exact problem I am solving.

You need to force yourself to struggle.

Get stuck. Get irritated. Write the wrong solution. Read the error. Walk away for a few minutes. Come back and try again.

That discomfort is doing something important. It is teaching you how to think through a problem instead of teaching you how to paste the answer.

AI can remove that struggle almost instantly. Sometimes that is exactly what you need, especially when shipping a real product. But if AI removes every difficult moment while you are learning, it can also remove the part that develops your problem-solving ability.

Use AI but don’t outsource every thought.

Do Something Every Day

Programming is a long, winding road. It is not linear, and it is not going to be easy.

You are not going to study for six months and suddenly be good at everything.

It takes time. It takes grit. It takes repetition.

Do something every day.

That does not mean you need to spend 12 hours coding every single day. Some days you might build an entire feature. Other days you might fix one bug, read five pages, review flashcards, study one method, or finally understand a concept that confused you yesterday.

Even if all you have is one percent, give that one percent.

The small days matter because they keep you connected to the work. Over time, those days accumulate into real understanding.

Then, eventually, things start clicking.

A concept you struggled with six months ago suddenly feels obvious. You look at a problem and already have an idea of how to solve it. You recognize a pattern before someone has to explain it.

That feeling is incredibly rewarding—but it only comes after repetition.

Use Flashcards

Flashcards have been one of the most useful additions to how I study.

I recommend Anki. The desktop version is free, your cards can go anywhere with you, and spaced repetition gives you a structured way to repeatedly review information before you forget it.

I make flashcards for methods, fundamentals, object-oriented programming, dunder methods, language behavior, networking concepts, Linux commands, and anything else I want available in my head.

Whenever I watch a programming video and hear someone say:

“You don’t need to memorize all of these, but you should start becoming familiar with them.”

I make flashcards.

I want to be the guy who knows them.

I want to look at a problem and think, “Yep, enumerate() fits here,” because I understand the tools available to me not because I asked an AI which function to use.

That is part of mastering a language.

The deeper your understanding becomes, the faster you can recognize possible solutions. You stop treating every problem as something completely new because you already have a mental inventory of patterns, methods, and behaviors you can use.

That knowledge also helps when you move into another language.

You may not recognize the syntax, but you can map the unfamiliar language back to concepts you already understand. You can ask how it handles iteration, objects, error handling, memory, types, or concurrency and compare those answers with the language you know deeply.

That is extremely valuable in programming, cybersecurity, and system administration. Sometimes you need to read code written in a language you have never formally learned. A deep understanding of one language gives you a foundation for navigating the unfamiliar one.

You Have to Love It

One line has stuck with me for years.

I was watching MasterChef or a show like it and one of the contestants said something close to:

“I love cooking. I’ll wake up at one in the morning with an idea, and I have to see it on a plate.”

That is me with programming.

That one sentence is probably the best way I can explain how much I love this shit.

I will research a project right before bed and then struggle to sleep because I want to get up and build it. I want to test the idea. I want to learn whatever I am missing and see whether I can make the system work.

I used to never read. Now I am an avid reader.

I try to make myself read books that aren’t about programming, Linux, operating systems, networking, or technology but I struggle to finish them. I don’t have the same passion for them.

I have a deep passion for learning what I love.

You need some version of that.

Programming will frustrate you. You will spend hours hunting a bug created by one character. You will misunderstand documentation, break working code, choose bad approaches, and occasionally question whether you know anything at all.

Interest gets you started.

Love keeps you going.

Build With AI and Without It

I don’t believe the answer is to avoid AI.

Use it.

Use AI as a senior engineer you can question at any time. Ask it to review your approach, explain unfamiliar patterns, identify security problems, compare options, and show you where your reasoning is weak.

Then write your own code and have it guide you.

Also build directly with AI.

Let it help you create something larger than you could currently build alone. Study the output and observe how complete software is organized. Follow the flow from the user interface into the API, through the application logic, and into the database.

There is an unbelievable amount you can learn from AI.

But you need to understand what it is giving you.

Never ship a product you haven’t studied.

That does not mean you must be able to explain every individual syntactical decision from memory before anything can leave your computer. It means you should understand what the system does, how its major pieces connect, where the important data travels, and why each feature exists.

If someone points to a feature and asks how it works, you should be able to explain it.

If you understand every line, even better. That is what I recommend working toward.

But at the same time:

Ship. Ship. Ship.

Write the code. Use the tools you need. Solve the problem. Put the software in front of real people.

You learn things from real users that you cannot learn while endlessly polishing a project by yourself.

Listen to what users like. Listen to what they hate. Watch where they get confused. Fix what is urgent, categorize what can wait, and continue improving the system.

You Are Responsible for What You Ship

AI does not take responsibility for your product.

You do.

If AI generated half the code and you deployed it, it is still your code.

If user data is exposed, a feature breaks, an application becomes unavailable, or a vulnerability makes it into production, you cannot blame the model that generated the output.

You chose to ship it.

That responsibility can feel heavy. Let it.

Feel the pressure. Swallow it. Let it hurt, sting, and make you nervous.

That is what growth feels like.

Then investigate the problem, communicate with your users, fix what needs to be fixed, learn from it, and keep going.

So, Should You Still Learn to Program?

Yes.

Learn to program.

Learn the fundamentals. Pick a language and go deep. Use flashcards. Read documentation. Build without AI sometimes. Build with AI other times. Struggle through problems instead of always searching for finished answers.

Use AI to move faster, but develop the skills required to recognize when it is confidently leading you in the wrong direction.

Don’t treat learning and shipping as opposites. Study deeply and still put things into the world.

The future of programming will absolutely include AI. That does not make understanding software less valuable.

It makes understanding what the AI produces even more important.

I hope at least one person gets something useful from this post.

If that person is you, start today.