Ask HN: What made programming finally click for you?

36 points by newsoul ↗ HN
The "Aha!!" moment where things start falling into place and you understand really what it is about and now you can concentrate on breaking up and solving the problem at hand rather than worrying about the lagnuage, syntax or the act of programming. Because you know if you can solve the problem you can implement it in no time.

47 comments

[ 1.3 ms ] story [ 164 ms ] thread
For me it was about to 2 years to get to the level of “if I can imagine the algorithm I have no doubt I can implement it”, but that was gradual and there are many more levels such as being able to code to a standard style or idiom, I would hesitate to identify an aha moment, but if there were one it would be after doing 2 online algorithms courses from Princeton and Stanford.
I started learning Python when I was 12 years old by reading books. I could understand the mechanics but I couldn't solve a problem I hadn't seen solved before. I tried to make a game of hangman, but I simply couldn't design it. I gave up on it.

Several months later, perhaps a year, I sat down to try it again. For some reason it wasn't so hard this time. I was able to get it to work.

I don't remember what my other projects were, but I remember struggling to design some more software. I couldn't tell where to begin or how stuff should work. So I'd just jump in somewhere and start somehow. I'd flesh out one component, and then when I'd go to write a component that integrated with it, I found my first design was wrong. I ended up throwing out drafts and restarting.

Through a grueling repetition of this I learned to have a better intuition. I increased my capacity to hold a large and complex program in my head, and to reason about it. I remember a job interview at 18 years old, when someone told me, "you write decent Python." I was quite proud.

I don't think they're was a single moment where it clicked. It was a painful teething process of repeatedly painting myself into a corner, throwing everything out, and starting again. I was very lucky to have supportive adults in my life who helped me out, along with kind strangers on the internet who looked at my broken code.

I'll tell you about one small moment of realization. Once I was asking for help online with a problem relating to my masking an import with a local variable, or something like that. After this was explained to me, Ned Batchelder gave me a command; "now, realize that importing is just a special case of assignment."

It legit blew my mind. It felt like a zen master had imparted special wisdom to me. It was a magical pedagogical moment I've never experienced again. Thanks again, nedbat.

I tried teaching myself programming for a few years, on and off.

But it wasn't until I took a statistics class, which involved programming in R, that I began to realize the purpose of functions: to handle inputs, and return outputs.

The class involved data engineering, so I created functions to deal specifically with data.

And it was then that I realized "Ohhh... functions in any language just operate on data... so... with this knowledge, now I see the purpose of application routes in web frameworks like ExpressJS, Python Flask, etc."

A course on relational databases helped me understand how to store data.

And from there, I finally realized the purpose of a REST API, and how browsers connect to servers.

At that point, I realized "Wow, I finally understand how to create a full stack app (including database design)"

This would suggest that you're free to choose your application model and interface design. But usually you're not.

A big part of todays programming work is spent on understanding what others have come up with about how the environment your app runs in is modelled and how it talks to your app and expects your app to talk and behave. This includes data models, process models, event handling etc.

So while there might be a big click when you discover that you need a place to store your data and have algorithms/code operating on that data, in common programming tasks it has to click again an again about others' ways of doing things and adjusting your code to fit that model.

And yes that can be fun and enlighting. Again and again.

I've been programming since my teens and professionally for 15-odd years. I think programming really only "clicked" in the last few years. Now I know with reasonable certainty how I will structure a project and how much time it will take.

What made it click? There wasn't a specific point, but I think it was when I started to seriously branch out into multiple languages. I've dabbled in other languages before, but when I seriously started working with other languages and made larger projects in them did I understand how to structre the code so it's not terrible.

Learning some Java when C++ was dominating. It seemed so much easier for the beginner to get a working program and think more about the problem space in a purer way. Also the fact it came with a great standard library.
+1, while not really a “aha” moment, it was definitely a “holy shit” moment coming to Java from C++.

Another moment was trying out Node.js to see what all the fuss was about (coming from Java/C#), I’m not a huge fan of JS but I was blown away by how easy it is to build stuff (npm was the real killer feature, unfortunately I never came across any other language that did it better).

There is something about NodeJS culture that you get very pragmatic and easy to use libraries come out of it. There is a lot of nonsense too, but it the closest ecosystem to lego. It might be the pain of making stuff interoperable on NPM/JS leads towards people going for simpler APIs.
Learning machine code. It finally made sense how the entire machine sort of worked at all levels. No longer were things like Javascript magic.
The first thing they taught me in programming in uni was: "Divide and conquer". It took me some time to truly understand what that meant in terms of programming. I remember that when starting a software project, I always started to feel very anxious if I was unable to picture the WHOLE program in my head; after some time I understood that by dividing it into smaller problems, and solving each one of them one at the time (without thinking at all in the other parts), things will eventually be connected and work, like magic. By truly adopting this basic paradigm you start to think naturally about interfaces to connect these smaller parts of your program, and from there things just flow.
I don’t think there was that one “aha!”-Moment, but I always found out when something seemed to hard, if I would revisit it after couple weeks it suddenly seemed so easy. I guess there is a lot of cross-knowledge you can apply from learning thing A to things B and C. So I guess the best advice is never stop learning, just ingest knowledge; the actual programming topic doesn’t really matter.

However a couple things stand out:

- learning to use a debugger

- test driven development

- static typing

- learning a systems language (stack, heap, memory management, pointers etc.)

My master's degree is a 2 year period when I realised that regardless of the scale and complexity of a problem, if you have a systematic learning approach and resolve, you can overcome it.
I think I personally enjoy the magic of languages, compilers and their tools. A lot of work and fields make us very dependent on programming. We can achieve almost everything we want through programming. I used to be a person using a programming language, but now I'm working on my own programming language https://github.com/KusionStack/KCLVM , design a programming language and implement it, which will eventually improve the efficiency of developers, stimulate the creativity of more programmers, and let them feel b, I am working hard to realize this beautiful vision.
Having a goal. I started in my teenage years so it's been a while, but coding small programs that take a number, double it and print it out gets boring after a while.

Then my father asked me if I could write a simple app that talked through the serial port to control a project of his. Having a goal, and external motivators, is what turns something you learn into something you use.

Have a well defined goal, and unless you're one of those with great internal motivation, share the goal with someone else.

Not sure what you mean. I was fascinated by the idea of telling a machine what to do before I got started. That's what got me started. I tried it out with the first programmable machine I could get my hands on, which turned out to be a calculator, everything since feels like a new and cool variation on the theme of telling a machine what to do. Data structures, OOP, functional programming, parallelization, web servers, they have the benefit of being fun to think about in their own right, but within programming, they're still just tools to solve specific problems (better). Initially I assumed that all problems had a solution like this, turns out there are some fundamental limits to that, but thinking about those is more math than programming (and a good reason to prioritize math and fundamental understanding over getting married too closely to any particular programming paradigm).

Perhaps the closest to an epiphany that I had was in an AI course, realizing that building machines that don't take instructions but rather examples of what to do is a full paradigm in its own right. But arguably that's separate from programming (and imho underscores why understanding the fundamentals is more important). When it comes to memorizing syntax, that's just a function of how long and how recently I've been using that particular tool, it builds up and also decays fairly quickly, that aspect doesn't feel fundamental at all.

Exactly this. I remember the first time I saw a computer, just pressed a button and the letter appeared on the screen. It was magical. There was another “aha” moment later when I understood that it’s doing what I tell it to do but nothing else, so I have to be very specific.
I can think of some specific things that clicked over the years , but getting acclimated to programming in general was a gradual process, rather than a "click".
The title of the classic Niklaus Wirth book. "Algorithms + Data structures = Programs".

Rereading the Wirth's book 20 year later, I finally realize it. Every product I have been working on was a data structure indexed by a key, then processed to transform the data into other data.

Programming a game made it click early for me. I however think the barrier of entry is almost too low today blurring the line of what programming actually is.
(comment deleted)
Two things.

One was Visual Basic. VB helped me go from writing fun abstract play things to amuse myself to actually writing something that solved a real world problem for people at a real world company. This taught me that focusing on boring, simple and 'ugly' programs that actually end up in front of people and save them time (and money) is far more valuable than writing really clever programs that don't, and that's what programming as a profession (as opposed to a hobby) is all about.

The second was learning Haskell. The way Haskell forced me to think about everything connected to programming completely changed how I saw things and helped my build up a mental model of the programming 'world' that really made sense to me and made solving programming problems much easier.

It never clicked for me? It just always made sense.

Maybe I’m still meandering around in the pre-click phase though and don’t know. Maybe one day it will click for me!

Pair programming with better programmers than me.
LOGO - it was this kind of graphics generation language where a cursor moved on the screen based on commands you put in. This clicked right away. I was 5 years old IIRC.

Then, during my pre-teen years, I couldn’t understand how games had several moving objects all at the same time even though it was sequential execution. Then the update-render loop clicked in as I discovered it. Together with that, all kinds of event handling, interrupts, context switching etc.

Then, with WPF, databinding really clicked in with any sort of retained-mode rendering. So then Angular, React etc as well.

When I started learning programming – just when I was starting high school – it was a very mechanical practice. I read something in a book, tried it and the results would match most of the time. I could understand what the code was doing, but not how it did it. Until I learn assembly and memory models when I was researching rootkits – infosec was the most exciting thing for me at that time. Then it dawned on me that programming was about manipulating data in a specific way to get the result you want. That made everything easier, looking past syntax and tooling to seek only data flows and intent.
To add to this question: is there any language in particular that makes learning programming concepts any easier? I often see people mentioned Visual Basic but since that is no longer around, what would be the next closest thing? I suppose Python?

I use PowerShell for a lot of my scripting needs and have found it to be pretty intuitive, but am wondering what other languages I might enjoy solving problems in.

Do you have any resources that make PowerShell intuitive?

I've been using bash for ages but PS looks like a verbose, wildly disorganized language, possibly optimized for Windows idiosyncrasies. I have difficulties remembering just the syntax for getting the list of environment variables.

> what other languages I might enjoy solving problems in

Clojure - as intro I had "The Joy of Clojure" by Michael Fogus

Just use it everyday and you will grok the basics after few months. If you want to do something in xyz, you do it in pwsh no matter how long it takes initially.

> I have difficulties remembering just the syntax for getting the list of environment variables.

How is that possible. Its simply ls env:

The Camel ("Programming Perl" by Larry Wall).