Farei questo:
Percorso A: il metodo semi-tipico
Impara una lingua con una sintassi più regolarizzata come Java, C # o Python. Perl è uno strumento follemente utile ma è anche molto molto libero in termini di come ti consente di fare le cose. Le altre lingue che ho elencato sono molto, molto meno.
Ottieni un libro su Strutture di dati in tale lingua.
Ottieni un libro sugli algoritmi in questa lingua.
Ottieni codice Java / C # completo ed efficace / Qualunque sia la versione di Python.
Path B: Path of Enlightenment di Joel Spolsky (o Death, scegli tu)
Ottieni il libro "Codice"
Ottieni "The C Programming Language" di K&R
Ottieni la struttura e l'interpretazione della programmazione per computer
Per quanto riguarda il metodo, il metodo 1 ti insegnerà a programmare in modo più regolare. In una certa misura i concetti di informatica (nessuna teoria della complessità ancora, fidati di me) e ti offrono un linguaggio migliore per lavorare in progetti con altre persone e per fare applicazioni più grandi.
Il metodo 2 è più hardcore, è molto più di un approccio di base con "Codice" che spiega le basi, K&R introduce le cose a livello di macchina e la SICP introduce i concetti di livello superiore. È un percorso molto più difficile ma più mirato.
In entrambi i casi, concediti del tempo. Roma non è stata costruita in un giorno e nemmeno le capacità di programmazione, anche se sei un genio. La programmazione di Peter Norvig in 10 anni è il solito saggio a cui indico le persone.
Addendum:
Per quanto riguarda le cose gratuite disponibili: Python the Hard Way come elencato di seguito è un buon inizio, da lì, Come pensare come uno scienziato informatico è una continuazione ragionevole.
Ci sono un certo numero di risorse su Algorithms là fuori e onestamente probabilmente potresti cambiare i passaggi 3 e 4 senza problemi. Tieni presente che è qui che la matematica inizia davvero ad apparire, quindi non aver mai paura di chiedere aiuto quando arrivi a questo stadio. Questa sembra essere una guida gratuita ragionevole .
In realtà non esiste un equivalente libero coesivo di Code Complete per dire se Code come un Pythonista sembra piuttosto solido. La cosa importante è concentrarsi sul rendere leggibile il codice una volta che i fondamenti sono stati eliminati. Non è "necessario" nello stesso modo in cui è corretta tutta la sintassi del codice, ma rende la vita molto più semplice una volta che si va oltre i piccoli programmi o si lavora su qualcosa per un lungo periodo.
Potresti scoprire che mi sono concentrato principalmente su Python, perché è il più semplice dei tre per trovare materiale gratuito ben scritto. Penso che i tutorial Java di Oracle vadano bene, ma sono un po 'secchi e non ideali per i principianti. C # si trova in una situazione simile, sebbene nessuno dei due soffra della mancanza di documentazione.
Inoltre, il tuo primo scherzo / gioco di parole CS: vuoi "rifattorizzare" la tua istruzione, non Backtrack.