Ci sono molti approcci per imparare come programmare. Alcuni optano per ciò che viene attualmente utilizzato nel mercato. Preferisco suggerire un approccio che ti insegnerà come creare programmi strutturati, malleabili e comprensibili. Per questo, inizia con SICP (ottieni una versione usata per risparmiare qualche soldo). Ovviamente non avrai un lavoro di programmazione in Scheme o Lisp, ma non è questa l'intenzione alla base della mia raccomandazione. L'idea è di apprendere il processo di pensiero metodico che risolve i problemi e crea soluzioni componibili e manutenibili per loro.
Una volta che si lavora alla maggior parte del libro, ottenere un libro introduttivo su Python o Ruby. Lavora i concetti principali (procedure, strutture di controllo). Allo stesso tempo, cerca la "Teoria del programma strutturato" di Bohm e Jacobini e la programmazione strutturata di Jackson.
Si noti che non ho menzionato l'orientamento all'oggetto. Il fatto è che OO è eccellente per l'analisi e l'implementazione, ma difficile per la fase di progettazione. La programmazione procedurale, modulare e strutturata è più trattabile e, per essere onesti, è estremamente difficile imparare e utilizzare correttamente l'orientamento agli oggetti senza comprendere appieno i concetti di programmazione strutturata, procedurale e modulare.
Una volta che ottenere che fare, fare un tuffo in C (utilizzare il buon vecchio Kerninghan e Ritchie del libro C Programming Language.)
Una volta che si ottiene che a farsi, poi saltare in Java o C# al contenuto del vostro cuore. Quindi, leggere questo documento:
http://sdg.csail.mit.edu/pubs/2009/hoare-jsp-3-29-09.pdf
Come un mondo reale sviluppatore Java, mi troverei irragionevole suggerire chiunque è grave imparare a programmare per iniziare con Java o C#. Sono un ottimo strumento per il lavoro, ma non una grande lingua per l'insegnamento (a meno che la persona abbia già esperienza sostanziale o esposizione a programmazione procedurale e strutturata)
Anche se è fatto per il tempo libero, la programmazione è molto di più rispetto alla codifica con un linguaggio commercializzabile. Vuoi sviluppare lezioni e abitudini che ti aiuteranno a programmare in modo pulito ed efficiente in qualsiasi lingua. Vi consiglio caldamente di seguire lo schema che ho presentato qui. In bocca al lupo.
== EDIT - 2011-11-22 ==
Oltre alla carta seminale di Hoare cui sopra, vi consiglierei vivamente di ottenere Mitchel, McKim e Meyer di "Design by Contracts, by Example". In effetti, direi di leggere prima questo libro e poi leggere il documento di Hoare.
== EDIT - 2013/01/21 == Quando dico quanto segue:
Il fatto è che OO è eccellente per l'analisi e l'implementazione, ma difficile per la fase di progettazione.
Voglio dire che, per la non iniziati, la fase di progettazione è molto più difficile da capire e cogliere quando si utilizza OO OO e le tecnologie correlate. La fase di progettazione comprende gli elementi prescrittivi che mappano il "cosa" (dall'analisi) in un concreto "come" (l'implementazione) e l'implementazione si riduce in definitiva a elementi imperativi o funzionali.
Ovviamente, per non inizializzato, questo non viene mantenuto.
Apprezzo quello che stai dicendo, ma non credo che l'analogia regga. Ho tentato di fare proprio questo, con Ruby e Python. Finisco per rinunciare alla frustrazione perché non capisco cosa sta succedendo. Quello che trovo con HtDP è che, dal momento che sto capendo meglio i concetti, sto imparando di più. –
@Cena Hai guardato il libro "Dive Into Python"? – elviejo79