From Curiosity to Code: My Approach to Learning Programming
Learning to code is a journey that involves mastering not only the basics of programming but also delving into complex projects that push your skills to new heights. In this article, I'll try to outline a rough plan to becoming a proficient developer and offer few ideas for practical projects to build in order to develop and showcase your skills.
If you are brand new, I am not sure if some of these will work for you, nontheless feel free to go through the article and pick what you find interesting and helpful, best of luck.
Of course you will start by picking a programming language, I would suggest you do so based on your needs and wishes, be it getting a job, scratching a curiosity ich, or a creating a hobby project, and then setting a plan for learning and practicing, which I will try my best to help you carve, let's get into it.
At the end I will share my personal recommendation for what languages to pick if you are interested in hearing that.
Foundations
As with almost everything in life, you will start your programming journey by mastering the fundamentals of your language of choice. Learn about variables, loops, control flows, ..., to gain a solid understanding of how to program and how code works. This forms the basis for all your future programming endeavors so tackle it wisely and with patience.
Getting Hands-On
After you have learned a bit, it is time to solidify your knowledge so far, do not worry if some concepts have not clicked yet for you, it is common for almost everyone, so you need to practice to get a feel for what you know and what you don't. I would suggest you practice by building a project you care about, it can be a simple game, CLI application, or a plain website, whatever peaks your interest, just get something done, and do not sweat it, you will be bad as everyone was but embrace the hardships and push through.
If you do not have any project ideas to work on I will suggest you go through Advent of Code(Codewars and Leetcode are a viable choice at this stage as well) as it is simple in the sense that it gives you a list of requirements but still vague that it is not holding your hands as in a tutorial, which is good but I would recommend avoiding them as you might get stuck in what we call "tutorial hell", I personally only use them for learning specific topics and concepts from the language, or in general such as concurrency or hoisting as examples.
Keep practicing
Once you go through a few challenges, I would suggest you start looking into building a complete project, again whatever piques your interest, as I am a web developer I will recommend a few web projects but if you are interested in Machine Learning, Game development, or any other field, lookup projects to tackle(AI chatbots like ChatGPT are good at providing you with decent ideas but do not treat them as a bible, expand them on your own).
Projects recommendations
Some of my projects to tackle that I found interesting and fun that might interest you as well are building an interpreter for a language, I would recommend Lisp, or if you need an introduction I would recommend "Crafting Interpreters" by Robert Nystrom and "Writing An Interpreter In Go" by Thorsten Ball. This will not only reinforce your understanding of your language of choice but also expose you to the intricacies of language design and implementation(obviously not a production-ready language).
The second recommendation would be building a socket web server and client, sort of a chat app, where users can join and send messages to each other, you can make it as intricate or as simple as you want, this will give you a feel for the language
My last recommendation is to build a simple ticketing system similar to Jira, it does not have to be as feature-complete obviously, but it will help you gain a feel of what it is like building an actual project from writing its software requirements(a features list basically), designing the UI, picking a tech stack, and coding it, and as a bonus deploying it. Some features that can be interesting to implement are authentication and authorization, file uploads, security practices, code structuring, and more. This will challenge you to use most, if not all, language features and third-party packages(try not to go overboard with it, I am looking at you JS developers). Of course, this is a small subset of what you can pack into such a project, feel free to add whatever you like, the goal is to fuel your curiosity and have fun.
As a bonus, these projects might be interesting for peers and employers to talk about and give you a little bit of help if you are seeking employment.
Learning Good Habits and Practices
Through these projects, you'll naturally pick up good and bad habits and practices, which are subjective for the most part but there are real standards that it would be in the nest interest of everyone if you adhere to which will help you to carve a successful programming career.
Understand the importance of clean code in the context of real-world applications, get comfortable with version control systems like Git, and collaboration tools such as GitHub and Jira(just to name a few), as well as reading and writing documentation.
These are a few skills you need to practice as they are transferable and will help you become a more proficient developer.
Algorithms and Data Structures
Once you are comfortable with building applications, shift your focus to algorithms and data structures. These are the building blocks for efficient and scalable software. Understanding how to choose and implement algorithms is key to solving complex problems and arguably important for your craft.
You can start by simple data structures such as Arrays, Stacks, and LinkedLists, and the operations you can perform on them and their complexities(space and time), although I strongly recommend you do not get fixated on that last part as they are guidelines and not a set in stone rules, as often an array will get farther than you think rather than reaching for a fancy data structure.
And remember practice is your best "trick" for mastery. To practice I would recommend you solve a few problems on platforms such as Leetcode or Codewars. Again do not get fixated too much on them, it is fine if you do not understand all of them yet, keep practicing and building software, and you will start noticing areas where DSA can be applied.
Further Steps
Once you grasp the bascis and get comfortable with building applications, I suggest you start looking into more specific topics to deepen your knowledge in your language and tooling, and of course, if you have an employment goal, craft your resume, network with other people be it developers or recruiters, and best of luck in your journey.
Other aspects I would recommend you start checking are how CPUs and Memory work, parallelism and concurrency and their applications and challenges, design patterns, and programming paradigms preferably different ones than the one used by your current language, last get familiar with the use cases for dynamic and static typed languages and why both exist and some of the languages that use each.
Final thoughts
This is by no means a comprehensive guide, but it is meant to be a rough plan for learning to be a good programmer(The world really needs more of them).
By learning and practicing the mentioned topics(not an exhaustive list) you will not only learn the basics of programming but also gain practical experience through challenging projects.
The combination of foundational knowledge, hands-on experience, and algorithmic proficiency will hopefully prepare you for a successful and rewarding career in programming. Keep in mind you need more skills to be a proficient programmer such as communication, discipline, and collaboration, just to name a few.
I would like to bring your attention to the fact that I did not mention any languages, libraries, frameworks, or runtimes(yes now we have to bring them up, thanks to JavaScript) as they are means to an end, by that, I mean while they are useful to learn and master and have their benefits but do not get fixated on them and their comparisons(it does not matter really), React or Svelte is not a topic that requires a fight(yes things escalate sometimes beyond a discussion), both are useful and have their use cases and drawbacks, the same goes for languages, libraries, and other tools.
As promised my recommendation for a language to pick will be the following: JavaScript, C#, Java/Kotlin, Go, or Swift. These languages are a good choice for a few reasons, their relative ease of learning curve, and broad availability of positions in the market(as I noticed in the EU and some parts of the US and Africa). But Do your homework to decide which one to pick, and lastly, that list is not in any particular order.
Never forget, that sheathing your sword, figuratively speaking, takes a great deal of discipline, practice, and willingness to step out of your comfort zone and delve into the unknown. Keep practicing and most importantly keep an open mind regarding new topics, practices, paradigms, and technologies, you'll never know what you might like and enjoy, so try as much as you can.
Lastly, I would like to show some appreciation to those who cultivated and inspired these ideas, clearly, I did not come up with them but rather learned them throughout the years and now I like to share them with the hopes they might be useful for someone out there.
If you liked(or disliked) the post or any of its ideas and would like to have a civilized discussion or point out any corrections, feel free to reach out to me via LinkedIn or Twitter.
Cheers!