Greetings. My name is Denis Aleksandrov. Apart from being an Android developer, I have been mentoring interns in various companies and managing student internships for over seven years. Over that time, I had a chance to both work one-on-one with promising students and host group internships with dropout. In this article, I am going to wrap up the most important and useful aspects of conducting student internships, thanks to which our training programs are as useful and efficient as possible.
When and who to intern
Every employer wants an applicant to be a team member who is ready to start working as soon as possible. Practically, however, even the most experienced developers need time to get used to their job, to say nothing of students or freshers. Therefore, in case you are recruiting students, you’ve got the following options:
- Wait until the students become graduates and get better prepared for work.
- Employ students providing them an opportunity to successfully complete their studies.
- Employ students without taking their educational activities into account.
We are mostly sticking to the second option, and here is why.
First, you may want to win the right candidates right at the university. Actually, you would hardly ever find a talented and yet undervalued student who did not manage to find a job during their studies.
Second, even the most talented students become interns first. They have yet to compare the knowledge they got and the real work.
Third, many students cannot understand at once what they want to do after graduation. It is very important to connect with such students as soon as possible, and, preferably, you should be the first to do so. The first work experience largely determines the entire career of an IT specialist (see baby duck syndrome for details).
Students rarely choose either path, whether to study or to become a trainee, deliberately. Most of them want to get both a diploma and a job offer. Of course, there are cases when you have to choose only one option, but in fact, most interns manage to combine work and study over a few years. This is a good choice and I try to mentor students while having further employment in mind.
With 11+ years’ experience in teaching, I’ve got people whom I helped get ready for their exams and who are now working in large companies. Sometimes, I come across my former students at hackathons and academic competitions and think like ‘here is a student who met expectations and it would be nice to see how their experience can help in the project I am working on now.’ Of course, this is a long-term and vague way in terms of results, but the game is worth the candle.
Overall, here are three main stages our student mentoring may break out into:
- Communication at a university. In order to engage the most promising students, we promote online and offline communication at a university instead of just advertising our blog or social media pages. It includes lectures, seminars, and taking part in university events.
- Apprenticeship. This is mandatory while studying at a university, with a goal to sharpen their theoretical knowledge. Each student must find an option for apprenticeship, which means there is always a demand. The businesses, however, wants to engage the most talented and motivated people, and to do so, we have to work hard at stage 1.
- Becoming a trainee. This is not a mandatory part, which we offer only to those who performed well at stage 2. This basically means that we onboard the student and offer them an employment contract.
Cooperating with universities
Finding and engaging the best students basically involves the following steps:
- Taking part in university hackathons, academic competitions, and graduation theses as experts.
- Lecturing at universities.
- Providing open classes and seminars at universities.
- Providing apprenticeships.
The ultimate goals of a university and a business may be different. Despite this, both parties may regard this as a win-win opportunity.
Some people tend to assume that a university should fully prepare students for work. This is not perfectly true, though. As an Android developer, I am pretty sure the techs are going to change quite a bit before today’s freshers finish their courses. Moreover, even though you teach students the most trendy technologies, this does not guarantee those will be in demand in the next five years, as it is impossible to determine which requirements will be essential in four years. You don’t quite need to determine that, though.
At a university, a student should be taught some basic things like C++, the principles of assembly and compilation, the methods of organizing memory at the hardware level, etc. Of course, you won’t find these on the list of requirements for an Android candidate. Probably, you won’t even find these in 98% of other job openings. The university provides the theory basis that allows, say, to see the leaky abstractions by Joel Spolsky.
The requirements a student will find when browsing job openings are constantly changing. Every year, new technologies, frameworks, versions of programming languages, and other things are emerging. The developers are constantly learning, with a broad basic technical profile being much more important than knowledge of trendy frameworks. It is much easier to independently study the platform’s API and framework documentation than catch up when it comes to atomic and bitwise operations.
As for business software development, there is one thing: no matter how complete the requirements are, you still have to learn. Overall, self-education matters the most. Nearly all necessary knowledge is accessible in a few clicks, and it is vital to actually find and use this knowledge.
The necessary theory basis the university provides, however, must still be feasible in real life. Whether or not this is going as planned, may only be seen while having hands-on experience on a production project. This is why, before any mentorship, we help the university with expertise and activities, keeping in mind the business edge.
The core issue of many student projects is not technical limitation (this is a common issue for many a production project as well), but mostly general lack of understanding of why and for whom the item is intended. It is always hard for students to learn frameworks, development workflows, and other everyday stuff of software development. It is difficult do digest such information without practice. We are working hard to help students understand these processes by explaining where using a framework could help save precious hackathon time or conducting game sessions while analysing roles in the development team and workflows.
Last year, I lectured a course on software development tools and technologies for the final year students of the Software Development Department at the Southern Federal University. To give some examples, I always try to discuss the most real-life issues, such as those I have to personally deal with. Six months later, a few students started working in our company as trainees, and as they were knowledgeable enough in terms of workflows, it was quite easy for me to organize the mentorship process.
At the same time, overdoing is out of the question as well, as a student project may be not well planned and rather clumsy. It is much more important to show how the basic requirements to project and code get formed, i.e. why it is important to understand end user needs, how to make the system flexible and scalable, how to take legal details into account when working with data, etc.
Overall, investing into communication with universities is one of the most controversial points for business in terms of the results. Many things depend on whether the faculty and the university managers are much involved in, and how the uni’s bureaucracy is engaged. This is a long-term investment, the results of which can only be seen after many years. However, if your company is rather stable and you plan to recruit employees for many more years ahead, working with universities may come in quite handy.
There are many approaches to mentoring students, from ‘I will sign all your papers on your last day’ to ‘Here is a business feature in a production project, you’ve got two weeks, the clock is ticking’.
We, however, stick to an approach when a team of students is working on a project managed by an experienced employee.
There are meetings twice a week where we analyze the current progress or explain the necessary information, i.e. application architecture, platform or language features, and other similar issues.
There are no minimum hours a student is required to spend in office. Meetings are also optional, as one may study everything on their own, although it is complicated.
The time of internship varies and may be anything from two to ten weeks. There are special apprenticeships, however, which may last longer. Students may do what they must do, get the necessary documents, and get back to their studies, but in case they complete the special apprenticeship and show good results, we might offer them further internship.
There is also a way to skip an apprenticeship by already having a good project, portfolio, or some experience in another company; in this case, we can just deem the student to have completed the apprenticeship.
There is also some additional motivation to get mentored, as a student may add a new project to their portfolio and get personal recommendations from mentors upon completion. We do not issue diplomas or certificates, however, but only consider real results of work and personal feedback.
I personally assume that a student is ready to become a trainee in case they are ready to learn quickly and proficiently. One way or another, internship means integrating into production projects and company workflows. You just need to be a quick learner, and if you are, you may quickly get on board.
Becoming a trainee
Once a student has done well, we may offer them to become a trainee. This means that the student will be learning the necessary processes and technologies to do real production tasks. A newbie developer must get proper knowledge and understanding of the code, as well as a good notion of the libraries.
You should not drive junior devs to critically important production projects straight away, though, and here is why:
- First and foremost, there should be some room to make mistakes, which are an integral part of a beginner developer career. There must be an option to start everything all over again.
- Getting involved into the workflows is a multi-staged process. It is hard to understand all the development features at once. Being a trainee means getting stagedly engaged into the process.
- Any developer must understand an issue deeply. Sometimes, you just cannot explain everything to a newbie when they are working on a production project.
- Students do have exams, and you’d better not prevent them from taking those. When it comes to real projects, this may be an issue.
Being stressed while a trainee
Trainees or interns may often get stressed, as they have to both study and work. You, as an employer, may both help them and become a hindrance to them.
Here are some tips you might want to follow when supporting a student:
- Assistant them in writing their graduation thesis. We do help them choose the topic, and the internship they do should ideally assist them in writing their thesis.
- Give them the free schedule to chose. It is not that convenient for mentors but pushing a student into an impossible time frame is perhaps the worst decision possible.
- Let them take their exams. Internship is primarily an educational process, so do not get them involved into production development that much. If they need to take those exams, stay aside.
- Get them scaled in without speeding up too much. If you do have a minimum requirement of hours per week, let them set the max themselves. If they are ready, go on; if not, do not be pushy.
Is internship paid?
In most cases, internships are paid. An internship is a process of preparing an employee for work, i.e. training, getting to know a company and a team, etc. Of course, your main goal is having an employee ready to complete production tasks.
Our interns get all paid based on their hourly rate. Even though an employee being mentored is not involved into production projects at the very start, the work process is still tracked with code review, teamwork, and manager supervision, so the things are serious.
In my opinion, when an intern does not get paid, this means the employer does not take them seriously or simply exploit them. If a company needs a good employee, they should get paid in any case.
What is a successful internship?
First and foremost, the employee must get fully involved into the company’s workflow. Fortunately, students get on board a new company in most cases.
The second point, which is no less important, is the ability to quickly learn. A junior developer should independently find, study, and apply a certain technology, as the developer’s job is directly related to this. When a junior dev becomes a middle, they already should learn to filter the necessary information on their own; at junior level, however, being able to search is enough.
Third, any successful junior developer should be able to independently review their own code. No code can be perfect, and even a good code has to be rewritten multiple times. Self-criticism is essential for further growth.
Finally, a successful intern must be ready to work on a production project, especially when it comes to deadlines. This does not only include having enough time to work, but also to take part in scheduled calls and meetings.
As for the final testing, this is very much widespread in many companies, I personally dislike tests that check the knowledge of programming languages. There are people who literally learned by heart the most popular questions about development, but, unluckily, this has practically nothing to do with real programming skills.
Finally, once we see everything is in line with our requirements, we can offer an intern a full-time position.
What is next?
Once everything is all set, the new employee will get a production project and face the harsh everyday life of a software developer. This includes, for instance, the fact that the code is not always written according to the rules, the workarounds are sometimes okay, and refactoring is an important yet not always feasible thing. Overall, they go on studying: as I see it, this is the best about software development.
The former student will also take part in reviewing other developers’ code. I find it extremely important to involve specialists of various levels into such reviews as, in this case, it is easier to find some simple errors an experienced developer would often miss, while also allowing the development team to professionally grow. Besides, a junior developer also needs to understand someone else’s code, and it is better to start doing this at the code review stage.
As I see it, the key and decisive factor of a successful internship is the motivation and of an intern and their ability to get the tasks done. As a mentor, I should support this motivation and ensure that the tasks assigned to my intern are completed on time.
In order to make it all happen, it is very important to understand what each party wants to get and how to achieve these results at the planning stage. As for the technical details, they get almost always changed during the internship.
In April 2020, we had to completely switch our internship to the online mode, which brought a lot of issues from providing tech equipment to signing internship contracts.
Nevertheless, a number of students fulfilled their academic commitments and explored the new world of business software development. One of those became our intern.