Qual è la parte della teoria informatica che dovrei sapere? [chiuso]

27

Parlando come qualcuno con una laurea in ingegneria elettronica piuttosto che in informatica, qual è il un po ' di informatica che dovrei sapere per farmi diventare un programmatore vero mondo migliore?

(Per mondo reale intendo qualcosa che userò e trarrò vantaggio dal mio lavoro quotidiano come programmatore - ad esempio suggerirei che la comprensione della normalizzazione del database è più utile di quella di un tipo rapido per cui ci sono molte librerie).

    
posta Jon Hopkins 07.12.2010 - 11:01
fonte

18 risposte

52

Se devo scegliere solo un bit, che è una decisione difficile, direi di andare per la notazione Big O . Comprendere le implicazioni di O (n), O (ln n), O (n²), O (2 ^ n), O (n!) Ti aiuta ad evitare molti errori costosi, il cui tipo funziona bene nel ambiente di test ma fallisce disastrosamente nella produzione.

    
risposta data 07.12.2010 - 11:22
fonte
19

Questa è una domanda, a tutti verrà data una risposta diversa. Direi: la teoria della complessità è il pezzo più importante, che non impari direttamente come programmatore (come algoritmi e strutture dati), ma che cosa può avere un impatto sul tuo lavoro. Aiuta, se lo so, che un problema è di complessità cubica, so che si ridurrà di molto se si aumenterà la dimensione del problema.

    
risposta data 07.12.2010 - 11:15
fonte
12

Informazioni su strutture dati, algoritmi e complessità.

Non troppo per capire che una macchina non è una scatola magica con un potere illimitato. Non puoi lanciarci contro qualcosa e aspettarti che si scricchioli in pochi millisecondi. Ha dei limiti che conosci. Devi imparare a non testarli con il tuo codice.

Dai anche un'occhiata agli approcci comuni per risolvere particolari problemi di progettazione nella programmazione. Modelli di design vale a dire. Non adorarli basta prendere le idee che comunicano.

Anche la conoscenza della modellazione del database è essenziale.

Dopodiché sono solo linguaggi di programmazione, framework e librerie differenti che implementano o consentono di implementare i concetti principali. Raccogli ciò che ti piace e fai pratica con quelli.

    
risposta data 07.12.2010 - 11:07
fonte
7

Questo è un po ' di una domanda difficile.

Tutti gli aspetti dell'informatica sono importanti in un modo o nell'altro.

In terms of what you will benefit on a day to day basis, probably a generalised overview of how your code works "under the hood" from code to CPU.

Capire la Big O Notation è importante, e anche capire come il tuo codice possa essere eseguito è anche molto importante nelle situazioni del mondo reale.

    
risposta data 07.12.2010 - 14:35
fonte
7

Sì, questo mi ha fatto venire in mente per ore.

Nel processo, ho dovuto rimuovere alcune delle risposte comuni fornite qui.

NO LIST

  1. Notazione Big O (n) . Difficile metterlo qui, ma No, possiamo intuitivamente risolvere le inefficienze e confrontare diversi set di procedure senza aver nemmeno lontanamente ascoltato l'analisi algoritmica asintotica.

  2. Lingue funzionali No, un'unica famiglia di linguaggio è solo un modo per pensare ai problemi. Perché solo questo bit dovrebbe avere importanza?

  3. Problema di interruzione Alcuni sono troppo specifici e le persone hanno vissuto la vita senza sapere che esistessero.

  4. Ascolta Se non stai ascoltando, vivi in un mondo tutto tuo. Non necessariamente dannoso!

  5. Ciclo di sviluppo del software Nah! Possiamo ancora imbattersi in qualche incredibile software o sforzo eroico solista.

  6. teoria della complessità Immagino che questo potrebbe essere ma senza tutti i formalismi

That one bit of idea from Comp Science

Direi - " Abstractions Abstractions Abstractions ... ". Impara a riguardo. Vedi esempi intorno ad esso e impara come costruirlo usando. È ovunque. Tutta l'informatica, l'ingegneria e le applicazioni sembrano strati su strati di astrazione.

Una volta che lo sai, inizi a imparare a guardarti intorno.

Quando ne vedi qualcuno che usa list insertion in python e not append , sorridi perché sai che gli elenchi python sono costruiti usando l'astrazione dell'array dove gli inserimenti sono costosi e sono più economici.

Questo è solo un esempio.

    
risposta data 09.12.2010 - 08:48
fonte
4

Teoria degli automi e FSM. : -)

    
risposta data 07.12.2010 - 18:40
fonte
3

Casi di utilizzo competitivo delle strutture dati.

Ci sono situazioni in cui è richiesta una mappa con alberi rosso-nero per garantire le prestazioni e altre in cui non è possibile utilizzare un array, di nuovo per garantire le prestazioni. Sapere quando scegliere quale struttura dati è un'abilità inestimabile.

    
risposta data 07.12.2010 - 14:44
fonte
3

ci sono solo tre numeri che contano:

  • a zero
  • una
  • molti
risposta data 07.12.2010 - 15:19
fonte
3

La cosa più importante che ho imparato in CS (e come sviluppatore per molti anni e come architetto) è la capacità di risolvere un problema in base alla volatilità e non alla funzione. Tutti i buoni design isolano e incapsulano la volatilità. Tutti i buoni sviluppatori / architetti lo fanno intuitivamente anche se non lo hanno formalizzato nel loro modo di pensare. Un motivo enorme per il fallimento del progetto è la mancata soluzione di un problema sulla base della volatilità e dell'incapsulamento. Un fallimento nell'incapsulare la volatilità porta inevitabilmente alla fuga della complessità e del fallimento del progetto.

    
risposta data 07.12.2010 - 18:33
fonte
3

Il problema di interruzione

Il fatto che esistano problemi relativi al computer che semplicemente non può essere risolto da un computer.

    
risposta data 07.12.2010 - 19:07
fonte
3

Dovresti conoscere abbastanza teoria degli automi per essere in grado di sapere dove il problema che stai affrontando rientra nella gerarchia dei linguaggi formali. Da questo, puoi capire alcuni importanti usi pratici, come il perché non dovresti usare un REGEX per analizzare HTML (HTML ha bisogno di una grammatica context free per descriverlo), e perché ci vuole molto più tempo per compilare C ++ rispetto a Java o C # (C ++ richiede una macchina di Turing, mentre Java e C # possono essere descritti con grammatiche context free).

I livelli più importanti dei linguaggi formali sono, dal più debole al più strong:

  1. Lingue che possono essere analizzate da un automata finito, o da un REGEX (le implementazioni di REGEX con backreferences sono più potenti di questa categoria, ma non possono ancora analizzare tutto nella categoria 2)

  2. Lingue che possono essere analizzate da un automa con memoria di stack o una grammatica senza contesto.

  3. Lingue che possono essere analizzate da una macchina di Turing o da un automa con memoria ad accesso casuale.

risposta data 08.12.2010 - 17:12
fonte
2

Bene, potrei darti una risposta noiosa: teoria degli automi e teoria dell'informazione.

Oppure potrei dirti cosa ho imparato da un consulente hardware molto tempo fa:

  • "Abbastanza buono" non è abbastanza buono.
risposta data 07.12.2010 - 23:49
fonte
1

Il Ciclo di vita dello sviluppo del software è qualcosa che consiglierei di sapere se non lo fai già. Concesso che questo è stato introdotto in un secondo anno di corso di informatica ed è qualcosa usato ripetutamente all'interno di progetti software. Questo può essere utile per avere un'idea generale di come un progetto va dall'inizio alla fine, ma se vuoi approfondire ci sono metodologie come Waterfall o Agile che potresti studiare per ottenere una conoscenza più specifica.

    
risposta data 07.12.2010 - 15:58
fonte
1

Programmazione

Dal Dipartimento di Matematica e Informatica Hobart e William Smith Colleges arrivano Informatica 124 Introduzione alla programmazione :

Topics include control structures, objects, classes, inheritance, simple data structures, and basic concepts of software development.

Se non puoi programmare, non stai andando molto lontano nell'elaborazione del mondo reale.

E, sì, ho notato che sei programmatore. Questo per migliorare la tua conoscenza generale della teoria della programmazione e quali altri approcci ci sono disponibili.

È la programmazione informatica come la conosciamo?

In risposta al commento di @Thomas Owens, che ha sottolineato (giustamente) che la programmazione non è strettamente informatica, mi piacerebbe citare da Wikipedia Computer Science articolo:

... the focus of computer science is more on understanding the properties of the programs used to implement software such as games and web-browsers, and using that understanding to create new programs or improve existing ones ...

Quindi, mentre lo leggo, programmando stai dimostrando la tua comprensione della teoria della programmazione. Questo a sua volta dovrebbe aiutarti a creare un codice semplice ed elegante che sia una gioia per gli altri con cui lavorare.

    
risposta data 07.12.2010 - 14:23
fonte
1

Non sono d'accordo con Konrad Rudolph. C'è "Un po '" di informatica che dovresti sapere per farti diventare un "programmatore del mondo reale" migliore. Se non prendi nient'altro dalle risposte che stai ricevendo qui, considera almeno questo: Soddisfare i requisiti NON è lo stesso che soddisfare il cliente! Gli utenti finali cercheranno SEMPRE di usare il tuo programma in un modo che non hai mai pensato o codificato. SEMPRE, SEMPRE, SEMPRE.

Pertanto, per essere un programmatore migliore, è necessario innanzitutto ASCOLTARE. Ascolta il cliente. Ascolta i loro bisogni. Ascolta i loro desideri. E soprattutto, ascolta il loro livello di "techs-pertise". Non posso dirti quante volte ho visto un progetto realizzato esattamente come richiesto, ma non del tutto ciò che il cliente ha effettivamente detto. Tutto perché il programmatore che raccoglieva i req non ascoltava davvero.

Qualcos'altro che puoi portare via è, a meno che tu non abbia un background nel design dell'interfaccia utente, ottenere qualcuno per progettare l'interfaccia utente. POSSO SEMPRE individuare un'app in cui l'interfaccia utente è stata progettata dal programmatore e non da un esperto. Ciò che è logico e logico per te non ha senso per il cliente. E, se i tuoi clienti non sono tecnicamente seri, (e chi sono?), La tua soluzione "funzionale, corretta, ma esteticamente brutta" sarà accolta con il calore di skunk a una cena.

    
risposta data 07.12.2010 - 17:36
fonte
1

Lingue funzionali!

L'apprendimento dei linguaggi funzionali ti fa pensare in termini di espressioni, piuttosto che di passi e di stati mutabili con nome (variabili). Ciò ha un impatto significativo sulla tua capacità di affrontare in modo efficace i problemi di programmazione di tutti i giorni, specialmente ora che quasi tutte le lingue popolari hanno funzionalità.

Algoritmi e teoria della complessità sono anche importanti, ma è in qualche modo meno interessante in quanto ti permette di mettere nomi su cose che di solito già sapevi e potevi dedurre.

    
risposta data 08.12.2010 - 23:24
fonte
0

I computer sono essenzialmente pattern matchers, niente di più. Tutto si riduce alla Turing Machine, il classico Computer Scienceconcept per spiegare i pattern maching.

    
risposta data 09.12.2010 - 17:20
fonte
-2

Risoluzione dei problemi e desiderio di continuare ad apprendere!

Mi servono molto meglio che conoscere rapidamente l'ordinamento e la normalizzazione del database.

    
risposta data 07.12.2010 - 11:06
fonte

Leggi altre domande sui tag