Dovrei perseguire l’informatica se non sono bravo in matematica?

Ci sono due domande diverse qui, e due questioni diverse per ogni domanda. Queste hanno bisogno di essere spacchettate.

Le domande, come diverse persone hanno già sottolineato, sono la necessità della matematica per la programmazione rispetto all'informatica. I problemi, per ogni domanda, sono se uno ha bisogno della matematica per ottenere una laurea nell'area e per praticare nell'area.

Per l'informatica, la risposta è abbastanza semplice. L'informatica è una disciplina accademica che dipende fortemente da vari tipi di matematica: probabilità e statistica, logica, ecc. Non andrai lontano senza la matematica, né in termini di istruzione né in termini di pratica. (Si potrebbe essere in grado di lavorare in alcune branche senza usare direttamente la matematica, e avendo bisogno solo della disciplina strutturale di cui parlo più avanti, ma sarà difficile arrivare a quel punto in primo luogo)

Per quanto riguarda la programmazione, è certamente il caso che l'attuale pratica di programmazione mainstream abbia relativamente poca dipendenza dalla matematica. Ci sono anche molti modi per ottenere un'educazione che vi porterà a quel punto: probabilmente non una tipica laurea universitaria in informatica (i requisiti di calcolo e matematica discreta probabilmente vi metteranno al tappeto), ma forse una formazione on-line o attraverso programmi come il CIS (computing and information sciences) - oltre, naturalmente, all'autoformazione.

Per essere un programmatore forte e di successo, tuttavia, credo che abbiate bisogno di qualcosa, ed è così fortemente correlato alla matematica formale che spesso viene scambiato per essa, ma i due non sono identici. La gente usa frasi come "sofisticazione matematica" o "pensiero matematico", il che aumenta ulteriormente la confusione (perché entrambi suonano in qualche modo legati alla "matematica"). Permettetemi quindi di dargli un nome diverso: strutturalismo.

Quando si programma, si stanno creando e mantenendo strutture. Queste strutture hanno dipendenze e relazioni che devono essere mantenute nel tempo (entrambe le nozioni di tempo: mentre un sorgente di programma è in esecuzione, e mentre il sorgente del programma stesso si evolve). Pertanto, la programmazione richiede la capacità di pensare chiaramente attraverso le strutture, così come di comprendere le proprietà sulle strutture (ad esempio, le relazioni uno-a-molti, le loro dimensioni e come le dimensioni crescono, la capacità di sostituire una struttura con un'altra, ecc.) Un sacco di supporto alla programmazione - dai sistemi di tipi all'UML ai linguaggi di specifica e altro ancora - è progettato per aiutare i programmatori a tenere traccia di queste strutture e a farle evolvere.

Alcuni programmatori possono usare strumenti molto sofisticati per fare questo tipo di progettazione e manutenzione strutturale (ad esempio, io aiuto a tenere un corso chiamato "Logic for Systems" che riguarda l'uso di linguaggi avanzati e strumenti di analisi proprio per questo compito). A quel punto, la programmazione non solo sembra matematica, ma può essere difficile persino distinguere le due cose.

Ma ogni buon programmatore è impegnato in questo tipo di pensiero strutturale, sia che usi la matematica di fantasia o meno. Quando si scrivono contratti o vincoli di integrità del database o qualsiasi altra dichiarazione descrittiva che non è direttamente legata all'esecuzione del programma, si sta facendo una dichiarazione strutturale. Un tipo complesso o una gerarchia di classi riflette questo tipo di pensiero. Anche quando scrivete casi di test e chiedete "Ho coperto lo spazio?", o vi impegnate in una revisione del codice che parla del perché sono state scelte particolari strutture di dati, state pensando strutturalmente. È inevitabile. Infatti, un buon test per un programmatore è quello di tirare fuori il suo codice e interrogarlo sulle sue strutture e vedere quanto bene può articolare le sue scelte.

Il fatto è che questo tipo di pensiero strutturale è profondamente matematico. (Una definizione di "matematica" che mi piace è "le proprietà strutturali di oggetti immaginari"). Qualcuno che può lavorare bene strutturalmente - e ne avrà bisogno, credo, per avere una carriera a lungo termine nell'informatica se è ancora giovane oggi - ha la chiarezza di pensiero e di organizzazione che credo non sia molto diversa da quella di cui si ha bisogno per avere successo in molti tipi di matematica. Naturalmente, c'è di più nel fare matematica, come ad esempio venire fuori con idee intelligenti che si rivelano essere intuizioni chiave per dimostrare le proprietà, e queste hanno più o meno analoghi nella programmazione (a seconda del tipo di programmazione che si fa).

La linea di fondo, quindi, non è chiedere se si può pensare matematicamente. Piuttosto, è chiedere se si può pensare strutturalmente. Se ci riuscite, probabilmente farete bene come programmatori, e forse anche come informatici. Se non ci riuscite, allora immagino che avrete molte più difficoltà a sopravvivere e ad avere successo.