Leonardo "Leo" Conegundes launched a startup with my high school friends, but I only met him during our computer science studies, when he was presenting his research on using Artificial Neural Networks for the stock market. From then on, every time I talk to Leo, he is always sharing new trends and technologies. When he talks about his startup, you can clearly see he dreams of a future where Brazilians participate more in the stock market. He is working very hard to see that this dream becomes a reality. Leo knows no fear when it comes to solving problems. For his academics studies, he worked on cracking the hardest types of problems in computing.
WLAD: Tell us a bit about your work and what you are currently doing.
LEO: Well, I'm a guy with an academic background in computer science. I did my bachelor's and master's in the computer science department at UFMG [Universidade Federal de Minas Gerais]. I’ve always had one foot in the university, and the other in the business world. In the business side, I was always involved in startups. In the academic side, after I finished my master's, I started to lecture classes. I was a professor at PUC [Pontifícia Universidade Católica], at UFMG and at Itaúna University. Since 2014, I'm a professor at CEFET [Centro Federal de Educação Tecnológica]. I'm a founding partner of a startup called SmarttBot, where I oversee the development of automated trading strategies for the stock market. Way back when we started we couldn't imagine the dimension it would reach. Throughout the six years I've been working with software for the stock market, we’ve had to face many challenges.
Computer Science Academia vs. Programming in Corporations
WLAD: You said you have one foot in academia and the other in business. What do you think is the bridge between these two worlds? Do you think academics prepare those who want to delve into the corporate world?
LEO: Not very well. I feel there’s a huge gap between the university and the corporate world. I try to unite these two worlds; there are others also trying to do that, but in general I see that the goal of people who are in academics is not this one. People from the business side often see computer science academics as purely theoretical people, unable to add value to their companies. I know that's not true, but I've seen many business people talk about academic researchers and teachers as people who would not bring immediate results in a teamwork endeavour, because they think they just daydream and fantasise a lot about things that would not lead to results in the corporate context.
No matter what, in every area, nobody leaves the university fully ready; it only gives you the basis. I graduated from UFMG, and one thing that I like from their teaching methodology (at least in computer science), is that you learn, a lot, on how to learn. If there's something I learned at the university, it was how to learn. You're never spoon-fed – you have to go after everything.
But I think there is a lacking; let me try to explain. What would be the dream companies a computer science student would want to work at when he finishes his studies? Maybe Google? Here in our city we have Google's research center. Or maybe the person would want to go to Microsoft, Facebook or other famous Internet companies. If the person likes hardware, or has a computer engineering degree, maybe Intel. In any case, these companies all adopt many well-established practices, which are like the ABCs for the professional programmer. A student will spend four to five years in the university, and in many cases he or she doesn't see any of that whatsoever. They don't even know it exists.
So a student who has completed his studies without any experience in the industry, who hasn't done any internships with a focus on development (internships are not even mandatory for graduating in computer science), this student will graduate without having any knowledge of the tools and technologies that are used by most professionals. Of course, the focus should not be on teaching the technologies and tools of the current trend. The things you can teach that will last through time are the foundations. But we’ve got to have something from current tools and technologies too. For me it's unthinkable to have a computer science curriculum that does not include mobile development, and we see that a lot. So even though this very important for businesses, we see many universities keeping their curricula unchanged for a long time. And when it changes, many times it does not include topics that are very important for programming in a professional environment, that everyone in IT should know about.
WLAD: What are the most critical things that a professional programmer should know, that are not taught in computer science courses?
LEO: I'll take UFMG as an example, since I studied there, and it's considered one of top, if not the best, computer science courses in Latin America. This course has the highest level of excellence in the Brazilian research bodies; it frequently comes out in first place in national exams comparing the students of different universities in the country. So even if UFMG is not the best in the country, it surely is among the best. And it's commonplace to see a student earning his degree there without having any knowledge of web development, at all. And that happens in the world we live today, in which everything is web-based and mobile-based.
When I graduated, the world was converging to the web already, and we didn't even have a shabby notion of web development in the course. It's very important that the programmers know the bare basics from the most important technologies. Talking about project management, when they teach software engineering, in general, everything they teach will only be applicable if you are going to work in a super large-scale, traditional enterprise that has been in the market for ages. But not even 10 percent of the people that graduate go work in these types of companies. So why don't they teach what the majority of companies are doing? Startups, for instance, use completely different software engineering techniques when compared to corporate giants. And not only startups, modern and Agile companies in general too. Take Google – do you think they use any of these IBM-based processes? I really see a lack of alignment between these two universes. When they go teach project management, why don't they present Agile methodologies that are popular today? This way the student would at least know that this exists.
Now, about programming languages. It's very common to graduate from computer science with a very shallow knowledge of programming languages. You learn in depth one, maybe two languages, and have shallow or no contact with others. Maybe if a student had had brief exposure to more languages, maybe during just one or two months in a few classes, that could already be fixed.
In my understanding, a person that graduates in computer science must constantly be learning by other means apart from the university, so that she has a knowledge that is broader. It's not that in order to be good at computer science you need to learn 100-plus programming languages. I believe that the person must know one very well, and be capable of getting along with others. But I think contact with a range of languages is important.
Can a computer science degree help getting hired?
WLAD: As a college professor and data-science hacker, you know for sure some things the university teaches that help, things that are important for the industry, for the companies. Which would be these things? And, do you recommend that someone wanting to be a professional programmer take on a university course?
LEO: I think having a theoretical basic understanding of how things happen in computing is fundamental. In our company we do many rounds of hiring. Each time, we get about 100 applications, and we pick about 10 for performing a programming quiz with us. From there, we can see that most people do not have the minimum care with the efficiency of their proposed code lines. If the candidate had a minimum understanding about algorithmic complexity analysis, he would never propose such code. So I consider it's very important to have a theoretical education in the university.
But the idea that a programmer can only be excellent if he or she has a university diploma is false. I know a lot of people that didn't enrol in any university course, 100 percent self-taught people, that can produce awesome code in a broad range of contexts.
Today we have a broad and easy access to massive online courses. I did a few myself. You can take those at home, or even on a mobile phone or tablet, and you have the possibility of learning with teachers and other students from around the world. If the person is able and likes to learn alone, I don't think having a university degree is mandatory. It depends much more on the person's profile: some people will get a lot from it, some will not. For some people the university will show them things they didn't even know existed. The university can provide contact with other people who also work in IT. For many, this might be the first contact with others working in the same field. The university brings people together, establishes connections, but it's not mandatory, not for everyone.
WLAD: You talked about the hiring process in your company a bit, so I'm going to ask, how hard is it to hire good people from the IT field?
LEO: It's really hard, especially for my type of company. In a startup you must have someone who has a lot of initiative. It can't be someone who will stick around waiting for instructions on what to do. It must be someone that will push himself and do things by himself. The technical capacity of the person must be very high, because you have a really reduced team; any one extra person joining has a very big impact on the whole. If you add an average person, it might actually drag the team down. I'm talking about a minuscule team like ours, with 12 people, where seven are developers.
If you get an average of the technical quality of these seven, and imagine that we suddenly have to hire 30 people… it's impossible to keep growing the team while at the same time keeping the same average team quality. There are going to be a few talents, but in general, the more people you have, the lower the average team quality you'll have too. It's hard. So in the beginning, the more you can increase this average, finding people that are better than you, and better than the ones you already brought, the better. But that's going to stop at some point, and you'll have to start bringing in people that are not as excellent. That's a reality that we are not facing today, because we have a very small team. So we've made a few selection processes where we didn't select anyone. We opened up a spot in the company, we did the whole process, but in the end we didn't feel anyone was going to add enough value.
WLAD: If you could write an anonymous letter for all those candidates from the processes where nobody was selected, what would you tell them to do so that they could get better, so they could bring that average to the team upwards? What would they have to do?
LEO: Chase after knowledge, whatever the way – in the university, working alone, working for free, working for open source. Get experience. Don't reach out to us 100 percent raw; show that you are able to take the initiative (again, speaking in the context of a startup company), and find a way to demonstrate that you can help the team. Because you're going to join a small team, and it has deficiencies in many areas. When you have a small team, even with a very high average technical skill, there will evidently be a lack of people to do specific things. So show that you can fill in these gaps. But the main thing is about learning. The candidate must learn, learn and learn, and also put whatever he is learning in practice. Someone who is chasing after a first internship maybe will have to accept something that might not be what was expected, but that will provide learning. So study, chase after opportunities where you'll get experience.
WLAD: Going deeper into that question, how would you recommend specifically that the person study?
LEO: If you are going to start college, pick one that has a high quality. And I also like the new learning opportunities on the web. Take online courses; read blogs from your interest areas. Many people have prejudice against learning with blogs, but undoubtedly today they represent a very rich source of information. For instance, not long ago I was a person that knew absolutely nothing, zero, about sales, and had to seek information and learn it. Much of my learning involved taking blogs from the Silicon Valley and reading something daily from them. Content on the web, online courses offered by Udacity, Coursera, Udemy, Khan Academy, blogs, and also formal teaching in the university. A few people even have the opportunity to learn in high school, by doing technical school. Also make sure you try the things you are learning in practice, so they are not learnt only in theory. And also never forget the importance of the theory, so that you put things in practice the correct way.
Software Development Methodologies
WLAD: In terms of software development processes, such as Agile methods, what do you use in your company, what do you think worked best for your team?
LEO: We use the classic Scrum. We use two online tools to help manage the Scrum processes, and we have today a policy of code versioning and code control, and paired programming, and also processes where one checks the code of the other. We don't do paired programming for everything, but some programming tasks, such as coding the stock market trading strategies, really benefit from it. A few clients ask us to implement specific strategies for our robots to execute on the stock market, and it's fundamental that the code is solid. And even if the code isn't handled by two programmers at the same time, it will pass through editing by at least two people, in our code review process. We have a very well-defined policy for commits and code management, that we customized for us.
WLAD: And how does that policy works? Tell us more!
LEO: We use Git for code versioning in all our applications; we have about 50 repositories, considering all of the company's software. Every repository has the branches "production", "staging", "testing" and "master". These four are mandatory for all repositories. We have a policy, I don't know if it's a best practice, but it worked very well for us. Any feature, bug, any code change doing something, that can be a single code commit, will be left in a single commit. So if you are going to do two things (even if they’re two small things), do one first, commit, then the other, and commit. Don't pack multiple things in your commits. And if more than one commit is needed for a task, a branch must be created for the task. And our process is: the branch that is created for the task is merged with master. The only thing that we do with the testing branch is to merge the master branch in it. The only thing that we do with the staging branch is to merge the testing branch in it, and the only thing we do in production is to merge the staging in it. So there is nothing besides merging the "previous" branch. The time it takes for something to reach the production branch varies. Sometimes it's very fast, the developer can advance the changes in the branches quickly, and sometimes not. That is something we took a long time to figure out and embrace as a company policy. It's something very simple, the things I'm telling you now, but for us to discover that this would work very well for us, that wasn't trivial. Maybe for simple lack of knowledge. At first, everyone would do things one way; nobody thought it would be better if we did in a standard way.
Programming Languages and Infrastructure
WLAD: What types of technologies and programming languages do you work with?
WLAD: MariaDB? Whoa, I’ve never heard of this!
LEO: It's a fork of MySQL. The "My" from MySQL comes from the name of the first daughter of the dude who created it. And Maria is the name of his younger daughter.
WLAD: Unbelievable! This curiosity is gonna be a great part of the interview. I thought it came from the idea that the SQL was "mine".
LEO: Yeah, everybody did. And Maria is fork that is getting much better. Google is migrating a few things to it. Let's see… we also use a few tools for monitoring, but we managed to build something in which we have control over everything. If there is a bleed in the technology, it was put there by us. So in terms of infrastructure, we don't rely too much on other people's code.
WLAD: Do you think the programmer should learn about infrastructure? Considering a guy who wants to focus his career on development…
LEO: I think it's important to know the basics, but you don't need to become the infrastructure hero. In our company, an expert in devops was needed. And we also had to have someone who was very good with networks. We needed not generic knowledge on computer networks; we needed to operate complex communication protocols under VPN, side-to-side with stock market servers, efficiently.
WLAD: Any last thoughts for our readers?
LEO: Sure, let me again emphasize the importance of chasing after the knowledge. There are plenty of high-quality resources for the person to learn by himself on the Internet. Sometimes the biggest difficulty becomes to filter what is good from what is worthless. Either way, it's easy to find; that is very good.