Quanto è importante sapere come programmare per TCS?


66

Venendo da un background più matematico, non ho mai davvero imparato a programmare. Sto iniziando un dottorato di ricerca in TCS e molte persone sono state sorprese da quanto poco sapevo sulla programmazione (e sul computer in generale). Riesco a scrivere algoritmi in pseudo-codice, ma non conosco davvero alcun linguaggio di programmazione.

Posso immaginare che un giorno potrei dover implementare alcuni algoritmi per il mio lavoro, ma allora posso aspettare questo momento? O c'è qualcosa di più?

Quanto è importante saper programmare in TCS (in campi in cui la programmazione non è direttamente coinvolta): ci sono ragioni che potrebbero portare un teorico CC (ad esempio) a sapere come programmare? Vale la pena dedicare molto tempo a imparare a programmare? E se ci sono, esiste una categoria (funzionale, imperativo, orientata agli oggetti ..) del linguaggio di programmazione più adatto?


12
Dovresti averne programmati alcuni per scrivere pseudo-codice significativi, cioè definiti e che riflettono il tempo di esecuzione. I matematici spesso non fanno nessuno dei due. Inoltre, se vuoi effettivamente usare la teoria che sviluppi, è probabile che dovrai implementare qualcosa. Per quanto riguarda le lingue, probabilmente stai meglio imparando qualcosa di funzionale. C è bello per le prestazioni ma difficile da ragionare e disordinato sotto molti aspetti. (Come puoi vedere, YMMW)
Raphael

6
Concordo con "I matematici spesso non fanno nessuno dei due". Un semplice test per stabilire se un matematico che descrive un algoritmo abbia davvero programmato è chiedere "Che cosa intendi esattamente con" Dato un X ... "?"
Jeffε

4
Programmazione, che cos'è? I teoremi sono i miei programmi. Una procedura di cottura è diversa dall'arte culinaria. Siamo spiacenti, da oltre 20 anni non riesco a leggere alcun codice del programma. In realtà, odio questo casino "essere realizzato su PC". (Già questa notazione rende malati.) Euclide non ha potuto programmare. Eppure ha fatto programmi per secoli.
Stasys,

6
@StasysJukna: Euclid era in realtà un programmatore davvero schifoso. Non solo non ha mai implementato i suoi algoritmi, non li ha nemmeno mai eseguiti a mano su casi di test moderatamente complicati.
Jeffε

3
@ Jɛ ff E: Sì, Euclid era un programmatore schifoso, esattamente questo che volevo dire. Noi, in TCS, tendiamo a non distinguere tra libri di cucina e arte di armamento. Euclide potrebbe. Ho un grande rispetto per le persone che possono programmare. Ma non credo che questa funzione significhi "un CAN in TCS". Non farà male.
Stasys,

Risposte:


55

L'informatica teorica è un campo ampio e l'importanza della programmazione dipende da ciò che fai in TCS. Citerò due modi in cui la programmazione può aiutarti, senza implicare che questi sono gli unici modi.

Innanzitutto, se si progettano algoritmi per problemi di importanza pratica, implementare i propri algoritmi e rendere il codice disponibile per gli altri può essere un grande vantaggio. Ad esempio, il problema dello scafo convesso si presenta in molti campi e le persone usano pacchetti software come cdd di Komei Fukuda e lrs di David Avis per risolvere questo problema. Se avessero pubblicato i loro algoritmi solo su articoli, probabilmente meno persone avrebbero usato i loro algoritmi. Più utenti significano più feedback e probabilmente anche maggiori opportunità di collaborazione, il che è prezioso.

In secondo luogo, anche se non si lavora in algoritmi, la scrittura di un codice unico consente di testare una semplice congettura quando la congettura è adatta al calcolo numerico. Ad esempio, se ti chiedi se il prodotto di tre matrici definite positive ha sempre una traccia positiva, è facile scrivere un codice per testarlo per alcune scelte casuali di matrici definite 2 × 2 o 3 × 3 e trovare un controesempio. Anche se non pubblicizzi di aver scritto alcun programma per testare la congettura, la programmazione può risparmiare il tempo che sarebbe stato trascorso invano cercando di dimostrare una dichiarazione falsa.

Il linguaggio di programmazione da scegliere dipende da cosa vuoi fare con la programmazione e, a mio avviso, può essere un argomento per un intero libro. Ma se progettate algoritmi e volete implementare i vostri algoritmi in modo che altre persone possano usare l'implementazione, un fattore importante è la disponibilità. Sebbene ci si possa aspettare che la maggior parte dei potenziali utenti del codice abbiano accesso a un compilatore C, non ci si può aspettare che le stesse persone abbiano accesso a un compilatore Haskell. Per i programmi una tantum, la scelta è più basata sulle librerie disponibili e include ambienti come Matlab.

A proposito, anche la programmazione può essere divertente.


2
@SureshVenkat: In effetti, se la programmazione è divertente, la domanda "Quanto è importante la programmazione?" Potrebbe non essere molto rilevante. Ma poi la maggior parte della mia risposta diventerà irrilevante. Che triste! :)
Tsuyoshi Ito

Prima non avevo pensato al tuo secondo argomento, anzi sembra davvero una buona idea testare una congettura con un breve programma! Per quanto riguarda la programmazione può essere divertente, così sembra, ma devo ancora vedere tutto l'apprendimento del fine settimana lungo =).
Gopi,

@Gopi: Detto questo, molte congetture non rientrano in questo framework di "test con un programma semplice". Ad esempio, di solito non possiamo testare comportamenti asintotici (almeno con un semplice programma). Ma quando hai delle congetture che possono essere testate, una piccola programmazione può essere uno strumento potente. Per quanto riguarda il divertimento, sì, ho capito. Non volevo ignorare il punto di vista "divertente" elencando solo alcune motivazioni dal punto di vista "utilità".
Tsuyoshi Ito,

3
Le note di Knuth su una classe di problem solving hanno un meraviglioso esempio dell'interazione tra congetture e codice (vedi Problema 1): www-cs-faculty.stanford.edu/~knuth/papers/cs1055.pdf (Mi piace particolarmente l'immagine di qualcuno correre in classe con un mucchio di stampe)
Suresh Venkat,

47

Mi sento in dovere di citare Doron Zeilberger su questo:

Opinione 37 : La programmazione è ancora più divertente del provare e, cosa ancora più importante, dà molta, se non di più, comprensione e comprensione.

Leggi l'opinione, è pieno di gemme (tra l'altro tende a essere deliberatamente provocatorio). Ad esempio, "Il modo migliore per capire qualcosa è insegnarlo. Ma ancor meglio insegnarlo agli umani è insegnarlo a un computer".

La mia esperienza personale è che anche quando fai un lavoro puramente teorico avrai bisogno di alcuni strumenti di calcolo. Evito molte noiose manipolazioni algebriche di routine con Mathematica. Metto alla prova le mie congetture cotte a metà forzando piccole istanze su Matlab o Python. Ho scritto un articolo che è pura combinatoria, ed è il lavoro che ha beneficiato maggiormente dell'esecuzione di esperimenti informatici approfonditi per capire cosa sta succedendo. Euler ha fatto enormi tabelle di calcoli noiosi per ottenere informazioni sui problemi. Dobbiamo a lui usare i nostri strumenti per automatizzare questo processo quando facciamo matematica.

A parte questo, se lavorerai su algoritmi e strutture dati, la programmazione fornirà una prospettiva insostituibile su questioni di efficienza e usabilità. La mia opinione qui differisce in qualche modo con gli altri. Penso che imparare un linguaggio funzionale in modo da poter scrivere prove che digiti correttamente sia una perdita di tempo (penso che sia un ottimo punto che le persone che hanno esperienza con un linguaggio fortemente tipizzato tendano probabilmente a scrivere prove più strutturate con cura; non credo che valga la pena dedicare il tuo tempo a fare questo esercizio). La programmazione funzionale oscura le problematiche della progettazione degli algoritmi e del tempo di esecuzione e sottolinea le questioni logiche e semantiche (e, naturalmente, l'apprendimento della programmazione funzionale è probabilmente un must e arriverà in qualche modo naturalmente se sei interessato alla semantica logica / PL). Allo stesso modo, Penso che entrare nei dettagli OO di Java e C ++ non sia anche il modo ottimale per passare il tempo, poiché lo scopo di OO è quello di scrivere codice riutilizzabile modulare. È la strada da percorrere se produci codice che gli altri possano usare. Ma nel caso in cui desideri ottenere informazioni sull'efficienza e sul tempo di esecuzione, se ti interessano algoritmi e strutture di dati davvero efficienti, secondo il suggerimento di esaminare C. Ti consente di rimanere vicino alla macchina pur fornendo un ragionevole livello di astrazione . In questo modo puoi avere un'idea di ciò che è veloce e di ciò che è lento, di ciò che è una struttura di dati ragionevole, ecc. Ma nel caso in cui desideri ottenere informazioni sull'efficienza e sul tempo di esecuzione, se ti interessano algoritmi e strutture di dati davvero efficienti, secondo il suggerimento di esaminare C. Ti consente di rimanere vicino alla macchina pur fornendo un ragionevole livello di astrazione . In questo modo puoi avere un'idea di ciò che è veloce e di ciò che è lento, di ciò che è una struttura di dati ragionevole, ecc. Ma nel caso in cui desideri ottenere informazioni sull'efficienza e sul tempo di esecuzione, se ti interessano algoritmi e strutture di dati davvero efficienti, secondo il suggerimento di esaminare C. Ti consente di rimanere vicino alla macchina pur fornendo un ragionevole livello di astrazione . In questo modo puoi avere un'idea di ciò che è veloce e di ciò che è lento, di ciò che è una struttura di dati ragionevole, ecc.


10
"La programmazione funzionale oscura le problematiche della progettazione degli algoritmi e dei tempi di esecuzione e sottolinea le questioni logiche e semantiche". Parole di combattimento :)
Suresh Venkat,

3
"La programmazione funzionale oscura i problemi di progettazione degli algoritmi e dei tempi di esecuzione e sottolinea i problemi di logica e semantica." Ecco perché è una buona scelta se lavori nella parte logica o semantica di TCS. :)
Radu GRIGore,


3
@Sasho: tutte le tecniche ordinarie funzionano ancora nei linguaggi funzionali. L'unico "problema" è che la programmazione funzionale incoraggia uno stile di programmazione e progettazione della struttura dei dati che le normali tecniche di analisi algoritmica sono poco attrezzate per gestire. (Ad esempio, qual è il big-O della composizione delle funzioni? L'operazione è banale , ma rompe completamente i presupposti della complessità asintotica - non esiste una semplice metrica numerica delle dimensioni per un input funzionale.)
Neel Krishnaswami

3
@SashoNikolov: Ogni volta che insegno a una classe di strutture dati laureate, vorrei davvero poter supporre che tutti avessero avuto qualche esperienza di programmazione funzionale. Invece di spendere tre lezioni di 90 minuti per spiegare la persistenza, potrei semplicemente dire "Ehi, hai notato che le tue strutture dati fanno già QUESTO?"
Jeffε

33

Puoi essere un informatico teorico di successo senza programmazione. Per alcune persone, la programmazione è piuttosto difficile, e se sei uno di loro non dovresti disperare e cambiare campo.

Tuttavia, per la maggior parte degli studenti laureati in matematica e informatica, imparare a programmare non è particolarmente difficile ed è un'abilità molto utile. Dovresti imparare un linguaggio di programmazione e, se ti piace, dovresti provare a fare abbastanza pratica per diventare ragionevolmente competente. Quindi, quando verrà il punto (e lo sarà) che sarà utile nella tua ricerca scrivere un programma, sarai in grado di farlo.

Se non impari a programmare ora, è molto probabile che quando alla fine dovrai scrivere un programma, non avrai tempo di imparare, quindi potresti non scriverlo effettivamente e finire per essere meno efficace nel tuo ricerca. Mentre ottenere uno studente laureato o un laureando per farlo per te non è troppo difficile, ci sono molte volte in cui è molto più facile e richiede meno tempo farlo da soli piuttosto che spiegare loro il problema.

Che lingua dovresti imparare? Consiglierei un linguaggio orientato agli oggetti, poiché questi sono quelli che sono attualmente più utilizzati e sospetto che questo sarà più vero in futuro. Forse Python o Java - sono entrambi linguaggi orientati agli oggetti e mentre sono usati meno nella pratica rispetto al C ++, la mia impressione è che siano entrambi molto, molto più facili da imparare. (Avvertenza: non conosco il C ++, nonostante abbia lavorato presso i Bell Labs, quindi forse mi sbaglio.)


2
Vedo la verità nel tuo terzo paragrafo :).
Gopi,

1
"Tuttavia, per la maggior parte delle persone, imparare a programmare non è particolarmente difficile" - la mia esperienza mi porta a non essere d'accordo con questo, ma la maggior parte delle persone non sono ricercatori TCS.
Max

2
Con l'ascesa di Sage, è possibile lavorare con un linguaggio piacevole e popolare come Python pur disponendo immediatamente di librerie matematiche in stile Mathematica / Maple / Matlab.
András Salamon,

1
Il C ++ ha il sistema di metaprogrammazione / tipo più avanzato di qualsiasi linguaggio di programmazione per scopi generali mainstream che abbia mai visto, tranne la famiglia dei linguaggi Lisp. Quindi, se sei interessato alla teoria dei tipi, alla progettazione del linguaggio o alla teoria dei compilatori, o più in generale alla semantica formale, potresti averne bisogno di familiarizzare. Oltre a C ++, Java e C # sono indispensabili se si desidera effettuare ricerche in Informatica sperimentale o sperare di ottenere un lavoro come programmatore o ingegnere del software nel settore. Python dovrebbe essere insegnato nelle scuole superiori: D
Antonio Valerio Miceli-Barone,

4
@ AntonioValerioMiceli-Barone: non sono d'accordo, almeno per la teoria dei tipi, la progettazione del linguaggio, la semantica formale e la teoria del linguaggio di programmazione (PLT) in generale: il C ++ non è il linguaggio da imparare per quei campi; Il TT e la semantica formale si riferiscono quasi esclusivamente alla programmazione funzionale, mentre la comunità PL è più diversificata, ma preferisce linguaggi più eleganti del C ++. Haskell è il linguaggio "mainstream" con il sistema di tipi più avanzato, seguito da Scala (meno avanzato, un po 'più mainstream). Il C ++ ha caratteristiche interessanti, ma è di livello troppo basso per il gusto moderno.
Blaisorblade,

33

C'è un'altra risposta che nessuno ha davvero sollevato. La programmazione può effettivamente portare a una teoria interessante. Molti dei recenti sviluppi dell'hash (in particolare l'hash della tabulazione) non sono motivati ​​da preoccupazioni teoriche di per sé, ma dal fatto che gli algoritmi teoricamente ottimali non sono così grandi nella pratica. Questo ovviamente è qualcosa che non conosci a meno che tu non sia in grado di scrivere codice.

Anche nel regno degli esatti algoritmi del tempo esponenziale, una motivazione sta producendo algoritmi che possono effettivamente funzionare. I solutori SAT ne sono l'esempio canonico.

In breve, la capacità di codificare consente di realizzare carenze e punti deboli in quelli che potrebbero sembrare risultati teorici ottimali e che a loro volta aprono nuove direzioni teoriche di ricerca.


La tua risposta potrebbe essere d'aiuto sulla domanda sui risultati empirici nella TCS .
Gopi,

forse: ma quel filo si è estinto da tempo :)
Suresh Venkat,

In effetti, non ho visto la data, era nell'ultima newsletter che ho ricevuto, nella sezione "I più grandi successi delle settimane precedenti" =).
Gopi,

18

Tre punti:

1) Esiste un approccio alla matematica chiamato Experimental Mathematics (vedi anche wikipedia: // Prova assistita da computer ) in cui usi programmi informatici per indagare su schemi e strutture di oggetti al fine di elaborare prove analitiche su questi oggetti. Per questo approccio, è meglio sapere come programmare. Puoi essere sicuro di trovarti nella necessità di questo approccio per dimostrare affermazioni molto teoriche. Credo che lo snobismo contro la programmazione spesso non sia davvero utile nella ricerca TCS.

UNL(X,Y)BL(Y,C)

3) Quando dici "programmare" intendi anche " programma lineare " o " programma semidefinito "? :)


2
Nessuno che conosca usa "per programmare" per "per programma lineare" o "per programma semidefinito". Invece diresti "costruire / risolvere un programma lineare".
Peter Shor,

2
@PeterShor Il punto 3 non era grave
Alessandro Cosentino l'

3
E, naturalmente, dovresti anche imparare a programmare in modo lineare ea programmare semidefinito ... entrambe le abilità utili.
Peter Shor,

3
+1 per il punto 2, in realtà mi è stato insegnato un po 'di OCaml quando ero studente, anche se l'ho usato solo per un anno, ho preso l'abitudine di controllare i tipi delle mie prove.
Gopi,

4
Programma in modo dinamico !
Jeffε

16

Grazie Gopi per questa domanda. Vorrei estendere le molte risposte interessanti in un'altra dimensione che non è stata ancora menzionata.

La ricerca non è l'unica cosa che facciamo all'università: se vuoi rimanere nel mondo accademico, alla fine dovrai insegnare. Se sei fortunato, dovrai insegnare corsi abbastanza lontani dalla tua area di specializzazione. Molto probabilmente ti verranno assegnati corsi con una componente di programmazione sostanziale. È qui che anche una moderata capacità di programmare aiuta sostanzialmente: sarai molto meglio un insegnante se sai programmare. Innanzitutto, ti sentirai più a tuo agio con il materiale, sarai in grado di rispondere meglio alle domande degli studenti e capirai le difficoltà che gli studenti hanno nell'imparare a programmare, mentre hai sperimentato tu stesso questo processo di apprendimento. Inoltre, puoi produrre materiale didattico migliore. Ad esempio, puoi provare tu stesso gli esercizi di programmazione prima di consegnarli agli studenti,

C'è un'ulteriore dimensione pragmatica: l'insegnamento comporta varie attività ripetitive che un abile programmatore può spesso automatizzare, come creare rapidamente un sito Web che gli studenti possono utilizzare per inviare i corsi e farlo classificare automaticamente (in base al numero di test automatici che il codice supera).


"Se sei fortunato, dovrai insegnare corsi abbastanza lontani dalla tua area di specializzazione." È fortunato ...?
Tsuyoshi Ito,

3
@ Tsuyoshi: Beh, ti costringe a familiarizzare con una nuova area tematica. A breve termine, ciò significa molto lavoro (che si ammortizza a lungo termine, poiché probabilmente insegnerai questo materiale più di una volta). Allo stesso tempo, amplia notevolmente i tuoi orizzonti intellettuali.
Martin Berger,

@TsuyoshiIto: Sì!
Jeffε

13

La programmazione è un buon modo per migliorare la comprensione di vari concetti, ma è anche una perdita di tempo pericolosa.

Un tipico argomento contro la programmazione è che ti fa passare il tempo con dettagli non importanti; un argomento tipico per la programmazione è che ti fa capire che i dettagli che ritieni poco importanti sono in effetti importanti. Diventare bravi nella programmazione significa soprattutto essere in grado di gestire rapidamente le parti non importanti. Diventare buoni richiede molto tempo.

Per quanto riguarda il linguaggio di programmazione da imparare: "tutti loro" è la mia risposta (ironica).


2
Finalmente un argomento contro la programmazione :).
Gopi,

1
@Gopi, penso che la programmazione possa essere molto divertente e che la migliore comprensione che ottieni sia molto importante. Le altre risposte forniscono grandi esempi di come la programmazione aiuta a capire. Quindi ti incoraggio a imparare la programmazione e non mollare se l'impresa non sembra ripagare rapidamente.
Radu GRIGore,

6
Dimostrare teoremi è anche un buon modo per migliorare la comprensione di vari concetti, ma è anche un pericoloso spreco di tempo.
Jeffε

@ Jɛ ff E, la mia opinione è preservata dalla sostituzione [pseudocodice-> prova su carta, codice-> prova in un assistente di prova].
Radu GRIGore,

12

Sono in ritardo alla festa e queste sono tutte ottime risposte, ma ho un'altra ragione:

Visualization.

Sì, spesso lavorerai con cose che non possono essere visualizzate, ma spesso lavorerai con cose che possono. Saper programmare è indispensabile per questo compito e la visualizzazione può offrirti molte informazioni su un problema.


3
So programmare e sono assolutamente senza speranza alla visualizzazione. Sospetto anche che ci siano strumenti che ti permetteranno di visualizzare le cose senza fare molta programmazione; se non ci sono, ci dovrebbe essere e forse lo sarà tra qualche anno.
Peter Shor,

@PeterShor: Perché non usi C ++! (Sto scherzando)
Tsuyoshi Ito

1
@PeterShor: non mi riferisco a nessuna lingua o ambiente specifici; MATLAB conta qui. Ma sapere come programmare può farti ottenere visualizzazioni che altrimenti sarebbero incredibilmente scomode. Ad esempio, lo spazio delle matrici bidimensionali definite positive è tridimensionale e volevo visualizzare una famiglia di costrutti in questo spazio. Ho dovuto inventare una trasformazione e poi codificarla per vedere davvero i miei oggetti.
John Moeller,

@John ... hai ragione, non penso che avresti potuto farlo in nessun altro modo.
Peter Shor,

7

Solo un breve punto: saper programmare mi offre uno strumento aggiuntivo nella ricerca teorica. Quando ho un algoritmo che penso funzionerà, se è abbastanza facile, potrei codificarlo e verificare se effettivamente funziona. Se la mia idea non funziona (nemmeno) in pratica, non è molto probabile che funzioni in teoria e questo approccio spesso mi salva dall'affondare una quantità enorme di tempo cercando di dimostrare qualcosa che è falso.


Tsuyoshi Ito ha scritto un argomento simile nella sua risposta (secondo punto :)).
Gopi,

Oops hai ragione - mi è mancato.
Lev Reyzin

5

Nessuno qui ha affrontato le questioni pratiche del perché qualcuno che studia TCS dovrebbe imparare la programmazione.

Se hai intenzione di fare un dottorato di ricerca in TCS in un dipartimento di Informatica, ci sono buone probabilità che tu abbia bisogno di seguire alcuni corsi non teorici, e quelli saranno quasi certamente ad alta intensità di programmazione. A seconda del programma in cui ti trovi, potresti anche aver bisogno di conoscenza di argomenti non teorici per superare gli esami di qualifica.

Quando finisci il tuo dottorato di ricerca, la maggior parte delle opportunità di lavoro per TCS sono nel mondo accademico. Se lavori nel mondo accademico, ti verrà richiesto di insegnare e potresti dover insegnare a un corso di laurea triennale a livello di introduzione che sarà più programmabile che teorico. Anche se stai insegnando una lezione di teoria agli studenti universitari, come ad esempio Algorithms, puoi aspettarti che i tuoi studenti sapranno di più sulla programmazione che sulla teoria e senza sapere cosa sanno i tuoi studenti, sarà difficile per te colmare le lacune nella loro comprensione . Rabbrividisco al pensiero che gli studenti universitari di CS vengano insegnati da qualcuno che non conosce la programmazione!

Se non ti interessano queste preoccupazioni pratiche, allora puoi probabilmente fare ricerche senza davvero sapere nulla sulla programmazione. Certamente hai molta compagnia nella comunità TCS, ma il chilometraggio varierà in base all'area esatta della Teoria in cui stai lavorando. Ad esempio, se stai facendo pura teoria della complessità computazionale, dimostrando limiti inferiori su classi che nessuno ha mai sentito parlare, allora è probabile che la programmazione non ti sarà utile. Ma se stai facendo qualcosa di più algoritmico, allora sento che riuscire a scrivere un buon codice di lavoro pulito rafforzerà la tua intuizione se non altro.

Consiglio di imparare C (non C ++). Prendi una copia di K&R e leggila fronte-retro. C non ha molte delle fantasiose caratteristiche dei linguaggi moderni, ma ha una sintassi e una semantica semplici ma eleganti, che dovresti essere in grado di apprendere interamente. Tuttavia, anche quando capisci il linguaggio nel suo insieme, ci vuole ancora pratica per padroneggiare la scrittura di un codice elegante e privo di bug in C. Tuttavia, se riesci a padroneggiare la codifica in C, sarai in grado di padroneggiare qualsiasi linguaggio di programmazione che incontri. Inoltre, questa disciplina ti aiuterà a pensare come pensa l'hardware, il che sarà utile durante la progettazione di algoritmi.

Idee come i puntatori sono molto importanti per chiunque stia progettando algoritmi, ma sfortunatamente linguaggi come Java e Python li oscurano da te, quindi è per questo che non li consiglio come prima lingua a qualcuno con un background matematico. OOP è più importante per le persone che devono mantenere enormi progetti software, non per chi sta progettando algoritmi.


0

Suggerirei di non attendere l'inizio del corso poiché l'informatica a qualsiasi livello implica l'implementazione di algoritmi attraverso un computer al fine di realizzare / verificare / risolvere qualsiasi teoria che dovrete affrontare durante il corso, in particolare al vostro livello.

Ho dovuto programmare prima in classe 10 (scuola superiore) e sapevo già come usare una riga di comando e questo mi ha davvero aiutato (questo è per mostrarti come le capacità di programmazione "base" sono considerate in CS).

Lo stupore dei tuoi colleghi è ben fondato, poiché lo pseudocodice e gli algoritmi sono tra le prime cose che uno deve imparare per programmare.

Tuttavia, non ti perderai completamente nel tuo prossimo corso poiché puoi utilizzare le tue più ampie abilità matematiche (da solo) a tuo vantaggio per saltare la programmazione orientata agli oggetti per recuperare più velocemente l'apprendimento di un linguaggio di programmazione funzionale.

  • La programmazione funzionale è MOLTO orientata alla matematica, considerata più difficile da imparare per il suo background matematico necessario, considerata molto potente (nel suo modo "semplice" e matematico per risolvere problemi difficili con mezzi eleganti e "puliti").
  • L'orientamento agli oggetti è utile quando non si desidera comprendere algoritmi e principi di implementazione sottostanti e si desidera semplicemente "riutilizzare" oggetti già esistenti.

Penso che potresti affrontare l'Haskell (di solito non una prima lingua) perché è puramente matematico, funzionale e può fare praticamente tutto quello che vuoi. Imparare Haskell ti metterebbe a un livello in cui non avresti bisogno di imparare molto di più per tenere il passo e ti metterebbe persino in una situazione di controllo e potere sul tuo corso. Se ti piacciono le statistiche, l'apprendimento di R è un vantaggio, ma non tanto quanto Haskell. Ho visto rapporti di matematici che affermano quanto fossero sorpresi dalla sua vicinanza alla matematica e da come abbracciava il loro modo di pensare.

Inoltre, una sfida che vale la pena affrontare (per abituare rapidamente le mani a un ambiente di programmazione) sarebbe installare e usare Linux (Ubuntu Linux farà). Fidati di me, imparerai molto giocando con esso ...

Questi consigli sono il modo migliore che conosco per raggiungere velocemente e sicuramente per un matematico in informatica. Inoltre, la comunità open source è molto amichevole e utile e se sei bloccato, IRC è il modo più diretto per parlare di qualsiasi argomento attraverso canali specializzati (connettiti su FreeNode). Ricorda: chiedere è l'unico modo per risolvere le domande, che tu sia, un forum, un motore di ricerca o nelle chat room.


4
Non so quanto stai rispondendo alla domanda originale: non ho chiesto "come fare", ma più "cosa fare".
Gopi,

0

Un esempio di implementazione C ++ di un sistema di prove interattive è il seguente documento: Prove interattive ottimali per la valutazione dei circuiti, di Justin Thaler. È disponibile su http://people.seas.harvard.edu/~jthaler/ . Sembra essere un passo verso l'obiettivo di sviluppare un'implementazione pratica di sistemi di prova interattivi di uso generale.

Articoli simili e relativi codici sorgente appaiono sul sito web sopra menzionato.


3
Spiegheresti come questo documento è correlato alla domanda, ad es. Quanto è importante sapere come programmare per TCS ?
scaaahu,

Anche se fosse un esempio di risultato teorico che ha beneficiato della programmazione, non risponderebbe alla domanda originale?
Jeremy,

La domanda chiede se è necessario che un teorico della complessità conosca la codifica. Il documento sopra menzionato usa chiaramente i risultati sperimentali per integrare concetti teorici; questo richiede la codifica. In ogni caso, mi ci è voluto molto tempo per trovare un progetto di programmazione così strettamente legato a un concetto centrale nell'informatica teorica. Spero che questo post possa essere utile a qualcuno in una ricerca simile.
lgidwani,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.