Can you learn programming in a month?

Why a non-expert can program, what to expect and how to start

Piotr Artur Klos
Geek Culture
19 min readFeb 7, 2023

--

In this article I’m trying to coach you through your initial programming education. I’ll tell you what philosophical and psychological challenges await you, so you know what is normal. I’ll show an example of an initial plan and then mention some commonly ignored aspects of continued learning that can help you get a more fulfilling experience in the long run. I’ll also tell you why you can contribute to software projects despite having little knowledge and skills.

Executive summary

  • Programming is complex and full of path alterations, requirement changes and reprioritization. Accept it and attack your projects (and, at this point in time, your learning) at all fronts, because you never know where you can advance until you try.
  • At the same time, focus on solutions to practical problems rather than theory and try to finish as many small programs as possible in the initial learning period.
  • Don’t stay away from complex tools as these can be very rewarding in the long run. Understand that you don’t need to know everything upfront in order to contribute to software.
  • Use high-quality learning resources, learn how to learn and take care of your motivation.

Disclaimer: This article contains the text of some answers that I gave to aspiring programmers on Quora, reworded for this article, as well as some original content.

What is programming

I’ll quickly introduce programming because it’s easy not to know what one is up against, so this information will be needed later to inform our learning approach. This intro also contains a list of skills to read about on your own.

Programming is a complex activity with many aspects but fundamentally it is searching for automated solutions to people’s problems.

A woman sitting on the ground in a mountainous area, looking at something far away with binoculars.
Photo by Pawel Janiak on Unsplash

Some people wonder if programming is art, science or engineering. In my opinion, it’s really neither of those. It is more of an investigative activity that involves engineering, science and some craft-like coding as well. You find a solution, or what a solution could be, and then you either plug into it or you build it.

Just to provide some proof of that, programming has been listed as one of investigative careers by Indeed.

Programming consists of a few skills (in no particular order):

  • career planning, for example finding a niche where businesses can pay you for making specific programs, maybe with a plan for some open-source development, publishing or freelance
  • marketing your skills
  • requirements gathering and experience design
  • quality control
  • programming languages (you will probably need at least 2 or 3 of those in the long run)
  • some mathematics, depending on what kind of programming you do
  • algorithms and data structures
  • applying design patterns, including architectural patterns
  • using various tools and libraries
  • domain knowledge (for example you may need mechanical engineering knowledge if you make CAD tools)
  • some people skills, especially communication, and managing expectations, as you need to work with others most of the time
  • some psychological skills, especially maintaining your internal motivation and finding fun

But you don’t need to know all of this at your first job, so don’t worry yet.

Programming can be divided to 2 basic activities:

  • Development. This is searching for solutions to problems. There is a customer that needs a piece of software and you are to provide an implementation. You never know all the requirements and solutions upfront, so you have to do a lot of experimentation and back-and-forth with the customer. Some solutions exist and you can download existing ones or follow a known recipe. Others don’t exist yet, so you have to write completely new code.
  • Maintenance. This involves bug fixing, porting, monitoring performance, maintaining infrastructure etc. Maintenance often mixes with development, for example to fix a bug you may need to develop a module.

But the main part is searching for automated solutions to people’s problems.

The right mindset for learning programming quickly

Learning enough in a month to be able to help someone program is no easy feat. You will need to be agile and hardworking in your learning.

A pair of hands, dirty from physical work, in an outdoor setting.
Photo by jesse orrico on Unsplash

Focus on learning solutions to problems, relax when learning tools

The most important thing is not to be a perfectionist. There is no need to stress that you don’t understand every detail of a programming language or that you can’t get as far as you want in an online course. You are learning to search for solutions, remember?

For example, you can learn every detail about the django python framework, but what is more important than theoretical learning is that you know what is possible to do. For example, if you know what a web application is, that you can make one with django, and what its limitations are going to be, that may be all you ever need to know about django, so the details should have lower priority in your learning process. Try to learn how it works behind the scenes, but don’t worry if you don’t understand everything, and, more importantly, don’t learn advanced features of django if you aren’t going to use them soon, unless you are focusing on discovering what is possible. You will forget them anyway if you do.

The same observation applies to all the tools, including programming languages, mathematics and to all the software for programmers, such as git, github, IDEs, shell languages and so on.

Try to make a lot of small programs. Know how to do a console app, a mobile app, a web app, how to code a binary search and how to parse JSON data, just to name a few. When advanced tools, features and patterns come up in the process, learn them but not all upfront. In general, learn a repertoire of solutions to problems rather than the details of things.

When it comes to swaths of theory, let others define them for you by taking a small number of high-quality online courses. Don’t pick a 400-page book and try to learn everything in the book upfront, without applying it. If a book piques your interest, read only as long as you understand the text and can apply parts of it. This will usually be limited to a few chapters if you are a beginner.

The learning of tools — can you be agile enough?

Photo by Ian Flores on Unsplash

The learning of tools in this environment is going to present some challenges. Initially some will feel overwhelmingly complicated or even over-engineered. The critical thing is not to give up. You will repeatedly find that you had wrong assumptions. For example, you will think you need to learn mainly X and Y, you will spend a week learning Y, and then you will find out that you should really learn P, Q and X, and drop Y. For example, you think you need math and JavaScript and later you learn that you need algorithmics, Java, and JavaScript and that you can drop the math. Can you survive that? Can you just start learning Java instead of

  • giving up, or
  • taking a break of 2 weeks to think things through, or
  • continuing with math that you won’t need?

If the answer is yes, then you are on the right track.

Programming is, in part, solving search problems, because you have to find all these requirements and solutions, and you never know them all upfront. Learning programming is also a search problem because you are trying to figure out what you need to learn for your niche.

Programming is, in part, solving search problems. Learning programming is also a search problem because you are trying to figure out what you need to learn for your niche.

To make things worse, you will be searching simultaneously for

  • What kind of programming you want to do.
  • What tools and skills are needed for this kind of programming, and how to learn them.

The learning of tools — can you be persistent enough?

A single green plant growing from a patch of sand.
Photo by Jill Heyer on Unsplash

At the same time you need to be persistent in following one of the topics, so that you have something to show at the end of the initial month. Can you do that? Let’s say you liked and decided to learn a programming language, say C but then find out that in Java it is much easier to do something, for example create a desktop app with buttons and it really impresses you. On the other hand, there is data supporting the fact that C is widely used, as well as information about what C is used for. Can you independently make a decision about which field you want to work in and then let that dictate the programming language? For the purpose of this example, let’s say that field is embedded development. Can you continue learning C, based on the data alone despite feeling that you are missing out on a seemingly more satisfying technology like Java? Can you focus on building specific kind of programs regardless of not liking some of the tools? Can you go out of your comfort zone and just learn whatever tools, languages and theory is needed for that specific thing?

If the answer to the above questions is yes, then, yes, you can learn programming in a month, perhaps not enough to start a startup on your own but enough to start to help others in exchange for money.

Example initial plan

One approach to starting out learning programming is as follows:

  1. Pick a commonly used programming language, like python, C++ or Java. The choice depends on what field you have in mind, so you will also need to use Google search to learn which language is used where. You can also look at the Tiobe index to see which languages are the most common ones at the moment. You should not limit yourself to only one language in the long run, but initially choosing a single language will help you to focus.
  2. Make some use of a few resources that can allow you to learn fast:

    Coursera is filled with plenty of high quality courses, created by the best universities and used by real professionals to improve their programming skills. The courses are usually interactive and maintained so they won’t crash and cause errors. Pick one which has a high mark (4.6 or more) and a large number of reviews. If the cost of 50$ or so is too high for you, then audit the courses before you take them (I generally recommend that you audit a few courses before committing to a specific one). As a bonus, if you actually pay and complete the course, you normally get a verifiable certificate that you can put on your CV. Complete one course from Coursera at this step.

    Competitive coding sites like HackerRank contain thousands of self-contained coding problems to solve, with scripts that check the correctness of your solutions. They are available in all difficulty levels, from easy to expert. These are nice because you can practice useful skills without wondering where to start and what to work on. There is also the gamification aspect of earning points, contests and so on, that you can use to motivate yourself. There are many articles that list those websites, such as this one. The keyword to search for is “competitive coding”. At this step do a few, at least 5 problems at such a site, trying to be diverse and adjusting the difficulty to your level.
  3. Try to implement a small project on your own. It can be as simple as generating a pdf from excel table in python, or sending you an email every time someone enters your house, or generating a collage from a folder with pictures. If you don’t know what to do, search for “<lang> project ideas for beginners” where <lang> is the programming language you chose. The goal is to quickly expose you to the difficulties of actually designing something from scratch and finishing it, which is very different than just learning language syntax or solving a predefined problem. Don’t be afraid to spend a lot of time on Google, searching for anything you are missing. Focus on completing the program, not making it perfect.
  4. Expand your knowledge in the specific topic you like, sticking to the basics of computer science first. The goal is to give you some foundational knowledge so that you can develop any future projects easier and with more satisfaction from the applied knowledge. You will also have something to read or watch, which will provide a nice distraction from the actual coding. Example basic topics include algorithms and data structures, computer architecture, programming abstractions (languages, paradigms, patterns), mathematics (discrete math, continuous math, probability or mathematics for computer science), operating systems and computer networks (a.k.a. networking). If you want to have more choices or if you don’t believe me, take a look at curricula of some actual computer science university courses, such as this one or this one and pick topics that interest you from the first year. Focus on CS and math topics, skip physics and electronics as they aren’t useful for programmers, unless you want to deal with hardware, such as in chip design or robotics. Each topic will have a ton of resources online, such as courses on Coursera that you can use to learn quickly.

But programming is not just about minimizing learning time — the value of perseverance

Programming, as well as learning programming, is a lot about perseverance. If you find out that something is taking a longer time than anticipated, can you continue? Can you maintain your physical and mental health enough to learn some things that seem boring and disconnected from the world?

If you can, it can pay off in the long run.

A woodpecker, sitting on a dry tree trunk with a lot of holes in it.
Photo by Dulcey Lima on Unsplash

Reason 1: excelling at getting things done

Often the ones doing the best in the market have committed to one specialty and are excelling at it, simply because they found a way to make it their job and they’ve been practicing it for a long time. At some point while others’ best is to try to do something, not knowing if they even have a chance, these experienced people just get it done and this can be very rewarding in terms of money and reputation. Job opportunities open up when you have a longer time horizon.

Job opportunities open up when you have a longer time horizon

Reason 2: less competition

There is another advantage of learning something useful that takes a long time to learn, beyond just being quicker at solving problems. What if there are programming tasks that require in-depth knowledge, or they can’t even be started with any probability of success? These include library and framework development, dealing with some large code bases and starting a large software project. Then, if you are the person who has the knowledge, then the more you know the less competition you have in the job market.

A graph, based on no data at all, my own work

I have no statistics to substantiate the above graph, this is just my expectation from what I observe in the industry. There is a large number of people who start learning a technology, like a programming language. Most are just doing it at a computer science course, with no intention of actually using it, or as a hobby, so they only learn it superficially. It takes a long time to become an expert, so one person can be an expert in at most one tech, so this limits the number further. Then some people who work with the tech move into other roles like management, or change the used tech stack and lose touch with the developments in the tech they were an expert in. Few are left at the end.

Keep in mind that some technologies, like the C++ language, are quite old, so there are lots of people having extensive experience with them, but it doesn’t mean they are willing to keep up with the newest developments, or that they are willing to keep using it.

Why programming tools are complex and how to deal with them

Why tools can be complex

For example, take some of the most popular programming languages: C++ and Java. Both are complicated and have a lot of features, whose usefulness isn’t obvious at the beginning. They take a long time to master. Does it mean you should avoid them in favor of simpler languages? Not necessarily. Some complex tools are justifiably complex.

Some complex tools are justifiably complex.

For example, C++ is complex because it interoperates with C well and because the code can be fully optimized for speed and memory usage, which requires a lot of additional features and inhibits some forms of simplification such as automatic garbage collection. Moreover, C++ has additional features for building very large applications, with hundreds of thousands of lines of code, for portability and so on. None of this is needed to wrote a working program that sorts numbers, which is why it may feel excessive but these features help in the long term, assuming that you picked the right language for the job.

Why you can contribute after just a month of learning a tool that takes 10 years to master?

Let’s compare programming with another profession, to give some fresh perspective.

To become a medical doctor takes a very long course of studies. A lot of people simply can’t afford to study that long. Moreover, the medical needs of the society change much quicker than the number of doctors (the recent health crisis is an example), so some temporary shortages appear. On top of that, countries neglect providing enough resources to teach new doctors or even don’t do the necessary strategic planning. In this environment there is almost a constant shortage and doctors can earn a lot of money, for example in the USA it’s almost 4 times the national average. Not 4x the minimum wage, not 4x of the median but 4x of the average, so this is a huge amount of money to the overwhelming majority of people. The long training time exacerbates the shortage, regardless of the reason for it.

Some medical procedures, in principle, take a short time to learn, so why can the doctors practice only after a long training process? The answer is, of course, that when practicing medicine one cannot design a simpler human body that always works in a predictable way but has to deal with it the way it is and anticipate all the corner cases in all the aspects of diagnosis and treatment, from its effectiveness, through side effects and risks.

But programming is not medicine. I wrote that you can practice programming for money after just a month of learning, right?

The fundamental reason why you can contribute even as a beginner is that, unlike in medicine, you can test everything before the client runs the code! This is in addition to the fact someone’s life usually isn’t on the line when you program computers.

The fundamental reason why you can contribute even as a beginner is that you can test everything before the client runs the code

And most projects these days have testing suites, which means that there is code written that verifies that everything works correctly after a change is made. This means that you can contribute by making small improvements for which you don’t need an in-depth knowledge of anything really.

So you don’t need to know all of Java in order to use Java. Just let the more experienced guy design program architecture and tests and use your limited knowledge to get smaller bits done. Also, the code can be refactored (improved without changing the behavior of the program) later.

How to approach learning complex tools

To sum up, don’t make the mistake of thinking that programming tool must be simple in order to be useful. The real-life applications aren’t simple, so there must be some tools that aren’t simple. Rather than discounting them, consider:

  • Is this tool useful?
  • Is this tool popular (this is not only social proof but helps with the ease of use because all questions are answered on the internet)?
  • Is there a simpler tool that can do the job really well?
  • Is the learning really that long, or can I learn a part of the tool and still be productive?

The answer to the last question will usually be no, so don’t worry too much about how complex the tool is upfront. You might want to learn something like Java after all, if that is what’s needed in the niche you want to get into.

Just keep in mind, there is a limit to rewards from specializing at something fairly common, like a programming language. It is best to find a more narrow niche, like compilers, physics engines for games, scalable web applications, just to name a few examples. But then you need to also make sure that you can find a job consistently in the niche. Because of that, you might want to start with general skills and then gradually specialize more and more, as your career goes on.

Programming, as well as learning programming, is also about motivation

I’m writing about psychology, because learning is a lot about motivating yourself through this complex task. Guess what… The same thing applies to programming itself, as you may already suspect from the description I gave at the beginning of this text. So treat this section as a warning about what you are getting into, as well as an inspiration to make good decisions even when there are some emotions that color your perception of things.

Note, that the psychology of efficient learning, including, of course, the motivational aspects, is a well-researched topic. I recommend the article How to Stay Motivated While Learning to Code by Damilola Oladele at freecodecamp, as it seems to contain some of the right points, is correct and is a good summary. If you want a really thorough treatment of the subject, I can highly recommend the Learning How to Learn course created by the best — psychology researchers who are experts on learning.

The most useful soft skills in programming

The most useful soft skills in programming are:

  • humility and respect for technical and mathematical problems, a.k.a. accepting reality
  • resilience to failure

These are elements of one’s own character and psychology, related the most to the internal motivation. Read on to find why I picked those.

The distribution of problem difficulties in programming

In the late 2000s I used to make some 2D games and I made my own UI framework for that in C++. This is before I knew that making a fully-featured UI framework and maintaining it is already more than one full-time job. I could never make a good one and if I tried, I wouldn’t have time to make games any more. So in the end, I had to abandon it. I would have learned much more if I made a lot of smaller programs.

Some problems you will solve, some you won’t. Some will take 1 minute to solve, others will take 1 year, others take 10 years. For example, in 2022 you can’t build talking NPCs (non-player characters) for games, which are indistinguishable from human players, especially if you spend less than 1 year doing it. By the way, I don’t know about 2023, it has barely started at the time of writing this and progress in AI is astounding. This is a task that only few people know how to even approach and because of that it would take you many years to do it. And before you write to me that ChatGPT can be indistinguishable from a human, not it can’t, because it has tells, for example it knows way too much compared to it’s limited logical abilities. Some companies like OpenAI may know the answer, but they won’t share it immediately, they won’t make it easy to copy and they may fail at the task anyway because there may be more to the problem than their initial assumptions.

As a beginner, or even an intermediate developer you will often not notice that something is complicated. For example, a beginner may start making such an NPC only to find out the hard way that it’s taking too much time.

But the complexity level will be a big unknown even if you assume that everything is complicated because then you will start overestimating it. You will never get it exactly right. What people don’t appreciate is just how often you will estimate the complexity of a task wrong and by how much. It will happen pretty much always and the complexity (in terms of time spent) will be usually off by a factor of 3.

You will always underestimate or overestimate the time it takes to do something in programming.

You need to accept all that and just find ways to advance in you learning, in your projects and in your career in this exact environment, in spite of it, because you can’t change it.

Always search for alternative ways to do things

Photo by Denny Luan on Unsplash

Always search for alternative ways to do things, because there may be a way that takes 10x less time, even though it doesn’t look that way initially. This may require you to abandon the initial excitement from doing something one way.

Cut your losses short.

Your own mind is trying to trick you! Beware of the sunk cost fallacy and the plan continuation bias. Accept the lost time and cut your losses short. Identify the one thing that is worth doing and do that. And don’t choose something just because you’ve spent some time on it already. Pick the important thing and delay everything else for when you have the time, possibly forever.

If one gets stuck and won’t go further until they solve something, they will get nowhere. If one gets frustrated because they can’t do something, they will not advance either. If one solves one thing and gets frustrated because the next thing turns out harder and they are not getting their dopamine hit, they will get nowhere either.

Some symptoms of not being resilient and not accepting reality are:

  • not finding programming fun
  • anger
  • procrastination
  • blaming others
  • becoming cynical

Procrastination is an especially common symptom of feeling overwhelmed when you find that things are harder than you thought or that you have wasted time.

Summary

Programming is complex and full of path alterations, requirement changes and reprioritization. Accept it and attack your projects (and, at this point in time, your learning) at all fronts, because you never know where you can advance until you try.

At the same time, focus on solutions to practical problems rather than theory and try to finish as many small programs as possible in the initial learning period.

Don’t stay away from complex tools as these can be very rewarding in the long run. Understand that you don’t need to know everything upfront in order to contribute to software.

Use high-quality learning resources, learn how to learn and take care of your motivation.

Good luck!

--

--

Piotr Artur Klos
Geek Culture

I'm a computer vision and image processing developer, with focus on edge computing and HPC aspects of the field. Also an expert C++ programmer.