Magic Isn't Real
The article reflects on a software developer's journey from confusion to clarity in programming, emphasizing the importance of experience, continuous learning, and tackling challenges to gain deeper understanding.
Read original articleThe article discusses the journey of a software developer who reflects on the initial feelings of confusion and intimidation when learning programming concepts. The author compares this experience to the feeling of standing before a complex building, unsure how the tools at hand could create such structures. Over time, as developers gain experience and knowledge, they begin to recognize patterns and demystify the "magic" behind programming. The author emphasizes that many aspects of programming that once seemed daunting become clearer with context and understanding. The piece highlights the importance of continuous learning and exploring different areas of technology, even those not directly related to one's daily work. The author shares a personal experience of implementing a feature in Go, illustrating how the process of tackling challenges can lead to valuable insights, even if the outcome is not immediately useful. Ultimately, the message is that the perceived complexity in programming is often a lack of context, and with persistence and curiosity, developers can gain a deeper understanding of their craft.
- The feeling of confusion in programming is common among beginners.
- Gaining experience helps demystify complex programming concepts.
- Continuous learning and exploration are crucial for developers.
- Tackling challenges can lead to valuable insights and understanding.
- The perceived complexity often stems from a lack of context.
Related
I learned the language of computer programming in my 50s – what I discovered
A writer in his 50s learned programming, favoring Python for its simplicity. He attended PyCon, noting diversity and efforts to address disparities in tech, emphasizing empathy and aesthetics in coding.
Holding a Program in One's Head (2007)
The article highlights the cognitive processes in programming, emphasizing mental retention of code, the impact of distractions, and advocating for smaller teams and independent work to enhance creativity and understanding.
Software is about people, not code (2020)
Software development prioritizes understanding human needs over coding skills. Successful projects depend on user engagement, collaboration, and communication to ensure solutions effectively address real-world problems.
What 10k Hours of Coding Taught Me: Don't Ship Fast
The article emphasizes the importance of developer experience and software architecture, advocating for simplicity in coding, prioritizing refactoring, and maintaining code quality through structured practices and passion for the craft.
The Age of Software Artisans
The article highlights a shift towards "software artisans," emphasizing personalized coding, the evolution from machine code to user-friendly software, and the importance of continuous learning and adaptation to AI in development.
It's when you take apart a mechanical clock and keep looking for the time-keeping part, until you figure out that there isn't a time-keeping part in there, it's just gears and a spring.
It's when you learn about integrated circuits and full-adders, and keep trying to understand how a bunch of transistors can do Mathematics, until you figure out that there isn't a mathematics-doing part in there, it's just circuits and wires, arranged in a way that makes the voltages come out right.
It's when your understanding of the top-down structure snaps together with the bottom-up mechanics of the building blocks. There's no space left for the ghost in the machine to haunt, and you go "Oh. huh". I live for that moment.
My first “pc” was a clone of zx spectrum and all I had was a built-in BASIC and then some assembler on a cassette. Both went with “books” on how to use them, together with all of the unlimited time you have when you’re a kid.
This transferred to my first PC and eventually I learned how FAT, DOS, BIOS work, how to make a TSR and fool around B8000/A0000, first steps with 386+. It also helped that my granddad was an impulse electronics engineer and taught me how actual gates work and how computers count, sum and select numbers. He also had access to multiple books on hardware. I knew it all down to the silicon.
Other people had all sorts of magical ideas on how computers work. Special “hidden system areas”, “graphics card does X”, “computers multiply by addition”, etc etc. It’s a human thing that if we don’t understand something, our mind tries to yadda yadda it.
And the more you yadda yadda, the less chances it leaves that you’ll actually learn it. I tend to fight with these half-baked autogenerated explanations and try to dig down to how it really works. For no particular reason, that’s just what I like to do. It leaves a mark on how you work though.
This is the great paradox of good ideas. The best ideas are obvious, but only in retrospect. You would be very unlikely to encounter the idea by randomly fumbling around, yet it feels so simple and obvious (and often even easy to implement!) after someone else points it out and you mull it over. Usually it requires looking in a different dimension than the one you were focused on rather than looking further along familiar dimensions, which is our default behavior.
In this way there’s a parallel to modern machine learning, where backprop on gigantic models allows us to find very short paths in very high dimensions, rather than finding very long circuitous paths in low dimensions. It turns out this also solves the overfitting problem, in the same way that “retrospectively obvious” is a good filter for ideas.
Except…the dev has to learn the new API, which we can call domain Y, and which can become quite complicated and hard to map conceptually to domain X (e.g. React events vs browser rendering, or Java GC vs real memory).
And when the cool facade doesn’t quite work for some exotic use case, now what? The dev gets to learn the original domain X anyway, plus how X and Y interact. In the worst case they have rewrite all their Y-using code.
Great abstractions are good magic; bad abstractions are evil magic. And yet good vs evil is often hard to tell apart when you pick up the problem.
After nearly 30 years of persistent excavation, I'm finally at bedrock with registers, some assembly and embedded C.
Lifting my head up to find the mess we've created for graphical application development is admittedly disheartening, but also thrilling as there are ways to make it better.
1) You cannot do preemptive multitasking except by having a timer interrupt (okay, maybe one can also allow emulation).
2) Quantum key distribution (starting with BB84) depends crucially on the fact that the world is not classical.
But in general I agree with the article, it's more or less why I did not become a programmer.
However the magic is what emerges when the parts come together, the system becomes more than the sum of its parts.
Think of a car or a cellphone, an llm, it feels magical what it does, while the elementary parts do not consist of magic.
I recently write some robotics code using ROS, taking a step back I looked a the result and thought: Actually that is not much different conceptually from running K8s deployments coupled by Kafka.
Related
I learned the language of computer programming in my 50s – what I discovered
A writer in his 50s learned programming, favoring Python for its simplicity. He attended PyCon, noting diversity and efforts to address disparities in tech, emphasizing empathy and aesthetics in coding.
Holding a Program in One's Head (2007)
The article highlights the cognitive processes in programming, emphasizing mental retention of code, the impact of distractions, and advocating for smaller teams and independent work to enhance creativity and understanding.
Software is about people, not code (2020)
Software development prioritizes understanding human needs over coding skills. Successful projects depend on user engagement, collaboration, and communication to ensure solutions effectively address real-world problems.
What 10k Hours of Coding Taught Me: Don't Ship Fast
The article emphasizes the importance of developer experience and software architecture, advocating for simplicity in coding, prioritizing refactoring, and maintaining code quality through structured practices and passion for the craft.
The Age of Software Artisans
The article highlights a shift towards "software artisans," emphasizing personalized coding, the evolution from machine code to user-friendly software, and the importance of continuous learning and adaptation to AI in development.