Becoming a top-ranked specialist requires work, patience and time not only from the junior himself but also from the company that provides the starting point for their career. The benefits of novices have already been described in the article “What does the work of an intern cost?” If you want to become valuable to your employer you should heed the advice of experienced and successful colleagues. Applicants, take note!
– When we post a vacancy we get a lot of replies, but only one candidate out of 25 is able to complete the test task. This means that nowhere near every person who wants to become a programmer goes on to be a professional. Do you think there is a certain predisposition required for work in this sphere?
Undoubtedly, not everyone has what it takes to be a good developer, or a good chef or plumber for that matter. If we are talking about specific character traits for coders, then the following ones are indispensable.
|Perseverance, patience and the ability to solve a task even if doesn't come together easily and off the cuff.
|A systematic approach and an engineer's mind set. I'm talking about a person's ability to rise above the problem, see it as a whole and then solve different tasks with a tactical approach. One must have an overall vision and not the vision of a bedbug which sees only the part of the wallpaper that's in front of it.
|Mathematical thinking and accuracy of wording. More often novices can't clearly express their thoughts in speech.
– Is the ability to accurately formulate your thoughts only necessary for communication or does it influence the quality of the code too?
A competent specialist must be able to communicate with the other participants of any process. A typical drawback that I have encountered is a lack of universal terminology within a team: it becomes difficult for colleagues to understand each other.
The task should be considered from the perspective of the client's needs or else the end result may not be satisfactory. If a task is not clearly formulated you should ask questions and find out additional information.
If a person wants to become not just a developer but a lead developer their communication skills, or lack thereof, will prove very important. But you won't go far if you don't have the basic skills necessary to solve algorithmic problems.
– It appears that professionalism has two constituent parts: personal qualities and technical knowledge. How would you recommend people develop both?
Let's keep the discussion to people with potential. A person may learn exclusively from somebody else, but it's impossible to get all the knowledge you need from books alone.
– Are you talking about acquiring experience under the guidance of a mentor?
Yes, in any activity you need a teacher who can transmit knowledge. And it's important to accept the need for teaching in good faith: “I need to learn a lot, I want to get to the top of my profession, but now I am at the beginning of my journey” and not “I already know everything”.
– That is, understanding your level and being humble?
That's right. Humility and understanding that you are not experienced yet and have to do what you are told, carrying out the instructions of a person you respect even if you don't think them right or logical. Consequently, in part you have to accept in good faith what you are told about writing code and communicating with clients. If you are ready to obtain knowledge from older colleagues then you will develop.
The ability to ask is very important. Many people get fixated on a problem and waste an incredible amount of time because they haven't asked a more experienced colleague. On the other hand you do need to find the right moment to ask questions and not distract your colleagues all the time. But there are some taciturn people who sit for a week without asking anything and, as a result, reinvent the wheel.
– Do you also require a certain level of experience to ask the right questions?
Yes, you need to understand that the problem you are solving is a normal one. This is why trainees need supervision.
Let's summarise with regard to personal qualities. As an apprentice you should be taking in knowledge, asking questions, following steps and learning from experience. For instance, when a project is delegated to you this knowledge may be acquired by looking at the code written before you: the way it is executed and which approaches have been applied. You can then replicate it by following the same methods. Some people start to write in their own style, inventing methods and ignoring what's in front of them. First you must look to how a professional does it.
– Can you develop your technical skills by taking courses and gaining certificates?
I think that it is useful. But I believe that it is more important to develop under your own steam. You must have the desire to code. At school and university you need to solve real problems at your level of expertise, try out various technologies in practice, and find your niche.
– How good a basic technical skillset does a university education give?
I can only speak from my own personal experience. A maths degree gives a good foundation and a structure for those whose minds are already inclined towards exact sciences.
But if a person doesn't study and experiment independently then it will be impossible to make progress on the basis of a university education alone. University provides the basic algorithmic foundations, but even after successfully passing your exams you won't suddenly become a qualified specialist.
To be ready for employment after graduation you have to write code during your studies, be interested, and experiment, or else any post-graduation training will be purely speculative. Technologies develop very quickly and the education system isn't equipped to adjust, apply new methods or introduce new subjects. The trends of five years ago are not in such wide use now, and the developmental tools of ten years ago are totally obsolete.
– But university teaches you how to study.
Undoubtedly. While you are at university you should study and learn to code at the same time.
– There are people who want to program but they lack the all-important engineering mind set. Should they look for an auxiliary role (project manager, tester) or simply pursue a narrow focus: if you can't create complex systems, perfect simple ones. What attracts a person to programming?
Everyone likes different things.
– And what attracted you?
Since I was a child I liked electrical engineering, soldering and circuits, but mainly in theory.
– Is that possible?
Yes, it is – I studied a series of DIY books. One in particular, The Radio Receiver and the Circuit Diagram of a Receiver, described the purpose of every section in a circuit, which parts were needed and how to assemble it. But I never got to try it out: I found myself working with difficult materials – solders and various parts. There were imperfections: you solder something a bit lopsidedly, or you fail to create a proper point of contact, which makes a bad connection that can then fall apart. In short, my handicraft efforts were far from successful, and to be honest I didn't solder anything of note. But the theory was interesting to me – everything is perfect in theory. For example, a magazine called Beginners' Engineering came with a circuit for a microcomputer. I wouldn't have been able to assemble it, but I studied the way the technical elements worked.
In school I discovered in programming what I lacked in electrical engineering: operations with precise material instruments – bits of information, that is. Ones and zeroes. You can solder a resistor well, badly or not solder it at all. With the processing of information it's quite different. After encountering real coding I saw that what man had created was not ideal. In large projects a human mind can't encompass everything and there are always lots of mistakes, but you can't compare it to soldering. There is some sort of ideal: the program does what you have coded it to do, and this all depends on the power of your mind and your ability to look at the situation from various angles. This is what attracted me.
– Which technologies would you recommend for beginners to study? Which are the most sought after?
Web technologies and everything related to network programs. Python/Django, .NET and Java position themselves as the behemoths: thorough, and with a very rich functionality. .NET is fast to develop, and there are many specialists and, correspondingly, many projects. There is a wide range of tasks in РНР, which is an open cross-platform language. 99% of hostings support websites in PHP. There might be only a few new tasks but there are enough projects to support older products.
– I have encountered a negative attitude towards PHP. It even appeared to me that some people equate projects on PHP with so-called “shitcode”.
In reality the disorganisation is in some people's heads and not in PHP.
– You mean that it's not PHP itself which is defective but the projects written in it?
Here's how it works. PHP is easy to master: it's not strictly specialised and has lots of modules, so everybody with the slightest interest in programming starts learning it, including shitcoders who don't have a systematic enough mind set. It's these people who produce the shitcode: this is where you insert a piece of code into any part of a page so that something will be displayed there, and this code begins to pile up without any systematic approach. PHP allows coders to do that and is abused by some people. Still, some serious websites are written in PHP, such as VK and Facebook (recognized as an extremist organization by the Russian government), although some of the code has probably been rewritten in Python. Only six years ago all major products apart from Microsoft were written in PHP.
– What can you say about Java?
I have mixed feelings about it. It's one of the oldest languages, and complex products were written on it in the 90s, including banking systems and Lotus Domino – an analogue of SharePoint used in government institutions. It's presented as a cross-platform language. Even when you install Java you will see a message saying that there are 9 billion devices in the world that can run Java. This is partly true since Java is an interpretive language. You write a code which can be run on various devices because there are interpreters. But there are certain rough edges.
– I read on SuperJob that Java developers have the highest salaries. Is that because they work mainly in banks?
Yes, probably. The age of Java is gradually coming to an end. There have been a lot of web applications with sections of Java code, including various banking clients. Part of the code is downloaded from a server within the browser but runs only on the computer. You can't access the interface from the browser – cross-platform Java is used for that. The problem is that modern browsers refuse to support Java – Chrome, for example. Newer technologies are appearing now.
– What are the most recent?
HTML5 and CSS3 – these technologies should be studied. You should learn to understand and be able to explain how a webpage works: what happens when you type something in a browser and press enter, and what kind of data exchange is happening with the server. In this way you can become an insightful specialist. You won't be able to progress further without understanding how to solve typical problems according to a template. You can spend your whole life doing the same thing, but I think people who are suited to becoming programmers want to do something new, to create. Sometimes you need to show initiative. Being half-robot is no good in this profession. Learn to offer solutions and develop the creative approach that forms the next constituent part of a programmer's personality.
Sometimes finding the solution to a problem is like writing a script for a play. One character says one thing, and then another character does something. It's the same in programming: we have components that interact and exchange messages.
– From a layman's point of view it is difficult to reconcile a creative approach with the image of a programmer as a boring nerd who does everything according to an algorithm.
A boring nerd isn't a programmer; a boring nerd is a boring nerd. Let's put it this way: the archetypal nerd has some qualities that are important to us, including perseverance and meticulousness, but our colleagues also need other qualities – namely the ones we have already discussed.