Rafael “Rafa” Viotti is the programmer with the highest eye for detail and quality I ever knew. This guy will spot an extra space in your code as quickly as he will point out an extra comma in a source comment. During the time I worked with Rafa, he significantly influenced my coding style, always encouraging me to strive for excellence in my code.
WLAD: Tell us a bit about what you do and what you work with.
RAFA: I work as a programmer, and am currently managing three custom web softwares for three different companies. I'm also working on a new web product we're gonna launch soon.
How to select programming candidates
WLAD: You are the leader of the development team, so you have to hire people and train them. I would like to know how you choose people. What must the candidate have? What features and skills do you consider the most?
RAFA: Our basic filter for hiring people at our company is to have a bachelor's degree in any computer science course from UFMG [Universidade Federal de Minas Gerais]. Or, they must be in the last few semesters there. So far we haven't demanded any specific knowledge. We know that if the candidate did most of the course at UFMG, he or she will not have a hard time learning whatever the challenge requires. So the basic thing is to have the UFMG computer science background. We know anyone from there will have a great learning ability.
WLAD: So you don't even interview people?
RAFA: We do interview. I interviewed a few candidates some time ago, but as of recently, I'm not doing it anymore. The last people who joined the company were interviewed by my partner, André. Although he is not a programmer, he has a good technical understanding and he can do it all by himself.
WLAD: So he considers "soft," non-programming skills?
RAFA: Other things also weigh in, but he mainly considers the technical skills. The most important thing for the candidate is to be a good programmer. He knows how to screen good programmers. He doesn't code, but he really understands a lot; I think he is at the limit of how technical you can be without coding. And he is a very experienced person; he runs other businesses. He is used to interviewing people; he interviews maybe 10, 20, 30 people per month for his other companies. So he has mastered the interviewing process. When a new person comes to talk to me in the office, I know he or she has already been hired.
WLAD: One of the main criteria for hiring is to be a student of UFMG. Do you think the university contributes to the programmer's formation?
RAFA: Yeah, definitely.
WLAD: In what ways does the university help the most in giving the student what is needed to become a professional programmer?
RAFA: Mainly by putting obstacles in the student’s way. Requiring that the student programs practical projects that are hard to do, and demanding good results from these projects. I think this is the main factor. Also the teachers; we have many teachers that know a lot and pass on a lot of knowledge. I don't think that the college professor should guide the student too much. The professor must point in the right direction, and let the student go alone. And I think at UFMG the professors do that a lot. Many people complain about that, but I think that's a good thing, not a deficiency. The student must learn how to learn. You only truly learn by yourself; no one can stick in anything into anyone else's head.
WLAD: I think software quality is a very important factor in software development. Which software quality factors are most observed in your company, and how do you control them? What processes are followed to ensure the code is going to be well written?
RAFA: Software quality is hard to define, but for me it relates to a well-organized code. It's code that was written with care, so it's easy to read and you can understand what goes down in each section of the code easily. It's a highly modular software. That's the main criteria for me: write it in a way you can read it later, and not just to solve the problem. There are two main techniques we use today; one is code review in pairs. At first I was the major reviewer of everyone's code in the company, but today our more senior programmers are already reviewing the code from interns and juniors. I think code review is very important, and ideally, a more experienced programmer should review the code of a less experienced programmer. And the second factor that affects the software quality a lot is having an automated test suite. That's important to assure the requirements are being met, and at least assure that whatever was working keeps on working later as the code evolves. And also, we take care to orient people well, keep an organized programming environment, and we sponsor a company culture which employees understand and work in its favour, not against it.
WLAD: What are the elements from your company culture you like the most?
RAFA: We have a culture that states, "A mission given is a mission accomplished," so if we pass on any kind of challenge or quest for any of our developers to solve, he or she must do it. We don't accept excuses like, "I can't," or "I don't know how," or "I don't understand." That's something well established already. Also, seriousness. Everybody in the team is very serious about their work; there are no jokes in the work environment.
WLAD: For people who are starting to program, what do you recommend in order to get qualified and become a good programmer? What can the person do to learn to be a very good programmer?
RAFA: Not considering an undergrad degree in computer science?
WLAD: You can also mention that.
RAFA: So, an undergrad computer science degree, at least, because a technical degree won't give you the same education. Well, actually an undergrad degree is quite enough. Besides that, to enjoy programming, and remember that you won't learn how to program well at the university. You’ve gotta get home and code, dedicate yourself to it, really like it. You'll have to sit down and practice programming; that's the best advice I can give. And practice in many fields of computer science – don't limit yourself to a single field. Of course, you can't be an expert in everything, but try to understand a little bit of everything, and specialize in little things that you find the most interesting.
WLAD: Regarding new technologies, how do you evaluate one? Do you start a test project, or just read about it?
RAFA: I read a lot of blogs. I don't read the mainstream technology portals and news, because in there you're most likely to get a point of view that might be, well, let's say, shaped to conform to specific interests. So I really like to read blogs and Stackoverflow. I read other programmer's testimonials, then I select a few technologies. Then I download it, install and test it. I read their manuals, even without implementing anything with it. I read it to see what it's like. Later on I test the best suitors in practice.
Music and Code
WLAD: Do you use music for coding? What is the effect of music on your work?
RAFA: Yeah, I do. Not always, but I listen to it with a certain regularity. I'd say that 30 percent of the time I'm at work, I'm listening to music, whereas in the other 70 percent I'm not. I don't think that music impairs the work; much the opposite. I think it can even help, because when you are working with programming, if you are focused, the music acts as an ambient sound that doesn't divert your attention. It can even help you not notice other unexpected noise in the environment. So I have nothing against it. Programming is a very introspective activity; you don't need to interact a lot.
WLAD: Do you think that it's important for the programmer to engage in research? For instance, pursuing a master's degree, or a PhD? Do you think this helps the guy to become a better professional, or do you think that it's better to remain "in the trenches," fixing problems for the industry?
RAFA: I believe that the market is better. Practical experience counts a lot, and the workplace can give you a better notion of real-world work pressure than the academic environment. And I also think working for a company is more motivating. But maybe I like that just because it was the path I followed. But getting a master's degree helps too. In four years of undergraduate studies, if the student started to work when he began his course, he won't leave as an experienced programmer. That's a fact. I'd say you need at least 10 years to really become an experienced programmer that has a differential. So if the guy decides to do a master's followed by a PhD, he will maybe be in contact with programming for seven to eight years, so he will end his studies with much more experience than someone who just had four years. If he doesn't do the master's, he can also do other things, such as personal projects. But like I said before, what I think makes the difference in programming is the practice. The professor isn't there to walk you through anything; he just needs to put you on the right path, and let you move on. Regardless if you are in the academic or workplace environment, it will take a good amount of time for you to familiarize yourself with everything, reach a good level and be very comfortable with programming. There are many different technologies and aspects you'll have to learn and familiarize yourself with, and they change a lot.
On Software Development Methodologies, IDEs, Good and Bad Practices
WLAD: Regarding software development methodologies and project organization, what do you think works for your company? How do you organize tasks, the long-term goals? Do you use anything like Scrum or XP?
RAFA: No, we don't strictly follow any programming methodology. We don't use traditional software engineering, and we also don't closely follow Scrum or Extreme Programming. We have our internal form of development that has a bit of everything.
WLAD: And how does it work?
WLAD: What is your favourite programming language? When you have a small hack to do, or sometimes a brief problem you have, what is your first go-to language, and why?
RAFA: My favourite programming language is Python, simply because I think it's the language with the highest legibility levels within the major languages in the market. And besides being extremely legible and clean, it's quite complete. Its default library and external libraries are very broad and cover almost everything you need to work with, and it's a general-purpose language. But I don’t always use Python. Sometimes, for small tasks, or things that must be done quickly, I’d rather do it in Shell Script, maybe using sed, or awk, or something simple. I use Python for larger things. When I have to do simple things like text output transforming, when the output of one program can only be in a given format, and you necessarily need it in another format, I just roll a little sed, maybe with some more shell scripting, maybe a little bash function. That even helps me to diversify, not focusing on a single language.
WLAD: What do you think about using programming IDEs like Eclipse or .Net? Do you think that they help?
RAFA: In some cases, I think using these things is compulsory. For instance, if you are developing for Android, it's really complicated not to use an IDE like Android Studio or Eclipse. If you develop for iOS, and don't use XCode, you'll have a much bigger workload. So in these cases it's compulsory. But, if you can avoid it, do it. I'm partial to programming using a text editor. This way, you develop no dependency on any hazardous IDE resources, for instance, the debugger. Using it, it's easy to get too comfortable and lazy, coding stuff that doesn't work, instead of focusing on doing code that will work, so you won't have to debug it. That subverts the objective of writing code, and I think that mechanically debugging code as you write won't make you a good programmer.
WLAD: Any other hints in this sense? Any other bad practices that coders must avoid?
RAFA: Mainly that one, not to rely too much on a debugger or on any other tool. If you can break free of that and use a text editor, that would be ideal.
WLAD: Any other bad practices?
RAFA: I think planning a bit before you set out to write code is good. Many developers are presented with a task and the first thing they want to do is get their hands in the code, and I don't think that's good. It's better to read first, then write a pseudocode, or maybe write a small text file detailing your strategy for implementation, or an execution logic you have just in your head. I think this is great. Going straight to coding would be a bad programming practice. I think people refer to it as "cowboy coding." Also, when you have to fix someone else's code, trying to address just the part where you think the problem is without carefully reading and understanding the whole might be dangerous. Specifically, going to the code without thinking beforehand is bad.
WLAD: Any last comments?
RAFA: I think not… just that programming is really good. I recommend coding to everyone! (laughs)