Drafted around mid 2016 :
http://higherorderfun.com/blog/2011/02/16/programming-is-art/ [ the word art has Latin roots meaning ‘skills’ / ‘technique’]
- Our discussion indicates that computer programming is by now both a science and an art, and that the two aspects nicely complement each other. […] We have seen that computer programming is an art, because it applies accumulated knowledge to the world, because it requires skill and ingenuity, and especially because it produces objects of beauty. A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better. Therefore we can be glad that people who lecture at computer conferences speak about the state of the Art. – Donal Knuth
- Writing good code does not come solely from studying books and lectures – like other forms of art, it requires practice. Books and lectures can teach you the theory and the technique, but not the art. To be a truly great programmer, you need years of painstaking practice, where you constantly challenge yourself into doing things you’re unfamiliar with – just like other forms of art. You can study music theory all you want, but without lots of practice, you’ll never be a great composer. Peter Norvig makes a compelling point that mastery of programming, like other arts, takes some ten years of practice.
- In my opinion, graduating in computer science can teach you many things – but nothing that you could have taught yourself with curiosity, love for the subject, and Google.
http://norvig.com/21-days.html (by Peter Norvig – Director of research at Google Inc.)
- Researchers (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, telegraph operation, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. Samuel Johnson (1709-1784) said “Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.”
- “Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, which in English renders as “Life is short, [the] craft long, opportunity fleeting, experiment treacherous, judgment difficult.” – Hippocrates. “The most effective learning requires a well-defined task with an appropriate difficulty level for the particular individual, informative feedback, and opportunities for repetition and corrections of errors.”
- The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes. Then repeat. And repeat again. There appear to be no real shortcuts: even Mozart, who was a musical prodigy at age 4, took 13 more years before he began to produce world-class music. In another genre, the Beatles seemed to burst onto the scene with a string of #1 hits and an appearance on the Ed Sullivan show in 1964. But they had been playing small clubs in Liverpool and Hamburg since 1957, and while they had mass appeal early on, their first great critical success, Sgt. Peppers, was released in 1967.
- Be the best programmer on some projects; be the worst on some others. When you’re the best, you get to test your abilities to lead a project, and to inspire others with your vision. When you’re the worst, you learn what the masters do, and you learn what they don’t like to do (because they make you do it for them).
- Book learning alone won’t be enough. “Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter”
- Alan Perlis – “Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers”. Perlis is saying that the greats have some internal quality that transcends their training. But where does the quality come from? Is it innate? Or do they develop it through diligence? As Auguste Gusteau (the fictional chef in Ratatouille) puts it, “anyone can cook, but only the fearless can be great.” I think of it more as willingness to devote a large portion of one’s life to deliberative practice. But maybe fearless is a way to summarize that. Or, as Gusteau’s critic, Anton Ego, says: “Not everyone can become a great artist, but a great artist can come from anywhere.”
- How about working hard to continually improve over 24 months?
- Programming is understanding a problem well enough to be able to explain it as simple as possible to a machine.
- Your job is to solve a problem with code in the most elegant way, such that your solution is easy to adapt, modify and reuse.
- Elegant code adopts aesthetics to achieve high maintainability / expressing ideas clearly and elegantly is important for code quality.
- Complex Problems Require Simple Solutions
- I’m not the smartest person programming. I stumble over highly stateful code. Math beyond simple arithmetic is pretty tough for me. But despite my mental shortcomings, I am actually a great programmer. When I look at code I write compared to average code in average projects, even code written by great engineers, I notice that my code is always simpler. My classes do less. My APIs are small and clear. I can’t actually grok classes that have too many responsibilities, so my classes always do one thing. I remove and remove from my APIs until they fit neatly in my brain. I could explain any class constellation I’ve devised to any competent programmer and they would not be overwhelmed.
- There’s this prevailing idea that complex problems call for complex solutions, or, worse, ugly problems call for ugly code. I remember the C++ code I saw at Microsoft, full of preprocessor macros, bit twiddling, and hand-rolled data structures, in desperate need of layers of abstraction. Programmers would tell themselves they were solving hard problems, maybe the code should be hard to read.
- The reality is just the opposite– the worse the problem, the more important it is to have simple solutions. Even if the nature of a problem is complex, there is a solution that divides the problem into subproblems of manageable complexity. There is an interface that can be put atop that complexity that lets the reader ignore that complexity in the average case.