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


37

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, liste collegate, set, ecc. E ovunque ho lavorato 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?


10
Dipende da dove lavori e da chi vorresti chiamarti programmatore.
Tim

1
Sì, se senza aggettivi negativi.
duros,

Risposte:


79

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 e 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 utilizzare questa conoscenza per valutare i compromessi.


6
Caspita, a metà strada mi aspettavo che questo fosse portato all'oblio da persone eccessivamente politicamente corrette per aver usato il termine "codice scimmia".
dsimcha,

15
"software simian" è sempre la terminologia preferita
STW

3
Non sono totalmente d'accordo. Il tipo di software che viene scritto "da zero" influenza notevolmente chi è in grado di scriverlo. Alcuni software richiedono una complessità intrinsecamente inferiore (o maggiore) rispetto ad altri.
Nick Spreitzer,

8
+1, 20% perché sono d'accordo, 5% grazie a "Real Programmer TM" e 75% perché ho imparato il linguaggio dell'assemblea e voglio fingere che ne sia valsa la pena
Carson Myers,

3
La maggior parte dei lavori esistenti richiede solo "scimmie di codice". È normale che le persone che lavorano in "code monkey" tendano a dimenticare tutte le sue conoscenze precedenti, rendendosi ogni giorno un po 'più di "code monkey", nonostante il suo potenziale. :(
cag

32

coloro che non conoscono la storia sono condannati a reinventarla


75
In realtà, coloro che non conoscono la storia sono condannati a reinventarla usando i metodi O (N 2) o O (N 3) invece di usare i noti metodi O (N log N) che sono abbastanza vecchi per comprare alcol in tutti i 50 stati.
John R. Strohm,

@John ROFLMAO - troppo vero!
Steven A. Lowe,

3
.... sono condannati a

30

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 sia 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 alcuni casi molto specifici (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. È possibile fare una carriera come programmatore senza fare affidamento sulla conoscenza come questo.
  2. E ' sicuramente non farà male a 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 a tuo vantaggio conoscerli.


13

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 buona 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 come 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 è necessaria un'eccellente comprensione di questi problemi più profondi per fare quel tipo di lavoro, non è sufficiente . In altre parole, il solo fatto di sapere come funziona una tabella hash o perché un tipo 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 i problemi 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, allora 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.


2
Ci sono sempre soluzioni ovvie. Smettono di funzionare quando cambiano i requisiti;) Non credo che una conoscenza approfondita degli algoritmi e delle strutture di dati sia una vera premessa per un buon ingegnere del software. È solo che raramente ne vedi uno senza di esso, perché ciò che un buon ingegnere del software ha, è una sete insoddisfacente di conoscenza.
back2dos,

+1 Ben definito "Suppongo che per rispondere alla tua domanda, dovresti chiederti:" Cosa voglio essere? Dove andrò con la mia carriera? "
Bill

12

Dipende a cosa servono i lavori. Questo tipo 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.


1
grazie per la tua risposta. Condividerò con te un'intervista divertente che le persone che mi intervistano hanno richiesto qualcuno che fosse bravo sul lato dell'interfaccia utente usando json css ajax javascript jquery ecc. Mi hanno chiesto come avresti scritto un server web. E cosa succede quando il salvataggio viene premuto in un file word
sushil bharwani,

2
@sushil - Penso che sia il tipo di posto in cui non vuoi lavorare ...
Jon Hopkins,

@sushil: sono totalmente d'accordo con @Jon Hopkins. Meglio lavorare come cameriere in attesa di un buon lavoro che accettarlo. Avere idioti incompetenti come superiori ti renderà estremamente frustrato e ti bloccherà nel tuo sviluppo personale.
back2dos,

6

Ottima domanda Javascript o Java o VC ++ sono linguaggi di programmazione super intelligenti in cui non sarà mai necessario creare da zero un elenco collegato o una tabella hash. Ma devi comunque avere la possibilità di decidere quando utilizzare l'uno sull'altro, le penalità di prestazione e i bonus a seconda della maturazione ecc.

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


Grazie mille, prenderò il tuo consiglio e inizierò a conoscere questi argomenti
Mahmoud Hossam,

3

Aggiungerò "sì, certo che puoi ancora definirti un programmatore". Ma che tipo di programmatore vuoi essere? Penso che i migliori programmatori abbiano almeno alcune basi nelle basi teoriche. Sanno 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 conoscendo il gergo significa che sarà più difficile comunicare con altri sviluppatori).


2

La conoscenza di algoritmi consentono di dire con fiducia come le vostre scelte saranno in scala ! Personalmente ritengo che ciò sia necessario per essere un programmatore senior



1

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 ( Non l'ho fatto 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

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.


0

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.

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.