Devo capire che algoritmi e strutture dati sono chiamate programmatori? [chiuso]

37

Sono passati sei anni da quando ho iniziato a programmare. Coding in tutti i tipi di cose come ActionScript, JavaScript, Java, PHP, Ajax, HTML HTML, ASP, ecc. Ho usato matrici, mappe, liste collegate, set, ecc. E ovunque lavorassi persone come me. Ma ogni volta che sono intervistato è molto probabile che le persone mi facciano domande su hashish, alberi, pile e code. 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 stanno facendo tutte queste domande selezionano me, non mi faranno mai lavorare su queste cose. Devo davvero sapere tutto questo?

    
posta sushil bharwani 11.11.2010 - 17:05
fonte

12 risposte

78

Se tutto ciò che sai fare è scrivere il codice della colla, potresti chiamarti scimmia del codice. Un sacco di codice della colla deve essere scritto e si può fare una vita decente come una scimmia del codice. Per definirti Real Programmer 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 usare questa conoscenza per valutare i compromessi.

    
risposta data 11.11.2010 - 19:34
fonte
32

chi non conosce la storia è condannato a reinventarlo

    
risposta data 11.11.2010 - 17:34
fonte
27

Bene, lavorare in un linguaggio come JavaScript lo rende abbastanza 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 sia necessario o essere in grado di implementare una struttura dati in JavaScript che superi la classe Array. Questo è anche il caso in PHP.

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

  1. Devi conoscere e distinguere quelle strutture di dati e capire come si comportano in situazioni diverse in modo che tu possa scegliere quello giusto.
  2. In Java, non è assolutamente improbabile che tu voglia alla fine scrivere la tua implementazione per una hashmap per ottenere una maggiore velocità in un caso molto specifico (ad esempio se le chiavi che vuoi gestire soddisfano 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 implementarne uno da soli. Tuttavia, se viene fornito 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 è buona per capire. Ed è qualcosa di estremamente chiaro e formalizzato e quindi piuttosto banale rispetto alle complessità dell'applicazione o dell'ingegneria dei sistemi. Sono solo una piccola parte del puzzle, ma sono facili da capire - se sei disposto a investire un po 'di tempo.

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

    
risposta data 11.11.2010 - 19:17
fonte
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 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 alcuni risultati desiderati. Tuttavia, ho una comprensione delle strutture dati e degli algoritmi e ritengo che la conoscenza sia una base 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 ci sono soluzioni ovvie, nulla che sia direttamente indirizzato 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 ideare una soluzione e occasionalmente questo processo va nel regno dell'architettura su larga scala.

Mentre un'eccellente comprensione di questi problemi più profondi è necessaria per fare quel tipo di lavoro, non è sufficiente . In altre parole, solo sapere come funziona una tabella di hash o perché un ordinamento di heap di solito ha buone caratteristiche di prestazione 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 ottenere 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 ti accontenti di continuare a fare quello che stai facendo, allora potresti semplicemente voler imparare abbastanza strutture dati e algoritmi per superare le domande dell'intervista in gran parte arbitrarie con cui ti trovi.

Se vuoi crescere nella tua carriera e hai la passione per questo che è essenziale, dovresti abbracciare queste materie 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 segnato il corso per gran parte del resto della mia vita, e non potrei essere più grato per questo. Ora, non posso immaginare di fare altro che lavorare come ingegnere del software.

Buona fortuna con tutto ciò che scegli.

    
risposta data 11.11.2010 - 17:29
fonte
10

Dipende dal tipo di lavoro. Questo genere di cose sono domande dell'intervista abbastanza standard, ma sono anche abbastanza prive di fantasia e probabilmente non riguardano affatto il lavoro - certamente non è un lavoro che usa le tecnologie che elencherai.

Per me, come domande dell'intervista, sono un buon giudice se hai fatto una laurea in Informatica (e lo puoi ricordare) piuttosto che qualsiasi misura di abilità o conoscenza generale di programmazione.

Suggerirei che o impari queste cose in modo da poter passare attraverso l'intervista, o semplicemente accetti che ovunque chiedere queste cose non è per te, ma no, non devi conoscerle per chiamarti un programmatore.

    
risposta data 11.11.2010 - 17:10
fonte
6

Ottima domanda. Javascript o Java o VC ++ sono linguaggi di programmazione super intelligenti in cui non avrai mai bisogno di creare una lista collegata o una tabella hash da zero. Ma devi comunque avere la capacità di decidere quando usarne uno sull'altro, le penalità e i bonus di performance che ciascuno accumula ecc.

Ho intervistato molti programmatori API , come le code-scimmie e, nella maggior parte delle interviste, non sono riusciti regolarmente a progettare sistemi efficienti dal punto di vista delle prestazioni e scalabili. Bottom line: conoscere un sacco di API ti porterà il pane, ma per il burro è necessario partire dalle basi dell'informatica.

    
risposta data 28.11.2010 - 18:18
fonte
3

Aggiungerò "sì, certo che puoi ancora definirti un programmatore". Ma che tipo di programmatore vuoi essere? Penso che i migliori programmatori abbiano almeno delle basi nelle basi teoriche. Conoscono perché hanno scelto una particolare struttura / algoritmo di dati, nonché i compromessi che ne derivano. Mi aspetto che qualsiasi sviluppatore 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).

    
risposta data 11.11.2010 - 17:41
fonte
2

La conoscenza degli algoritmi ti consente di dire con confidenza in che modo le tue scelte saranno scale ! Personalmente ritengo che sia necessario essere un programmatore senior

    
risposta data 28.11.2010 - 18:35
fonte
2

"If you want to be a good programmer you just program every day for two years. If you want to be a world class programmer you can program every day for ten years, or you could program every day for two years and take an algorithms class."

-Charles E. Leiserson

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

    
risposta data 08.04.2013 - 17:33
fonte
1

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

Ho trascorso molto tempo a lavorare nel design (test, doc, progettazione del codice). Ma quando trovo un bug (o una cattiva prestazione) o devo codificare una nuova struttura dati (perché il requisito è molto NUOVO per l'applicazione), devo capire dove si trova il problema nell'istrm e devo correggerlo ( L'ho fatto non molto bene, quindi:))

Gli algoritmi classici e le strutture dati sono una sorta di "schema di dizionario" nel mondo dello sviluppatore.

Alcuni link eccellenti:

risposta data 11.11.2010 - 17:42
fonte
1

Potresti essere un buon programmatore    adesso, ma conoscenza dei dati    Struttura, algoritmi e conoscenza    di altri argomenti in informatica    sarebbe sicuramente di grande aiuto    migliorarti in molti modi:

  • Potresti essere in grado per essere più efficace e più veloce facendo cose. Anche gente che già avere una laurea in Informatica e sanno che molti di questi argomenti tenderanno per stare al passo con gli ultimi progressi per migliorare stessi.

  • Questa conoscenza sarà anche utile per, se fino a un livello minore, dì se tu passare dal programmatore alla gestione rintracciare più tardi, perché vorresti ancora essere in grado di capire il tecnico aspetti migliori dei progetti con questo conoscenza.

  • Naturalmente struttura dei dati e gli algoritmi sono molto richiesti interviste, quindi questa è un'altra motivo per cui potrebbe essere utile sapere loro.

risposta data 11.11.2010 - 19:44
fonte
0

Hai menzionato hash, alberi, pile, code e algoritmi di ordinamento. Bene, le tecnologie che hai citato sono per lo più legate alla pagina web e allo scripting web. Dovresti assolutamente capire gli alberi, per cui puoi lavorare bene con il DOM. Ma se lo scripting è tutto ciò che devi fare, probabilmente stai bene. Non avrai bisogno della maggior parte degli strumenti del mestiere per un vero programmatore. Ma questo perché c'è una grande differenza tra il juggling delle stringhe che costituisce la maggior parte degli script Web e ciò che molti di noi considerano "programmi di scrittura".

Lavoro con gli hash e gli alberi praticamente ogni giorno, e pile e code meno spesso ma abbastanza frequentemente. L'ordinamento è fondamentalmente un problema risolto; praticamente qualsiasi lingua ha un quicksort incorporato nella libreria standard, un metodo Sort sui tipi di raccolta di base, ecc., ma devi 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 come funzionassero, potrei probabilmente modificare le soluzioni di codifica che funzionano, ma non sarebbero soluzioni di ottima qualità. Correvano lenti, 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 le strutture dati. Miglioreranno davvero la qualità del tuo codice.

    
risposta data 11.11.2010 - 19:37
fonte