Qual è la materia / teoria CS più difficile che hai studiato ma importante per il campo? E il motivo per favore?
Qual è la materia / teoria CS più difficile che hai studiato ma importante per il campo? E il motivo per favore?
Risposte:
"Ci sono 2 problemi gravi nell'informatica: memorizzazione nella cache, denominazione ed errori off-by-1"
Onestamente, costruzione del compilatore!
Progettazione e analisi di algoritmi
Penso che questa domanda dipenda dall'insegnante che hai avuto e da come quella materia è stata organizzata nella tua carriera.
Analizzare gli algoritmi può essere difficile come qualcuno vuole. Tieni conto che ci sono problemi irrisolti, e non solo: problemi che non possono essere risolti.
Il fatto è che puoi avere un problema e se sai che non può essere risolto, è perfetto. E se non lo facessi? Puoi dedicare molto tempo a provare che è NP-Complete o a cercare una soluzione di tempo polinomiale per risolverlo.
Dimostrare NP-completezza non è facile. Sì, sono noti molti problemi, ma il punto è trovare le riduzioni per dimostrare che è NP-Complete. E cosa succede se passi molte ore / giorni / mesi a provare a dimostrarlo e può essere risolto in tempo polinomiale? :)
Ci sono anche altre materie, come i compilatori , la teoria dei gruppi e le funzioni ricorsive primitive che possono essere difficili come il piano tematico o l'insegnante vuole;)
Riconoscimento del modello, ovvero intelligenza artificiale. Questo si riferisce al calcolo intelligente insieme ad altri strumenti di riconoscimento dei modelli come il riconoscimento ottico dei caratteri, la voce al testo, l'identificazione facciale, ecc.
Molte delle cose "belle" che puoi fare o che desideri che tu possa fare con i computer si basano su questi algoritmi e abbiamo tentato di perfezionarle per decenni senza molto successo.
La mia scelta è la teoria della calcolabilità
(Hmm ... forse non è così importante, ma sicuramente è stato difficile)
Ci sono solo due problemi gravi in Informatica: invalidazione della cache e denominazione delle cose. - Phil Karlton
teoria delle categorie (matematica discreta), ma ne vale la pena
Crittografia
Se lo fai in modo leggermente sbagliato, potrebbe costare milioni di aziende.
Sistemi operativi, in particolare la parte che ha a che fare con il threading.
E il motivo non è perché è stato così difficile fare in modo che 5 filosofi mangiassero la pizza con una forchetta. Il motivo è perché scrivere codice multithread è di per sé difficile e non necessariamente facile da calcolare per la mente umana (almeno maschio - secondo mia moglie).
Anche io voto per Compiler Design. Soprattutto dove arrivano le parti DFA e NFA. Non sono anche così chiaro sui problemi e le cose NP.
Bene tecnicamente questo è un ramo della matematica, ma è molto rilevante in CS.
Quasi tutto in CS si basa su code (visibile (ovvio) e invisibile (non così ovvio o implicito)).
All'inizio di CS le code erano ovvie.
Una coda di programmi (ogni programma un mazzo di carte).
Oggi le code non sono così ovvie. Internet ad esempio: una rete a commutazione di pacchetto, ma i pacchetti formano le code e il routing dei pacchetti è una forma di minimizzazione della coda.
Non è troppo difficile sui problemi del giocattolo che ti vengono dati nel corso, ma una volta che inizi a considerare problemi reali si trasforma in un duro lavoro.
Interpretazione dei requisiti del cliente quando il cliente non sa davvero cosa vuole. Questo non viene insegnato al college ed è una delle abilità più essenziali da avere.
Personalmente, la mia era Logica formale. Iniziare è stato difficile, ma una volta che abbassi le regole e riesci a giocarci abbastanza, il tuo cervello va Logic++;
, il che in fase di sviluppo è un'ottima cosa.
Come nota a margine, sto rispondendo direttamente alla domanda - questo non era sicuramente l'argomento più difficile quando ho conseguito la laurea, ma era probabilmente l'argomento più "applicabile nella vita reale".
Costruzioni del compilatore. Difficile ma deve capire i concetti alla base
Kernel Design qualcuno? Beh, non so davvero come sia fatto e quali siano le funzionalità di destinazione di un sistema operativo, ma per me pensare di progettare un kernel deve essere un compito scoraggiante.
Penso anche alla sicurezza informatica ; Non so davvero cosa renda pericoloso un sistema, tranne ovviamente ovvi overflow del buffer, iniezioni di XSS e SQL.
Non ne sono sicuro, ma sembra che alcuni algoritmi non siano sicuri; guarda il progetto MetaSploit, elenca tutti i tipi e tipi di violazioni della sicurezza: puoi vedere che ci sono molti modi in cui un programma può essere imperfetto.
Ci sono molti argomenti imbarazzanti nel campo, ma le mie scelte per pura e persistente difficoltà sono quelle che riguardano le proprietà del sistema globale . Esempi di questo argomento generale includono:
Questi sono difficili perché stai cercando qualcosa che esiste solo quando tutto è corretto; hai bisogno di una proprietà di sistema globale e tuttavia praticamente tutti gli strumenti disponibili (e tutti quelli che si adattano a problemi reali nella mia esperienza) fanno davvero solo ragionamenti locali. È difficile passare dal ragionamento sui brani del programma all'intero shebang, in particolare perché è del tutto possibile avere pezzi che sono tutti corretti in se stessi ma dove ci sono ancora bug sottili perché i componenti sono disposti in modo errato; i bug possono essere caratteristiche emergenti indesiderabili ...
Servizi informativi sulla gestione
Durante il mio periodo universitario, ogni semestre avevo una materia di gestione che mi rendeva totalmente pazzo.
Difficile! bene argomenti come Compiler Design , OS Design ecc. sono difficili ma sono davvero interessanti e stimolanti. Ho davvero incasinato argomenti come il Sistema informativo / servizi di gestione ecc. Poiché sono pieni di noia e devi passare attraverso molta teoria.
Se stai lavorando in C / C ++, i puntatori sono il concetto più importante da sapere. Ma in qualche modo non l'ho mai capito completamente al college.
Progettazione e analisi di algoritmi. Non è tanto difficile da capire e analizzare algoritmi noti , è che progettare e analizzare nuovi algoritmi per problemi difficili è difficile e richiede un'ampia comprensione di molte aree e pratiche nell'applicazione di molte tecniche diverse.
Qual è la materia / teoria CS più difficile che hai studiato ma importante per il campo?
Matematica discreta.
È stato difficile perché le teorie sono molto vagamente correlate tra loro ma vengono utilizzate in CS. Troppa memorizzazione credo ...
Prova di Induction, Big O, ricorsione, divisione e conqure, Graph Theory, blah blah .. argh!
Il compilatore per me è stato facile, perché abbiamo dovuto prendere la teoria degli automi. ^^
Mi piacciono le tue risposte (e non ho dimenticato di votarle), come compilatore, kernel, ecc., Ma la maggior parte dei programmatori non ha mai incontrato questi problemi. C'è un problema un po 'più semplice, ma più comune: concorrenza - thread, blocco. È molto facile scrivere un programma che produca errori magici, se si commette anche un piccolo bug nell'architettura di concorrenza.
Quindi, dico, non è il problema più difficile nell'informatica, ma poiché è comunemente usato, è pericoloso.
Programmazione orientata agli oggetti
Probabilmente è perché mi sono tagliato i denti su FORTRAN e APL, ma il passaggio da linguaggi strettamente procedurali a oggetti è stato qualcosa con cui ho lottato per anni. Non aiuta i cosiddetti "esperti" a scrivere articoli ed esercitazioni contrastanti su cosa significhi essere orientati agli oggetti e sui modi migliori / adeguati per costruire programmi orientati agli oggetti.