According to a Wikipedia article on Ram Dass (formerly called Richard Alpert):
When asked if he could sum up his life's message, he replied, "I help people as a way to work on myself, and I work on myself to help people … to me, that's what the emerging game is all about."
I am not a religious person, and in fact I stand firmly against organized religions. On the other hand, being somehow "spiritual", friendly and helpful towards others seem to me virtues that I can support. And among the so-called spiritual gurus, Ram Dass appears to have a message of universal love and understanding, without greed, will to control, or need to boss people around. Helping others is indeed the only purpose of this article.
I do not consider myself a great programmer, but during all these years, I have learned something about how computers work and how to program them. This document will not contain many details nor will it be long. I just wish to sum up certain topics so that aspiring programmers could progress faster and avoid some pitfalls. There is already lots of technical documentation available as traditional books and on the Web, so my focus will be more in the big picture .
I will talk about general guidelines and principles, but to help people in a more practical way, I will also suggest one possible path for beginners to take. The suggested method is by no means the only one possible, but I am pretty convinced it is among the valid alternatives that could get you started if you want to become a programmer.
My background is mostly in Linux, and that is one of the reasons I recommend trying out some Linux distribution such as Fedora Linux. Note that becoming a programmer using Windows or Apple is very much possible, but in my opinion Linux has many advantages. To name a few:
Let's start by talking about some misconceptions and prejudices concerning programming first.
Not being familiar with how software is written, it is all too easy to underestimate software complexity. Many things you see on your screen seem simple and elementary, but when you examine their inner workings, you will realize things are not that easy after all. For instance, think about copying a file from one folder to another. Using some kind of a graphical user interface ("GUI"), or perhaps cp
utility using Linux command line, it all seems self-evident and very basic. But trust me, if you examine the details, there is lots of work required to be done for copying a file.
Where does this realization lead us to? To a healthy and respectful appreciation of even the "simple" things we see. When we know that most of the things that appear simple, are not really simple, we have a better and more realistic understanding of computer's workings and reality in general.
Having a too big ego, i.e. overestimating one's own skills as a beginner, can be common. This problem is partly tied to the point I made before about underestimating software complexity. For example, if you have a big ego and lots of self-confidence, you could take look at a text editor such as VIM and say: "Although I am a beginner, this terminal-based text editor is such a simple and boring program that I could write my own version in just a few days!". That would be a mistake.
It is of course perfectly acceptable to be confident about your abilities, but try not to overestimate your skills. As a beginner, you have a lot to learn and that is nothing to be ashamed of. And even as you gain more experience and skill, you still always have a lot to learn. We can never become experts in all fields in computing, but instead we rely on other people's help and knowlegde.
At some point you will realize the huge complexities around us. This can lead to discouragement and even despair. You could say to yourself: "I never realized there is so much to learn. I will never make it!". It is all right to have these darker moments, but do not give up. It is true that we can never master everything there is related to computing, but we can gain experience in our chosen fields. Things will get clearer in time, although there will always be some areas that we simply do not have the time or skill to study thoroughly.
Is programming and computing suitable just for males? Of course not. You can be male, female, transgender, gay, straight, bi-sexual, asexual, gender X or whatever. As of this writing, programming and computing is indeed a male dominated field, but this is mostly because of sad historical events. Men have been favoured and women have been put down, but nowadays it is quite clear that absolutely anyone can become a programmer. Or anyway person's sex or sexual orientation has nothing to do with it. It is only the person's mind that counts. As programmers, we express thoughts using source code. It is a mental process.
Suffice it to say that like sex or sexual orientation, age has nothing to do with becoming a programmer. I do believe it is best to start out as young as possible, just to imprint logical thinking early into the mind and allow it to develop from there. But this is not to say middle-aged or old people could not become programmers. If you are willing to work on it, you could very well succeed, although it cannot be guaranteed that anyone will become a programmer.
Some overoptimistic self-help books try to convince people they can become anything and learn absolutely anything if they just have enough passion and work hard. Unfortunately that claim appears to be false. Not all people can compose music, not all people can be nuclear physicists, not all people can be painters, not all people can be top athletes. As humans, we have limitations. We may be good in some things, mediocre in others, and horrible in certain things. It is an old saying that practice makes perfect. But to be honest, it is not quite true. With practice, most people can certainly improve in their chosen fields, but not necessarily become experts or leaders in the field.
It is the same with programming. Some people disrespectfully call programmers "code monkeys", implying that their skills are elementary and that anyone could learn them with little or no practice. That is all false thinking. To become a programmer, you have to have the right skills, talent and work hard. Not everybody can do it, but everybody can try and see if it works or not.
It is a pretty common misconception that mathematical expertise is required in order to become a programmer. That idea is false, but knowing mathematics is surely beneficial in certain areas of programming. Programming is a large field and some areas can be purely number crunching or require skills in complicated mathematics. I believe e.g. scientific simulations often involve complex math. Cryptography and 3D graphics are also examples of areas where you need lots of mathematics - at least if you are a researcher and involved with low-level design and basic principles.
On the other hand, logical thinking is always quite essential, but this is a more generic skill than mathematics. To be good at math, you have to have a certain amount of logical skills, but you can be logical without being very good at mathematics. To learn programming, you need logical, analytical and linguistic skills. There are many, many areas in computing where you need very little mathematical expertise. So being good in mathematics is a great bonus, but not essential when becoming a programmer.
What does it mean to be analytical? Put simply, you need to be able to think about complex things such as cars and you need to be able to break them down into their constituent parts. A car consist of tires, steering wheel, gas tank, gearbox, brakes, speedometer and so on. Similarly with programming, you need to deconstruct bigger things into smaller things and see how they interact and are related to each other. This requires analytical thinking and engineering skills, but not necessarily much mathematics.
Programming is a field with considerable freedom. By this I mean that it is basically very accessible to anyone without much need for special equipment or laboratory environment. To become a programmer you need just a few physical things: You need access to a computer to write, run and test your programs. But used laptops are cheap and almost anyone can afford to buy one. After that you need Internet access in order to get help online from the programming forums and so on. You also need online documentation and quite possibly some classic textbooks as well. Those are the material world requirements.
I already mentioned the mental requirements: logical mindset and analytical thinking abilities.
Do you need a University degree to become a programmer? Absolutely not. For those who enjoy being in school, getting formal education can be beneficial. But even if you complete all the University courses in Computer Science, you still have years of work ahead of you. University courses are pretty brief, but in order to really master programming skills and take part in real-world projects, you must be prepared to study and work by yourself. Teaching yourself skills has a special term coined for it: Autodidactism. It is very important that you learn how to teach yourself.
Some people would like to become programmers just to make lots of money. Or to work as a paid programmer just to make a decent living: Would that work out? Yes, it could work out. But it could be emotionally and mentally draining. Ideally you should have an honest passion to learn about computing, and a desire become a programmer, not just the idea of making money. But I do know people who program for a living just to be able to financially support their real passions like opera singing.
In this section I will describe some theory and practice of programming and computing. This is just one possible path, but it could prove helpful.
I think that you should study theory and practice in parallel. Learn the theoretical general principles, but at the same time take breaks from it, and learn how to use program development tools in practice.
I also want to stress out that this is the broad outline, the big picture, one possible generic map to follow. To master these concepts properly almost always takes many years unless you are a genius.
To put the theory into practice, you need to learn your tools. Compare this to carpenter's work. To build anything, you need to know how to use hammers, nails, screws, saws, drills, chisels. It is the same with programming.
for
and while
with if
conditionals. Be happy about all progress. In all likelihood you will not write large and complicated programs in some time, so be patient.First free yourself of misconceptions and prejudices concerning programming. Anyone has the potential to become a programmer. However, know that becoming a programmer is a long, but interesting project that usually takes many years. And it never really ends, as there is always more for us to learn. Then take the time to learn enough theoretical background and practical things so that you will know how to write programs in the real world.
You need lots of patience and hard work, but try to enjoy your ride. This project could indeed be a whole new way of life for you. But it is also possible that you will fail. Unfortunately not all people can become programmers, but how could you know if you do not even try? There is no reason to be afraid of possible failure. Start with baby steps, learn as you go and do not worry about not understanding everything all at once.
Surely there will be difficult times when you feel discouraged and pessimistic, but just stick with it and always keep on trying. Sometimes taking a break and getting good night's sleep helps a lot. When you are tired and your brain is overloaded with new and complex information, you cannot learn. You need to rest for a while and come back later.
Remember that patience is also a skill that can be practiced and learned. If you cannot study for one hour straight, try 30 minutes or 15 minutes at first, then take a break. It also helps to change the subject, so if you are fed up with studying some theory, take a break and try to learn about some new software tool instead.
You could try to read some source code from early on, but be warned: Almost all real-world programs, even the simplest, will be too complicated to understand at first. It is better to read introductory books, Internet tutorials and write very small test programs as you go. And remember that even the experienced software developers often know only some parts of the programs that they work on. For instance, Linux kernel is a huge and famous software project with hundreds of contributors. There is no single person who understands it all, but instead there are experts who know their subsystems very well.
As time goes by, it is also important to find the areas that interest you the most. They could be operating systems, cryptography, security, graphics, scientific modeling, web applications, mobile games, networking, programming languages, web design, user interface design, databases, etc. It is impossible to master all fields, so in addition to acquiring a broader picture, it is often good to specialize in some area.
Be patient and have fun!
Kalevi Kolttonen <kalevi@kolttonen.fi>UPDATE June 19th, 2018: A programmer friend of mine just read this article. She commented on practical things by saying that to a person who has never programmed before, it would probably make sense to start with a high-level language first. She suggested Python instead of C. I tend to agree with her, because with C it is quite easy to create nasty bugs that can be confusing to a beginner. Programming in Python is much safer and it is also easier.
UPDATE October 21th, 2018: If you are starting out now, it is recommended to learn Python version 3. It has many useful features and built-in default support for UTF-8 character encoding, making it ideal for international use in all countries.
A Python guru and educator Mark Pilgrim has written an exceptionally great book called Dive Into Python 3. He allows you to have it free of charge, so if you are interested in Python 3, please do yourself a favour and click the following link to download Dive Into Python 3 in PDF format! You will not regret it.
This book proves that Mark Pilgrim is among the top authors. He is truly capable of explaining the basics and more difficult concepts (such as closures) in a clear and understandable way. Mark's book should be considered not only as a modern classic text on Python 3, but also as an example of how to teach in general. I just cannot stop praising Dive Into Python 3, it is quite excellent.