I’m going to share with you what I see as “25” common pitfalls when learning to program (or working towards mastering programming). Many of these points affect both beginners and professionals alike — myself very much included.
0. Forgetting that programming is all about people. Yes, the machine will execute your code, but programming is solving problems for people, translating their requirements into code that will be read, maintained, and modified by other people (or yourself down the line).
1. Not spending enough time programming. Depending on your job or schedule, you might spend a lot of time on tasks that are related to programming but aren’t actually programming itself.
2. Stopping at the surface of a given technology you’re learning. Feeling satisfied with having mastered the basics just enough to get stuff done, without ever exploring further or going behind the scenes all that much.
3. The Magpie approach to learning programming. You start learning Rails, half-way through you realize that Phoenix is out there, oh and you need to learn JavaScript so you might as well go with Node.js… but wait TJ switched to Go, and hold on… what about Rust? Soon enough your browser history will have, “web development or data science career”, “is Clojure dead?”, “Clojure vs Elixir”, “is Crystal mature enough”, “any good frameworks for Golang”, “Phoenix vs Buffalo” and “Kotlin for web development” all in the same week. 😀
4. Reading books and watching courses online but not practicing the skills presented, therefore quickly forgetting about them.
5. Skipping fundamentals. So you end up learning about continuation-passing style (CPS) but still can’t do SQL joins without an object-relational mapper.
6. Not enough patience or discipline to progress through the learning process and steps required to master any technology.
7. No clear map or schedule for continuing to learn through available resources, while you tackle more immediate challenges in your day-to-day programming.
8. Analysis paralysis, wasting way too much time choosing amongst various frameworks and libraries (like Angular, React, and Vue), rather than just picking one, using it, and switching to something else only if you actually need to do so. Basically being a maximizer instead of a satisficer.
9. Refusing the polyglot nature of modern-day programming. In most domains, it isn’t reasonable to expect one programming language to be the best fit for every problem. Likewise, identifying too much as an X or Y programmer, rather than just a programmer who prefers X or Y.
10. Fear of experimenting with new technology. Rather than just reading about certain emerging technologies (e.g., blockchain or chatbots), actually firing up a VM to try them out yourself, even if it involves getting your hands dirty with a programming language or API you are not familiar with.
11. Expecting to know everything upfront. Being disappointed after finding pointers to the solution via Google, because you didn’t come up with an elegant solution entirely on your own and kicking yourself while thinking, “I should have thought of that myself”.
12. Not creating many small katas, exercises, and projects while learning.
13. Fear of sharing code with others or getting code reviews, lest you be judged.
14. Not seeking one-on-one mentorship from more experienced developers.
15. Expecting to learn everything at once with unrealistic timelines (e.g., master iOS development in a month).
16. For the more entrepreneur-minded, not exploring cool projects because they don’t have a clear path to revenue generation.
17. Not asking questions for fear of coming across as stupid or as more of a newbie than you actually are.
18. Feeling like you are not a real programmer if you’re creating apps by gluing high-level libraries together, in a high-level language instead of doing “hardcore” algorithms in more complex languages. I dub this low-level programming envy.
19. Allowing the desire to learn best practices to hinder your ability to grasp the fundamentals of a given language or technology. For example, feeling like you need to learn a whole book on design patterns or master TDD/BDD before you start creating projects.
20. Perfectionism. Letting perfect be the enemy of good enough. Never shipping anything, getting stuck in the “final touches” phase. (But balance is important, so don’t ship horribly broken software for the sake of shipping.)
21. Related to the previous point, ignoring the progression: make it work, make it faster, make it clean. Instead, expecting a polished solution from the get-go. It’s important to accept that the first iteration will be a rough draft to improve upon.
22. Impostor Syndrome. Feeling that you aren’t good enough. This is particularly bad if you don’t fit the current developer stereotype, as a lack of role models that you can relate with might mistakenly confirm your doubts. This is part of why women and minorities representation in tech is so key.
23. Writing code and learning about programming from books, but never reading other people’s code. Open Source gives us an amazing resource that can drastically speed up our understanding of programming and best practices.
24. Not getting exposed to other paradigms or domains. If you’re a web developer, not learning about other types of development. If you know Object-Oriented programming, not learning about Functional programming.
25. Not teaching others what you learn. Nothing will solidify what you learn as well as trying to explain it to others. Even just studying with the intention of teaching will increase your ability to learn.
There you have it… 25 pitfalls. Oh, don’t forget off-by-one errors, too. 😀
Conclusion
All this to say:
You’re good enough. You can definitely do it. Just watch out for these pitfalls, make a plan, commit to it, then take it one step at the time.
When learning to program (or improving your current mastery of it), I recommend the code/read/teach method. Code one real project, and many small exercises/katas as you learn. Read books but also other people’s code. Finally, teach what you learn online and in person. You don’t need to be an expert to do so.
I hope this is somewhat useful. If it is, feel free to share the link online. It’s a list that I, myself, plan to reread once in a while.
Initially, I shared these thoughts on learning to program as a series of tweets, but Twitter’s UI had some issues displaying them as a single thread. So I’m reposting them here as a post. Incidentally, this ends my one-year hiatus from blogging.
Get more stuff like this
Subscribe to my mailing list to receive similar updates about programming.
Thank you for subscribing. Please check your email to confirm your subscription.
Something went wrong.
Welcome back. I was surprised and delighted to see a new post appear in my RSS reader. I hope things are back on their way to being normal.
Thank you very much, Clarence. Things aren’t too bad.
Now that’s what I call a proper come back! Sincerely hope that you are doing well. As for the article, I can relate too much to this, you’ve put it together nicely.
Thank you, Ivan. It’s great to be back. Things are definitely looking up.
Great post! I too will come back to this list frequently. As a relatively new programmer (2 years of Python), I definitely relate to number 3 The Magpie approach. Should I learn Django or Flask? Need to learn JavaScript, which leads to jQuery which then leads to Bootstrap. Not to mention the data science rabbit hole!
For now I am going to focus on Flask and build some simple web sites that work. Then faster and cleaner.
Thanks for the great advice!
Thanks for stopping by, Mike. Sounds like a good plan.
I much more believe in the progression: make it work; make it clean and beautiful; and finally if necessary make it fast. Delaying cleanliness and beauty is always bad as it makes future work om your code difficult and messy.
Yeah, I was debating the order of the last two, Robert. I think often it ends up being: make it work, make it clean, make it fast, and then make it cleaner after the optimization work, if needed.
I read it without seeing your portfolio, I felt like you’re sitting beside my desk @ IBM office, and then found you’re an IBMer :D. It was a pleasure to read this real-life description, Antonio.
A colleague had directed me to your post, many thanks for your words of wisdom, Antonio. I will benefit from your advice, and furthermore, my Computer Science secondary school students will also benefit. Now I shall look forward to all your other posts! 🙂
Hey Antonio,
added it to my overview, especially liked the diagram at the bottom:
https://tech-craftsmanship.zeef.com/roberthopman#block_122022_-meta-learning
Thank you sir! Especially last part: “You’re good enough. You can definitely do it. Just watch out for these pitfalls, make a plan, commit to it, then take it one step at the time.” I needed that.
I am working on convolutional network as a project for my thesis and everything feels so overwhelming. I know the basics of it, but i completely lack the knowledge in maths, so I’m often delaying and procrastinating because it’s so hard. Thank you for reminding me to take one step at a time.
When I was learning how to programme, back in the day, I found it painfully laborious. Over time i have actually begun to enjoy it. As you say, anyone can do it. Just watch out for the pitfalls