• Home
  • Perchè dovrei leggere DevBlog?
  • Forum
DevBlog

Imparare a programmare in 10 anni, i consigli di Peter Norvig

9 giugno 2012 22:40 / 1 Commento / Mattia

Pubblico di seguito un articolo “insolito”, nel senso che è scritto in inglese ed è opera di Peter Norvig. Link e risorse interessanti mi capita spesso di segnalarle tramite il profilo Twitter, ma in questo caso ho preferito inserirlo sul DevBlog per dare la possibilità ai lettori di commentarlo e quindi aprire un gruppo di dibattito.

Nel suo articolo Peter Norvig sottolinea alcuni aspetti legati ai metodi di apprendimento delle tecniche di programmazione (in qualsiasi linguaggio). Come dovrebbe comportarsi un programmatore (aspirante o “navigato” che sia) per migliorare le sue conoscenze, guidare con successo i progetti ed essere in grado di affrontare qualsiasi sfida di programmazione?

Peter riassume 3 punti fondamentali:

- diffidare dai libri che spiegano “come imparare il C++ in 3 giorni”

- non mollare! Il ciclo di apprendimento medio duro 10’000 ore

- Divertiti, collabora, impara, leggi

Ma non perderlo… Leggi di seguito!

Teach Yourself Programming in Ten Years

ProgrammatoreLet’s analyze what a title like Learn C++ in Three Days could mean:

  • Learn: In 3 days you won’t have time to write several significant programs, and learn from your successes and failures with them. You won’t have time to work with an experienced programmer and understand what it is like to live in a C++ environment. In short, you won’t have time to learn much. So the book can only be talking about a superficial familiarity, not a deep understanding. As Alexander Pope said, a little learning is a dangerous thing.
  • C++: In 3 days you might be able to learn some of the syntax of C++ (if you already know another language), but you couldn’t learn much about how to use the language. In short, if you were, say, a Basic programmer, you could learn to write programs in the style of Basic using C++ syntax, but you couldn’t learn what C++ is actually good (and bad) for. So what’s the point? Alan Perlis once said: “A language that doesn’t affect the way you think about programming, is not worth knowing”. One possible point is that you have to learn a tiny bit of C++ (or more likely, something like JavaScript or Flash’s Flex) because you need to interface with an existing tool to accomplish a specific task. But then you’re not learning how to program; you’re learning to accomplish that task.
  • in Three Days: Unfortunately, this is not enough, as the next section shows.

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. 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. Malcolm Gladwell reports that a study of students at the Berlin Academy of Music compared the top, middle, and bottom third of the class and asked them how much they had practiced:

Everyone, from all three groups, started playing at roughly the same time – around the age of five. In those first few years, everyone practised roughly the same amount – about two or three hours a week. But around the age of eight real differences started to emerge. The students who would end up as the best in their class began to practise more than everyone else: six hours a week by age nine, eight by age 12, 16 a week by age 14, and up and up, until by the age of 20 they were practising well over 30 hours a week. By the age of 20, the elite performers had all totalled 10,000 hours of practice over the course of their lives. The merely good students had totalled, by contrast, 8,000 hours, and the future music teachers just over 4,000 hours.

So it may be that 10,000 hours, not 10 years, is the magic number. (Henri Cartier-Bresson (1908-2004) said “Your first 10,000 photographs are your worst,” but he shot more than one an hour.) Samuel Johnson (1709-1784) thought it took even longer: “Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.” And Chaucer (1340-1400) complained “the lyf so short, the craft so long to lerne.” Hippocrates (c. 400BC) is known for the excerpt “ars longa, vita brevis”, which is part of the longer quotation “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.” Although in Latin, ars can mean either art or craft, in the original Greek the word “techne” can only mean “skill”, not “art”.

So You Want to be a Programmer

Here’s my recipe for programming success:

  • Get interested in programming, and do some because it is fun. Make sure that it keeps being enough fun so that you will be willing to put in your ten years/10,000 hours.
  • Program. The best kind of learning is learning by doing. To put it more technically, “the maximal level of performance for individuals in a given domain is not attained automatically as a function of extended experience, but the level of performance can be increased even by highly experienced individuals as a result of deliberate efforts to improve.” (p. 366) and “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.” (p. 20-21) The book Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life is an interesting reference for this viewpoint.
  • Talk with other programmers; read other programs. This is more important than any book or training course.
  • If you want, put in four years at a college (or more at a graduate school). This will give you access to some jobs that require credentials, and it will give you a deeper understanding of the field, but if you don’t enjoy school, you can (with some dedication) get similar experience on your own or on the job. In any case, 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” says Eric Raymond, author of The New Hacker’s Dictionary. One of the best programmers I ever hired had only a High School degree; he’s produced a lot of great software, has his own news group, and made enough in stock options to buy his own nightclub.
  • Work on projects with other programmers. 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).
  • Work on projects after other programmers. Understand a program written by someone else. See what it takes to understand and fix it when the original programmers are not around. Think about how to design your programs to make it easier for those who will maintain them after you.
  • Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal).
  • Remember that there is a “computer” in “computer science”. Know how long it takes your computer to execute an instruction, fetch a word from memory (with and without a cache miss), read consecutive words from disk, and seek to a new location on disk. (Answers here.)
  • Get involved in a language standardization effort. It could be the ANSI C++ committee, or it could be deciding if your local coding style will have 2 or 4 space indentation levels. Either way, you learn about what other people like in a language, how deeply they feel so, and perhaps even a little about why they feel so.
  • Have the good sense to get off the language standardization effort as quickly as possible.

With all that in mind, its questionable how far you can get just by book learning. Before my first child was born, I read all the How To books, and still felt like a clueless novice. 30 Months later, when my second child was due, did I go back to the books for a refresher? No. Instead, I relied on my personal experience, which turned out to be far more useful and reassuring to me than the thousands of pages written by experts.

Fred Brooks, in his essay No Silver Bullet identified a three-part plan for finding great software designers:

  1. Systematically identify top designers as early as possible.
  2. Assign a career mentor to be responsible for the development of the prospect and carefully keep a career file.
  3. Provide opportunities for growing designers to interact and stimulate each other.

This assumes that some people already have the qualities necessary for being a great designer; the job is to properly coax them along. Alan Perlis put it more succinctly: “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 finctional 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.”

So go ahead and buy that Java/Ruby/Javascript/PHP book; you’ll probably get some use out of it. But you won’t change your life, or your real overall expertise as a programmer in 24 hours, days, or even weeks. How about working hard to continually improve over 24 months? Well, now you’re starting to get somewhere…

Dunque…

La cosa fondamentale che ogni professionista dovrebbe coltivare nella propria personalità è l’entusiasmo e la voglia di confrontarsi (sempre, anche dopo anni di attività) con situazioni più grandi di quelle che, in quel determinato momento, può gestire.

Questa attività mette in gioco alcuni processi neurologici di rinforzo positivo, che consentono alla persone di affrontare con maggiore convizione, consapevolezza, coraggio ed autostima tutte le sfide che si presentano.

Un programmatore dovrebbe quindi:
- avere sempre entusiasmo per il proprio lavoro
- collaborare e condividere le conoscenze con altri “colleghi”
- affrontare progetti e situazioni, anche quando sembrano scomode e/o insuperabili
- mantenersi ottimisti dei cambiamenti, anche dopo tante “sconfitte”
- continuare a provare, a buttarsi in azione sul campo di battaglia

E tu cosa pensi?

Approfondimenti

Per approfondimenti, visitare la pagina originale di Peter Norvig al seguente indirizzo: http://norvig.com/21-days.html

Altri articoli che potresti trovare interessanti:

  • Video, organizzazione nei team di sviluppo
  • 4 Geeks: Facebook presentation
  • Il selettore di Google nelle pagine SERP
  • Video inchiesta sui database relazionali, pro e contro
  • Apple e Steve Jobs, un caso di personal branding
  • Da pazzi, la storia di HTML 5 section e article
  • Google Car: la macchina autoguidata
  • Web developers vs Web designers: Infographics
  • La canzone del programmatore e del committente
  • Programmatori Junior: benvenuti nel mondo reale!
Pubblicato in: Curiosità e Strumenti, Linguaggi e Tecnologie / Tag: Peter Norvig

Un commento a “Imparare a programmare in 10 anni, i consigli di Peter Norvig”

  1. alessandro on 27 settembre 2012 at 11:44 said:

    Interessante, soprattutto la parte sulle competenze “personali” … in effetti a volte si perde entusiasmo e voglia di imparare e si eseguono sempre le stesse azioni senza pensare che magari ci sono modi migliori. A questo proposito, sento che in smau ci sarà il lancio di un nuovo ambiente, Leonardo hlc. Non sono riuscito a trovare molte info, solo il sito “ufficiale” http://www.leonardo-hlc.it/, che mi sembra puro marketing. Pareri, opinioni, consigli? Grazie-.

    Reply↓

Lascia un Commento Annulla risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Post Navigation

← Previous Post
Next Post →

Autore

Ciao e Benvenuto sul mio blog!
Mi chiamo Mattia, vivo a Padova.

Sono uno sviluppatore appassionato di software e comunicazione digitale. Questo non è un diario personale, ma uno spazio dove raccolgo informazioni tecniche di programmazione, servizi e strumenti web per sviluppatori.

Articoli recenti

  • Pubblicare codice su WordPress, SyntaxHighlighter Evolved
  • Pubblicare Redmine su Heroku: guida completa
  • Da zero a Backbone.js in 30 minuti, visualizzare una collezione di dati
  • Posizionamento di un sito web nel 2012, quali novità?
  • Imparare a programmare in 10 anni, i consigli di Peter Norvig

Categorie

Tag

.htaccess accessibilità apache api Aruba blog browser business crossbrowser CSS3 dbms editor facebook fondamenti font form geolocalizzazione Google gratis html 5 introduzione jQuery linux Microsoft motori di ricerca newsletter online oop open source ottimizzazione posizionamento programmatore script SEO SERP server sito web software sorgenti tips twitter web 2.0 web designer wordpress xss

Commenti recenti

  • francesco su Creare un social network gratis come Facebook
  • Gian Luca su [PHP] Inviare dati POST senza un form HTML
  • Roberto su Validare form HTML con jQuery
  • claudiot su [C] Divisione per sottrazioni successive
  • gege su Come richiamare una funzione PHP tramite Javascript!

Archivi

  • maggio 2013
  • marzo 2013
  • novembre 2012
  • settembre 2012
  • giugno 2012
  • maggio 2012
  • febbraio 2012
  • dicembre 2011
  • novembre 2011
  • settembre 2011
  • agosto 2011
  • giugno 2011
  • aprile 2011
  • marzo 2011
  • febbraio 2011
  • dicembre 2010
  • novembre 2010
  • ottobre 2010
  • settembre 2010
  • agosto 2010
  • luglio 2010
  • giugno 2010
  • aprile 2010
  • marzo 2010
  • febbraio 2010
  • gennaio 2010
  • dicembre 2009
  • aprile 2009
  • marzo 2009
  • febbraio 2009
  • gennaio 2009
  • dicembre 2008
  • novembre 2008
  • ottobre 2008
  • settembre 2008
  • agosto 2008
  • luglio 2008
  • giugno 2008
  • marzo 2008
  • febbraio 2008

Meta

  • Collegati
  • Voce RSS
  • RSS dei commenti
  • WordPress.org
© Copyright 2013 - DevBlog
Infinity Theme by DesignCoral / WordPress