Software Engineering Program by ITMO and JetBrains: Students Share
Last year, ITMO University and the JetBrains company launched the “Software Engineering” corporate Master’s program. Apart from completing traditional practical assignments, its students also get to work on projects under the guidance of JetBrains’ developers and representatives of its partner companies in order to present their results at the end of each semester. We’ve asked some of them about working with leading developers from major companies, as well as the advantages of following a corporate Master’s program.
I majored in Izhevsk, and when the time came to choose a Master’s program, I found myself in quite a strange situation. On the one hand, I had good theoretical knowledge in such fields as mathematics and computer science thanks to my competitions background and me having studied particular textbooks and courses independently. On the other, I had no practical skills whatsoever. For this reason, I wanted to find a program that featured both a good practical component and fundamental training in a wide range of subjects. Most Master’s programs I learned about had at least one of the two major drawbacks: they were either quite formal or gave overspecialized knowledge. So, I have to say that I didn’t have much choice apart from the JetBrains’ corporate Master’s program.
We get an all-round education. Many of the subjects have to do with the field of Computer Science. They offer the understanding of many of the theoretical aspects of information technology and just general knowledge that helps keep the conversation in fine company. We also get many subjects that focus on practical assignments, so we still get to code a lot.
The program offers many benefits apart from the courses themselves. First of all, we get to work in close collaboration with great lecturers. Secondly, we get to communicate and exchange experience among our peers: all of us have different backgrounds, and we have much to learn from each other. Lastly, learning so many different subjects gives you self confidence, as you understand that you learn a lot and you can apply what you’ve learnt.
The project I worked on at JetBrains focused on simplifying the procedures associated with version control systems. More specifically, we wanted to learn to automatically generate texts that reflected the changes made since the last saved version of the repository. We succeeded in identifying the key problems and limitations that emerge when solving such a task. In the end, we developed a model that’s good at predicting the text for particular cases of minor changes. In future, this model will be released as an IDE plugin.
For now, I don’t want to limit myself to any field in particular, because I still haven't thought about all the possible career paths I can choose from. For this reason, I aim to learn as much as possible about various subject fields and the associated knowledge and skills. For now, the ones I like most are the field of data analysis and everything that has to do with natural language processing.
I was making my choice between one program in Moscow and this one; to my mind, these two were the only really good programs in the field of programming and data analysis you could get in St. Petersburg and Moscow. In the last moment, I decided that I’m more interested in programming, and chose to study in St. Petersburg.
I’ve already conducted several projects during my studies. I did the first one for the Mobile Robot Algorithms Laboratory. They decided to use indoor gps sensors for their algorithms, and I had to develop a driver that would make it possible to get data from the sensors and send it to the robot. All of it should’ve function as part of the ROS robot operating system.
For my second project, I did a decompiler for Kotlin programming language. I did that in summer as part of my mandatory internship at the JetBrains company.
Finally, my thesis research that I’ve been working on for the last six months as part of the Kotlin team focuses on developing a tool that will make it possible to automatically create a library with a common API that will be common for different platforms (ios, macos, linux, etc.) from the already existing Kotlin/native libraries. This will make things easier for many Kotlin users who work on multiplatform projects, as it would become possible to use the existing libraries in a platform-independent code.
As part of our training, we got courses on algorithms, combinations theory and graph theory, parallel programming, and theory of types, which is all considered fundamental knowledge. Still, we also got lots of practical assignments, and for each course we had to write lots of code or complete many exercises. This way, we got various kinds of knowledge, and enough practical experience to solidify it. Personally, I’d say that the most useful opportunity that we got was to try many different technologies, programming languages and tasks under the guidance of experienced lecturers in just a short amount of time.
In future, I plan to continue focusing on developing compilers and the programming language theory in general, as I’ve always liked this. I’ve already joined JetBrains’ Kotlin team, and I think I’ll be staying with them after I graduate.
I’m very interested in the ideas of functional programming, and this is why I was looking for a program where I could continue learning them, as well as study the fields where they can be applied. This Master’s program largely focuses on programming language theory, which is why I decided to follow it. Another reason was the abundance of general knowledge subjects in this course.
The topic of my current project is “increasing the granularity of warning messages in the GHC compiler”. It is conducted under the guidance of developers from Serokell. Its results will help Haskell developers make their work a bit more pleasant. In other words, they will be able to toggle off some of the warnings for the source code. I chose to work with Haskell because I like this language very much, and this project allows me to immerse into the essence of its compiler.
We have a special day scheduled for working on our research project, but in fact, we choose the time we find most comfortable for both the student and the research advisor. Their interaction can also take various formats. For example, I tend to work on my research during the weekdays and contact my research advisors via a special chat.
Our program implies much practical training, but we also get considerable theoretical background. What’s more, we get to choose whether we want to focus on the theoretical or practical aspects of each particular subject. I think that everything that we learn has some purpose: the workload we get helps us learn to properly manage our time and increase our efficiency.
A wide range of subjects and specializations, lecturers with specialized knowledge – all of that offers each students an opportunity to follow their individual educational path. Personally, I chose to focus on programming language theory because this is what I’m really interested in. And I plan to continue doing so in the future.
I liked this Master’s program for its range of subjects. Apart from fundamental knowledge, we get a great opportunity to try ourselves at different fields and choose what we really like. What’s more, I really liked it that the lecturers dedicate much time to working with students individually, which is a rare occurrence in other programs.
When talking about my Master’s program, I have to note that we have both purely practical subjects and general ones. Still, even for general subjects we have practical assignments when we have do exercises or write code, i.e. we don’t just get knowledge but also learn to apply it.
I believe that every subject has its purpose: even if you understand that you won’t be focusing on machine learning in the future, learning to use its basic algorithms can come in very handy. This helps you broaden your outlook and solve nonconventional tasks. Also, our program is organized in such a way that you have to learn to manage your time properly, which is a most important skill for not just programmers but for any kind of professionals.
In future, I would like to continue focusing on what I’m doing for my research thesis, i.e. formal languages and statistical analysis. There are many interesting tasks in this field, ones that I would’ve really liked to try; also, it has to do with a great number of other subjects, so you can always learn new and interesting things.
Before joining this program, I majored in physics. I had particular groundwork, I understood how programming worked, but I knew that I was still lacking fundamental knowledge. In the end, I chose to follow this Master’s program, as I decided that it would both give me the fundamental knowledge I needed and give me an opportunity to learn something on a mode advanced level.
Just recently, they allotted us to various projects for this semester. Some continued with what they were doing before, but I decided that trying something new will be better. If my previous project gave me the opportunity master my teamwork skills, then my current one gives me insight into my future subject area, which is machine learning.
We get to choose whether we want to focus on either fundamental or practical training. For one, when we had practical assignments on formal languages, we could choose whether we wanted to get more theoretical or practical knowledge. Personally, I chose the latter. Still, as for the program in general, I’d say that its organizers succeeded in attaining a particular balance. During the lectures, we get great knowledge and we can always clarify any issues we get interested in. As for the practical assignments, we also get enough of them to understand what do we need the theory for.
What do I consider to be the most useful for me? I can think of two things. First of all, it’s the program itself. Nowadays, there’s lots of information in free access that you can use to learn programming by yourself. Still, that can be tricky. When you have a clear plan and people who will help you stick to it, it’s really great. Secondly, and this might be even more important, the projects we work on under the guidance of various companies. This helps to not just immerse in the profession, but also become acquainted with the industry’s giants.
In future, I want to grow in the field of machine learning. As of today, the associated techniques can be applied in various fields. It’s even a bit frightening: studying something that can once make me lose my job. Well, jokes aside, machine learning can help replace many people, but good specialists will always be in demand, and that is something that I want to become. Upon completing a Master’s program, I want to go work for a major company, and applying for a position at JetBrains is among my top options.
I heard a lot of good feedback about this program from my older peers. I also liked it that I already knew many of the lecturers (I followed their courses on Stepik), which made me sure of the program’s quality.
As of now, I am working on my thesis research as part of a JetBrains’ team that focuses on the IntelliJ Rust Plugin. This is a plugin that adds the support of the Rust language in IntelliJ IDEA and other of JetBrains’ projects. The purpose of my work is to offer better IDE support to those who make use of procedural scripts (which is one of Rust’s concepts). In order to attain that, I have to align the plugin’s existing infrastructure with the inner API of Rust’s compiler.
Of all the courses they offer us at the program, I especially liked the one on Java and virtual machines. It gives the idea of not just the subject itself, but also many adjacent fields. I believe that the scope that you’re giving knowledge in is very important, as it helps the students better understand the subject. I also think that it’s great that I got to know many different lecturers and specialists from various fields. Such things give you an opportunity to get the full picture of the industry, and learn how important this community is for everyday work.
For now, I’m most interested in an field that exists at the interface of programming language design and design of tools for these languages. I believe that working in such a field can help you make the lives of many developers easier, and the results of your work will be used on a daily basis.