📜 ⬆️ ⬇️

What should we teach new software developers? Why?

Significant changes in computer science training are required to better meet the needs of the industry.

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


In many places, there is a gap between computer science training and industry needs. Take a look at the following situation:
The famous professor of computer science (with pride): “We do not teach programming; we teach computer science. ”
Production Manager: “They are not able to program.”
In many ways, they are both right, and not only on a 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."
Some other production manager: “We do not accept Computer Science graduates; it is easier to teach physics programming than a KN graduate in physics. ”

Both points of view make sense, but ideally, both points of view would be essentially erroneous. The professor is mistaken in not teaching what you do not practice (and in many cases, never practiced), and therefore do not understand, whereas the production manager is right only in that the requirements for software quality are so absurdly low. that physicists (and others not computer scientists) 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 the student): "He accepted the invitation to work in the industry."
Another professor of CN: “Sorry; he was so promising. ”

This discrepancy underlies many problems and complicates attempts to solve them.
The industry needs graduates of computer science to develop software (at least at the beginning of their careers). This software is often part of a code base that has accumulated over a long time, and is used for embedded or distributed systems with high reliability requirements. However, many graduates in fact do not have any education or practice in software development other than their hobbies. In particular, most consider programming as the minimum effort for doing 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 on algorithms, data structures and programming technology, which, nevertheless, who understand all the intricacies of the lesson on operating systems, completely ignoring the data structures, algorithms and software structure. The result is a poor perception of illegible disorder.

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 concept of “technical support” and “coding quality” is 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 broken down lately.

Complaining about software is a popular activity, but much of the software has improved over the past decade, just as it has improved in previous decades. Unfortunately, these improvements had an enormous cost, expressed in human effort and computer resources. In essence, we learned how to build reasonably reliable systems from unreliable parts by adding endless levels of dynamic checks and huge tests. The structure of the code itself sometimes changed, but not always for the better. Often, multiple levels of software and intricate connections that are similar in structure prevent a person — nevertheless, competent — from fully understanding the system. This promises trouble in the future: we do not understand and cannot even measure the main aspects of our systems.

There are, of course, engineers who resisted the pressure to build poorly functioning, poorly understood systems. We will be able to thank them for the fact that our computerized airplanes are not broken, our phones are working, and our mail arrives on time. They deserve credit for their attempts to make software development a complete and reliable set of principles, tools and techniques. Unfortunately, their minority and functionally redundant and resource-intensive software dominates the imagination and thinking of most people.

Similarly, there are educators who advocate the separation of theory and work experience. They also deserve praise and active support. In fact, every educational institution known to me has programs aimed at practical experience, and some professors have devoted their lives to the development of specific programs. However, considering this issue more broadly, I am not impressed - several projects or practices are a good start, but not a replacement 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 have poor quality arise again in a slightly different form after switching to new installations.

My characteristics of the “industry” and “scientific community” resemble a caricature, but I am 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 the production researcher and manager (24 years at AT & T Bell Labs, 7 of whom as head of the department), who have already spent 6 years in the scientific community (in the department of scientific school of engineering school). I travel a lot, spend serious discussions with technicians and managers from several dozen (mostly American) companies every year. I see a discrepancy between those who prepare the universities and what the industry needs, and this is a threat to the viability of the CN and to the computer industry.
In many organizations that rely solely on the computational process, the level of technical skills has become dangerously low.

Scientific community / industry mismatch

And what can we do? The industry will prefer to hire “developers” who are fully trained to use 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 aligned. Graduates entering the industry should have a good understanding of software development, and the industry should develop mechanisms to absorb new ideas, tools and technologies much better. Introducing a good developer into a culture designed to prevent semi-skilled programmers from harming is pointless, because the new developer will be limited in creating something substantially new and better.

Let me point out the scaling problem. Many production systems consist of millions of program lines, while a student can graduate with honors in a CN course, without even writing a program in more than 1000 lines. In all major production projects, several people are involved, while many CN courses encourage individual work, considering teamwork to be dampening. Understanding this, many organizations focus on simplifying tools, technologies, languages, and operating procedures to minimize the value of developer skills. This is an irrational use of human abilities and efforts, because it leads everyone to the lowest 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”, “capable of transforming breakthroughs”, “killer additions” and so on. They want to be able to work with minimally qualified and interchangeable developers who are led by several “dreamers” who are too sublime to think about the nuances of the quality of the program. This leads to tremendous conservatism in the choice of basic tools (such as programming languages ​​and operating systems) and the dream of monocultures (minimize preparation and implementation costs). In turn, this leads to the development of huge private and mutually incompatible infrastructures: something besides the basic tools is necessary to allow developers to produce applications and computer systems. Suppliers need something in the developers in addition to the generality of the basic methods. Incentive systems contribute to both grandiose corporate schemes and short-term results. The final costs fluctuate, as well as the frequency of failure of new projects.

Facing such an industrial reality - and other similar constraints - the scientific community takes independent measures, doing what best knows: carefully examining 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 databases of programs written in obsolete ways are not suitable for this model. Like the industry, the scientific community also develops incentive systems to keep up. All this is perfect, given the continuous improvement of educational courses in well-distributed study subjects. Thus, the successes of the scientific field are suitable for production needs as a cow saddle, and the industry has to spend money on training workers, as well as the development of specialized infrastructures.

Someone always says, "if the industry just paid developers a decent salary, then there would be no problems." It may help, but paying more for the same job will not help much; for a sound alternative, the industry needs the best developers. The idea of ​​developing software as a pipeline, managed by semi-skilled, interchangeable workers, is fundamentally imperfect and irrational. This pushes the majority of competent people out of this field and prevents students from entering it. To get out of this vicious circle, educational institutions must produce more specialists with appropriate 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 is not originally about computers, and is not originally a science. Rather, it is about computer users and how thinking works, which includes computation (“algorithmic and quantitative thinking”). It combines the features of science, mathematics and design, often with the use of computers. For almost all people in a CN, this is an applied field - “pure CN”, which is separated from applied applications, as a rule is ineffective.

What distinguishes a KN specialist designing applications from a professional in some other field (such as medicine or physics) designing the same? The answer should be "knowledge of the essence of the CN perfectly." What should be this "essence"? It should contain most of the installed KN curriculum — algorithms, data structures, computer architecture, programming (principal), some mathematics (for initial teaching of reasoning based on evidence and quantitative reasoning), and systems (such as operating systems and databases). ). To combine this knowledge and gain a general understanding of how to cope with big problems, each student must complete several group projects (you can call this the basics of software development). The balance between theory and practice is fundamental - KN is not only principles and theorems, and it is not only a hacking program.

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

Experienced teachers will note: “But this is impossible! It is unlikely that any of the students will be able to master all this in four years . ” These teachers are right: something will have to change. I propose 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 carry out research work will, as usual, pursue a PhD degree.

Many professors will say: “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 encourage them to program. . 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 about a piano teacher who never touched keys? Training in the KN should give the student, in addition to the necessary knowledge from books, the ability to apply this knowledge in completed systems and appreciate 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 depends on software. Is it a matter of principle that everyone could essentially change the main part of the program at his own discretion and on the basis of corporate policy? If so, will it also be in principle in 50 years? Is it fundamental that some software, on which millions of people depend, will not have a guarantee? In fact, the problem is that professionalism on the basis of licensing depends on a large general part of knowledge, methods and techniques. A licensed engineer can guarantee that the building was built using accepted technologies and materials. In the absence of the generally accepted concept of competence of 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 inconsistencies? It is much more difficult to characterize the "industry" and the "needs of the industry" than to talk about educational institutions. After all, 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 non-profit making, complicated or common in the approach to the building system, and so on. Therefore, I cannot even begin to prescribe medications. However, I have one observation that relates directly to the disparity 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 essential for survival.”
No organization can remain successful without continuity and infrastructure for hiring and developing new talents. Growing interaction with educators interested in software development can be productive for both parties. Collaborative research and an emphasis on continuous learning that goes beyond simple training courses can play a major role in this.


We must try. Until we start, our infrastructure will continue to squeak, swell and absorb resources. Gradually, some part will break down in some unforeseen and destructive way (think of Internet routing, online banking, e-voting and power grid management). In particular, we must narrow the gap between educational institutions and industry through changes in both sides. I propose to define the structure of CN training, based on the core and specializations and application areas, gradually aiming at licensing some software, at least some of the CN professionals who produce it. This can go together with a bias towards increasing the production / educational qualification for technical experts.

Source: https://habr.com/ru/post/105544/

All Articles