Materie CS che un laureando deve conoscere [chiuso]


34

Al college, non sono mai stato interessato alla teoria. Non l'ho mai letto. Non importa quanto ci provassi, non ero in grado di leggere cose e non sapevo cosa stesse realmente accadendo praticamente. Come ad esempio, nel mio corso sulla teoria degli automi, il mio professore mi ha detto tutto ciò che è probabilmente correlato all'aspetto matematico di esso, ma nemmeno una volta ha menzionato dove sarebbe stato usato praticamente. Questo è solo un esempio.

Sono riuscito a passare il mio college e anche internato con una società, dove ho fatto un progetto e per fortuna non si sono preoccupati dei miei voti, dato che erano al di sopra della media.

Ora, sono interessato a sapere quali argomenti uno studente CS deve assolutamente e positivamente conoscere? Soggetti che possono avere rilevanza nel settore. Questo perché ho un po 'di tempo libero tra le mani e mi aiuterebbe a conoscerli meglio.

Quali sono i tuoi suggerimenti? Come per uno, gli algoritmi sono un argomento.


3
Le espressioni regolari sono basate sulla teoria degli automi e ti aiuteranno se dovessi mai analizzare qualcosa. Ho fatto e imparato cose a scuola che si sono rivelate irrilevanti per i lavori che ho svolto, ma questo dice almeno tanto su ciò su cui ho lavorato quanto su quello che ho imparato. Nulla di ciò che ho imparato sarebbe inutile sul campo in ogni circostanza.
David Thornley,

2
Odio lavorare con il tuo tipo ... jk (sorta di). Se fossi in te, mi prenderei prima il tempo di rivedere le cose che dovresti sapere da scuola - in questo modo non sembreresti un idiota alla tua prossima intervista. Dopo di ciò imparerei una quantità ragionevole di strutture di dati e algoritmi che sembrano essere utilizzabili in un mondo reale. Devi capire dove vuoi essere. Se sei uno sviluppatore di giochi, probabilmente avrai bisogno di algebra lineare, grafica 3d, geometria computazionale. In generale, è necessario rivedere al minimo i dati str, alg, database, os e compilatore e continuare a studiare.
Giobbe

È difficile nominare una particolare applicazione per la teoria degli automi nello stesso modo in cui è difficile nominare una particolare applicazione per l'aritmetica. Un'esagerazione, forse, ma non così tanto. I diagrammi di stato sono spesso utili e manipolarli nel codice è utile per vari scopi. Gli alberi delle decisioni (minimizzati in digrafi) sono un esempio relativamente recente per me, e ho anche avuto bisogno di usare modelli statali (in forma canonica) come chiavi nei contenitori. Se non riesci a vedere le applicazioni all'interno delle applicazioni, pensa in termini di aggiunta di un livello di riferimento indiretto: generazione di codice.
Steve314,

1
Di seguito troverai molte ottime risposte CS, ma penso che limitando la tua domanda in questo modo manchi un paio delle cose più utili che ho visto in 15 anni da quando ho ottenuto il mio BSCS, ciò che ha differenziato la gente che hanno fatto bene nel settore: capacità di comunicazione e lavoro di squadra in piccoli gruppi. A quanto pare sciocco, vai al dipartimento di discorso / lingua / teatro e prendi una lezione come "comunicazioni per piccoli gruppi" o "leadership / gestione di gruppo / gruppo". Anche se non hai intenzione di fare il management, le competenze che acquisisci ti renderanno un ingegnere e un membro del team migliori.
cabbey,

Risposte:


41

Che ci crediate o no, una delle cose che si sono rivelate di importanza cruciale per me nella vita successiva è stata la costruzione del compilatore. Non è la versione moderna di Namby-Pamby che usa Lex e Yacc, questo è per i manichini.

Costruzione di un vero compilatore in cui scrivi da zero il tuo scanner e parser di simboli.

Questo è qualcosa che pensavo non avrei mai più usato. Ma negli ultimi 20 anni quel corso ha dimostrato il suo peso in oro 4 volte. Per ogni elaboratore di comandi che ho dovuto scrivere, ogni scanner di messaggi in arrivo, ogni dispatcher di utenti, ogni interprete di script ha usato i principi di quel corso. Fallo in questo modo e la vita è dolce, chiara e semplice. E ho anche dato tutte le informazioni a un collega che non l'aveva fatto - doveva effettivamente scrivere un compilatore per una macchina astratta. Che potrei aggiungere ha avuto molto successo commerciale.

Se dovessi salire e ringraziare un docente del corso universitario in una qualsiasi materia, sarebbe questo. Senza quello sarei passato ma le mie soluzioni sarebbero state molto più brutte.

(E prima che qualcuno salti in piedi e dica "beh, avresti potuto usare lex e yacc ..." la risposta è, forse - dipende molto dal sistema. In alcuni casi i linguaggi di programmazione non erano C (es. PL / M e Ada), in alcuni casi non erano disponibili per la piattaforma Lex o Yacc prontamente disponibili. Conoscere le basi significa che una soluzione è a portata di mano invece di stringere la mano cercando di capire come piegare qualche strumento per adattarsi al problema.)


6
I compilatori +1 sono stati uno dei miei corsi preferiti di uni ed è sempre utile. Ho usato raramente lex / yacc / bison, i fondamenti sono molto più concreti.
Orbling

Sono totalmente d'accordo, anche se per un motivo diverso. Conoscere come scrivere il generatore di codice - anche se ho usato Lex e Yacc - è stata la mia prima e migliore immersione nella programmazione orientata agli oggetti.
Peter Turner,

Puoi (e dovresti sapere ANCHE) scrivere il generatore di codice in semplice C, o in qualche altro linguaggio non OO. Quindi è una lezione su come scrivere pezzi di codice procedurale molto grandi e suddividere la generazione di parser / scanner / codice in fasi ragionevoli e comprensibili.
quick_now

I compilatori +1 incorporano così tanti modelli e principi che ti permetterà di vedere il design e il codice in una luce completamente diversa dopo averlo fatto.
Andrew T Finnell,

2
"Questo è qualcosa che pensavo non avrei mai più usato." Se avessi un dollaro ogni volta che lo dicessi a me stesso quando ero più giovane ...
Nick Spreitzer,

37
  1. Strutture dati / algoritmi, in particolare i grafici. La quantità di situazioni del mondo reale in cui sono riuscito a utilizzare algoritmi relativi ai grafici è stata una sorpresa per me. Concentrati sulla conoscenza delle caratteristiche di quando una struttura di dati o un algoritmo è appropriato. Essere in grado di vedere un problema e sapere ad esempio di utilizzare la programmazione dinamica / algoritmo goloso è importante e può farti risparmiare un sacco di tempo.

  2. Conoscenza operativa della complessità computazionale. Non devi sapere qual è il limite inferiore del radix sort ma sapere come capire quale sia il tempo di esecuzione peggiore di qualcosa che scrivi è importante, specialmente per i progetti con prestazioni critiche.

  3. Concetti di sistema operativo. Gestione della memoria, Scheduler, ecc. Ogni sviluppatore dovrebbe davvero avere una solida conoscenza dei sistemi operativi dato che il codice che scrivi interagisce costantemente con esso.

  4. Netsec. Ho incontrato pochissimi sviluppatori che hanno una solida conoscenza dei problemi di sicurezza di base con lo sviluppo (overflow del buffer, xss, SQLI, ecc.). Questo è davvero un must se vuoi avere successo nel settore. È fantastico se riesci a scrivere la prossima cosa importante, ma non avrai molti utenti a lungo se non proteggi i loro dati.

  5. Paradigmi di programmazione. Conoscere le caratteristiche e le differenze tra programmazione OO / funzionale / procedurale. Una delle migliori lezioni di laurea che abbia mai avuto è stata la scrittura di 20 semplici interpreti di istruzioni per fortan, schema, prologo, ecc. Nelle stesse lingue. Solo l'esposizione stessa può davvero aiutarti a comprendere i concetti fondamentali dello sviluppo del software.


1
+1 L'intero elenco è praticamente richiesto, (4) in particolare è sempre così importante nell'era moderna distribuita.
Orbling

1
+1 su Strutture dati / Grafici. Il numero di programmatori che conosco che non sa come usare correttamente un Hashtable o perché un elenco collegato invece un semplice array in alcuni casi mi sorprende ogni giorno.
Machado,

+1 per i paradigmi di programmazione. Una buona comprensione dei contrasti tra i diversi tipi di lingue aiuta molto.
apoorv020,

19

Soddisfare i requisiti di laurea non è necessariamente sufficiente per essere il miglior informatico che puoi essere. Per un tipico curriculum universitario, ecco le prime dieci cose che dovresti essere sicuro di imparare:

  1. Le basi dell'economia - Un corso introduttivo su argomenti come complementi e sostituti è vitale per lavorare nella grande economia, o semplicemente per comprenderla. Mentre il concetto di un Bene Giffen non ti aiuterà necessariamente, conoscere le esternalità lo farà. Potrebbe anche aiutarti ad apprezzare il fatto che più situazioni sono vantaggiose per te di quanto tu possa immaginare.

  2. Come scrivere una prova - Tutti i maggiori in informatica dovrebbero sapere come scrivere una prova. E la matematica discreta, mentre fa parte di una colazione ben bilanciata, non conta. [L'induzione è solo una tecnica di dimostrazione e puoi cavartela senza sapere molto sulle prove.] Per scrivere prove è necessario un corso di algebra o di analisi reale. E per algebra intendo la teoria dei gruppi o l'algebra astratta, non il corso che hai seguito al liceo. Per il massimo beneficio, prendi algebra e analisi reale nello stesso termine.

    Perché è essenziale scrivere prove? Perché è programmazione! Pensa a quando hai imparato a programmare per la prima volta: se un'attività richiedeva unife un ciclo, potresti non aver avuto alcuna intuizione su dove metterli in relazione tra loro. Ma ora lo stesso compito sarebbe del tutto naturale. Scrivere una prova è molto simile. C'è una serie di trucchi che impari e una volta imparati le cose sembrano piuttosto diverse.

  3. Come scrivere - Le abilità comunicative scritte sono essenziali, sia che tu lavori nel settore o nel mondo accademico. È meglio se riesci a trovare un corso di meccanica e non un corso di scrittura che tratta effettivamente un argomento diverso. Cioè, molte scuole cercheranno di rendere i corsi di scrittura più pertinenti o interessanti rendendolo su un argomento speciale. Prova ad andare per la versione "noiosa" del corso.

  4. Probabilità e statistiche - Ci sono alcune cose che raccoglierai correttamente seguendo un corso. Insieme ai requisiti principali di CS (che dovrebbero fornire matematica discreta, calcolo a variabile singola e variabile multipla e algebra lineare) e algebra e / o analisi reali, la raccolta di statistiche probabilmente fornirà un minore in matematica. L'apprendimento delle statistiche può aiutarti a lavorare con altri scienziati sui loro progetti.

  5. L'attuale hot topic - Nei decenni precedenti, potrebbe essere stato un database o una programmazione orientata agli oggetti. Oggi potrebbe essere la programmazione web o l'architettura orientata ai servizi. Qualunque sia la moda attuale, assicurati di seguire un corso. Se non altro per vedere di cosa parla la moda.

  6. Il problema di arresto - La maggior parte dei problemi non può essere risolta dalle macchine. Questa è un'idea abbastanza profonda che la nostra cultura ha assorbito così bene da non sembrare più scioccante. Lo stesso vale per la radio, Goedel e la bomba atomica; non è stato fino all'arte postmoderna e alla guerra fredda che abbiamo potuto affrontare ancora una volta questi concetti. Tuttavia, un corso di teoria della calcolabilità può re-sensibilizzarti a questa prova piuttosto sorprendente.

  7. Pura programmazione funzionale - Molto probabilmente non passerai alla pura programmazione funzionale, a meno che non effettui ricerche o lavori per poche aziende selezionate, ma sapendo che ti aiuterà a essere un programmatore migliore. Il motivo è che imparerai molte nuove forme di astrazione e concetti come numeri e continuazioni e monadi della Chiesa e, sì, ricorsione, e questi strumenti possono essere applicati anche al tuo prossimo programma Java.

  8. P e NP - OK, questo è già sul tuo percorso critico, ma attenzione comunque. Vuoi essere sicuro di poter correggere qualcuno quando erroneamente chiamano NP "non polinomiale". Come se!

  9. Gli argomenti del corso che sicuramente odierai : questo potrebbe essere un corso CS che trovi troppo basso livello, troppo teorico o un corso non CS che trovi troppo discutibile, troppo duro o troppo noioso . Se un corso come questo sembra essere un problema per te e ti ritrovi a spiegare agli altri perché sei così felice di non dover seguire così e così, dovrebbe dirti che imparerai molto seguendo il corso! Forse non imparerai i materiali del corso, ma imparerai a conoscere i tuoi limiti e forse di più sulle giustificazioni che fai a te stesso. [Suggerimento: di solito sono deboli.]

  10. Il corso non CS che ti piacerà sicuramente - Alla fine, dovresti divertirti. Questo è il corso da cui probabilmente otterrai il minimo, ma seguilo comunque. Fallo una volta. Se ti piacciono molti corsi, allora buon per te, ma assicurati che non ostacoli il resto dei corsi in questo elenco.

Il mio approccio qui è stato pratico, basato su corsi che puoi effettivamente seguire. E mi sono concentrato su obiettivi di apprendimento che probabilmente verranno appresi. Nota: questa risposta è stata adattata da un mio post sul blog su Dieci cose che ogni specialista di informatica dovrebbe imparare .


Una spiegazione per il downvote sarebbe utile. Forse posso cambiare la mia risposta, e poi puoi cambiare idea.
Macneil,

Professore, non voterei la tua risposta ma c'è una cosa con cui mi metterò in discussione. Scrittura di prova: fino ad oggi non posso ancora scrivere una prova discreta a meno che tu non mi abbia chiesto di provare che un numero è pari o dispari. Non riesco a vedere la connessione tra questo e l'industria. Forse mi manca il "Problem Solving Aspect?". Non potrei mai avvolgere il cervello attorno all'induzione matematica o al Lemma pompante. Non penso che mi stia rallentando.
Bryan Harrington,

Scrivere una prova è come scrivere un programma. Imparare a dimostrare che un * 0 = 0, per esempio, è un po 'come il FizzBuzz della matematica (beh, forse è un po' più difficile). All'inizio sembra intimidatorio, ma presto raccogli i piccoli trucchi, proprio come hai fatto quando hai imparato a programmare. Le prove possono avere diverse strutture che possono aiutarti a pensare in modo ricorsivo e strutturale. Come ho detto, un corso di matematica discreto non lo taglia per imparare prove reali. Per questo hai bisogno di una teoria di gruppo o di un'analisi reale.
Macneil,

Sebbene la conoscenza dei complimenti sia certamente utile, credo che una conoscenza dei complementi sia più rilevante per l'economia.
ijw

1
@ijw: per quanto riguarda l'economia per gli studenti CS, Joel ha una buona discussione che vale la pena leggere: joelonsoftware.com/articles/CollegeAdvice.html
Macneil,

8

Dopo aver parlato con un paio di rappresentanti dell'azienda e amici che hanno avuto molte interviste:

  • Banche dati
  • OOP
  • algoritmi
  • Strutture dati

tendono ad essere "mosti" per i nuovi assunti (o come hanno detto, corsi "altamente raccomandati").

Altri corsi che possono essere utili sono la sicurezza del computer, l'assemblaggio e l'architettura della macchina. Molti dei miei professori mi hanno consigliato anche un corso di compilazione. Inoltre, se hai tempo, consiglio vivamente corsi di matematica come la teoria dei grafi, la matematica discreta e la combinatoria. Apprendi molte abilità di ragionamento in quelle classi su cui la maggior parte dei corsi CS sorprende, ma finisci per essere molto utile quando scrivi programmi molto complessi.

Spero che sia d'aiuto!


1
Sarebbe d'accordo con OOP e le strutture di dati.
apoorv020,

4
Strutture di dati di base ... così importanti. Più importante, penso, di OOP. Devi essere in grado di pensare a come archiviare e organizzare le informazioni. E se su un sistema embedded il layout in memoria delle tue strutture dati è roba vitale o mortale.
quick_now

3
+1 per le lezioni di matematica. Ti aiutano anche a imparare a tenere traccia di grandi problemi / sistemi.
Michael K,

1
La rete è buona da fare anche.
Keyo

OOP? Puoi programmare in Haskell o C senza OOP ... Ti darò che è ampiamente usato, ma non credo sia fondamentale. L'esposizione a vari paradigmi, d'altra parte, sembra abbastanza utile.
Matthieu M.

6

Dipende in gran parte da ciò che si prevede di fare con il grado. Sembra che la maggior parte delle major CS finiscano per essere ingegneri del software di qualche tipo. Con questo in mente, non sono davvero sicuro del motivo per cui più persone non si occupano solo di ingegneria del software. Ho il sospetto che non ci siano abbastanza programmi di ingegneria del software disponibili soprattutto nelle istituzioni pubbliche.

Vengo da un terreno incastonato. Ogni singola persona con cui lavoro aveva una laurea EE o una laurea CE e questo è in parte dovuto al fatto che quando i "vecchi" quando andavano al college non c'erano molti programmi CE disponibili. Quindi, è abbastanza ovvio che se si desidera lavorare nel campo incorporato è auspicabile uno sfondo hardware.

Indipendentemente dal campo in cui vuoi lavorare, credo che ogni programmatore dovrebbe seguire un corso di programmazione di assemblaggio. Non potresti mai utilizzarlo, ma insegnerà esattamente cosa sta succedendo a livello di processore durante una chiamata di funzione, come vengono gestiti gli interrupt, come è strutturata la memoria o come vengono utilizzate le diverse modalità di indirizzamento. Credo che tutto ciò ti renderà un programmatore migliore.

Inoltre, anche se potrebbe non essere evidente, alcuni di questi sono tutti argomenti importanti quando si considerano Strutture dati e algoritmi per una piattaforma specifica.


+1 perché una laurea in informatica ti dà esperienza con una vasta gamma di materie / tecnologie. Assicurati solo di prestare attenzione al corso di progettazione del software.
Sig. Ant il

+1 Per il montaggio, è sempre saggio capire veramente cosa sta succedendo in fondo alla pila. Sarebbe bello se anche tutti conoscessero l'hardware, ma per molti sarebbe un passo troppo avanti.
Orbling

5

Ci sono 2 modi per rispondere alla tua domanda. Lasciami provare entrambi. Il primo modo è guardare le cose da un potenziale punto di vista del mercato del lavoro, capacità di codifica ecc. Quindi ecco la mia lista:

  1. Struttura dati
  2. Algorithm Analysis
  3. Programmazione orientata agli oggetti
  4. O un corso specifico in C ++ o Java
  5. Sistemi operativi
  6. Progettazione dell'interfaccia utente
  7. Programmazione parallela

Il secondo modo è guardare le cose da una prospettiva un po 'astratta, e chissà, potrebbe anche essere un po' filosofico. L'elenco che segue potrebbe non avere le competenze più richieste dal mercato del lavoro, ma sono abbastanza sicuro che quando uscirai da questi corsi avresti un apprezzamento più profondo dell'arte dello sviluppo del software.

  1. Teoria del linguaggio finito e degli automi
  2. Costruzione del compilatore
  3. Teoria dei grafi
  4. Intelligenza artificiale

Non elencare solo una serie di corsi che secondo te ritieni essenziali, fornire ragioni ed esperienze che hai dettato alla tua lista.

2

Aggiungerei anche le pratiche di ingegneria del software o di progettazione all'elenco, sebbene il loro contenuto sia generalmente raccolto dagli studenti del settore.

Inoltre, secondo me (non supportato da molta esperienza), le aziende non vogliono davvero la maggior parte delle cose teoriche insegnate in corsi come database ecc., Vogliono che le persone capiscano e siano in grado di usare queste cose.

EDIT: A causa del downvote, ho voglia di spiegare la mia risposta. Sono uno studente di informatica dell'ultimo anno e la mia esperienza si basa sul mio tirocinio e colloqui di lavoro con aziende leader del settore. Nella mia esperienza, alle persone viene raramente richiesto di utilizzare algoritmi complicati o di codificare strutture di dati molto complicate nelle interviste o nei lavori.

Più utile se è possibile creare e utilizzare database, utilizzare il controllo del codice sorgente, sapere come eseguire correttamente il debug, sapere come utilizzare i modelli di progettazione, ecc. Tuttavia, come ho già detto, queste competenze sono generalmente acquisite nel settore e non coperte dai corsi. Le pratiche di ingegneria / progettazione del software implicano in genere la costruzione di un progetto di medie dimensioni, molto utile per apprendere tutte queste abilità.


Fornisci maggiori dettagli sulle tue esperienze e sul perché qualcuno dovrebbe seguire questi corsi.

@Mark: puoi spiegare la logica alla base del downvote?
apoorv020,

@ apoorv020 senza spiegare perché stai raccomandando Ingegneria del software o Pratiche di progettazione, la tua risposta non è utile. La tua modifica non spiega ancora perché le stai raccomandando.

@ apoorv020 l' unico valore riscatto per l'adozione di Software Engineering o Design Practices è che di solito costruisci un progetto di medie dimensioni (qualunque cosa significhi)? Che cosa hai imparato personalmente seguendo questi corsi?

Sono buoni a sapersi, ma questi non sono argomenti CS.
Thomas Owens

2

Cose che ho imparato al college e che uso ogni giorno:

  • Metodologia di progettazione orientata agli oggetti
  • Modelli di progettazione
  • Espressioni regolari
  • Algoritmi e analisi di base
  • Strutture dati

Vorrei aver seguito un corso di database. (Mi sono preso abbastanza da sopravvivere da quando mi sono laureato, ma vorrei sapere di più.) Vorrei anche insegnare il controllo della versione - è onnipresente, estremamente utile e completamente ignorato nel curriculum della mia scuola.

Ho dovuto seguire diversi corsi di matematica. Non uso il calcolo da quando mi sono laureato. Vorrei seguire un corso di statistica. (Ancora una volta, ho preso abbastanza da sopravvivere dalla laurea, ma vorrei sapere di più.)

Oltre il dipartimento CS, segui un corso di scrittura. Buone capacità comunicative scritte sono essenziali per il successo.


+1 Sorpreso dal fatto che i database non fossero obbligatori nel tuo corso, generalmente considerati un componente essenziale.
Orbling

Era. Ne sono uscito per un tecnicismo e me ne pento.
pwc,

@Orbling: spesso i piccoli dipartimenti (al contrario di quelli delle grandi scuole statali) semplicemente non hanno abbastanza docenti per richiedere tutti gli argomenti principali. Nella mia scuola, ad esempio, i database erano elettivi.
Macneil,

@Macneil: Nel mio corso, il corso sui database primari era un prerequisito (che copriva tutte le basi: modellazione ER, moduli normali, SQL (non solo SQL di base, composto / nidificato, ecc.), Posizionamento dell'indice, ecc.), Quest'ultimo, più complesso , i corsi di database erano elettivi (penso che ce ne fossero tre in totale). Non ho mai scelto di prenderli, dato che immaginavo che fosse roba che avrei potuto assorbire indipendentemente più facilmente di altri corsi che mi sarei perso. Penso che ho preso avanzato OPPURE invece.
Orbling

@pwc: scommetto, ti ricordi perché ne sei uscito, al contrario di come?
Orbling

2

Ci sono molti corsi importanti, a seconda della direzione in cui stai pianificando di andare. Tuttavia, supponendo che tu possa programmare, il corso più importante deve essere:

  • Strutture dati e algoritmi

    Praticamente tutto nell'informatica torna alla gestione dei dati tramite algoritmi. Presta particolare attenzione agli array e agli hashtable, poiché sono di gran lunga le strutture di dati più utili di uso comune, ma gli elenchi e gli alberi e i grafici (beh, gli elenchi sono tipi limitati di alberi e gli alberi sono tipi limitati di grafici) anche essere importante. Inoltre, comprendere gli algoritmi è vitale per produrre codice che non sia terribile. (Altrimenti farai cose terribili, come usare un algoritmo O ( n 3 ) in cui farà uno O ( n log n ).) Se il tuo diploma CS non ha un DS + A obbligatorio su di esso, non è CS. O ingegneria del software. O anche solo la programmazione.

A parte questo, il corso che ho trovato più utile nel corso degli anni in più campi è stato:

  • Concorrenza

    Ci sono molti aspetti della concorrenza, ma mi aspetto una comprensione della differenza tra memoria condivisa e passaggio di messaggi. Vorrei anche che ci fosse una forte copertura delle strategie di blocco (mutex, semafori, ecc.) E delle transazioni.

    Questo è vitale per comprendere la parallelizzazione, ovviamente, ma è anche fondamentale per qualsiasi cosa distribuita (ad esempio, scrivere un servizio che è esposto a Internet, anche se è a thread singolo poiché i client saranno comunque asincroni). Comprendo che è utile anche per scrivere giochi (che in genere sono multithreading) e lavorare con dispositivi integrati.

A parte questo, penso che sia nel miglior interesse della maggior parte dei laureandi che siano esposti al maggior numero possibile di idee diverse. Molti linguaggi di programmazione e paradigmi. Molte aree di applicazione diverse. Una quantità ragionevole di matematica (di nuovo, perché è utile così spesso) e anche una certa esposizione a fattori umani e psicologia (perché qualsiasi software che interagisce con gli utenti ha a che fare con le persone). Dopo tutto, non sai mai esattamente cosa farai in futuro, quindi pianificare la flessibilità è un'ottima strategia di vita.


1

Quando ero al college c'erano alcuni argomenti per i quali non riuscivo a vedere un uso nella mia vita reale e a volte quell'intuizione è stata dimostrata giusta (i metodi formali sono davvero pratici solo per problemi banali nella maggior parte dei casi) e altre volte è stato del tutto sbagliato (la notazione Big-O è molto utile) quindi immagino nel complesso che il mio io più giovane fosse in parte giusto.

Se vuoi prepararti per il mondo reale, oltre alle cose che @ K-Ran raccomanda sopra, ti suggerisco di leggere il Codice completo e di usarlo come base per una ricerca più approfondita su qualsiasi argomento che trovi difficile o che non ritieni di avere sufficientemente coperto.


A volte ho trovato utili metodi formali, sebbene ovviamente solo su piccoli componenti. Ho pensato a Dijkstra et al. come dire qualcosa del tipo "Se sei un matematico perfetto, puoi essere un buon programmatore".
David Thornley,

Ho il sospetto che se stai lavorando su un codice che dipenderà da te, in pratica devi avere una solida conoscenza di queste cose. Ma per il lavoro che ho svolto non è mai stato necessario. Se ne avessi avuto bisogno ora, dovrei tornare indietro e riapprenderlo da zero ...
Glenatron,

Cose come Z sono utilizzate solo per software mission-critical in organizzazioni in cui, come dici tu, le vite sono a rischio. Tuttavia, penso che impararli instilli una consapevolezza molto maggiore della correttezza del codice e dia profondità al pieno sostegno su specifiche di ogni tipo. A volte ciò che impari non è per se stesso, ma aiuta a capire cosa sta sopra.
Orbling

Pensa a come costruire blocchi più grandi che siano solidi. Se hai dimostrato che i tuoi componenti sono corretti (e li hai testati per trovare gli stupidi errori che hai fatto nella progettazione e nella prova), hai meno cose di cui preoccuparti quando scrivi e esegui il debug.
David Thornley,

1

Penso che dovresti studiare quanto segue:

Sistema operativo: - Anche se potrebbe non essere necessario che funzioni come programmatore, ma vale la pena sapere come funziona un sistema operativo e ci si aspetta da un laureato in CS. Qualsiasi buon libro può aiutare.

OOP: - Questo è pane e burro. Un dovere assoluto. Libri se vuoi chiedere: Il tuo primo libro dovrebbe essere: - prima testa OOAD, quindi puoi scegliere il libro di Grady Booch e Ivar Jacobson

Strutture dati e algoritmi: - Molto importante per sviluppare il pensiero logico e la mentalità.

Per me questo è abbastanza. Non è mai troppo tardi. :)


1

Come qualcuno che intervista regolarmente i candidati per la programmazione di lavori e qualcuno che dopo essere stato nel settore per 12+ anni si sente ragionevolmente realizzato, suggerirei quanto segue

  • Database Design & SQL: è sorprendente il numero di programmatori che non conoscono l'SQL semplice e quelli con buone capacità SQL sono inestimabili. Essere in grado di progettare un buon database potrebbe non essere utile in una società che ha una struttura di database impostata, per start-up e aziende in fase di cambiamento, è DEVE!
  • Modelli di progettazione. Ti aiuteranno semplicemente a prendere decisioni migliori sul buon design
  • OOP: Questo è di solito un pre-req per la maggior parte dei corsi, ma aiuterà.
  • Algoritmi: poiché così poche persone sanno cos'è la ricorsione, figuriamoci capire quando potrebbe salvare un sacco di codifica complessa
  • Strutture di dati: la maggior parte delle lingue moderne si occupano di queste cose per te, ma capirle è la chiave per una buona progettazione.

Quindi, qualche lavoro extra curriculare, leggi:

  • Libri con certificazione. Spesso ti insegnano il tipo di sintassi e gli operatori sottostanti. È molto più importante SAPERE perché stai facendo qualcosa, piuttosto che "perché funziona", che è così banale.

1

È DIPENDENTE , non c'è una sola risposta valida per questa domanda.

Il programmatore è un mondo generale per identificare qualcuno che scrive software per computer.

Ora, là fuori c'è un software di ogni tipo. Ad esempio, usando Wikipedia come fonte di generalizzazione possiamo incontrare 3 grandi generalizzazioni :

  • programmazione del sistema
  • software di programmazione
  • software applicativo

Nel primo campo la programmazione del sistema sviluppa driver di dispositivo, sistema operativo, server, quindi ad esempio puoi seguire un corso di sistema operativo.

ma per quanto riguarda il software di programmazione ? qui come ha scritto wikipedia puoi codificare compilatori, debugger, interpreti, linker, editor di testi, quindi può essere utile un corso di automazione di teoria, teoria del linguaggio, linguaggio e compilatori.

Non possiamo parlare di software applicativi di alcun tipo:
- videogiochi: algebra, fisica, corsi orientati agli oggetti?
- software matematico: corsi di matematica?
- editing di immagini: corsi di matematica, fisica, algoritmo?
- automazione industriale: matematica, fisica, algoritmo, corsi di robot?
- software medico: biologia, medicina, cos'altro?
- molte cose qui: molti corsi qui.

Come puoi vedere, c'è molto che puoi seguire e diventerà utile per il tuo lavoro.

Nella mia esperienza, sono un ingegnere del software di sistema e software applicativo nel campo della sicurezza (vuoi seguire un corso sulla sicurezza?), A partire da una piccola esperienza nella programmazione sto diventando più interessante negli algoritmi e nel sistema distribuito e ancora mi sento scomodo nella semplicità dell'applicazione generale che ho scritto (sniffer, sistema di rilevamento delle intrusioni di rete, rivelatore e rivelatore di protocollo, ecc.).

Come hai imparato acutamente in informatica teorica! hai seguito questo corso? : P

Hai imparato, ad esempio, che tutto il linguaggio del computer può essere inserito in una serie di funzioni matematiche calcolabili e, ad esempio, se la tua esperienza prende il mio stesso percorso, presto ti sentirai a disagio in questa piccola serie di calcoli e come me puoi iniziare a vedere come si sta sviluppando il software non è così accattivante e sorprendente perché lo stesso DESIGN PATTERN ritorna di nuovo (hai seguito corsi di design pattern?) e ad esempio puoi iniziare a interessarti maggiormente del PERCHÉ e COME il linguaggio può essere tradotto in funzione matematica e iniziare a impara che il linguaggio del computer non è così complesso! ad esempio potresti presto essere più sorpreso della persona e della psicologia e puoi ottenere più interesse a riguardo e diventare un buon project manager! hai seguito i corsi sul ciclo di vita del software?

Allora, qual è il corso MUST-HAVE nella tua carriera in CS?

Ti suggerisco di imparare tutto ciò che puoi imparare in tutti i campi, specialmente nel campo della teoria, perché in un campo di lavoro comune ti senti presto davvero annoiato dalla poca complessità che ti circonda e, diventando un lavoratore a tempo pieno, hai davvero meno tempo da imparare come funzionano davvero le cose e molto più tempo per vedere come le persone con una forte conoscenza teorica hanno proiettato le cose per funzionare e ti danno la possibilità di programmare per ottenere cibo a casa.

c'è un senso sbagliato della realtà nell'informatica. l'informatica, ad esempio, a volte è molto lontana dallo sviluppatore di software.

dai un'occhiata alla spiegazione di Wikipedia.

divertiti con la vita :)

i miei 2 centesimi.

scusa per il mio inglese davvero pessimo.


1

Senza dubbio la prima cosa in cui gli studenti CS dovrebbero essere fluenti è l'inglese.

Senza una comprensione dell'inglese sia parlato che scritto, sarai per sempre in svantaggio.

Guarda la miriade di domande che arrivano sui siti Stack. Troppi di loro sono difficili da decifrare. Alcune persone usano un mix di l33t, messaggi di testo (non sono sicuro del termine corretto). Altri fanno una dichiarazione e semplicemente aggiungono un punto interrogativo mentre mancano importanti piccoli pensieri come verbi o aggettivi.

Se non riesci a comunicare, non sarai in grado di farti capire molto meno di capire ciò che gli altri stanno dicendo.

Tutto il resto sono solo dettagli. Se riesci a comunicare, hai un'intelligenza almeno nella media e puoi capire cosa leggi, anche tu puoi avere una programmazione di carriera di successo.


1

Vengo a questo da una prospettiva leggermente diversa in quanto non mi sono laureato in CS, mi sono laureato in ingegneria elettronica (con un minore nel mondo degli affari).

Sulla base di ciò, penso che un elenco di cose che devi capire sia relativamente breve in quanto io (e molti altri non laureati in CS) sopravvivo felicemente senza sapere nulla sulla progettazione del compilatore o simili.

Cosa direi che ho raccolto che trovo utile:

  • Progettazione RDBMS - Gli RDBMS si trovano dietro la maggior parte dei sistemi e dei siti e dovresti capire almeno le basi di ciò che sta succedendo (ho imparato questo sul lavoro).
  • Progettazione dell'interfaccia utente di base: tutti i migliori programmatori con cui ho lavorato potrebbero produrre un'applicazione utilizzabile che non era brutta da morire. Tranne uno, ma è l'eccezione che dimostra la regola.
  • Qualche programmazione di base - e intendo di base. Ho imparato un po 'di C (per l'elaborazione di immagini e sistemi integrati), un po' di linguaggio di assemblaggio (che avevo dimenticato a poche settimane dal completamento del corso) e un po 'di Pascal (un corso di informatica di base era standard per tutti gli ingegneri). Durante l'intervista sono sbalordito dal fatto che pochi laureati in CS possano davvero programmare in qualche modo le organizzazioni commerciali considererebbero utili, quindi non mi aspetto molto, ma mi aspetto che conoscano le basi.
  • Logica: l'ho imparato attraverso l'elettronica digitale, i matematici attraverso la teoria, i laureati in CS attraverso la programmazione, ma per quanto tu lo impari, dovresti avere una buona comprensione di ciò che ne deriva.
  • Abilità comunicative - Ho fatto un paio di corsi all'università al di fuori della mia laurea, abilità di presentazione e assertività. Molto buon senso, ma non fa mai male sentirsi dire cose sensate un paio di volte.
  • Le basi del business e della contabilità. Alcuni programmatori si comportano come se non importasse, ma secondo me è importante per chiunque lavori in un'azienda: ecco come funziona il gioco e controllerà la tua vita, quindi perché non dovresti sapere almeno i rudimenti di come e perché accadono le cose?

E se hai la possibilità di imparare qualcosa sulla gestione dei progetti, allora non sarebbe male, ma in molti casi ha insegnato abbastanza male all'università ed è qualcosa che imparerai un po 'sul lavoro semplicemente lavorando sui progetti.


0

Aggiungerei anche alcuni corsi di base di Risorse umane / Psicologia all'elenco.

Potrebbe sembrare un'aggiunta strana, ma parte del lavoro professionale è imparare a vendere te stesso e negoziare. Entrare nella tua prima "vera" intervista senza una solida conoscenza delle motivazioni del drone delle risorse umane è una ricetta per il disastro e probabilmente si concluderà con lo studente incastrato in uno stipendio basso.

Conosci il tuo nemico in modo da poterti proteggere.


-1

1 ° anno:

  1. OOP di base in un linguaggio di alto livello
  2. Strutture dati

2 ° anno:

  1. Compilatore, costruisci un semplice scratch da un modulo
  2. Concorrenza

3 ° anno:

  1. Algoritmo
  2. Sistema operativo, aggiungi funzionalità e miglioramenti a uno semplice
  3. Linguaggio formale

4 ° anno:

  1. Networking
  2. Sistema distribuito
  3. Interfaccia utente
  4. Compilatore avanzato
  5. Sistema operativo avanzato
  6. Intelligenza artificiale
  7. Computer grafica

Tali corsi dovrebbero fornire molta teoria e pratica di programmazione.


-2

È strano che nessuno abbia menzionato Computer Architecture.


Penso che l'architettura del computer sia importante per sapere se vuoi capire l'impatto delle cache di memoria, errori di pagina ecc.
apoorv020,
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.