Wednesday, February 10, 2016

Some rules to be a great software developer

This is one of these days I'm in the mood to talk more than just about Ruby, Rails or any other specific language or framework. Maybe it is because I spent part of the night awake. Maybe it is because my kidneys are hurting. I don't know, but the fact is that I am a bit philosophical this morning.

What does it take to make one a great software developer?

I don't really know the complete answer, of course. If I knew I would be a great software developer, and I am far from this. But I've been programming computers in the last 31 years and I believe I learned something about this, more by observing others than by watching myself.

Then, here are some of my rules to detect a great software developer. If you fit on them, or consciously try to follow them, you'll certainly turn out to be a great developer. But this is not an easy path, I tell you. I know because I've been trying to follow my own rules in the last 31 years.

1) You have to love solving problems 

There is an old joke about Augustin-Louis Cauchy, a French mathematician and also a Roman Catholic like me. He attended the mass and his priest preached about how Heaven would be. According to the priest, in Heaven all your deepest needs would be satisfied. When the mass was over, Cauchy went to talk to the priest privately and asked him how the priest thought Heaven would be for him, Cauchy. The priest said: "Well, since you are a man who solve mathematical problems and enjoy doing this, I believe that in Heaven all math problems would be pretty clear and easy for you to solve". Then Cauchy said to the priest: "Forgive me, father, but I'll leave the church now and commit a deadly sin". "But why?", asked the priest, surprised. And he said: "If Heaven is like this, I prefer going to Hell. There they will give me lots of pretty difficult math problems to solve!".

If you intend to be a great software developer, then you must be at least a bit like Cauchy. Because this is software development. People are going to bring you problems all the time and you... or you'll love solving them, or you'll go crazy after a few years, or you'll move to another profession. A colleague of mine used to say she detested all the problems people would give her on a daily basis. She gave up programming and she is now a great lawyer. On the other hand, I had a friend here in Brazil who used to come to my working place every morning and we gamble, usually with dice. The winner could pick the hardest task of the day.

2) You have to love studying and learning

I started programming computers when I was in graduation still. At that time I was sixteen and now I am forty eight years old. During all this time not a single day passed without hearing about something new in this field.

Being a software developer is not like being an accountant, a field where the last great technical advance, the "Double Entry Book System" was first described by Luca Pacioli in 1494! (know more)

In software development the last technical advance was created now... sorry, now... no... now!

Things are  happening all the time and if you don't like to study and learn new things, soon you'll be completely out of date and, worse of all, out of the market. I know exactly how it is, because I've been into software development since 1985 and I'm the guy still standing, when most of my colleagues left this field for others just because they refused to continue studying long after graduation, post-graduation and so on.

Just to keep going, to continue making a living of programming computers, I have to study at least one hour a day. Most of the days it is a bit more. No, a lot more. And I'm not among the top ten. Not even among the hundred ten. Hell... not even among the first thousand! If you want to be in these lists, you'll have to do much more, believe me. 

3) You may NOT believe it is all about programming languages

Most people believe that learning deeply a programming language is the path to be a great software developer. It is not!

Software development is all about logic applied to solving problems. Programming languages are only the tools you use to express your logic. So, don't delude yourself. You may be a complete encyclopedia about a certain programming language and still be a mediocre programmer. On the other hand, if you are a great programmer, you'll write good solutions even using no specific language at all. Great programmers will draft great code on a napkin, using pseudo-code, or natural language, the same way a great composer would write a symphony with the same material.

4) You must not limit yourself to one programming language

You must definitely learn more than one programming language. It sounds strange, because I just said programming languages were not that important.

No, I haven't said that!

I said that logic and solution are not dependent off a certain programming language. But I also said that programming languages are tools to express your logic and your solutions. Then, if you know many programming languages you be able to express your ideas in a greater number of ways. And considering that certain programming languages are better than others to certain kinds of problems, the more programming languages you know, the more you'll be able to solve problems!

One of ways to recognize a mediocre programmer is when you see a fixation, an obsession, by a certain programming language. Those who say (*) [replace the * with Java, Ruby, Perl, PHP, Pascal... anything you like] is the best programming language ever and that one does not need to learn anything but it are NOT great programmers.

First of all, when someone says that a certain language is the best one, I always ask "For what?"... Because there is no such thing as a better language if you don't consider the kind of problem you are working on. Even if someone loves good old COBOL, this person will have to accept the idea that COBOL wasn't written to write device drivers. On the other hand, if you are performing the old art of "number crunching", COBOL works very fine, indeed.

But in order to choose the best language to write a solution to a certain problem one is supposed to know many languages. As people say, if all you have is a hammer, all things will look like nails. So, don't have a single tool if you want to be a great software developer.

5) Specialize in something

Here I'm using the advice a former teacher gave me about 37 years ago: "Learn a bit of everything, but choose something for you to really master".

Old José de Arimateia, a former math teacher of mine when I was eleven (yes, this old man here was eleven someday, long time ago...), didn't even knew at that time how important this piece of advice was going to be to me. In fact, I used it most of my  life and, in spite of the fact I don't even know if he is still alive after all these years, I frequently remember him saying so and thank him mentally for the advice.

You'll hardly find a generalist in the list of great software developers. And, in fact, you may replace "software developer" by mathematician, physician, lawyer... anything you like, in the last sentence. You'll hardly find a generalist in the list of the greats in ANY field, exception made to people like Leonardo da Vinci and Pythagoras. But may you tell another names like them in all human history? No? Then it is not safe to place all your bets in being a generalist.

As time passes, science and technology grow in larger and larger proportions. Nowadays it is almost impossible to anyone to be great in two different fields of study, like being a great musician and mathematician at the same time. Same happens in software development, a field in constant growth.

Then, if you want to be among the top ten of all times in software development (and all of us dreamed about this once or twice, specially when we were young...), find a niche, find something to be the very best on it. And work hard! Being the best is not just a matter of will, even if the "self help" authors keep repeating this all the time. Being the best is a matter of great efforts and sacrifice. Read the bios of the greats in any field and you'll see how some of them sacrificed even their families and personal lives to reach that position.

6) Remain single

I'm Brazilian and Portuguese is my native language. So, English is a language I started studying when I was ten years old. But I'm not telling this just to beg for your forgiveness to my mistakes in writing. I'm telling this to explain my fascination with an English word: bachelor.

This word is used to talk about an academical degree, as in "He is a Bachelor in Fine Arts" or "She is a Bachelor in Computer Science". But bachelor also means single, not married. And this is not a mere coincidence.

It is very difficult to study hard when you have a family, a wife or husband and kids. Very difficult indeed. I think about this everyday, when I stay awake after hours, when my wife and my son are both sleeping, drinking cup after cup of coffee, to study a new programming language, a new technology or finishing a freelancer job to make some extra money.

It happens that software development is made of study, as I said above (2). Then, if your goal is really to be  the "king of the hill, top of the heap", as old Frank Sinatra would say, you'll have to dedicate long hours of your time to study. And believe me, it is difficult to do so with a family.

So, the same way my advice to the married ones is "keep married" (I'm a Roman Catholic and against divorce), my advice to the single ones is "remain single".

7) There is always a better solution

Accept this fact. You may always find a better solution than the one you already found. So, do not delude yourself. This clean, elegant and correct solution you just found to a certain problem is not the best one. If you try harder, you may do something even better. And other people will surely find something better.

So, don't be so proud of your code. Remember the "Rule of the Six Months". According to this rule, if you look at your own code six months after having written it, you'll not even believe you were capable of writing such a crap!

This is not an exhaustive set or rules, of course. But they will surely help you when it comes to being a great software developer. Any other tule you can remember? Please, post it as a comment here.