Anyone can cook...

May 16, 2015

In the movie "Ratatouille", Chef Gusteau used to say that "Anyone can cook.", and we can extend it a bit, so arguably "Anyone can code"; and it had never been more certain than in the present times, for now even kids can code by just dragging and dropping some funny and colorful "blocks", as in the case of the Lego Mindstorms robot. The truth is that nowadays it is quite easy to learn anything, including how to code, which of course is a great power, but as uncle Ben used to say "With great power comes great responsibility". So, what could this responsibility be?

Before answering the previous question, I'd like to introduce one more, which will provide the grounds to determine what is that great responsibility that the ability to code implies: Is it enough to know how to give some instructions to a computer so it can satisfy our desires (or at least those that can be computable)?, and the answer is (drum roll here)... No!!!. Of course it is not enough, amongst other things, first we have to understand the problem itself (requirements, design, model), we have to know whether the problem we are trying to solve by coding is computable (can be solved by a computer program) or not, we have to know what is the best way (fastest, cheapest, reliable, optimal) to implement the specific solution, we have to prove that our program is correct (test, verify), we have to ensure our program will run under the desired conditions (scalability, performance), and in general, besides knowing how to write code, we have to know how to write good code, and to achieve such goal, we have to be able to understand how code works.

Because knowing how to code it's not enough, we have Computer Scientists and Software Engineers. The former, usually logicians and mathematicians, understand and develop the foundations of programs and computability, they design and implement programming languages, compilers, data structures, algorithms, formal models, logical systems, and in general the core of computation. The latter possess the technical and practical knowledge to implement big real-world systems, they are in charge of understanding requirements properly, so they can design architectures, and models which will guide the code to be written, they will also define which tests must be done to ensure that a program works properly. As a general view, Software Engineers use knowledge and tools developed by Computer Scientists in order to create good programs. It is worth saying what this simple categorization is not strict, and that there are other areas and activities involved, but for the purposes of this article, it is enough to stick with this general overview.

So, what happens with programmers? Well... programmers in general can write code, they can even copy-paste code, they don't really need to understand it; but good programmers must have knowledge from both: computer science and software engineering, and having knowledge does not mean to hold a degree in such areas, after all we have good programmers with no specialized degrees (designers and psychologists). The degree does not really matter, but knowledge does, and anyone, with enough passion, can get knowledge on Computer Science, Software Engineering, and Programming, therefore, anyone with passion can become a good programmer (ability is a plus).

In Ratatouille, Anton Ego stated that "Not everyone can become a great artist; but a great artist can come from anywhere"; I would say: not everyone can become a good programmer, but a good programmer can come from anywhere. Being able to code means that you have the power to create, and such power implies the great responsibility of learning and understanding; so I'd suggest that before writing your first "Hello World" program, you get some understanding about how a computer works, how to design and develop algorithms, and what the best programming practices are; and then, you can go and write some code, being a good programmer from the beginning.