it-swarm.it

Devo capire gli algoritmi e le strutture di dati per essere chiamati programmatori?

Sono passati sei anni da quando ho programmato. Codifica in tutti i tipi di cose come ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, ecc. Ho usato array, mappe, elenchi collegati, set, ecc. E ovunque lavorassi persone come me. Ma ogni volta che vengo intervistato è molto probabile che le persone mi facciano domande su hash, alberi, pile e file. Alcune domande riguardano la manipolazione di alcuni algoritmi di ordinamento. Non so se dovrei davvero conoscerli o dovrei smettere di chiamarmi programmatore. C'è qualcosa in me che mi dice anche se le persone che mi pongono tutte queste domande mi selezionano, non mi faranno mai lavorare su queste cose. Devo davvero sapere tutto questo?

38
sushil bharwani

Se tutto ciò che sai fare è scrivere il codice colla, potresti chiamarti scimmia codice. Un sacco di codice colla deve essere scritto e puoi vivere decentemente come una scimmia codice. Per definirti un vero programmatore TM ed avere fiducia quando il codice deve essere scritto da zero, devi conoscere algoritmi, strutture dati, gestione della memoria, puntatori, linguaggio Assembly, ecc. e capire come usare questa conoscenza per valutare i compromessi.

80
dsimcha

coloro che non conoscono la storia sono condannati a reinventarla

33
Steven A. Lowe

Bene, lavorare in un linguaggio come JavaScript rende questo piuttosto obsoleto, dal momento che un array è un mix tra un vettore, un hash e un albero e può essere usato come stack o coda. È molto improbabile che tu abbia mai bisogno o sarai in grado di implementare una struttura di dati in JavaScript che superi la classe Array. Questo è anche il caso di PHP.

Per Java OTOH, c'è una differenza. Suppongo che la libreria standard di Java ti fornisca qualsiasi infrastruttura di dati di cui hai bisogno. Tuttavia:

  1. Devi conoscere e distinguere quelle strutture dati e capire come si comportano in situazioni diverse in modo da poter scegliere quella giusta.
  2. In Java, non è assolutamente improbabile che tu alla fine vorrai scrivere la tua implementazione per una hashmap per ottenere una migliore velocità in un caso molto specifico (ad esempio se le chiavi che vuoi gestire riempiono alcuni vincoli speciali che consentono l'ottimizzazione).

Quando si tratta di algoritmi di ordinamento, non c'è molto bisogno di conoscerli o capirli, perché non è necessario implementarli mai da soli. Tuttavia, se ti viene dato un tale algoritmo, dovresti essere in grado di comprenderlo e implementarlo.

Due cose sono certe:

  1. puoi fare carriera come programmatore senza fare affidamento su conoscenze come questa.
  2. sicuramente non ti farà male conoscerli.

Le strutture dati e gli algoritmi sono semplicemente una cosa, che è bene capire. Ed è qualcosa di estremamente chiaro e formalizzato e quindi piuttosto banale rispetto alle complessità dell'ingegneria delle applicazioni o dei sistemi. Sono solo un piccolo pezzo del puzzle, ma sono facili da afferrare - se sei disposto a investire un po 'di tempo.

Quindi no, non ne hai bisogno, ma sarebbe solo per a tuo vantaggio conoscerli.

30
back2dos

Questa potrebbe essere un'occasione in cui può esserci una distinzione semanticamente significativa tra "programmatore" e "ingegnere del software". In questo contesto, in particolare, vediamo che hai una conoscenza di diversi linguaggi di programmazione e tecnologie correlate e che puoi usarli per produrre i risultati desiderati. Questa è una bella definizione operativa di "programmatore di computer".

Mi considero un ingegnere del software. Nella maggior parte degli aspetti quotidiani del mio lavoro, probabilmente faccio le stesse cose che fai tu. Uso il linguaggio del computer e le tecnologie correlate per produrre il risultato desiderato. Tuttavia, ho una comprensione delle strutture dei dati e degli algoritmi e considero tale conoscenza un fondamento fondamentale della mia capacità di fare molto di più.

Spesso, anche se non sempre, il mio lavoro consiste nel trovare una soluzione a problemi complessi per i quali non esistono soluzioni ovvie, niente che sia direttamente affrontato dalle caratteristiche del framework che sto usando o dalle capacità del linguaggio che sto lavorando con. In questo, ho bisogno di analizzare il problema e escogitare una soluzione e occasionalmente questo processo va nel regno dell'architettura su larga scala.

Mentre una comprensione eccellente di questi problemi più profondi è necessaria per fare quel tipo di lavoro, non è sufficiente. In altre parole, sapere come funziona una tabella hash o perché un ordinamento di heap di solito ha buone caratteristiche prestazionali non è sufficiente per essere un architetto di sistemi o un ingegnere senior. È il punto di partenza logico e da lì puoi iniziare a scavare più a fondo e viaggiare più ampiamente e acquisire l'esperienza necessaria anche per affrontare le questioni più grandi.

Suppongo che per rispondere alla tua domanda, dovresti chiederti: "Cosa voglio essere? Dove andrò con la mia carriera?" Se sei soddisfatto di continuare a fare quello che stai facendo, potresti semplicemente voler imparare abbastanza strutture di dati e algoritmi per superare le domande di colloquio in gran parte arbitrarie che devi affrontare.

Se vuoi crescere nella tua carriera e hai la passione per ciò che è essenziale, dovresti abbracciare questi argomenti il ​​più strettamente possibile. Se hai del tempo per lavorarci, una mente aperta e un vero entusiasmo, troverai cose meravigliose ed eccitanti. Non dimenticherò mai il giorno in cui ho capito per la prima volta Quicksort. La sensazione di eccitazione e scoperta ha aperto la strada a gran parte del resto della mia vita, e non potrei esserne più grato. Ora, non riesco a immaginare di fare qualsiasi cosa oltre a lavorare come ingegnere del software.

Buona fortuna con qualunque cosa tu scelga.

13
Adam Crossland

Dipende a cosa servono i lavori. Questo genere di domande sono domande di intervista abbastanza standard, ma sono anche abbastanza poco immaginative e probabilmente non riguardano affatto il lavoro, certamente non un lavoro che utilizza le tecnologie che elenchi.

Per me, come domande per l'intervista, sono un buon giudice del fatto che tu abbia conseguito una laurea in Informatica (e se lo ricordi) piuttosto che qualsiasi misura di capacità o conoscenza di programmazione generale.

Suggerirei che o impari queste cose in modo da poter superare l'intervista, o semplicemente accetti che ovunque chiedendo queste cose non fa per te, ma no, non è necessario conoscerle per definirti un programmatore.

12
Jon Hopkins

Ottima domanda Javascript o Java o VC++ sono linguaggi di programmazione super intelligenti in cui non avrai mai bisogno di creare un elenco collegato o una tabella hash da zero. Ma devi comunque avere la possibilità di decidere quando usarne uno l'altro, le penalità e i premi di prestazione maturano ciascuno ecc.

Ho intervistato un sacco di programmatori API aka scimmie di codice, e nella maggior parte delle interviste hanno fallito di routine nel progettare sistemi efficienti e scalabili. In conclusione: conoscere un sacco di API ti darà il pane, ma per il burro devi iniziare dalle basi del calcolo.

6
Fanatic23

Aggiungerò "sì, certo che puoi ancora definirti un programmatore". Ma che tipo di programmatore vuoi essere? Penso che i migliori programmatori abbiano almeno qualche fondamento nelle basi teoriche. Sanno che perché hanno scelto una particolare struttura/algoritmo di dati, nonché i compromessi che ne derivano. Mi aspetto che qualsiasi sviluppatore che intervista abbia almeno una comprensione di base, anche se non usano lo stesso gergo (anche se non conoscere il gergo significa che sarà più difficile comunicare con altri sviluppatori).

3
Martijn Verburg

La conoscenza degli algoritmi ti consente di dire con fiducia come saranno le tue scelte scala! Personalmente ritengo che ciò sia necessario per essere un programmatore senior

2
user1249

"Se vuoi essere un buon programmatore, devi solo programmare ogni giorno per due anni. Se vuoi essere un programmatore di classe mondiale puoi programmare ogni giorno per dieci anni, oppure puoi programmare ogni giorno per due anni e prendere una classe di algoritmi ".

-Charles E. Leiserson

Buon consiglio da Analisi degli algoritmi di Charles E. Leiserson - MIT

2
milan-j

Potresti essere un buon programmatore in questo momento, ma la conoscenza della struttura dei dati, degli algoritmi e la conoscenza di altri argomenti nell'informatica aiuterebbe sicuramente molto a migliorare te stesso in molti modi:

  • Potresti essere più efficace e più veloce nel fare le cose. Anche le persone che hanno già una laurea in Informatica e conoscono molti di questi argomenti tenderanno a tenersi al passo con gli ultimi progressi al fine di migliorare se stessi.

  • Questa conoscenza sarà anche utile per, se in misura minore, dire se si passa dal programmatore alla pista di gestione in un secondo momento, perché si sarebbe ancora in grado di comprendere meglio gli aspetti tecnici dei progetti con questa conoscenza.

  • Naturalmente nelle interviste vengono richiesti molto la struttura dei dati e gli algoritmi, quindi questo è un altro motivo per cui potrebbe essere utile conoscerli.

1
aditya

Dipende dal progetto: sono un ingegnere informatico e lavoro come programmatore analista.

Ho trascorso molto tempo a lavorare nella progettazione (testing, doc, code design). Ma, quando trovo un bug (o una cattiva prestazione) o devo codificare una nuova struttura di dati (perché il requisito è molto NUOVO per l'applicazione), devo capire dov'è il problema nell'algoritmo e devo correggerlo ( L'ho fatto non molto bene, quindi :))

Gli algoritmi e le strutture di dati classici sono una sorta di "modello di dizionario" nel mondo degli sviluppatori.

Alcuni link eccellenti:

1
alepuzio

Menzionate hash, alberi, pile, code e algoritmi di ordinamento. Bene, le tecnologie che hai citato sono principalmente relative a pagine web e script di web. Dovresti assolutamente capire almeno gli alberi, in modo da poter lavorare bene con il DOM. Ma se lo scripting è tutto ciò che devi fare, allora probabilmente stai bene. Non avrai bisogno della maggior parte degli strumenti del mestiere per un vero programmatore. Questo perché c'è una grande differenza tra il gioco di stringhe che costituisce la maggior parte degli script Web e ciò che la maggior parte di noi considera "scrivere programmi".

Lavoro con hash e alberi praticamente ogni giorno, e pile e code meno spesso ma abbastanza frequentemente. L'ordinamento è sostanzialmente un problema risolto; praticamente qualsiasi lingua ha un quicksort integrato nella libreria standard, un metodo di ordinamento sui tipi di raccolta di base, ecc., ma dovresti sapere in quali circostanze le prestazioni di quicksort possono peggiorare gravemente e le giuste strategie per ritardare l'ordinamento.

Se non conoscessi questi principi e il loro funzionamento, probabilmente potrei hackerare soluzioni di codifica che funzionano, ma non sarebbero soluzioni di qualità molto buona. Correvano lentamente, erano difficili da leggere e difficili da modificare, riutilizzare o estendere. Quindi, se vuoi imparare ad essere un buon programmatore, dovresti assolutamente leggere i tuoi algoritmi e strutture di dati. Miglioreranno davvero la qualità del tuo codice.

0
Mason Wheeler