Il concetto di complessità computazionale è importante per gli sviluppatori di software? [chiuso]


11

Avevo l'impressione che i concetti di complessità del tempo e della memoria siano un must per i laureati dei corsi di compsci, ma avendo studiato ingegneria non ho alcuna conoscenza se sia così. Di recente sono stato sorpreso di intervistare alcuni laureati di un college locale che non conoscono nemmeno il concetto. Immagino che la mia domanda sia:

Il concetto di complessità computazionale è importante per gli sviluppatori di software? E dovrebbe essere insegnato in corsi universitari?


1
Per spiegare la domanda usando un esempio: i laureati che ho incontrato non sanno cosa O(n^2)significhi.
Muhammad Alkarouri,

Risposte:


12

Nella maggior parte delle università, presumo (spero!) Che la complessità del tempo e della memoria faccia sicuramente parte dei loro corsi.

Ora, queste "complessità" sono un argomento molto elastico. Se le persone dovrebbero davvero conoscere tutta la teoria come "ZPP è la classe di complessità dei problemi di decisione che può essere risolta senza errori su una macchina di Turing probabilistica in tempo polinomiale". e questo genere di cose è discutibile. Personalmente considero queste teorie avanzate irrilevanti per lo sviluppo del software.

Al contrario, ritengo che ogni sviluppatore dovrebbe essere consapevole della complessità tempo / spazio delle strutture di dati e degli algoritmi che usano.


8

Molti principianti soffrono di ossessione per la microottimizzazione. Learning comp. la complessità guida gli studenti verso un modo molto più pratico di stimare prestazioni e scalabilità, secondo la mia esperienza.


6

Da quello che ho visto, sembra che la notazione della grande O e la complessità del tempo e della memoria siano enfatizzate molto nell'educazione informatica formale ... comunque essendo autodidatta, questa percezione si basa sull'ascolto e sulla lettura di ciò che le persone con tali educazioni dì e scrivi.

Anche se credo che le idee e i concetti generali siano importanti, non credo che la sua formalizzazione (come la notazione big-O e la terminologia varia) sia altrettanto importante, tranne per gli scopi della comunicazione. Solo perché qualcuno non ha familiarità con la notazione formale e la terminologia non significa che non possono vedere come e perché un algoritmo sarebbe più veloce di un altro in un caso particolare. Le persone possono vedere che il tempo impiegato per la ricerca di un albero binario bilanciato si riferisce al logaritmo in base 2 del numero di nodi senza prima apprendere la teoria della complessità in alcun senso formale, se capiscono come funziona l'albero e hanno una ragionevole comprensione dell'alta matematica della scuola. È importante sapere quando prestare attenzione alla complessità e all'uso della memoria e considerare i casi tipici e peggiori, però ... ma alcune persone non lo fanno.

La notazione e la terminologia diventano importanti per la comunicazione. Offrono un modo piacevole di comunicare a qualcun altro la quantificazione delle prestazioni di un algoritmo. Poiché viene spesso pubblicato in articoli e spiegazioni, è utile avere almeno una vaga comprensione in modo che siano più facili da seguire.

Quindi sì, i concetti sono importanti (sebbene meno quando risorse e tempo sono ampi ma i dati non lo sono). Ma sebbene i concetti siano importanti, la loro formalizzazione spesso non è così importante - e bisogna ricordare che la notazione e la terminologia non sono le stesse dei concetti stessi.

Modificare:

Non pretenderei di comprendere i concetti in modo così dettagliato come qualcuno che ha studiato formalmente, ma molte idee generali hanno senso. Penso che ci sia valore nello studiare formalmente questo, ma parte di quel valore può ancora esistere senza.

Per quanto riguarda l'introduzione dei concetti (al di fuori dello studio formale), penso che un buon inizio sia quello di incoraggiare le persone a pensare a quanta memoria hanno le strutture di dati, quali passi comportano gli algoritmi e come queste cose cambiano con dati diversi.

Aiuta anche a considerare situazioni ipotetiche e cambiamenti, come considerare cosa succede se un albero è bilanciato rispetto a cosa succede se è il più sbilanciato possibile, o quanti livelli nella struttura sarebbero la maggior parte dei nodi, o quanti più nodi può tenere premuto se la profondità aumenta di un livello. Questo modo di pensare è generalmente utile per i programmatori, non solo quando si guarda alla complessità; e se applicato a pensare a come funzionano gli algoritmi e le strutture di dati in circostanze diverse, punta naturalmente nella stessa direzione di un esame più formale della complessità.


Vista alternativa interessante. Puoi spiegare come introdurre i concetti? O come hai fatto a capirli? Ciò potrebbe indicare un modo alternativo per ottenere la comprensione necessaria.
Muhammad Alkarouri,

1
@MuhammadAlkarouri Ho modificato la mia risposta per risolverlo un po '.
Dmitri,

4

Comprendere le basi della complessità è importante e dovrebbe essere qualcosa che impari come studente universitario. In realtà penso che di solito venga toccato in qualunque classe ti insegni sulle strutture di dati. Riesco a capire i laureati che non capiscono o non ricordano, ma non riesco a vederli non aver imparato le basi della complessità.

Aggiornamento: perché è importante

Ero in una migrazione del database in un determinato lavoro. Avevamo una scadenza per quando la migrazione doveva essere completata. La persona che ha scritto la sceneggiatura non ha avuto fondamenti nella complessità. Sfortunatamente, nessun altro ha esaminato attentamente la logica usata nella sceneggiatura. Non ricordo i dettagli oltre a quello che ha usato un ciclo doppiamente annidato anziché una tabella hash. Dopo una settimana di esecuzione continua della sceneggiatura, abbiamo esaminato la logica e realizzato il problema. Dopo il cambio sono state necessarie circa 5 ore. Abbiamo quasi perso la scadenza per il completamento della migrazione a causa di qualcuno che non capisce la complessità.

Il punto è che è facile rallentare accidentalmente qualcosa che è ordini di grandezza o che rimarrà sempre a corto di memoria prima che il lavoro venga completato. Mentre macchine più veloci con più memoria possono mitigare piccoli errori, spesso non possono mitigare i problemi di complessità.


Ma ancora, la domanda è "è importante?". Perché anche se ripetono l'elenco delle coppie, ciò significa che il prodotto finale non sta facendo ciò che dovrebbe? Significa che è lento? Significa che non hanno svolto il lavoro per cui sono pagati?
Yam Marcovic,

Se il programma dovesse concludersi tra 2 giorni, ma richiederà invece 2 anni, direi che non sono riusciti a svolgere il lavoro per il quale sono stati pagati.
dietbuddha,

Il problema che hai descritto non era tanto un problema del povero sviluppatore, quanto piuttosto un problema nel processo decisionale che ha portato un programmatore non qualificato a occuparsi di tale programma.
Yam Marcovic,

O forse un processo decisionale che porta ad assumere qualcuno non qualificato per programmare come "sviluppatore di software" anziché "jr. Sviluppatore di software" o "stagista".
dietbuddha,

3

Trovo che chiedere se sia "importante o no" è piuttosto vago.

Troverai molte persone che evangelizzano su come ogni minima parte della conoscenza in questo mondo è strettamente richiesta nella loro opinione. Ma è un po 'inutile, perché non si può mai sapere tutto, e non ci si dovrebbe aspettare a meno che non aiuti a soddisfare i requisiti del proprio lavoro. Preferisco adottare un approccio più pragmatico ai prerequisiti educativi, in generale, a meno che non si tratti di hobby o preferenze personali arbitrarie.

È importante per i programmatori che dovrebbero scrivere codice estremamente efficiente o algoritmi infrastrutturali innovativi? Sì.

È importante per i programmatori che sviluppano applicazioni Web convenzionali? Possono gestirlo senza di essa o ottenere implementazioni efficienti nel mondo open source.

È importante per i programmatori che sviluppano GUI per applicazioni? Probabilmente no, perché i quadri di successo della GUI astraggono tutti quei piccoli dettagli.

È sempre bello saperlo, proprio come qualsiasi altra cosa, ma non impedisce a molti (o anche alla maggior parte) programmatori di fare semplicemente il proprio lavoro per la soddisfazione dei propri datori di lavoro.

D'altra parte, se uno si iscrisse a studi superiori, alla ricerca di un'istruzione fondamentale e teorica, ci si dovrebbe aspettare di apprendere materie che sono per definizione più teoriche che pratiche. Secondo me, è essenziale che CompSci. gli studenti imparano a conoscere la complessità, così come è importante che conoscono il calcolo.

Ma comunque, da quando CompSci. i programmi insegnano alle persone come essere buoni programmatori? Per questo hai programmi di formazione specializzati ed esperienza pratica (sia i tuoi che i tuoi colleghi programmatori che possono condividere i loro con te).


1
La seconda parte è probabilmente meno vaga: dovrebbe essere insegnata agli studenti di compsci a livello di laurea?
Muhammad Alkarouri,

1
Ho modificato il mio post per rispondere anche a questa domanda.
Yam Marcovic,
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.