How to get the most out of Computer Science Education
Most modern programmers have graduated from universities. Over time, this will change, but now things are such that good staff in IT companies still come from universities. In this post, Stanislav Protasov, Acronis University Relations Director, talks about his vision of the features of university training for future programmers. Teachers, students and those who hire them can even find a couple of useful tips under the cut.
For the last 10 years I have been teaching mathematics, algorithms, programming languages and machine learning at various universities. Today, in addition to my position at Acronis, I am also the Deputy Head of the Department of Theoretical and Applied Informatics at MIPT. From experience in good Russian (and not only) universities, I made some observations about the training of students in computer disciplines.
I am sure that you have come across a rule of 30 seconds, which states that a programmer must understand the purpose of a function after a quick look at its code. It was invented for a long time, since then there have been many operating systems, languages, hardware and algorithms. I have been writing code for 12 years, but relatively recently I saw the source code of one product, which at first glance seemed to me to be magic spells. Today, if you are not immersed in the subject area, then the 30-second rule stops working. Otherwise, you will not have enough not only 30, but also 300 seconds to figure out what's what.
For example, if you want to write drivers, you will need to dive into this area, read thousands of lines of specific code. With this approach to the study of the subject, the specialist has a “sense of flow”. Like in rap, when a feeling of good rhyme and the right rhythm appears without special rationalization. A well-trained programmer can easily recognize ineffective or simply bad code without going into a detailed study of where a style violation occurred or a suboptimal approach was used (but explaining this feeling can be very difficult).
Specialization and growing complexity lead to the fact that the formation of a bachelor no longer provides the opportunity to study all areas deeply enough. But just at this level of education you need to gain horizons. After that, in a magistracy or at work, you will need to spend some time diving into the problems and specifics of the subject area, study slang, programming languages and the code of colleagues, read articles and books. It seems to me that this is the only way with the help of the university to “pump up the crossbar” for future T-shaped specialists .
To my joy, university professors have already refused to find the right answer to the question: “What is better to program?”. The debate about which is better - C # or Java, Delphi or C ++ - has actually come to naught. The emergence of many new programming languages and the accumulation of pedagogical experience have led to the fact that an understanding has been established in the academic environment: each language has its own niche.
The problem of teaching using one or another programming language has ceased to be a priority. It doesn’t matter what language the course is taught. The main thing is the sufficient expressiveness of the language. Book “ The Art of Multiprocessor Programming”Is a good illustration of this observation. In this already-classic edition, all examples are in Java, a language without pointers, but with Garbage Collector. It is unlikely that anyone will argue that Java is far from the best choice when writing high-performance parallel code. But to explain the concepts outlined in the book, the language turned out to be suitable. Another example is Andrew Eun's classic machine learning course taught in the Matlab language in the Octave environment. Today one could choose a different programming language, but what, in essence, is the difference if ideas and approaches are important?
At the same time, in recent years, many more practitioners have become universities. If earlier Russian university programs were actively criticized for being divorced from reality, today it is no longer possible to say so about IT education. 10 years ago, there were almost no teachers at the universities with real experience in the industry. Now more and more often at the specialized department, classes are conducted not by full-time teachers in computer science, but by practicing IT specialists who read only 1-2 courses in their free time from their main work. This approach justifies itself in terms of quality training, updating courses and, of course, the search for potential employees in the company. I don’t think that I’ll reveal a secret by saying that we support the basic department at MIPT and build relations with other universities, including to
Holivars, who used to turn around programming languages, went into the philosophical direction. Now conditional “programmers” and “mathematicians” argue with each other. In principle, these schools could stand out in two educational programs, but the industry still does not share such subtleties well, and from university to university we have a similar education with a slightly different bias. This means that both the student and the company in which he will continue to work will have to supplement the puzzle of knowledge with the missing pieces.
The appearance in universities of practitioners who write industrial code in different languages gives students a better development skill. Being familiar with the implementation of standard libraries, frameworks and programming techniques, practical programmers instill in students the desire to write good code, to do it quickly and efficiently.
This useful skill, however, sometimes leads to the advent of fans of reinventing the wheel. Computer students think this way: “what should I write another 200 lines of good code that will solve the problem in the forehead?”.
Teachers who have received a classical mathematical education (for example, matfak or applied mathematics) are more likely to work in a near-scientific environment, or in the field of modeling and data analysis. “Mathematicians” see the problems in Computer Science differently. They primarily operate not with code, but with algorithms, theorems, formal models. An important plus of the mathematical approach is a clear fundamental understanding of what can and cannot be solved. And how to solve it.
Accordingly, teachers of mathematics talk about programming with a bias towards theory. Students who come “from mathematicians” more often offer well-thought-out and theoretically better solutions, but, as a rule, are not optimal from the point of view of the language and, often, are simply inaccurate. Such a student believes that his main goal is to demonstrate the ability to solve such problems in principle. But the implementation may be lame.
The guys who were brought up by programmers at school or in their first courses bring with them a “very beautiful bike”, which, however, usually does not work very asymptotically. On the contrary, they do not set themselves the task of deeply theorizing and turning to textbooks in search of optimal solutions, giving preference to beautiful code.
In various universities at student interviews, I usually see which “school” underlies his education. And I almost did not encounter the perfect balance in basic education. As a child, it was possible to prepare for olympiad mathematics in my city, but there were no programming circles. Now, in the circles, children learn to program in the “trendy” Go and Python. Therefore, already at the level of admission to universities there are discrepancies in approaches. I believe that it is important to support both skills at the university, otherwise either a specialist with insufficient theoretical base or a person who has not learned and does not want to write good code will come to work in the company.
It is clear that in such circumstances, the student simply chooses what he likes best. The teacher simply broadcasts a point of view that is closer to him. But everyone will benefit if the code is written beautifully, and from the point of view of algorithms everything will be clear, reasonable and efficient.
You can deepen your knowledge in theory by referring to specialized literature and online courses. You can improve your ability to use programming languages on Coursera, Udacity or Stepik, where a lot of different courses are presented. Also, students often begin to watch hardcore language courses if they feel that the algorithm teacher knows mathematics well, but cannot answer complex questions in the field of implementation. Not everyone will agree with me, but in my practice, the specialization in C ++ from Yandex has proven itself , in which increasingly complex language chips are sequentially sorted. In general, choose a course with high marks from reputable companies or universities.
Coming from a university to work in any company, from a startup to a large corporation, students of even top universities are poorly adapted to the real work environment. The fact is that today universities are “nursing” a lot with students. Even having missed a lot of classes, not prepared in time for the control and tests, having overslept, being late for the exam, everyone can pass and retake again - and in the end get a diploma anyway.
Nevertheless, today there are all conditions for students to be prepared for adulthood and independent professional activity. They will have to not only program, but also communicate. And this also needs to be taught. In universities, there are various formats for pumping these skills, but, alas, often they do not receive enough attention. Nevertheless, in our arsenal there are many opportunities to gain effective teamwork skills.
One of the reasons for writing this post was an article published on the Tyumen State University website . The author of the article focuses only on the shortcomings of Russian students noticed by foreign teachers. The practice of my teaching in different universities indicates that Russian school and higher education provides a good base. Russian students are savvy in mathematics and algorithms, it is easier to build professional communication with them.
In the case of foreign students, by contrast, the expectations of a Russian teacher can sometimes be overstated. For example, at the level of basic training in mathematics, the Indian students I met are similar to Russian students. However, they sometimes lack special knowledge at the exit from undergraduate studies. Good European students are more likely to have less strong maths at school level.
And if you study or work at a university, you can now build up work on communicative skills (yours or your students), expand the fundamental base and practice programming. To this end, all possibilities are provided for in the Russian education system - you just need to use them correctly.
I will be glad if in the comments to the post you share your links to courses and methods that help to balance the balance in education, as well as in other ways to pump soft skills while studying at the university.
For the last 10 years I have been teaching mathematics, algorithms, programming languages and machine learning at various universities. Today, in addition to my position at Acronis, I am also the Deputy Head of the Department of Theoretical and Applied Informatics at MIPT. From experience in good Russian (and not only) universities, I made some observations about the training of students in computer disciplines.
30 second rule no longer works
I am sure that you have come across a rule of 30 seconds, which states that a programmer must understand the purpose of a function after a quick look at its code. It was invented for a long time, since then there have been many operating systems, languages, hardware and algorithms. I have been writing code for 12 years, but relatively recently I saw the source code of one product, which at first glance seemed to me to be magic spells. Today, if you are not immersed in the subject area, then the 30-second rule stops working. Otherwise, you will not have enough not only 30, but also 300 seconds to figure out what's what.
For example, if you want to write drivers, you will need to dive into this area, read thousands of lines of specific code. With this approach to the study of the subject, the specialist has a “sense of flow”. Like in rap, when a feeling of good rhyme and the right rhythm appears without special rationalization. A well-trained programmer can easily recognize ineffective or simply bad code without going into a detailed study of where a style violation occurred or a suboptimal approach was used (but explaining this feeling can be very difficult).
Specialization and growing complexity lead to the fact that the formation of a bachelor no longer provides the opportunity to study all areas deeply enough. But just at this level of education you need to gain horizons. After that, in a magistracy or at work, you will need to spend some time diving into the problems and specifics of the subject area, study slang, programming languages and the code of colleagues, read articles and books. It seems to me that this is the only way with the help of the university to “pump up the crossbar” for future T-shaped specialists .
What programming language is best taught at the university?
To my joy, university professors have already refused to find the right answer to the question: “What is better to program?”. The debate about which is better - C # or Java, Delphi or C ++ - has actually come to naught. The emergence of many new programming languages and the accumulation of pedagogical experience have led to the fact that an understanding has been established in the academic environment: each language has its own niche.
The problem of teaching using one or another programming language has ceased to be a priority. It doesn’t matter what language the course is taught. The main thing is the sufficient expressiveness of the language. Book “ The Art of Multiprocessor Programming”Is a good illustration of this observation. In this already-classic edition, all examples are in Java, a language without pointers, but with Garbage Collector. It is unlikely that anyone will argue that Java is far from the best choice when writing high-performance parallel code. But to explain the concepts outlined in the book, the language turned out to be suitable. Another example is Andrew Eun's classic machine learning course taught in the Matlab language in the Octave environment. Today one could choose a different programming language, but what, in essence, is the difference if ideas and approaches are important?
More practical and closer to reality
At the same time, in recent years, many more practitioners have become universities. If earlier Russian university programs were actively criticized for being divorced from reality, today it is no longer possible to say so about IT education. 10 years ago, there were almost no teachers at the universities with real experience in the industry. Now more and more often at the specialized department, classes are conducted not by full-time teachers in computer science, but by practicing IT specialists who read only 1-2 courses in their free time from their main work. This approach justifies itself in terms of quality training, updating courses and, of course, the search for potential employees in the company. I don’t think that I’ll reveal a secret by saying that we support the basic department at MIPT and build relations with other universities, including to
Mathematician or programmer?
Holivars, who used to turn around programming languages, went into the philosophical direction. Now conditional “programmers” and “mathematicians” argue with each other. In principle, these schools could stand out in two educational programs, but the industry still does not share such subtleties well, and from university to university we have a similar education with a slightly different bias. This means that both the student and the company in which he will continue to work will have to supplement the puzzle of knowledge with the missing pieces.
The appearance in universities of practitioners who write industrial code in different languages gives students a better development skill. Being familiar with the implementation of standard libraries, frameworks and programming techniques, practical programmers instill in students the desire to write good code, to do it quickly and efficiently.
This useful skill, however, sometimes leads to the advent of fans of reinventing the wheel. Computer students think this way: “what should I write another 200 lines of good code that will solve the problem in the forehead?”.
Teachers who have received a classical mathematical education (for example, matfak or applied mathematics) are more likely to work in a near-scientific environment, or in the field of modeling and data analysis. “Mathematicians” see the problems in Computer Science differently. They primarily operate not with code, but with algorithms, theorems, formal models. An important plus of the mathematical approach is a clear fundamental understanding of what can and cannot be solved. And how to solve it.
Accordingly, teachers of mathematics talk about programming with a bias towards theory. Students who come “from mathematicians” more often offer well-thought-out and theoretically better solutions, but, as a rule, are not optimal from the point of view of the language and, often, are simply inaccurate. Such a student believes that his main goal is to demonstrate the ability to solve such problems in principle. But the implementation may be lame.
The guys who were brought up by programmers at school or in their first courses bring with them a “very beautiful bike”, which, however, usually does not work very asymptotically. On the contrary, they do not set themselves the task of deeply theorizing and turning to textbooks in search of optimal solutions, giving preference to beautiful code.
In various universities at student interviews, I usually see which “school” underlies his education. And I almost did not encounter the perfect balance in basic education. As a child, it was possible to prepare for olympiad mathematics in my city, but there were no programming circles. Now, in the circles, children learn to program in the “trendy” Go and Python. Therefore, already at the level of admission to universities there are discrepancies in approaches. I believe that it is important to support both skills at the university, otherwise either a specialist with insufficient theoretical base or a person who has not learned and does not want to write good code will come to work in the company.
How to “pump up the crossbar” for future T-shaped specialists?
It is clear that in such circumstances, the student simply chooses what he likes best. The teacher simply broadcasts a point of view that is closer to him. But everyone will benefit if the code is written beautifully, and from the point of view of algorithms everything will be clear, reasonable and efficient.
- IT horizons . A graduate of a bachelor's degree in Computer Science is a ready-made specialist with a developed technical outlook, who probably chose his profile. But in the younger years, we don’t know what he or she will do. Can go to science or analytics, or maybe, on the contrary, write a huge amount of code every day. Therefore, the student needs to show all aspects of work in the IT sphere, to get acquainted with all the tools. Ideally, teachers from theoretical courses will show a connection with practice (and vice versa).
- Growth point . Avoid rolling to extremes - in the interests of the student himself. Understanding who you are, “mathematician” or “programmer,” is not difficult. It is enough to listen to the first impulse when solving the problem: what do you want to do - look in the textbook in search of the best approach or write a couple of functions that will definitely come in handy later on? Based on this, you can build a further complementary trajectory of your learning.
- Alternative sources of knowledge . It happens that the program is well balanced, but “System Programming” and “Algorithms” are completely different people, and the first teacher is closer to some students, and the second to other students. But even if you do not like the professor, this is not a reason to hammer on some subjects in favor of others. Bachelors themselves are interested in finding the will to work with sources of knowledge and in no case trust in radical opinions, such as “mathematics is the queen of sciences, the main thing is to know the algorithms” or “good code compensates for everything else”.
You can deepen your knowledge in theory by referring to specialized literature and online courses. You can improve your ability to use programming languages on Coursera, Udacity or Stepik, where a lot of different courses are presented. Also, students often begin to watch hardcore language courses if they feel that the algorithm teacher knows mathematics well, but cannot answer complex questions in the field of implementation. Not everyone will agree with me, but in my practice, the specialization in C ++ from Yandex has proven itself , in which increasingly complex language chips are sequentially sorted. In general, choose a course with high marks from reputable companies or universities.
Soft skills
Coming from a university to work in any company, from a startup to a large corporation, students of even top universities are poorly adapted to the real work environment. The fact is that today universities are “nursing” a lot with students. Even having missed a lot of classes, not prepared in time for the control and tests, having overslept, being late for the exam, everyone can pass and retake again - and in the end get a diploma anyway.
Nevertheless, today there are all conditions for students to be prepared for adulthood and independent professional activity. They will have to not only program, but also communicate. And this also needs to be taught. In universities, there are various formats for pumping these skills, but, alas, often they do not receive enough attention. Nevertheless, in our arsenal there are many opportunities to gain effective teamwork skills.
- Written business communication . Unfortunately, most specialists leaving the university do not have a clue about the etiquette of correspondence. The specifics of communication in instant messengers in messaging at night and in the afternoon and the use of conversational style and informal vocabulary. However, it would be possible to train written language in the student’s communication with the department and the university.
In practice, managers often face the need to decompose a large project into small tasks. To do this, you need to describe each task and its components well, so that the junior developers understand what is required of them. A poorly set task often leads to the need to redo something, and therefore experience in written communication helps graduates to work in distributed teams. - Written presentation of the results of their work . For the presentation of their educational projects, senior students can write posts on Habr, scientific articles, and also just reports. There are many opportunities for this - as early as the second year, term papers begin at some universities. You can also use essays as a form of control - they are usually closer in form to a journalistic article. This approach has already been implemented at the Higher School of Economics.
If a company practices a flexible approach to development, it is necessary to present the results of its work in smaller portions, but more often. For this, it is important to be able to briefly convey the result of the work of one specialist or the entire team. Also, many companies today conduct "reviews" - annual or semi-annual. Employees discuss the results and prospects of work. A successful review is the main reason for career growth, bonuses, for example, in Microsoft, Acronis or Yandex. Yes, you can program well, but “sitting in the corner” even a tough specialist will always lose to someone who knows how to present their success well. - Academic Writing . Separately, it is worth highlighting academic writing. It is useful for students to get acquainted with the rules for writing scientific texts, using arguments, searching for information in various sources, and linking to these sources. It is advisable to do this in English, as the international academic community has much more good texts, and for various disciplines there are already well-established templates for presenting scientific results. Of course, academic writing skills are also needed in the preparation of Russian-language publications, but there are much more examples of good modern articles in English. You can get these skills as part of the corresponding course, which is now included in many educational programs.
- Leading meetings . Most students do not know how to prepare for meetings, keep a protocol and process data. But if we develop this skill in a university, for example, by participating in collective projects, we can avoid wasting time in the workplace. To do this, we need control over the design work of students in order to teach them how to effectively conduct meetings. In practice, it costs each corporation a lot of money - because if several people who receive a large salary spend an hour of working time at a rally, I want them to get the corresponding return.
- Public speaking . Many students are faced with the need to speak publicly only to defend their thesis. And not everyone is ready for this. I have seen many students who:
- with their backs to the audience
- swinging, trying to introduce a commission for trance,
- break pens, pencils and pointers,
- walk in circles
- look at the floor.
This is normal when a person speaks for the first time. But with this stress you need to start working earlier - with the protection of coursework in a friendly atmosphere among classmates.
In addition, the standard practice in corporations is to enable an employee to propose an idea, receive funding, a position or a dedicated project for it. But, if you think about it - this is the same defense of the term paper, just at a higher level. Why not train such useful career skills while studying?
What am I missing?
One of the reasons for writing this post was an article published on the Tyumen State University website . The author of the article focuses only on the shortcomings of Russian students noticed by foreign teachers. The practice of my teaching in different universities indicates that Russian school and higher education provides a good base. Russian students are savvy in mathematics and algorithms, it is easier to build professional communication with them.
In the case of foreign students, by contrast, the expectations of a Russian teacher can sometimes be overstated. For example, at the level of basic training in mathematics, the Indian students I met are similar to Russian students. However, they sometimes lack special knowledge at the exit from undergraduate studies. Good European students are more likely to have less strong maths at school level.
And if you study or work at a university, you can now build up work on communicative skills (yours or your students), expand the fundamental base and practice programming. To this end, all possibilities are provided for in the Russian education system - you just need to use them correctly.
I will be glad if in the comments to the post you share your links to courses and methods that help to balance the balance in education, as well as in other ways to pump soft skills while studying at the university.