Skip to main content

What I wanted to know when I started programming

What do you think about this article?

Too Long; Didn't Read. There are things I would have liked to know at the beginning of my career as a developer that would have changed how I used time in the first years. This article tells you without filters. It's not a list of motivational advice - it's an honest inventory of mistakes made out of ignorance, missed shortcuts, and things learned too late.

I can help you with that. However, I don't see the Italian text provided. Please paste the Italian text, and I'll be happy to assist you in translating it into English while following the given rules.

When I started programming seriously, I had no map. I had curiosity - all of it - but I didn't have a framework to understand how to organize learning, what to study first and after, how long to expect before something required became fluent. I was navigating by sight, and navigation by sight has costs: one often ends up in blind alleys, wastes time on things that don't serve the short-term, leaves out fundamental things because you're not sure they are important.

This article is what I wanted to read at that moment. It's not a study guide - for that, there's the Study Guide 6 months downloadable below. It's something more personal: a list of things I would have liked someone to tell me explicitly, which I had instead to learn in the hard way, often after having already lost time and made avoidable mistakes.

Some of these things seem obvious in hindsight. The obvious things in hindsight are almost always the same things that no one tells you at first, because whoever knows them assumes you already know them. It's not arrogance - it's a form of cognitive blindness. Once you know something, it's hard to remember how it was before you knew it. This article is an attempt to cross that blind spot and speak to the "I" I was when I first started out.

A note on tone: I do not write this article with the intention of complaining about lost time or those who did not tell me these things. The path was what it was, and it led me where I am now. I write with the intention of transferring what I have learned in a useful way for those just starting out. The rest is irrelevant.

This article is the second installment of the series. It does not assume you have read the first one, but if you want the complete context, the cornerstone of the series Gathers all articles and the career matrix with the 12 paths. If you have already read the first article on impostor syndrome, some things from this will sound like a natural continuation - because they are.

Typical difficulties

The difficulties I encountered at the beginning were not all technical. Some of the most impactful ones were meta-difficulties: problems with how I was learning, not with the content of what I was learning.

Resource allocation paralysis

The first enormous problem was the availability of resources. Tutorials, courses, books, videos, boot camps, official documentation - the landscape is vast and there doesn't exist a clear map. I spent weeks evaluating options instead of using just one option and moving forward. Every time I heard about a potentially better resource than what I was using, I was tempted to switch. The result was fragmented learning without linear progression or consolidation.

The paralysis of choice is a real and undervalued problem. Not because resources are bad - the majority of mainstream resources are good - but because switching from one resource to another prevents us from reaching the depth necessary for concepts to solidify. The brain learns through repetition and connection between concepts, not through superficial exposure to many different sources.

Common trap: Swap "I'm watching many tutorials" with "I'm learning". Passive tutorials - those where you watch someone write code without doing it yourself in parallel - have a very low performance. The feeling of understanding while watching is deceptive: it disappears most cases within 48-72 hours if not followed by active practice on the same material. The right parameter isn't "how many hours of content I've consumed" but "how many lines of code I've written myself, from scratch, on problems that I chose myself".

The myth of the "perfect plan"

Another common trap at the beginning is looking for the perfect study plan before starting out. I've read dozens of guides on "how to become a developer in X months", I've built detailed roadmaps week by week, I've compared bootcamps and self-study, different programming languages as my first step. All this time was being used to procrastinate the actual start.

There is no perfect study plan. There is a good enough plan that adjusts over time based on what you learn. The plan corrects itself while it's being executed - it doesn't exist before starting. Waiting for the perfect plan is a form of disguised procrastination.

The isolation of solo study

I have studied alone for a long time, without anyone to compare myself with, without any other code to read, without external feedback. The isolation of solitary study has a specific cost: developing habits and patterns that may be wrong without realizing it, because you don't have a point of comparison. The code I write works - excellent - but is written in ways that no professional working in a team would accept.

The thing I would have liked to know is that there are resources for getting out of isolation even before having a tech job: online communities like DEV.to, open source programs for junior contributors, local meetups, hackathons, coding bootcamps - even short ones just for comparison with others. Solo study works well for specific phases, but exposure to other people's code is essential before you think so.

There is also a psychological dimension to isolation that I have underestimated: when studying alone, you don't get feedback on how much you're progressing compared to others who are learning the same things. This doesn't mean that comparing with others isn't necessary - it's not in a competitive sense. But seeing someone who started at the same time and made similar progress as yours is a reality anchor that when studying alone, you don't have. Without that anchor, it's easy to overestimate your slowness or underestimate your growth.

Confusion between consuming and learning

A subtle but important challenge is the tendency to confuse content consumption with actual learning. Watching 20 hours of video courses in a week is not learning. Reading three chapters of a technical book without opening the editor is not learning. Content consumption is the zero phase - it's necessary, but not sufficient.

The moment when real learning occurs is when you try to do something on your own, encounter a problem, search for how to solve it, solve it, and then pass that enough so that that knowledge is yours. This process requires friction: the frustration of not being able to get it right immediately, the search for solutions, the trial-and-error. Passive consumption of content does not produce friction, and without friction there is no consolidated learning.

The practical rule I started applying: for every tutorial hour or course, at least one hour of independent practice on the same subject. Don't follow the tutorial while watching - build something similar from scratch, without copying, using only what you've understood. If you can't do it, that's a sign that you didn't understand as well as you thought. And this is useful information.

What worked (Federico)

Some things have worked better than others. I'll collect them here in an approximate order of impact, but the order is subjective - context matters.

1. Choose a resource and finish it

The most impactful thing I've done, at one point on the journey, was to choose a resource and finish it before moving on to the next one. It seems trivial but isn't: the pressure to change resources is constant, fueled by the abundance of options and the feeling that there's always something better. Resisting that pressure and completing what you've started is a skill in itself.

For basic web formation, freeCodeCamp It's the resume that I recommend: free, complete, with practical projects certifiable. But the resume counts less than the discipline of finishing it. Any good resume, finished, is worth more than five excellent resumes abandoned halfway.

2. Build something real every week

At some point I stopped searching for the perfect project to work on and started building something every week, whatever it was. A number generator. A temperature converter. A personal site with minimal CSS. A CSV file parser. Small, mundane, but real: code that ran, did something, could be shown.

The value of building real things is not just technical. It's psychological: every working thing is a concrete evidence of progress. It's these evidences that contradict the voice of the imposter in the long run - not pep talks, not abstract motivation. Working code.

3. CS50 Harvard as foundational concepts

Harvard University's CS50Free online, it is the course I recommend as a first conceptual foundation for those starting from scratch. Not because it teaches the "right" language - it teaches C and Python, which are not necessarily the languages you will work with - but because it teaches how to think about computational problems: what is a variable, what is an algorithm, what are data structures, why certain solutions are more efficient than others.

These fundamental concepts were missing, and their absence felt every time I had to reason about a non-trivial problem. I learned syntax before semantics - the how before the why. CS50 reverses this order correctly.

Reading someone else's code systematically

One thing that no one has explicitly told me is that reading code written by other developers - good, professional, in production - is one of the most effective forms of learning available. Don't read tutorials on how to write code. Read real code, with its compromises, conventions, patterns, and imperfections.

GitHub is the largest public code library that exists. I started reading repository of projects I used - libraries, frameworks, tools - to understand how they were built internally. At first, I understood little. Then a bit more. Over time, reading other people's code became one of the main instruments for learning patterns that I wouldn't have found in books.

5. Atomic Habits applied to technical study

Atomic Habits Il comportamento è il risultato di una serie di piccoli cambiamenti che si accumulano nel tempo. Questo libro ti aiuterà a comprendere come creare e mantenere abitudini positive, e come superare le difficoltà per raggiungere i tuoi obiettivi. Il concetto di "abitudine" è stato sviluppato da Charles Duhigg, un giornalista del New York Times che ha scritto un articolo sulla rivista The New Yorker intitolato "La scienza dell'abitudine". L'articolo descrive come le abitudini siano il risultato di una serie di piccoli cambiamenti che si accumulano nel tempo, e come possano essere modificate utilizzando tecniche specifiche. Il libro "Atomic Habits" di James Clear offre una guida pratica per creare e mantenere abitudini positive. Il libro è basato sulla teoria dell'abitudine di Charles Duhigg, ma presenta anche nuove idee e strategie per aiutare gli individui a superare le difficoltà e raggiungere i loro obiettivi. Il libro è scritto in un linguaggio chiaro e accessibile, e contiene molti esempi concreti di come le abitudini possono essere modificate. Il libro è anche dotato di una sezione dedicata alle tecniche per superare le difficoltà comuni, come la procrastinazione e la paura del fallimento. In generale, "Atomic Habits" è un libro che ti aiuterà a comprendere il potenziale delle abitudini positive e a creare un piano di azione per raggiungere i tuoi obiettivi. Il libro è una risorsa preziosa per chi vuole migliorare la propria vita e raggiungere la propria felicità. Il libro è stato scritto da James Clear, un autore e oratore che ha lavorato con molti clienti di alto profilo per aiutarli a migliorare le loro abitudini. James Clear è anche il fondatore della sua agenzia di coaching, che offre servizi di consulenza e formazione per aiutare gli individui a raggiungere i loro obiettivi. Il libro contiene molti esempi concreti di come le abitudini possono essere modificate, e presenta anche una sezione dedicata alle tecniche per superare le difficoltà comuni. Il libro è scritto in un linguaggio chiaro e accessibile, e contiene molti consigli pratici per aiutare gli individui a creare e mantenere abitudini positive. Il libro è stato pubblicato nel 2018 e ha ricevuto recensioni positive da molti lettori. Il libro è stato tradotto in molti paesi e ha venduto milioni di copie in tutto il mondo. Il libro offre una guida pratica per creare e mantenere abitudini positive, e presenta anche nuove idee e strategie per aiutare gli individui a superare le difficoltà. Il libro è una risorsa preziosa per chi vuole migliorare la propria vita e raggiungere la propria felicità. Il libro è stato scritto da James Clear, un autore e oratore che ha lavorato con molti clienti di alto profilo per aiutarli a migliorare le loro abitudini. James Clear è anche il fondatore della sua agenzia di coaching, che offre servizi di consulenza e formazione per aiutare gli individui a raggiungere i loro obiettivi. Il libro contiene molti esempi concreti di come le abitudini possono essere modificate, e presenta anche una sezione dedicata alle tecniche per superare le difficoltà comuni. Il libro è scritto in un linguaggio chiaro e accessibile, e contiene molti consigli pratici per aiutare gli individui a creare e mantenere abitudini positive. Il libro è stato pubblicato nel 2018 e ha ricevuto recensioni positive da molti lettori. Il libro è stato tradotto in molti paesi e ha venduto milioni di copie in tutto il mondo. Il libro offre una guida pratica per creare e mantenere abitudini positive, e presenta anche nuove idee e strategie per aiutare gli individui a superare le difficoltà. Il libro è una risorsa preziosa per chi vuole migliorare la propria vita e raggiungere la propria felicità. Il libro è stato scritto da James Clear, By James Clear (ISBN 978-0735211292) is the book on accumulating small habits that compound over time. Its application to technical study is direct: 30 minutes of code every day, with no exceptions, is worth significantly more than 4 hours once a week. The compounding of daily habits is real - and the code written every day accumulates in a non-linear way.

The concrete thing I implemented from this book is that I defined a fixed schedule every day for studying, removed any friction that could have caused that session to be skipped (the computer was already open with the file ready, no decision needed on what to do), and tracked each session on an ad-hoc calendar. The identity of a developer builds up one day at a time, not in intensive blocks.

Specialize quickly, don't wait.

One of the things I wanted to understand before is that in the world of software development, there's no way to "learn everything" - and waiting to have a complete understanding before choosing a direction is a trap. Specialization is not a closure: it's a strategy for building real competence in a reasonable amount of time.

The pressure to know everything - frontend and backend, database and cloud and security and machine learning - is real, but it's also paralyzing. The developer who knows a little bit of everything without digging deeper is hard to place in the job market compared to someone with clear vertical expertise and sufficient horizontal understanding to collaborate with others. Choosing a specific path - even if imperfect, even if changing ideas after - is better than staying in the limbo of being a generalist indecisive.

The practical way to choose a career path: what type of problem do you find most interesting to solve? If the answer is "building interfaces that work well for people", Frontend. If it's "building systems that manage data efficiently", Backend or Data Engineering. If it's "building things that behave intelligently", AI Engineering. It's not a definitive choice - careers often change frequently over time. But it's a starting point to move from.

Learning to read official documentation

A skill that I have underestimated for a long time is the ability to read official documentation of languages and frameworks that I use. The tutorials explain how to use a tool in pre-configured scenarios. Official documentation explains how the tool works in all scenarios, including those covered by the tutorial.

Passing from tutorials to direct documentation is a non-trivial cognitive leap - documentation is often denser, less narrative, more technical in language. But it's also the way to get out of dependence on tutorials and develop autonomy in finding solutions directly. Every time you encounter a problem that the tutorial doesn't cover, you have two options: seek another tutorial, or learn to use the documentation. The first option is doomed to fail in the long run. The second one isn't.

Cognitive framework

Two frameworks have helped me organize how I think about technical learning, and they continue to influence how I approach new things.

Deliberate practice vs casual practice (Newport + Ericsson)

Not all practice is equal. The research of Anders Ericsson - noted to the general public by Newport in So Good They Can't Ignore You (No translation provided as it's already in English) (ISBN 978-1455509126) - distinguishes between casual practice (doing the same thing you already know how to do over and over again to accumulate hours) and deliberate practice (working specifically on the edge of your current competence, on problems that force you to learn something new, with immediate feedback).

For software development, this translates into a concrete question: am I working on challenging things or am I working on things I already know how to do? Comfort is necessary for consolidation - but if you're only in comfort, you're accumulating hours without building real competence. Productive discomfort - the moment when you're dealing with something that you still don't master - is where most learning takes place.

The principle of cognitive scaffolding

Modern pedagogy talks about scaffolding as a temporary support structure that allows you to build competencies that then stand on their own. In the context of self-study technical courses, scaffolding are structured resources - courses, books, tutorials - that guide you step by step through content that you couldn't tackle alone without a path.

The risk is to become dependent on scaffolding: studying only through structured resources, without ever trying to do unguided tasks. The scaffolding needs to be removed progressively: starting from the guided tutorial, moving on to the semi-guided project (with documentation but no step-by-step instructions), and finally arriving at the completely autonomous project where you need to find your own resources. This progressive distancing from scaffolding is what produces real autonomy.

This framework helped me understand why many self-taught individuals get stuck at a certain level: they continue to do tutorials when they should be removing the tutorial and building on their own. The next step is not another advanced tutorial - it's building something without a tutorial.

The cost of learning from random sources versus carefully curated paths

One thing I didn't understand at first was the cost of unstructured learning. When you learn from casual sources - a video here, an article there, a tutorial somewhere - each source has its terminology, conventions, and way of presenting concepts. The result is a collection of fragmented knowledge that doesn't connect coherently.

The difference between a well-planned path and free navigation is not the quality of individual resources - it's progress. A well-designed curriculum introduces concepts in order: first the basics, then more complex structures built on those basics. Free navigation introduces concepts in a random order, and when you arrive at something advanced without having the basics, the basics become a cognitive debt that slows down progress.

My practical advice: for the basics (the first language, web fundamentals, basic computer concepts), choose a structured curriculum and follow it to the end. After completing the basics, free navigation becomes an effective tool - because you have context to place every new piece of information in its proper place. Before having that context, free navigation is costly in terms of time and consistency of acquired knowledge.

Readings and Resources

These are the resources I would have liked to know from the beginning, not after years of browsing by chance. I selected them for quality/time ratio and immediate applicability.

Curriculum and structured resources

  • freeCodeCamp - The most comprehensive free web development curriculum available online. From HTML/CSS basics to JavaScript, front-end libraries, tests, and APIs. It has the advantage of being structured with logical progression and verifiable certifications. You don't need to do everything - even just the Responsive Web Design and JavaScript Algorithms and Data Structures modules cover the essential basics for most front-end paths. The entry point I recommend for those starting from scratch.
  • Harvard CS50 - Foundational concepts of computer science, free. It's not a web development course - it's a course on how to think like a computer scientist. The difference is important. I recommend doing it before or alongside freeCodeCamp, not after.

Foundational Books

  • Andrew Hunt and David Thomas, Il Programmatore Pragmatico (ISBN 978-0135957059) - The Developer's Handbook. It is not a technical book per se - it does not teach a specific language. It teaches how to think about your work as a developer: how to learn, how to do debugging, how to write maintainable code, how to communicate in a team. Readable at the beginning, but increasingly dense with meaning with experience.
  • James Clear, Atomic Habits Il comportamento è il risultato di una serie di piccoli cambiamenti che si accumulano nel tempo. Questo libro ti aiuterà a comprendere come creare e mantenere abitudini positive, e come superare le difficoltà per raggiungere i tuoi obiettivi. Il concetto di "abitudine" è stato sviluppato da Charles Duhigg, un giornalista del New York Times che ha scritto un articolo sulla rivista The New Yorker intitolato "La scienza dell'abitudine". L'articolo descrive come le abitudini siano il risultato di una serie di piccoli cambiamenti che si accumulano nel tempo, e come possano essere modificate utilizzando tecniche specifiche. Il libro "Atomic Habits" di James Clear offre una guida pratica per creare e mantenere abitudini positive. Il libro è basato sulla teoria dell'abitudine di Charles Duhigg, ma presenta anche nuove idee e strategie per aiutare gli individui a superare le difficoltà e raggiungere i loro obiettivi. Il libro è scritto in un linguaggio chiaro e accessibile, e contiene molti esempi concreti di come le abitudini possono essere modificate. Il libro è anche dotato di una sezione dedicata alle tecniche per superare le difficoltà comuni, come la procrastinazione e la paura del fallimento. In generale, "Atomic Habits" è un libro che ti aiuterà a comprendere il potenziale delle abitudini positive e a creare un piano di azione per raggiungere i tuoi obiettivi. Il libro è una risorsa preziosa per chi vuole migliorare la propria vita e raggiungere la propria felicità. Il libro è stato scritto da James Clear, un autore e oratore che ha lavorato con molti clienti di alto profilo per aiutarli a migliorare le loro abitudini. James Clear è anche il fondatore della sua agenzia di coaching, che offre servizi di consulenza e formazione per aiutare gli individui a raggiungere i loro obiettivi. Il libro contiene molti esempi concreti di come le abitudini possono essere modificate, e presenta anche una sezione dedicata alle tecniche per superare le difficoltà comuni. Il libro è scritto in un linguaggio chiaro e accessibile, e contiene molti consigli pratici per aiutare gli individui a creare e mantenere abitudini positive. Il libro è stato pubblicato nel 2018 e ha ricevuto recensioni positive da molti lettori. Il libro è stato tradotto in molti paesi e ha venduto milioni di copie in tutto il mondo. Il libro offre una guida pratica per creare e mantenere abitudini positive, e presenta anche nuove idee e strategie per aiutare gli individui a superare le difficoltà. Il libro è una risorsa preziosa per chi vuole migliorare la propria vita e raggiungere la propria felicità. Il libro è stato scritto da James Clear, un autore e oratore che ha lavorato con molti clienti di alto profilo per aiutarli a migliorare le loro abitudini. James Clear è anche il fondatore della sua agenzia di coaching, che offre servizi di consulenza e formazione per aiutare gli individui a raggiungere i loro obiettivi. Il libro contiene molti esempi concreti di come le abitudini possono essere modificate, e presenta anche una sezione dedicata alle tecniche per superare le difficoltà comuni. Il libro è scritto in un linguaggio chiaro e accessibile, e contiene molti consigli pratici per aiutare gli individui a creare e mantenere abitudini positive. Il libro è stato pubblicato nel 2018 e ha ricevuto recensioni positive da molti lettori. Il libro è stato tradotto in molti paesi e ha venduto milioni di copie in tutto il mondo. Il libro offre una guida pratica per creare e mantenere abitudini positive, e presenta anche nuove idee e strategie per aiutare gli individui a superare le difficoltà. Il libro è una risorsa preziosa per chi vuole migliorare la propria vita e raggiungere la propria felicità. Il libro è stato scritto da James Clear, (ISBN 978-0735211292) - It's not a technical book, but it's probably the book that has had the most impact on my study habits. The framework of small habits that build up over time is the practical answer to the question "how do I find time to study every day when I already have a full life with many commitments?"

I prepared a curated reading list with 50 annotated resources for developers from non-CS backgrounds - books, courses, podcasts, blogs, with notes on when and why to use them. You can download it for free here above in exchange for subscribing to the newsletter.

Next step in the series

The next week will see the release of the third article in the series: What would I do today if I started again from scratch as a developerIt's the operational version of what you just read: not "what I would have wanted to know" in a retrospective manner, but "what I would do concretely, step by step, if I had to start from scratch today with what I know now".

The difference between the two articles is important: this one talks about awareness, the next one talks about actions. One is advisory, the other is operational. If this article gave you a map, the next one gives you a route.

You can find all articles in the series on cornerstone of the seriesWhere there is also a career matrix with 12 paths and 5 downloadable lead magnets.

See also: The impostor syndrome never ends (and it's normal) The first article in this series on how to coexist with impostor syndrome without it blocking your work.

What I have learned writing this

This article was harder to write than I expected. It wasn't a lack of content - the problem was the opposite. I had too many things that I wanted to know at the beginning, and choosing the most important ones among them took up more time than writing itself.

The criterion I used at the end is simple: I included only things whose absence caused me concrete problems, measurable in lost time or avoidable errors. I did not include things that are "good to know" in theory. The filter was: "If I had not known this thing, what would have happened differently?"

I have also resisted the temptation of making this article an exhaustive guide. An exhaustive guide to "things you should know when starting to program" would be pointless - too long, impossible to remember, parallel to countless other identical guides. What I wanted to write was something more specific and more personal: the things that, in my journey, made the greatest difference.

Something I've noticed in the writing process: many of the "things I would have liked to know" don't relate to code. They concern the meta-level: how to organize study, how to choose resources, how to measure progress, how to get out of isolation. Code is learned relatively easily if the context is right. The context - habits, method, network - is what makes the difference between those who arrive where they want to go and those who get lost along the way.

I've also thought about why these things aren't said at the beginning. Partly it's cognitive blindness that I mentioned in the introduction: who knows these things already doesn't remember how to not know them. Partly it's that the tech sector tends to glorify the story of "the self-taught genius who learned everything on his own" - which creates an implicit expectation that the journey must be difficult to be authentic. It shouldn't be. The difficulty should be in the content - real technical complexity - not in meta information about how to learn effectively.

If there's one thing you can take away from this article, it's that the time you spend learning how to learn is not time taken away from learning itself. It's an investment that pays off with interest. The right method saves you dozens of hours in the long run.

Do you have things you would have liked to know at the beginning that I haven't mentioned here? I'd like to know them. Write to me at Federico at federicocalo.dev.

I'll respond. Always.

If you are starting to use tools like Claude Code to compensate for the formal training gap, I have collected a series dedicated to the workflow agent that I use daily on my portfolio: Claude Code Workflow: Superpowers + GSD FrameworkIt's the system that allows me to manage 19 parallel phases without a development team behind it.

Frequently asked questions

What are some common difficulties faced by beginners when learning to program?

The article mentions several typical difficulties, including resource allocation paralysis, the myth of the "perfect plan", and the isolation of solo study.

Why is it a problem to switch between different resources while learning to program?

Switching between resources prevents learners from reaching the depth necessary for concepts to solidify in their brains, which learns through repetition and connection between concepts.

What is the difference between consuming content and actual learning?

Consuming content is just watching videos or reading books without applying what you've learned, whereas real learning occurs when you try to do something on your own, encounter a problem, search for solutions, solve it, and then reinforce that knowledge.

What is one practical rule the author recommends for effective learning?

The author suggests spending at least one hour of independent practice on a subject for every tutorial hour or course, building something similar from scratch without copying.

Commenti

Discuss this article in the community

Join the Telegram group to discuss with other developers, ask questions and share your experiences.

Did you like this article?

Explore other content on the blog or discover my projects