What should we teach new software developers? Why?

Original author: Straustrup
  • Transfer
Substantial changes are required in teaching computer science to better meet the needs of the industry.

image
Computer science should be at the center of software systems development. Otherwise, we must rely on individual experience and practical methods, which ultimately leads to less productive, less reliable systems developed and maintained at unreasonably high prices. We need changes in education that will improve production practices.

Problem

In many places, there is a gap between computer science education and industry needs. Take a look at the following situation: A
famous professor of computer science (proudly): “We do not teach programming; we teach computer science. ”
Production Manager: “They are not capable of programming.”

In many ways, they are both right, and not only at the superficial level. The task of the scientific community is not to train mediocre programmers, and the industry does not require only “comprehensively developed, highly educated thinkers” and “scientists”.

Another professor of computer science: “I have not written a single line of code.”
Another production manager:“We do not accept graduates from Computer Science departments; it’s easier to teach a physicist how to program than a graduate of KN physics. ”

Both points of view make sense, but ideally, both points of view would be essentially wrong. The professor is mistaken in that you can’t be taught what you don’t practice (and in many cases, you never practiced), and therefore you don’t understand, while the production manager is right only in that the quality requirements for the software are so absurdly low, that physicists (and others not specialists in computer science) can handle. Obviously, I do not mean physicists who have made significant efforts to study computer science - such combinations of skills are among my ideals.

Professor KN (about student):"He accepted the invitation to work in the industry."
Another professor of KN: “Sorry; he was so promising. ”

This discrepancy underlies many problems and complicates attempts to solve them.
The industry needs graduates from computer science departments to develop software (at least at the beginning of their careers). This software is often part of a long-established code base and is used for embedded or distributed systems with high reliability requirements. However, many graduates essentially have no education or experience in software development beyond their hobbies. In particular, most see programming as a minimal effort to do homework, and rarely in a broader sense, which includes systematic tests, technical support, documentation, and the use of their code by others. Also, many students cannot compare what they learn in one lesson with what they learn in another. Thus, we can often meet students with high marks in algorithms, data structures and programming technologies, which, nevertheless, who understand all the intricacies of the lesson on operating systems, absolutely not taking into account data structures, algorithms and software structure. The result is a poor representation of illegible mess.

For many, “programming” has become a strange combination of immoral hacking and the use of other people's libraries (with a very vague idea of ​​what is happening). The concepts of “technical support” and “coding quality” are usually forgotten or poorly understood. In the industry, complaints about the difficulty of finding graduates who understand “systems” and “can design software” are widespread and reflect reality.

But my computer hasn't crashed lately

Complaining about software is a popular activity, but much of the software has improved over the past decade, much like it has improved over previous decades. Unfortunately, these improvements came at a tremendous price, expressed in human effort and computer resources. In essence, we learned how to build fairly reliable systems from unreliable parts by adding endless levels of dynamic checks and huge tests. The structure of the code itself has sometimes changed, but not always for the better. Often, many levels of software and confusing connections, similar in structure, prevent a person - however competent, from fully understanding the system. This bodes well in the future: we do not understand and cannot even measure the main aspects of our systems.

Of course, there are engineers who resisted the pressure to build poorly functioning, little understood systems. We can thank them for the fact that our computerized planes do not crash, our phones work, and our mail arrives on time. They deserve praise for their efforts to make software development a complete and reliable set of principles, tools, and techniques. Unfortunately, their minority, and functionally redundant and resource-intensive software prevails in the imagination and thinking of most people.

Similarly, there are educators advocating for the separation of theory and practice. They also deserve praise and active support. In fact, every educational institution I know has programs aimed at practical experience, and some professors have devoted their lives to developing specific programs. Nevertheless, considering this issue more broadly, I am not impressed - several projects or practices are a good start, but not a substitute for an integrated approach to a balanced curriculum. The preferred names “software development” or “IT” instead of “Computer science” may mean differences in the future, but problems are of poor quality that will arise again in a slightly different form after the transition to new installations.

My characteristics of “industry” and “scientific community” are like caricatures, but I’m sure that anyone with little experience will recognize the parts of reality reflected in them. My point of view is the point of view of a production researcher and manager (24 years at AT&T Bell Labs, 7 of which as the head of the department), who spent 6 years in the scientific community (in the department of the KN Engineering School). I travel a lot, have serious discussions with technicians and managers from several dozen (mostly American) companies every year. I see a discrepancy between those who prepare universities and what the industry needs, and this is a threat to both the viability of indigenous peoples and the computer industry.
In many organizations that rely solely on the computing process, the level of technical skills has become dangerously low.

Scientific / industry mismatch

And what can we do? The industry will prefer to hire “developers” who are fully trained in using the latest tools and technologies, while the main goal of scientific institutions is to train more of the best professors. For progress, these ideals must be better built. Graduates going into the industry should be well versed in software development, and the industry should develop mechanisms to absorb new ideas, tools and technologies much better. It’s pointless to introduce a good developer into a culture created so that semi-skilled programmers do no harm, because a new developer will be limited in creating something essentially new and better.

Let me point out the problem of scaling. Many production systems consist of millions of lines of a program, while a student can graduate with honors at the KN course, never even writing a program of more than 1000 lines. Several people participate in all major production projects, while many KN courses encourage individual work, considering teamwork to be damp. Understanding this, many organizations are focusing on simplifying tools, technologies, languages, and operating procedures to minimize the importance of developer skills. This is an irrational use of human abilities and efforts, because it leads everyone to a lower common denominator.

Manufacturing wants to rely on proven and reliable tools and technologies, but it is also obsessed with dreams of “simple solutions to problems”, “transformative breakthroughs”, “killer additions” and so on. They want to be able to work with minimally qualified and interchangeable developers, led by several "dreamers" too high to think about the nuances of the quality of the program. This leads to great conservatism in the choice of basic tools (such as programming languages ​​and operating systems) and dreams of monocultures (to minimize the preparation and cost of implementation). In turn, this leads to the development of huge private and mutually incompatible infrastructures: something other than basic tools is needed to allow developers to produce applications and computer systems. Suppliers need something in the developers besides the commonality of the basic methods. Incentive systems promote both grandiose corporate schemes and short-term results. Final costs fluctuate, as does the failure rate of new projects.

Faced with such an industrial reality - and other similar constraints - the scientific community takes independent measures, doing what it can best: carefully studies a phenomenon that can be separately considered by a small group of like-minded people, building strong theoretical foundations, and creating ideal projects and technology for theoretical problems. Private methods for working with huge software databases written in obsolete ways are not suitable for this model. Like the industry, the scientific community is also developing incentive systems to keep up. All this is ideal, taking into account the continuous improvement of educational courses in clearly distributed subjects. Thus, the successes of the scientific field suit production needs like a cow saddle,

Someone always says, "if the industry just paid developers a decent salary, then there would be no problem." It may help, but paying more for the same job will not help much; for a valid alternative, the industry needs the best developers. The idea of ​​developing software as a conveyor driven by semi-skilled, interchangeable workers is fundamentally imperfect and irrational. This pushes the majority of competent people from this field and prevents students from entering it. To get out of this vicious circle, educational institutions must graduate more specialists with relevant skills, and the industry must master the methods, technologies and processes for using these skills.

Dreams of Professionalism

“Computer science” is a terrible and misleading term. KN was not originally about computers, and was not originally a science. Rather, it is about computer users and the ways in which thinking works, which includes computing (“algorithmic and quantitative thinking”). It combines the features of science, mathematics and design, often using computers. For almost all people in the KN, this is the applied sphere - “pure KN”, separated from applied applications, as a rule is ineffective.

What distinguishes a KN specialist who designs applications from a professional in any other field (such as medicine or physics) who designs the same? The answer should be “knowledge of the essence of indigenous peoples perfectly”. What should be this "essence"? It should contain most of the established KN curriculum - algorithms, data structures, computer architecture, programming (principal), some mathematics (for initial reasoning training based on proof and quantitative reasoning), and systems (such as operating systems and databases ) To combine this knowledge and get a general idea of ​​how to cope with big problems, each student must complete several group projects (you can call this the basics of software development).

Obviously, this essence is much more "computer-oriented" than the computer industry as a whole. Therefore, no one can be called a specialist in the field of the theory of computers and systems without additional specialization within the CN (for example, graphics, networks, software system architecture, human-machine interactions, security). However, this is still not enough. The practice of computer science is inherently applied and interdisciplinary, that is, every specialist in the theory of computers and systems should have equivalent minimum knowledge in any other field (for example, physics, medical design, history, accounting, French literature).

Experienced educators will notice:"But this is unreal! It is unlikely that any of the students will be able to master all this in four years . These educators are right: something will have to change. I suggest that the first degree in computer science should be a master’s degree — a master’s degree as a completed scientific degree — not as a bachelor’s degree with an additional one or two years of study. People who plan to conduct research will, as usual, seek the degree of Doctor of Philosophy.

Many professors will object: “I don't have time for programming!”However, I think that professors who teach students who want to become software professionals should find time, and their educational institutions should find ways to reward them for programming. The ultimate goal of KN is to help produce better systems. Do you trust someone who has not seen patients for a long time to teach surgery? What would you think of a piano teacher who never touched the keys? In addition to the necessary knowledge from books, teaching KN should give the student the ability to apply this knowledge in completed systems and appreciate the aesthetics in programming.

I use the word professional. This is a word with many meanings and hidden meanings. In areas like medicine and technology, it implies licensing. Licensing is a very insidious and exciting topic. However, our civilization is software dependent. Is it important that, in essence, everyone can change the main part of the program at their own discretion and on the basis of corporate policy? If this is so, will it also be important after 50 years? Is it important that some software that millions of people depend on will not have a guarantee? In fact, the problem is that professionalism based on licensing depends on a large common part of knowledge, methods and techniques. A licensed engineer can guarantee that that the building was built using accepted technologies and materials. In view of the absence of a generally accepted concept of competence of the CN (as I assumed earlier), I do not know how to apply this to computer programs. Today, I don’t even know how to choose a group of people to design a licensing test (or, more realistically, a set of tests for various narrow specializations, like medical commissions).

What can the industry do to eliminate the nonconformity? It is much more difficult to characterize “industry” and “industry needs” than to talk about educational institutions. In the end, educational institutions have a relatively standardized structure and relatively standardized approaches to achieving goals. The industry is much more diverse: large or small, commercial or not aiming at making profit, complicated or ordinary in approach to the construction system, and so on. Therefore, I can’t even start prescribing medications. Nevertheless, I have one observation that relates directly to the discrepancy between educational institutions / industry: many organizations that rely only on calculations have significantly reduced the level of technical skills:

Production Manager: “Searching for technical knowledge is critical to survival.”
No organization can remain successful without continuity and the infrastructure for hiring and developing new talents. The growing interaction with educators interested in software development can be productive for both parties. Collaborative research and an emphasis on continuing education that goes beyond simple training courses can play a major role in this.

Conclusion

We must try. Until we begin, our infrastructure will continue to creak, swell and absorb resources. Gradually, some part will break in some unforeseen and destructive way (think of Internet rooting, online banking system, electronic voting and power grid management). In particular, we must narrow the gap between educational institutions and industry through change on both sides. I propose to define the structure of training for indigenous peoples, based on the core and specializations and applied areas, gradually focusing on licensing some software, at least some professionals of indigenous peoples who produce it. This can go hand in hand with a bias towards raising production / educational qualifications for technical experts.

Also popular now: