it-swarm-eu.dev

Musím pochopit algoritmy a datové struktury, které mají být nazývány programátory?

Je to už šest let, co jsem kódoval. Kódování do všech druhů věcí, jako je ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP atd. Použil jsem pole, mapy, propojené seznamy, sady atd. A kdekoli jsem pracoval jako lidé. Ale vždy, když mě vedou rozhovory, je velmi pravděpodobné, že se mě lidé ptají na hashe, stromy, hromádky a fronty. Některé otázky se týkají žonglování některých třídicích algoritmů. Nevím, jestli bych je měl znát, nebo bych se měl přestat nazývat programátorem. Ve mně je něco, co mi také říká, i když mě lidé, kteří se ptají na všechny tyto otázky, vyberou, nikdy mě nebudou nutit, abych tyto věci pracoval. Opravdu jsem povinen to všechno vědět?

38
sushil bharwani

Pokud vše, co víte, je napsat lepicí kód, můžete si říkat opičí kód. Spousta lepidla kód musí být napsán a můžete si slušný život jako kód opice. Říkat si skutečný programátor TM a být důvěryhodný, když je třeba kód psát od nuly, musíte znát algoritmy, datové struktury, správu paměti, ukazatele, jazyk sestavení atd. a porozumět tomu, jak tyto znalosti využít k vyhodnocení kompromisů.

80
dsimcha

ti, kteří neznají historii, jsou odsouzeni, aby ji objevili

33
Steven A. Lowe

Díky práci v jazyce, jako je JavaScript, je to docela obskurní, protože pole je mix mezi vektorem, hashem a stromem a může být použit jako zásobník nebo fronta. Je velmi nepravděpodobné, že budete někdy potřebovat nebo být schopni implementovat datovou strukturu v JavaScriptu, která překoná třídu Array. To je také případ PHP.

Pro Java OTOH, existuje rozdíl. Předpokládám, že standardní knihovna Java vám poskytuje informace o jakékoli datové struktuře, kterou potřebujete.):

  1. Musíte znát a rozlišit tyto datové struktury a pochopit, jak si vedou v různých situacích, abyste si mohli vybrat tu správnou.
  2. V Javě to není absolutně nepravděpodobné, že budete nakonec chtít napsat vlastní implementaci pro hashmap, abyste získali vyšší rychlost v některých velmi specifických případech (například pokud klíče, které chcete zpracovat, splní některá speciální omezení, která umožňují optimalizaci).

Pokud jde o třídění algoritmů, není třeba je znát ani jim rozumět, protože není třeba nikdy implementovat jeden sám. Pokud je vám však takový algoritmus dán, měli byste být schopni jej pochopit a implementovat.

Jsou jisté dvě věci:

  1. Vy můžete děláte kariéru jako programátor, aniž byste se spoléhali na takové znalosti.
  2. To rozhodně vám neublíží znát je.

Datové struktury a algoritmy jsou prostě věcí, které je dobré pochopit. A je to něco velmi jasného a formalizovaného, ​​a tedy docela triviálního ve srovnání se složitostí aplikačního nebo systémového inženýrství. Jsou to jen jeden malý kousek v puzzle, ale snadno se uchopí - pokud jste ochotni investovat nějaký čas.

Takže ne, nepotřebujete je, ale bylo by to znát pouze pro váš prospěch.

30
back2dos

Může to být příležitost, kdy může být sémanticky smysluplné rozlišení mezi „programátorem“ a „softwarovým inženýrem“. V této souvislosti konkrétně vidíme, že znáte několik programovacích jazyků a souvisejících technologií a že je můžete použít k dosažení požadovaných výsledků. Toto je jemná operační definice „počítačového programátora“.

Považuji se za softwarového inženýra. Ve většině každodenních aspektů mé práce pravděpodobně dělám stejné věci jako vy. Používám počítačový jazyk a související technologie k dosažení žádoucího výsledku. Mám však pochopení datových struktur a algoritmů a tyto znalosti považuji za základní oporu mé schopnosti dělat mnohem více.

Často - i když ne vždy - má práce spočívá v nalezení řešení složitých problémů, pro které neexistují žádná zjevná řešení, nic, co je přímo řešeno vlastnostmi rámce, který používám, nebo schopnostmi jazyka, který pracuji. s. V tomto potřebuji analyzovat problém a navrhnout řešení a občas tento proces jde do říše rozsáhlé architektury.

Ačkoli k tomu, abychom mohli dělat takovou práci, je nezbytné dokonalé porozumění těmto hlubším problémům, není dostatečné. Jinými slovy, pouze vědět, jak funguje hashovací tabulka nebo proč haldy mají obvykle dobré výkonové charakteristiky, nestačí být systémovým architektem nebo vedoucím inženýrem. Je to logické výchozí místo a odtud můžete začít hlouběji kopat a cestovat širší cestou a získat zkušenosti, které jsou také nutné k řešení větších problémů.

Předpokládám, že pro zodpovězení vaší otázky byste se měli zeptat sami sebe: „Co chci být? Kam půjdu s kariérou?“ Pokud jste spokojeni s tím, co děláte, možná se budete chtít jen naučit dost datových struktur a algoritmů, abyste se dostali přes převážně svévolné otázky na pohovor, kterým čelíte.

Pokud chcete růst ve své kariéře a máte pro to vášeň, která je nezbytná, měli byste tyto předměty přijmout tak pevně, jak jen můžete. Pokud na nich budete mít čas, otevřenou mysl a opravdové nadšení, najdete úžasné a vzrušující věci. Nikdy nezapomenu na den, kdy jsem poprvé pochopil rychlý sortiment. Pocit vzrušení a objevení stanovil směr pro většinu zbytku mého života, a nemohl jsem být za to vděčnější. Teď si neumím představit, že bych kromě práce softwarového inženýra udělal cokoli.

Hodně štěstí s tím, co si vyberete.

13
Adam Crossland

Záleží na tom, pro jaké úkoly jsou. Takové věci jsou docela standardní otázky týkající se rozhovorů, ale jsou také docela nepředstavitelné a pravděpodobně se netýkají práce vůbec - rozhodně nejde o práci využívající technologie, které uvedete.

Pro mě jsou otázky na pohovor dobrým soudcem toho, zda jste udělali titul (a pamatujete si ho) na informatiku, než na jakoukoli míru obecných programovacích schopností nebo znalostí.

Navrhoval bych, abyste se buď tyto věci naučili, abyste se dostali skrz rozhovor, nebo prostě přijmete, že kdekoli se vás na tyto věci ptají, není pro vás, ale ne, nemusíte je znát, abyste si říkali sami programátor.

12
Jon Hopkins

Skvělá otázka. Javascript nebo Java nebo VC++ jsou super inteligentní programovací jazyky, ve kterých už nikdy nebudete muset vytvářet propojený seznam nebo hashovací tabulku od nuly. Stále však musíte mít schopnost rozhodnout, kdy ji použít) druhý, výkonnostní pokuty a bonusy, které každý získává atd.

Mám rozhovor s mnoha API programátory aka opice kódu, a ve většině rozhovorů, které běžně nedokázali navrhnout systémy, které jsou výkonově efektivní a škálovatelné. Sečteno a podtrženo: znát spoustu API dostanete chleba, ale u másla musíte začít od základů práce s počítačem.

6
Fanatic23

Přidám „ano, samozřejmě si stále můžete říkat programátor“. Ale jaký programátor chcete být? Myslím, že nejlepší programátoři mají alespoň nějaké základy teoretických základů. Znají proč zvolili konkrétní datovou strukturu/algoritmus a také kompromisy, které s tím souvisí. Očekávám, že jakýkoli vývojář, s nímž hovořím, bude mít alespoň základní porozumění, i když nepoužívá stejný žargon (i když neví, že žargon znamená, že bude pro vás obtížnější komunikovat s ostatními vývojáři).

3
Martijn Verburg

Znalost algoritmů vám umožní s jistotou říci, jak vaše volby budou měřítko! Osobně to považuji za nutné, abych byl senior programátorem

2
user1249

„Pokud chcete být dobrým programátorem, stačí programovat každý den po dobu dvou let. Pokud chcete být světovým programátorem, můžete programovat každý den po dobu deseti let, nebo můžete programovat každý den po dobu dvou let a vzít si třídu algoritmů. . “

-Charles E. Leiserson

Dobrá rada z analýzy algoritmů Charlese E. Leisersona - MIT

2
milan-j

Možná jste právě teď dobrým programátorem, ale znalost struktury dat, algoritmů a znalostí dalších témat v oblasti informatiky by určitě pomohla mnoha způsoby, jak se zlepšit v mnoha ohledech:

  • Možná budete schopni dělat věci efektivněji a rychleji. Dokonce i lidé, kteří již mají titul z informatiky a vědí mnoho z těchto témat, by měli tendenci držet krok s nejnovějšími pokroky, aby se sami zlepšili.

  • Tyto znalosti budou také dobré, pokud až v menší míře, řekněme, pokud se později přesunete z programátoru na manažerskou stopu, protože s těmito znalostmi byste stále mohli lépe porozumět technickým aspektům projektů.

  • Při rozhovorech se samozřejmě hodně ptáme na strukturu dat a algoritmy, což je další důvod, proč by bylo užitečné je znát.

1
aditya

Závisí to na projektu: Jsem BEng in Computer Engineer a pracuji jako analytický programátor.

Strávil jsem hodně času prací v designu (testování, doc, design kódu). Ale když najdu chybu (nebo špatný výkon) nebo musím kódovat novou strukturu dat (protože požadavek je pro aplikaci velmi NOVÝ), musím pochopit, kde je problém v algoritmu a musím ho opravit ( Udělal jsem to ne moc dobře, takže :))

Klasické algoritmy a datové struktury jsou ve světě vývojářů jakýmsi „slovníkovým vzorcem“.

Některé vynikající odkazy:

1
alepuzio

Zmiňujete hashe, stromy, hromádky, fronty a třídicí algoritmy. Technologie, které jste zmínili, se většinou týkají webových stránek a skriptování webů. Určitě byste měli stromům rozumět přinejmenším, abyste mohli s DOM dobře pracovat. Ale pokud je skriptování vše, co musíte udělat, pak jste pravděpodobně v pořádku. Pro skutečného programátora nebudete potřebovat většinu nástrojů obchodu. Ale je to proto, že existuje velký rozdíl mezi žonglováním řetězců, které tvoří většinu webových skriptů, a tím, co většina z nás zvažuje „psaní programů“.

Prakticky denně pracuji s hashami a stromy a stohy a fronty méně často, ale dost často. Třídění je v podstatě vyřešen problém; Téměř každý jazyk má do standardní knihovny vestavěn quicksort, metodu třídění na základní typy kolekce atd., ale měli byste vědět, za jakých okolností může výkon rapidsort vážně degradovat a správné strategie pro zpoždění třídění.

Kdybych tyto zásady nevěděl a jak fungují, pravděpodobně bych mohl proniknout do kódovacích řešení, která fungují, ale nebyla by to velmi kvalitní řešení. Běhaly pomalu, je těžké je číst a je těžké je modifikovat, znovu použít nebo prodloužit. Takže pokud se chcete naučit být dobrým programátorem, měli byste si určitě přečíst své algoritmy a datové struktury. Opravdu zlepší kvalitu vašeho kódu.

0
Mason Wheeler