“Sometimes it happens that a man’s circle of horizon becomes smaller and smaller, and as the radius approaches zero it concentrates on one point. And then that becomes his point of view.”
“When I thought I had hit rock bottom, someone knocked from below.”
Stanisław Jerzy Lec
PrefaceDoes a programmer need a higher education? The flow of opinions on this undoubtedly urgent topic has not dried up, so I have decided to express my view. It seems to me the general disappointment in education is due to the numerous processes and changes in the profession and it needs serious study. Below I will discuss the most common misconceptions, myths, and underlying causes of the phenomenon.
Maybe, you came to the wrong placeOnce again I remind you: the university is not a vocational school. Universities produce scientists and engineers, not blue-collar workers and technicians.
The university gives you fundamental knowledge, which will not become obsolete when you finish your education. One biologist from the National Institutes of Health wrote to me: “Times change but fundamentals do not change”. Excellent words! That is why it is better to choose the general direction of education and try to take the maximum number of elective courses, and that is why in the universities undergraduate physics students are given (as many people guess) so many “unnecessary” courses such as biology, chemistry, or literature, instead of the special ones.Carl Sagan, famous astronomer, mentioned in his books that he was working in the genetics laboratory and did experiments to test the hypothesis of abiogenesis while he studied. It is great that in the USA it is possible (in addition to the main major) to add a few other (minor) specialities. This is a wonderful opportunity that many other countries like Russia do not offer. So, if you have a choice between the theory of evolution and Java programming – choose the first, maybe, someday this knowledge will be useful in your career or even life. You will still learn the Java – if you really need it – but you are unlikely to learn the history of our planet. Moreover, evolution is so general and universal an idea that it can be applied to almost any engineering discipline. Remember, to narrow your horizons is always easier than to expand them. To the point, the situation in foreign universities is not fundamentally different. As a result of many years of parallel evolution, the world has developed similar requirements for professionals. You are quite right that in other countries you will be taught in a different way, but wrong if you think that you will be taught different things. Universities in other countries differ in educational processes, the names and amounts of courses, quality of practices, and real science, but the theoretical base is similar everywhere. The reason for such unification is pretty clear: the laws of nature are invariant in all countries. Therefore, specialists from one country are able to work all over the world.
Who are the programmers?To illustrate the importance of the question I will turn to an analogy. Imagine that you ask someone what his profession is, and he says he is a builder. Can you guess what he does without any additional information? No. He could be an architect with an artistic education, engineer, foreman, skilled worker, or a cleaner. Needles to say, many of these areas have their own specializations. And still all of them would be called builders, but it is obvious that they are very different types of builders. To make a doghouse, one need not have a special education, but without it no one can build a skyscraper. However, those who build doghouses usually are not called builders. On the other hand almost everyone now is called a programmer. A computer scientist who invents new algorithms; a navigation software developer at NASA; an expert in Assembler language who studies viruses; a schoolboy who makes HTML pages – all of them are programmers now. So, before you answer the question: “Does a programmer need higher education?”, you should clarify – which type of programmer? Perhaps, in your particular case, education is obviously not needed.
Whether we like it or not, the Strugatsky brothers’ dreams of a world of young research assistants are collapsed. The vast majority of people are not going to become scientists or engineers, and they definitely do not need a university degree. The two years associate degree completely address their needs. Because as a rule their desires and needs do not meet the goals of university education and their proposed work has little to do with science or engineering. This is not terrible, as the number of engineers in any field at any given time has always been less than technicians and blue collar workers. There is nothing humiliating in the blue collar profession, especially if you like it, but it does not make sense for one such person to call himself an engineer. Instead, you need to honestly admit whom you want to be, and not require universities to be what they are not supposed to. Only one thing, please do not call yourself a programmer, because a programmer is an engineer.Engineers cannot be blue collars. Even to develop simple program you should be a good engineer, or your program will be big and slow, consuming computer resources, and producing unnecessary traffic, flooding the network. On the other hand, blue-collars do non-creative jobs, they usually do not make decisions and do not solve problems; if they follow the instructions, they do their work very well. However, there has already been blue-collar workers in programming many years ago. They were typesetters, who coded programs written by engineers on a paper. And they disappeared very quickly when computers got more convenient terminals.
Measure thrice and cut onceEach profession has a minimum set of mandatory knowledge. In computer science and programming such a basis is maths courses; so the question “Does a programmer need the education?” usually turns into “Does the programmer need maths?” or “Does the programmer need so much maths?” Given that a programmer in the classic sense is an engineer, the question can be formulated differently: “Does an engineer need the education?” Discussion on this form of question usually does not arise. The problem, perhaps, is that not everyone wants to be a scientist or an engineer. If the limit of your dreams is to publish a simple game in the App Store, and not to design the artificial intelligence, cryptographic algorithm, or CAD engineering software, you can easily bypass the university to start your career, but even in this case good education will help you. The universities do not know whom you see yourself as in the future, and even you often do not know that at the age of your enrolment. It is believed that it is better to teach you all the basics, than to miss something important. In addition, the basic courses are generally interdependent, and you cannot just pick up and remove some of them. Their main goal is not to teach you all the knowledge in the world, as that is impossible in principle, but to provide you with a rough map of modern science and engineering, so when you are occasionally faced with something unknown, you can make the (probably) right decision, in which direction to go.
Let’s return to mathematics. Almost all books on algorithms require some mathematical culture from the reader. The algorithms and data structures – as Niklaus Wirth said – are the computer programs, and if you are not able to work with them, you can not be called a programmer. This is not necessarily the ability to design your own algorithms, usually you need to change existing ones, adapting them to individual cases, but also the ability to prove their validity and applicability to a variety of conditions, and the ability to analyse their behaviour in certain situations. Mathematics is actively used in areas such as cryptography, computer graphics, pattern recognition, video, sound, image and signal processing, computation physics, chemistry and biology, and so on. Even in system programming (which usually lays far from maths) without serious mathematical background you cannot write compilers, schedulers and file system drivers.Mathematics is the basis of all other knowledge. But many people begin to learn the profession from the end. Programmers who have studied programming languages, development tools, various technologies and patterns, but have not mastered the mathematical foundations, look like artists, who have a perfect understanding of the paints and brushes, learned a lot of tricks, but do not know the colour theory, composition, perspective, human anatomy, and other basics. They may have a lot of brilliant ideas, but they will not be able to express them. And all they can do is to work as assistants or repaint other’s pictures.
Occasionally, ignorance of the basics creates new styles, such as in the case of Vincent Van Gogh (to his credit I must say that he was aware of his problems and took painting lessons from professionals), but usually becomes an obstacle to creativity. And if in the art it is possible to justify the artist’s wry pictures saying that “he sees this way”, in the aerospace industry such cases (like when the wrong random numbers generation algorithm led to the millions of dollars from honest taxpayers missed the target), cannot not be justified by anything.At the same time we should not forget that for most part, maths for programmers is a toolbox rather than a science, and lecturers should teach them accordingly, especially the first year courses, explaining to students the reason for studying them. As for the social sciences and other non-core courses, their importance is marked not only by the fact that anyone should be well cultured and educated, but also because the human mind is extremely unpredictable and sometimes draws inspiration from unusual sources. My Russian language teacher told me a story from the Soviet epoch, when one aviation institute decided to save money and so got rid of literature courses. And what do you think transpired after? Soon the level of graduating engineers had decreased. Subsequently, literature courses were returned to the institute. So all these courses are necessary. Unfortunately, they are often badly taught, that does not add to their popularity; but we are talking about the idea, right?
So if you do not use the knowledge gained at the university, then the problem probably is not in your university but in your work, which does not give you a chance to use it. It is foolish to blame the university for giving “wrong” courses, when you studied how to design encryption algorithms, but now you make simple web pages or even work as sale manager.
Why universities?Well, you said, but why is the regular education better than self education? After all programming is not genetic engineering — you need not work in special expensive laboratories and can learn all the theories sitting at home. Indeed, the educational programmes of the universities are known, many courses are open, you can buy any book, take it from the public library, or read it on the Web. However, not everything is as simple as it seems. Mathematics, in contrast to the technologies and programming languages, is usually very hard to learn. You may not know that you are doing something wrong, unless you are told about it. Personal contacts are very important and may save you a lot of time and nerves. For example, you can listen to the lecture for a few hours and understand very little, while during the break in a few minutes you find out all the answers from the professor. Some programmers still need laboratories and special conditions, for example, those who want to work with unique architecture microprocessors, supercomputers, industrial robots or satellites.
Studying at a university is also an opportunity to gain practical experience in companies and organizations, which otherwise would not have been possible. This is an opportunity to do science, write articles, and participate in conferences, which is a necessary condition of work in the research labs of many companies, such as, Samsung, Phillips or IBM. Almost all world changing technologies were developed at universities, and some, such as the famous LLVM, have grown up from student projects. Well-known companies were founded by scientists and graduates within the walls of the universities: Silicon Graphics, Sun Microsystems, Yahoo, Adobe, and many others.Last but not least, without formal education, the doors of many research organizations (such as NASA, NIH, CERN or ARPA-E) will be closed for you. You have to prove your professionalism and to be much better than the competitors, because when all other qualifications are equal, formal education will be an advantage for them. Also, without a degree it is very hard to get a work permit in other countries. (It is not very important for the US but is still is useful.)
When someone knocks from the belowThe problem is global, but the most sharp in programming. And that is why. Reducing the entry level barrier has played a cruel joke on the profession. Initially, all the development tools were written by experienced programmers to simplify their work. These technologies were useful only if you understand what processes occur in them. Thus, they allowed you to write more programs in less time, but their quality depended exclusively on your knowledge and skills, because development tools still do not know how to think and to make decisions for you. Then someone decided that the simplification of programming would attract more people into the profession. Many people dreamed of a time when everyone would be able to write programs, regardless of their abilities.
Fear of your desires. Unfortunately, their dreams are now largely a reality, and not as it was intended in the seventies. Now you can create programs from building blocks, even without understanding how they work. If you are not a professional it will be a bad but (unfortunately) working program. The spread of cheap technology and ease of development have led to the fact that the market now is flooded with low-skilled programmers. As Say’s Law says “supply creates its own demand”. Many companies hire such “programmers” not because they really need them but just to be no worse than their competitors. The rule is simple: if you cannot hire professional programmers, you do not need them at all. Just buy existing product or order it from a professional software company.But it is not enough to write a program, you still need to publish it. And again the emergence of many online stores provided such an opportunity for everyone. Google, Apple, Microsoft, and other software companies are interested primarily in the greatest possible number of programs for their platforms, and they are also releasing development tools for them. In such circumstances, the development process is even more simplified, which ultimately led to an even greater decrease in the entry barrier of programming. The result of all this is the illusion of ease of programming, people began to think of it as something not serious, that does not require special knowledge and education. Such an opinion has been formed not only from the beginners, but also (which is a lot worse) by inexperienced customers and employers. Many of you have seen the vacancies with an impressive list of necessary skills, languages, libraries, and technologies, many responsibilities (with the possible exception of the cleaning services), yet all offered with a modest (if not to say ridiculous) salary. It is difficult to imagine in such industries as aerospace engineering, where the price of the mistakes is human lives. In such professions selection is very hard. Nobody wants to lose millions of dollars in insurance payments, license withdrawal, and bad reputation. Thus, an aerospace engineer can be either good or non existent, because no one wishes to hire the bad one even if he asks a very small salary. Quite different from programming, in which there is no lower limit, and every programmer, even very low-skilled, will not remain without a job. Our civilization is still alive only because most of the work performed by programmers is not critical, we can easily live without it, and any problems do not lead to disaster. Imagine that all computer games suddenly stopped working in the world, would it be a disaster? Of course not! No doubt this will be a global problem, but certainly not a disaster. However, if the same fate befell aircrafts the result would be tragic.
However, the danger is coming. Programming now is nearly everywhere, and it spreads very quickly. Already programmers’ mistakes in software cost too much, and the price of these mistakes will rise until it reaches human life. You can remember failures of Mariner I space probe (July 28, 1962), Ariane 5 Flight 501 (June 4, 1996), Mars Climate Orbiter (November 10, 1999), Patriot Missile (February 25, 1991) and finally Therac-25 which exposed six people to massive overdoses of radiation, killing four and leaving two others with lifelong injuries (1985–1987). So the day when your programmable teapot may kill you because its firmware is written by low-skilled programmers from no-name outsourcing company (placed somewhere in Laos) is not far from today. You are warned.
Real lifeOf course, this does not mean that excellent education or perfect knowledge of mathematics will turn you into a world-class programmer (it may be necessary but not sufficient). Everyone knows that many of university graduates are not working in their field. And I personally know a lot of mathematicians writing horrible programs. By the way, you may just not have abilities in programming, a very common situation. So I am generally against the use of simplified criteria. In real life, everything is important: formal education, knowledge, research, practice, and last but not least: your desire. People often think the university is an elevator, which will help them rise to the top of their career, while in reality it is more like stairs, and to achieve your goals, you need to move yourself. Education does not guarantee you a good job if you do not make an effort, but it can help you get one if you endeavour. And if you during your studies did not take part in any research or commercial projects and began to look for work only after your graduation, then programming (like any other engineering) is not the profession for you.
How did they do it?Bill Gates, Mark Zuckerberg, Larry Ellison. Reading success stories of famous people, many immature minds think like this: “If they could do it, then I can do it.” Maybe. But keep in mind that success is a very versatile concept, it is one thing to be a successful marketer and quite another to be an outstanding engineer. Nevertheless, it is no secret that some world famous programmers have no formal education, but before you go trying on their lives for yourself, remember that they are rare exceptions among many unknown losers. If someone jumped out of a window and survived, it does not imply that you should not use the stairs. Similarly, education should not (a very common mistake) be confused with the diploma, the fact that someone has not completed education, does not mean that they did not gain from it at all. It is likely they have studied for several years, attended courses, and gained some knowledge. Some of them (like Steve Wozniak) still came back and completed their education many years later.
Equally important are their mental abilities and character: as a rule, they are all bright, intelligent, talented, and somewhat brilliant, persons who knew from the beginning what they needed, are purposeful, and have phenomenal working efficiency. They do not ask for other people’s opinions and do not impose their own. And yet some of them, for example, John Carmack (the author of DOOM and Quake games) regret that he did not get a formal education and was too self-confident.If you are the same as they are, I sincerely wish you success, otherwise isn’t it better to use a more clear and proven way?
The future of blue collar jobsThere is the matter is that blue collar professions slowly become extinct because they are replaced by robots and automatic machines. Now whole factories are ruled by a few engineers and skilled technicians. This is good because no industrial work should be done by hands more than once. And that is especially true in programming, because in programming non-creative work can be automated very easily. The present world does not need more blue-collars, because machines do their work very well, it needs more scientists and engineers who will invent our future. Likewise, the world does not need more low-skilled programmers (even though they are not blue-collars in any sense) because they will be replaced very quickly by smart machines and programs. Instead, the world needs more high-skilled programmers, true engineers, who will change our life, making it better, safer and longer. Look at the open positions in research departments of many companies. As spoken about earlier, there are too many programmers and competition is very high, yet meanwhile these companies and institutions cannot find enough good programming researchers and engineers! Many positions are open for years. So where is competition and overflow? They are largely on the low levels. The sad truth is that as programming becomes more easy for non-professionals the low levels will be more overflowed. The wage will decrease until low-skilled programmers will be paid no more than McDonalds workers.
Good higher education is very expensive and takes many years but it is the basis of your future, which will extend to the future of your family. So, it is time to choose whether you will “code for food” all your life or you will work at a good company for a higher wage. Moreover, the reward is not only your wage but also interesting world-changing work.