Qual è la parte di teoria dell'informatica che dovrei sapere? [chiuso]


27

Parlando come qualcuno con una laurea in ingegneria elettronica piuttosto che in informatica, qual è l' unico pezzo di informatica che dovrei sapere per farmi diventare un miglior programmatore del mondo reale ?

(Per mondo reale intendo qualcosa che userò e di cui trarrò beneficio dal mio lavoro quotidiano come programmatore - per esempio suggerirei che capire la normalizzazione del database sia di uso più pratico che capire un tipo rapido per il quale ci sono molti delle biblioteche).


42
1 (scusate, dovevo farlo)
haylem

5
oh, o il più significativo! (Adesso vado ...)
haylem,

Teorical Computer Science stackexchange conferma ciò che menzionano tutti gli altri: complessità, strutture dati e algoritmi. cstheory.stackexchange.com/tags
chrisaycock il

2
Sento il bisogno di obiettare a questa domanda. Non c'è "un bit" che sarebbe sufficiente per imparare, e per di più, non c'è (IMHO) un bit "più importante". Ci sono molti aspetti che sono (di nuovo, IMHO) ugualmente essenziali per CS. Quindi penso che sebbene le risposte a questa domanda possano essere interessanti, la domanda avrebbe potuto essere formulata meglio.
Konrad Rudolph,

1
Se non avessi già avuto il tuo eeng, avrei detto logica booleana e / o teoria dei numeri discreti. Quasi ogni ife loopdichiarazione mai scritte utilizza un sottoinsieme di queste due aree di studio.
Steven Evers,

Risposte:


52

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


2
+1 e direi che è più importante sapere che O (n ^ 2) è peggio di O (lg n) (per esempio) è sapere come derivare il Big-O per un dato codice.
Dean Harding,

3
Non sono molto d'accordo. Questa roba è relativamente banale e ci sono argomenti più interessanti in CS. Inoltre, penso che molte persone pensino alla complessità in modo intuitivo, anche se potrebbero non chiamarla complessità e potrebbero non chiamarla quadratica, esponenziale, ecc.
Magnus Wolffelt,

Magnus: Nella mia esperienza, la maggior parte delle persone che non programmano non pensano affatto alla complessità, assumono intuitivamente O (n) per tutti i problemi.
user281377

Devo ancora averne bisogno formalmente.
CaffGeek,

1
Ciad: Non c'è nulla nella notazione O che sia eccessivamente formalista, ma senza nomi per le cose, difficilmente puoi pensare a quelle cose, e tanto meno parlarne con i tuoi coetanei.
user281377

19

Questa è una domanda, ognuno avrà una risposta diversa. Direi: la teoria della complessità è il pezzo più importante, che comunque non impari direttamente come programmatore (come algoritmi e strutture di dati), ma ciò che può influire sul tuo lavoro. Aiuta se so che un problema ha una complessità cubica, so che ridimensionerà male se la dimensione del problema aumenta.


Vorrei aggiungere che aiuta molto a sapere se si sta risolvendo un problema che può essere facilmente riformulato in un linguaggio più semplice.
philosodad,

La complessità è importante come concetto, ma in realtà non è spesso calcolarla. Comprendere ciò che è meno complesso è la parte importante.
Bill

@Bill: esattamente. Ma quella parte è l'unica cosa che non devi necessariamente superare con la pratica. La teoria è molto utile da quella parte.
Mnementh,

12

Informazioni su strutture di dati, algoritmi e complessità.

Non troppo solo per capire che una macchina non è una scatola magica con potenza illimitata. Non puoi lanciarci nulla e aspettarti che lo sgranocchi in millisecondi. Ha dei limiti che conosci. Devi imparare a non provarli con il tuo codice.

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

Anche la conoscenza della modellazione di database è essenziale.

Dopodiché sono solo linguaggi di programmazione, framework e librerie diversi che implementano o consentono di implementare i concetti chiave. Raccogli quello che ti piace e fai pratica con quelli.


Specifiche: ci sono molti algoritmi e strutture di dati.
Jon Hopkins,

Solo quelli di base per avere un'idea delle cose. Prendi un libro non troppo spesso e sfoglialo.

1
Questo è un po 'più di un po'.

7

Questa è una domanda un po ' difficile.

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

In termini di ciò di cui trarrai beneficio ogni giorno, probabilmente una panoramica generale di come il tuo codice funziona "sotto il cofano" dal codice alla CPU.

Comprendere Big O Notation è importante e anche capire come eseguire il codice è molto importante nelle situazioni del mondo reale.


7

Sì, questo mi ha spinto a pensare per ore.

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

NESSUN ELENCO

  1. Notazione O (n) grande . Difficile metterlo qui, ma No, possiamo intuitivamente risolvere le inefficienze e confrontare diversi insiemi di procedure senza nemmeno aver sentito parlare a distanza dell'analisi algoritmica asintotica.

  2. Linguaggi funzionali No, un'unica famiglia di lingue è solo un approccio per pensare ai problemi. Perché solo questo bit dovrebbe importare?

  3. Arrestare il problema Alcuni sono troppo specifici e le persone hanno vissuto la vita senza sapere di esistere.

  4. Ascolta Se non ascolti, vivi nel tuo mondo. Non necessariamente dannoso!

  5. Ciclo di sviluppo software Nah! Possiamo ancora farci strada verso un software incredibile o uno sforzo eroico solista.

  6. teoria della complessità immagino che potrebbe essere, ma senza tutti i formalismi

Quell'idea di Comp Science

Direi: " Astrazioni Astrazioni Astrazioni ... ". Scopri di più 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 bene intorno.

Quando vedi qualcuno che usa list insertionin pythone not append, sorridi perché sai che gli elenchi di Python sono costruiti usando l'astrazione di array in cui gli inserimenti sono costosi e si aggiungono più economici.

Questo è solo un esempio.


+1 per una risposta a cui hai ovviamente pensato molto.
Jon Hopkins,

solo un commento al tuo commento sul problema di Halting: "Vivere la vita senza conoscere l'esistenza" è vero per QUALSIASI argomento di informatica.


3

Casi di utilizzo competitivo delle strutture di dati.

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


3

ci sono solo tre numeri che contano:

  • zero
  • uno
  • molti

ma questo non implica che anche '3' sia importante?
Javier,

Dovrebbe essere zero, uno e infinito: en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens

@Javier: 3 è un sottoinsieme di molti
Steven A. Lowe,

@Thomas: dice chi?
Steven A. Lowe,

@Steven La mia comprensione potrebbe non essere del 100% qui, ma penso che l'idea sia che tu non abbia nulla di qualcosa, una sola cosa o il numero di cose che hai che dovrebbero essere illimitate. Se non stai limitando a nessuna o un'istanza, non dovresti limitare le istanze. Tuttavia, non sono del tutto sicuro PERCHÉ questo è il caso (ho solo vagamente familiarità con il concetto Zero / One / Infinity).
Thomas Owens

3

La cosa più importante che ho imparato in CS (e come sviluppatore per molti anni e come architetto) è la capacità di abbattere un problema in base alla volatilità e non alla funzione. Tutti i buoni progetti isolano e incapsulano la volatilità. Tutti i buoni sviluppatori / architetti lo fanno in modo intuitivo anche se non lo hanno formalizzato nel loro modo di pensare. Un'enorme ragione del fallimento del progetto è l'incapacità di scomporre un problema sulla base della volatilità e incapsularlo. Un fallimento nell'incapsulare la volatilità porta inevitabilmente a scappare dalla complessità e dal fallimento del progetto.


Cosa intendi esattamente per volatilità?
amara,

3

The Halting Problem

Il fatto che esistano problemi relativi al computer che semplicemente non possono essere risolti da un computer.


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 ciò, puoi capire alcuni importanti usi pratici, come il motivo per cui non dovresti usare un REGEX per analizzare l'HTML (l'HTML ha bisogno di una grammatica libera dal contesto per descriverlo), e perché ci vuole molto più tempo per compilare C ++ invece di Java o C # (C ++ richiede una macchina Turing, mentre Java e C # possono essere descritti con grammatiche libere dal contesto).

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

  1. Linguaggi che possono essere analizzati da un automa finito o da un REGEX (le implementazioni REGEX con riferimenti secondari sono più potenti di questa categoria, ma non possono ancora analizzare tutto nella categoria 2)

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

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


Uhm, no. Un'espressione regolare analizza una grammatica regolare. Questa è esattamente la categoria di grammatica che può essere accettata da automi a stati finiti. E una "grammatica di Chomsky" non si riferisce esclusivamente alle grammatiche libere dal contesto, che è ciò che processano le macchine stack.
philosodad,

@philosodad - La grammatica libera dal contesto è più precisa e ho aggiornato il post per usare il termine. Non capisco il tuo problema con quello che ho detto sulle espressioni regolari.
Dan Monego,

@ Dan - Il mio problema è che un'espressione regolare è precisamente potente come un automa a stati finiti, e se puoi analizzare QUALSIASI grammatica deterministica senza contesto con una macchina di quanto puoi analizzare TUTTE le grammatiche deterministiche senza contesto.
philosodad,

O, per essere più precisi: o hai bisogno di uno stack o non lo fai. Se è necessario uno stack per analizzare una lingua, è necessario disporre di uno stack per analizzare la lingua e, quindi, se una lingua richiede uno stack per analizzarla, è possibile analizzarla.
philosodad,

@philosodad - Esistono due tipi di espressione regolare: le espressioni regolari in teoria e le espressioni regolari implementate nel software. Hai ragione riguardo alle espressioni regolari teoriche, ma la maggior parte delle implementazioni ha diverse caratteristiche oltre la loro base teorica e può abbinare alcune lingue non regolari, come a ^ n per non prime n. Poiché questo è un filo sulla teoria in pratica, ho fatto di tutto per menzionare che esiste una differenza tra la definizione formale e quella usata in natura.
Dan Monego,

2

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

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

  • "Abbastanza buono" non è abbastanza buono.

1

Sviluppo del ciclo di vita del software è qualcosa che suggerirei di sapere se non lo fai già. Concesso questo è stato introdotto in un corso di Informatica del secondo anno ed è qualcosa che viene usato ripetutamente all'interno di progetti software. Questo può essere utile per avere un'idea generale di come va un progetto dall'inizio alla fine, anche se se vuoi approfondire ci sono metodologie come Waterfall o Agile che potresti studiare per ottenere conoscenze più specifiche.


2
Legge di Murphy: tutto ciò che può andare storto, andrà storto
Richard,

Non è teoria CS, ma questa è una risposta eccellente.
solo il

1

Programmazione

Dal Dipartimento di Matematica e Informatica Hobart e William Smith College arriva Computer Science 124 Introduzione alla programmazione :

Gli argomenti includono strutture di controllo, oggetti, classi, ereditarietà, strutture dati semplici e concetti base di sviluppo software.

Se non riesci a programmare, non stai andando molto lontano nel mondo reale dell'informatica.

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

Programmare Informatica come la conosciamo?

In risposta al commento di @Thomas Owens, che ha sottolineato (giustamente) che la programmazione non è strettamente informatica, vorrei citare l' articolo di Wikipedia sull'informatica :

... il focus dell'informatica è più sulla comprensione delle proprietà dei programmi utilizzati per implementare software come giochi e browser web, e sull'utilizzo di tale comprensione per creare nuovi programmi o migliorare quelli esistenti ...

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 è una gioia per gli altri lavorare.


La programmazione non è teoria CS. In effetti, potrei facilmente sostenere che la programmazione non è affatto informatica.
Thomas Owens

@Thomas Owens Ho aggiornato la mia risposta per confermare la mia affermazione che è valida. Potresti rivederlo e farmi sapere i tuoi pensieri?
Gary Rowe,

1
Ancora non penso che la programmazione sia CS. La programmazione POTREBBE essere utile per un informatico che vuole implementare un algoritmo o una struttura di dati, ma gli argomenti della teoria CS (dal mio libro di introduzione al Teoria CS, quindi probabilmente ci sono anche argomenti più avanzati) includono la logica, la teoria degli automi, la teoria dei grafi , calcolabilità, complessità computazionale e analisi degli algoritmi. Direi anche che anche i linguaggi di programmazione (la teoria alla base della progettazione e dell'implementazione di un linguaggio) fanno parte dell'informatica. Tuttavia, non è necessario essere in grado di programmare per essere un buon informatico.
Thomas Owens

@Thomas Owens Vedo il tuo punto e (mette il cappello da purista) Sono d'accordo. Tuttavia, l'OP chiede un po 'di CS che lo aiuterebbe nel mondo reale. Sono fermamente convinto che la teoria della programmazione (come implementata in un buon codice) sia un po '. Ho modificato leggermente di conseguenza.
Gary Rowe,

Si. Da CS, direi che la comprensione dei linguaggi di programmazione e dei paradigmi potrebbe aiutare (specialmente se si stanno implementando DSL, ma conoscere molti paradigmi come la logica procedurale, funzionale, OO, aiuta solo nello sviluppo del software). Comprendere gli algoritmi e le strutture dati ti aiuta anche a scegliere quelli giusti per risolvere il tuo problema nel modo più efficiente. La teoria degli automi potrebbe aiutare (una volta ho lavorato con un sistema che era un gigantesco FSM, ma non so quanto sia comune). Quindi direi che strutture di dati, algoritmi e teoria PL sarebbero le cose più utili da sapere da CS.
Thomas Owens

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 togli nient'altro alle risposte che stai ricevendo qui, almeno considera questo: Soddisfare i requisiti NON equivale a soddisfare il cliente! Gli utenti finali cercheranno SEMPRE di utilizzare il programma in un modo in cui non hai mai pensato o programmato. SEMPRE, SEMPRE, SEMPRE.

Pertanto, per essere un programmatore migliore, devi prima ASCOLTARE. Ascolta il cliente. Ascolta i loro bisogni. Ascolta i loro desideri. E soprattutto, ascolta il loro livello di "tech-pertise". Non posso dirvi quante volte ho visto costruire un progetto che era esattamente ciò che era richiesto, ma non era affatto ciò di cui il cliente aveva realmente bisogno. Tutto perché il programmatore che stava raccogliendo il req non stava davvero ascoltando.

Qualcos'altro che puoi portare via è, a meno che tu non abbia uno sfondo nella progettazione dell'interfaccia utente, convincere qualcuno a 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 sensato per te non avrà senso per il cliente. E, se i tuoi clienti non sono tecnologicamente avanzati (e chi lo sono?) Allora la tua soluzione "funzionalmente corretta, ma esteticamente brutta" verrà accolta con il calore di skunk a una cena.


3
Questa risposta non riguarda la teoria CS, che è ciò di cui Hopkins ha chiesto.
James,

1

Linguaggi funzionali!

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

Anche gli algoritmi e la teoria della complessità sono importanti, ma sono un po 'meno interessanti in quanto ti consentono principalmente di mettere nomi su cose che di solito già sapevi e che potresti dedurre.


0

Che i computer sono essenzialmente pattern matcher, niente di più. Tutto si riduce alla Turing Machine, il classico concetto di Scienza del Computer che spiega la lavorazione dei modelli.


-2

Problem Solving e desiderio di continuare ad imparare!

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


6
Questa non è teoria dell'informatica, si applicano ugualmente all'ingegneria elettronica (o praticamente a qualsiasi altra forma di ingegneria).
Jon Hopkins,

Per come la vedo io, prendere in considerazione il tuo esempio sapere che l'ordinamento rapido non è utile. Sapere che esiste e ciò che rende speciale è utile, ma è anche una ricerca di Google se non ne sapessi nulla. Anche la conoscenza di un algoritmo non è utile. Tuttavia, saperlo creare e interpretarne uno lo è! Forse se potessi cambiare la mia risposta, la complessità è probabilmente la più importante.
Bryan Harrington,

1
Non puoi cercare qualcosa se non sai di averne bisogno o che esiste. La tua risposta elenca importanti qualità che uno sviluppatore deve avere, ma non risponde alla domanda posta.
Adam Lear
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.