You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 KiB

Kodering Onderhoud Universiteit

Ek het oorspronklik dié as 'n kort om-te-doen lys van studie onderwerpe om 'n sagteware ingenieur te word gemaak, maar dit het gegroei tot die groot lys wat jy vandag sien. Nadat ek dié studieplan gevolg het, het Amazon my aangestel! Jy hoef heel waarskynlik nie soveel soos ek te studeer nie. Maar alles wat jy nodig het is hier.

Ek het ongeveer 8-12 gestudeer elke dag, vir maande. Hier is my storie: Hoekom ek vol-tyd gestudeer het, vir 8 maande, vir 'n Google onderhoud

Let asseblief op: Jy sal nie soveel soos ek hoef te studeer nie. Ek het baie tyd gemors op goed wat ek nie benodig het nie. Meer inligting daaroor onder. Ek sal jou help leer sonder om jou kosbare tyd te mors.

Die items wat hier gelys is sal jou goed voorberei vir tegniese onderhoude by omtrent enige sagteware maatskappy, insluitend die reuse: Amazon, Facebook, Google, en Microsoft.

Sterkte!

Vertalings:
Vertalings aan die gang:

Wat is dit?

Kodering op die witbord - van HBO se Silicon Valley

Dié is my multi-maand studie plan om 'n sagteware ingeneur te word vir 'n groot maatskappy.

Benodighede:

  • 'n Bietjie ondervinding met kodrering (veranderlikes, lusse, metodes/funksies, ens)
  • Geduld
  • Tyd

Let wel dat die 'n studieplan vir 'n sagteware ingeneur pos is, nie 'n webontwikkeling pos nie. Groot maatskappeie soos Google, Amazon, Facebook en Microsoft sien sagteware ingeneurs as verskilled van webontwikkeling ingeneurs. Byvoorbeeld, Amazon het Frontend Ingeneurs (FEE) en Sagteware Ontwikkeling Ingeneurs (SDE). Die is 2 verskeie rolle en die onderhoude verskil, omdat elkeen sy eie bevoegdhede het. Dié maatskappeie benodig rekenaar wetenskap kennis vir sagteware ontwikkeling/ingeneur rolle.


Inhoudsopgawe

Die Studie Plan

Onderwerpe om te Studeer

Kry die Werk

---------------- Alles hieronder is opsioneel ----------------

Opsionele Ekstra Onderwerpe & Hulpbronne


Hoekom gebruik dit?

As jy wil werk as 'n sagteware ingeneur vir 'n groot maatskappy, hierdie is die goed wat jy moet ken.

As jy uitgemis het op 'n rekenaar wetenskap graad, soos ek het, sal hierdie jou laat opvang en vier jaar van jou lewe spaar.

Toe ek hierdie projek begin het, kon ek nie verskil tussen 'n stapel en 'n hoop nie, het niks van Big-O geweet nie, of enige iets van bome nie, of hoe om 'n grafiek te dwars nie. As ek 'n sorteer algoritme moes kode, kan ek jou verseker dit was verskriklik. Elke datastruktuur wat ek ooit moes gebruik was ingebou in die taal, end ek het nie geweet hoe hulle werk onder die kap nie. Ek het nooit nodig gehaad of geheue te bestuur nie, tensy 'n proses vir my 'n "te min beskikbare geheue" fout gegee het, en dan moes ek 'n ander oplossing kry. Ek het 'n paar multidimensionele skikkings in my lewe gebruik en duisende assosiatiewe skikkings, maar ek hoef nooit 'n datastruktuur van nuut af gebou het nie.

Dis 'n lang plan. Dit gaan maande vat. As jy klaar gemaklik met baie van dié is gaan dit jou baie minder tyd vat.

Hoe om dit te gebruik?

Alles hieronder is 'n uitlyn, en jy moet elke item aan pak in orde van bo tot onder.

Ek gebruik Github se spisiale markdown flavor, insluitend taaklyste om vordering te volg.

As jy nie git wil gebruik nie

Op dié blad, kliek die Code knop naby die bookant, dan kliek "Download ZIP". Unzip die lêer en jy kan werk met die teks lêers.

As jy in 'n kode redakteur is wat markdown verstaan, sal jy sien alles is mooi geformateer.

Hoe om die repo af te laai as 'n zip lêer

As jy gemaklik met git is

Skep 'n nuwe tak sodat jy items soos dié kan merk, sit net 'n x in die hakies: [x]

Virk 'n tak en vold die bevele hieronder

Virk die Github repo https://github.com/jwasham/coding-interview-university deur om die Fork knop to druk.

Kloon na jou plaaslike repo:

git clone git@github.com:<your_github_username>/coding-interview-university.git
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all

Merk al die bokse met X nadat jy jou veranderinge voltooi het:

git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --set-upstream origin progress
git push --force

Moenie voel asof jy nie slim genoeg is nie

'n Nota Oor Video Hulpbronne

Sekere videos is net beskikbaar as jy skryf vir 'n kurses in 'n Coursera of EdX klas. Dié is genoem MOOCs. Soms is die klasse nie in sessie nie end jy sal moet wag vir 'n paar maande, so jy het nie toegang nie.

Dit sal wonderlik wees om die aanlyn klasse te vervang met gratis en altyd-beskikbare openbare bronne, soos YouTube videos (verkieslik universiteitslesings), sodat julle daarvanaf enige tyd kan leer, nie net wanneer 'n spesifieke aanlyn kursus in sessie is nie.

Kies 'n Programmeeringstaal

Jy sal 'n programmeringstaal moet kies vir die kodering onderhoude wat jy gaan doen, maar jy sal dan ook 'n taal moet kies waarmee jy rekenaar wetenskap konsepte kan leer.

Verkieslik is die taal dieselfde, sodat jy net vaardigheid in een hoef te bou.

Vir die Studie Plan

Toe ek die studie plan gedoen het, het ek 2 tale gebruik vir meeste van dit: C en Python

  • C: Baie lae vlak. Laat jou toe om met pointers en geheue allocation/deallocation te werk, sodat jy die datastrukture en algoritmes voel in jou bene. In hoër vlak tale soos Python en Java word die weggesteek van jou af. In daaglikse werk is dit wonderlik, maar wanneer jy leer hoe die lae-vlak datastrukture gebou is, voel dit lekker om naby die metaal te wees.
    • C is orals. Jy sal voorbeelde in boeke, lesings, vidoes, en oral sien wanner jy studeer.
    • The C Programming Language, Vol 2
      • Dié is 'n kort boek, maar dit sal jou 'n goeie vat gee oor die C taal en as jy dit 'n bikie oefen sal jy vinnig vaardigheid bou. Deur om C te verstaan help dit jou om te verstaan hoe programme en geheue werk.
      • Jy hoef nie super diep in die boek te gaan nie (of eens dit klaar te maak nie). Gaan net tot die punt waar jy C gemaklik kan lees en skryf.
      • Antwoorde vir vrae in die boek
  • Python: Modern en baie duur, ek het dit geleer want dis super nuttig en laat my toe om minder kode te skruf in 'n onderhoud.

Die is my voorkeur. Doen jy wat vir jou pas, natuurlik.

Jy mag dit dalk nie nodig kry nie, maar hier is 'n paar webwerwe om jou nuwe taal te leer:

Vir jou Kodering Onderhoud

Jy kan 'n taal gebruik waarmee jy gemaklik in is om die kodeering deel van die onderhoud te doen, maar vir groot maatskappye is die goeie besluite:

  • C++
  • Java
  • Python

Jy kan ook dié gebruik, maar lees eers rond. Daar is baie caveats:

  • JavaScript
  • Ruby

Hier is 'n artikel wat ek geskryf het oor hoe om 'n taal te kies vir die onderhoud: Pick One Language for the Coding Interview. Hierdie is die oorspronklike artikel wat my pos op basseer was: Choosing a Programming Language for Interviews

Jy moet baie gemaklik in die taal wees en kundig.

Lees meer oor besluite:

Sien taal-spesifieke hulpbronne hier

Boeke vir Datastrukture en Algoritmes

Die boek sal jou fondasie vir rekenaar wetenskap vorm.

Kies net een, in die taal waarin jy gemaklik sal wees. Jy sal baie lees en kodeering doen.

C

Python

Java

Jou besluit:

C++

Jou besluit:

Onderhoud Voorbereïngsboeke

Jy hoef nie 'n klomp van die te koop nie. Eerlikwaar is "Craking the Coding Interview" heelwaarskynlik genoeg, maar ek het meer gekoop om myself meer oefening te gee. Maar ek doen altyd te veel.

Ek het beide van die gekoop. Hulle het vir my genoeg oefening gegee.

As jy tonne ekstra tyd het:

Kies een:

Moenie My Foute Maak Nie

Hierdie lys het gegroei oor baie maande, en ja, dit het uit die hand geruk.

Hierdie is 'n paar foute wat ek gemaak het sodat jy 'n beter ervaaring het. En jy sal maande se tyd spaar.

1. Jy Sal Nie Alles Onthou Nie

Ek het ure lank videos gekyk en deeglike notas gevat, en maande later was daar baie wat ek nie meer onthou het nie. Ek het 3 dae spandeer om deur my notas te gaan en flitskaarte te maak, sodat ek kon revisie. Ek het nie al daardie kennis nodig gehaad nie.

Asseblief, lees sodat jy nie my foute maak nie:

Retaining Computer Science Knowledge.

2. Gebruik flitskaarte

Om die probleem op te los, het ek a klein flitskaart webwerf gemaak waar ek 2 tipe flitskaarte kon byvoeg: algemeen en kode. Elke kaart se formatering was verskillend. Ek het 'n mobiele-eerste webwerf gemaak, so ek kon revisie op my foon en tablet, waarookal ek is.

Maak jou eie verniet:

Ek BEVEEL NIE AAN dat jy my flitskaarte gebruik nie. Daar is te veel onnodige kaarte wat jy nie nodig het nie.

Maar as jy nie na my wil luister nie, hier is hulle:

Hou in gedagte dat ek oorboord gegaan het en het kaarte wat alles van assembly taal en Python trivia na masjien leer en statistiek dek. Dit te veel vir wat nodig is.

Nota op flitskaarte: Die eerste keer wat jy erken dat jy die anwoord ken, moenie dit as ken merk nie. Jy moet dieselfde kaart sien en dit vele kere reg beantwoord voordat jy regtig dit ken. Herhaling sal die kennis diepier in jou brein berê.

As 'n alternatief na my flitskaart webwerf is Anki, wat vir my voorgestel is talle kere. Dit gebruik 'n herhalingssisteem om te help onthou. Dit gebruikers-vriendelik, beskikbaar op alle platforms en het 'n wolk sync sisteem. Dit kos $25 op iOS maar is verniet op ander platforms.

My flitskaart databasis in Anki formaat: https://ankiweb.net/shared/info/25173560 (dankie @xiewenya).

Sommige studente het 'n kwessie na vore gebring dat daar wit spasie is in die formatering wat reg gemaak kan word met die volgende stappe: open deck, edit card, kliek cards, kies die "styling" radio knop, verg by die member "white-space: pre;" aan die einde van die card class.

3. Doen Kodering Onderhoud Vrae Terwyl Jy Leer

HIERDIE IS BAIE BELANGRIK.

Begin met die kodering onderhoud vrae terwyl jy datastrukture en algoritmes leer.

Jy moet toepas wat jy leer om probleme op te los, of jy sal vergeet. Ek het die fout gemaak.

Sodra jy 'n onderwerp geleer het, en voel sowat gemaklik met dit, byvoorbeeld, linked lists:

  1. Maak een van die Onderhoud Voorbereïngsboeke (of kodering probleem webwerve, onder gelys) oop
  2. Doen 2 of 3 vrae met betrekking tot linked lists.
  3. Beweeg aan na die volgende onderwerp.
  4. Later, gaan terug en doen nog 2 of 3 linked list probleme.
  5. Doen hierdie met elke nuwe onderwerp wat jy leer.

Hou aan probleme doen terwyl jy al hierdie goed leer, nie na die tyd nie.

Jy word nie aangestel vir kennis nie, maar hoe jy die kennis toepas.

Daar is baie hulpbronne vir dié glys onder. Gaan voort.

4. Fokus

Daar is 'n klomp afleidings wat jou kosbare tyd kan opvat. Fokus en konsentreer is moelik. Sit musiek aan sonder lirieke en jy sal in staat wees of goed te fokus.

Wat Jy Nie Sal Sien Gedek Word Nie

Hierdie is algemene tegnologie maar is nie deel van hierdie studie plan nie:

  • SQL
  • Javascript
  • HTML, CSS, en ander front-end tegnologie.

Die Daaglikse Plan

Die kursus gaan oor baie onderwerpe. Elkeen sal heerwaarskynlik jou 'n paar dae vat, of dalk tog 'n week of meer. Dit hang af van jou skedule.

Elke dag, vat die volgende onderwerp op die lys, kyk 'n paar videos oor daardie onderwerp, en dan skryf 'n implimentering van daardie datastruktuur of algoritme in die taal wat jy gekies het vir hierdie kursus.

Jy kan my kode hier sien:

Jy hoef nie elke algoritme the memoriseer nie. Jy moet net dit genoeg verstaan om jou eie implimenteering te skryf.

Kodering Vrae Beoefening

Hoekom is dié hier? Ek's nie gereed vir onderhoude nie.

Dan gaan terug en lees die.

Hoekom jy oplossings na programeringprobleme moet oefen:

  • Probleem erkenning, en waar die regte datastrukture en algoritmes inpas
  • Versameling van vereistes vir die probleem
  • Praat oor hoe jy die probleem oplos soos jy sal in die onderhoud
  • Kodering op 'n wit bord of papier, nie 'n rekenaar nie
  • Om te formuleer wat die tyd-en-spasie-kompleksiteit vir jou oplossing is (sien Big-O onder)
  • Toets jou oplossing

Daar is 'n wonderlike inleiding vir metodiese, kommunikatiewe probleem oplossing in 'n onderhoud. Jy sal dié ook van die programmeering boeke kry, maar ek het die uitstekend gevind: Algorithm design canvas

Skryf kode op 'n wit bord of papier, nie 'n rekenaar nie. Toets met sommige insette. Dan tik en toets dit op 'n rekenaar.

As jy nie 'n wit bord by die huis het nie, tel 'n groot skryfblad op by die kuns winkel. Jy kan sit op die bank en oefen. Dié is my "sofa whiteboard". Ek het die pen in die foto gesit vir skaal. As jy 'n pen gebruik gaan jy wens jy kon dit uitvee. Word baie morsig. Ek gebruik 'n potlood en uitveër.

my sofa whiteboard

Kodering vrae oefening is nie oor oplossings van programmering probleme memoriseer nie.

Kodering Problem

Moenie jou sleutel kodering onderhoud boeke vergeet hier nie.

Probleme Oplos:

Kodering Onderhoud Vrae Videos:

Uitdaging webwerwe:

Begin Solank

Oraait, genoeg praat, kom ons leer!

Maar moet nie vergeet om kode probleme op te los terwyl jy leer nie!

Algoritmiese kompleksiteit / Big-O / Asimptotiese analiese

Well, dis genoeg van daardie.

Wanneer jy deur "Cracking the Coding Interview" gaan, is daar 'n hoofstuk oor hierdie, en by die einde is daar 'n quiz om te sien of jy kan identifiseer wat die runtime kompleksiteit van verskeie algoritmes is. Dis 'n super revisie en toets.

Datastrukture

Meer Kennis

Bome

Sorteer

As 'n opsomming, hier is 'n visuele verteenwoordiging van 15 sorting algorithms. As jy nog detail nodig het op hierdie onderwer, sien "Sorteer" seksie in Bykomende Detail op Sommige Vakke

Grafieke

Grafieke kan gebruik word om baie problmeme in rekenaar wetenskap te verteenwoordig, so die seksie is lank, soos bome en sortering was.

Nog Meer Kennis


Finalde Revisie

Die seksie sal korter videos hê wat jy kan kyk redelik vinnig vir revisie van die mees belangrike konsepte.
Dis goed om die geheue tydelik te vervris.

Werk Jou CV By

Kry die Werk

Onderhoudproses & Algemene Voorbereiding

Spot Onderhoude:

Dink aan vir wanneer die onderhoud kom

Dink oor sowat 20 onderhoud vrae wat jy sal kry, in die rigting van dié hieronder. Hê ten minste een antwoord vir elkeen. Hê ook 'n storie, nie net data, oor iets wat jy bereik het.

  • Hoekom soek jy hierdie werk?

  • Wat is 'n taai probleem wat jy opgelos het?

  • Grootste uitdagings wat jy in die gesig gestaar het?

  • Beste/slegste ontwerpe wat jy al gesien het?

  • Idees om 'n produk te verbeter?

  • Hoe werk jy beste as 'n individu en as deel van 'n span?

  • Watse vernufte of ondervinding van jou sal 'n bate in die rol wees en hoekom?

  • Wat het jy die meeste geniet by [werk x / projek y]?

  • Wat was die grootste uitdaging wat jy in die gesig gestaar het by [werk x / pojek y]?

  • Wat was die moeilikste gogga wat jy moes oplos by [werk x / projek y]?

  • Wat het jy geleer by [werk x / projek y]?

  • Wat sou jy beter gedoen het by [werk x / projek y]?

  • As jy dit moelik vind om met goeie antwoorde op te kom vir hierdie vrae is hier 'n paar idees:

Hê vrae vir die onderhoudvoerder

'n Paar van meine (Ek ken moontlik al klaar die antwoorde, maar wil hulle opinie of span perspektief hé):

  • How groot is jou span?
  • Hoe lyk jou dev cycle? Doen julle waterfall/sprints/agile?
  • Is dit algemeen om na die sperdatum te jaag? Of is daar buigsaamheid?
  • Hoe word besluite geneem op jou span?
  • Hoeveel vergaderings het julle per week?
  • Voel jy die omgewing help jou fokus?
  • Wat werk jy aan?
  • Wat hou jy van dit?
  • Hoe is die werk lewe?
  • Hoe is die werk/lewe belaans?

Sodra Jy Die Werk Het

Geluk!

Hou aan leer.

Jy is nooit regtig klaar nie.


*****************************************************************************************************
*****************************************************************************************************

Alles hieronder is opsioneel. Dit is NIE nodig vir 'n intreevlak ingeneur nie.
Alhowel, deur om dit te studeer sal jy meer blootstelling kry met CS konsepte, en sal beter voorbereid wees vir
enige sagteware ingeneur werk. Jy sal 'n veel meer afgeronde sagteware ingeneur wees.

*****************************************************************************************************
*****************************************************************************************************

Bykomende Boeke

Hierdie is hier sodat jy kan delf in 'n onderwerp wat jy interessant vind.
  • The Unix Programming Environment
    • An oue maar goeie
  • The Linux Command Line: A Complete Introduction
    • 'n Moderne opsie
  • TCP/IP Illustrated Series
  • Head First Design Patterns
    • 'n Sagte inleiding na ontwerp patrone
  • Design Patterns: Elements of Reusable Object-Oriented Software
    • AKA die "Gang Of Four" boek, of GOF
    • Die kanoniese ontwerp patrone boek
  • Algorithm Design Manual (Skiena)
    • As 'n revisie en probleem herkening
    • Die algoritme katalogus porsie is ver buite die omvang van probleme wat jy in die onderhoud sal kry
    • Die bok het 2 dele:
      • Klass teksboek oor datastrukture en algoritmes
        • Pros:
          • Is so goed 'n revisie soos enige teksboek sal wees
          • Goeie stories van sy ondervinding met probleme oplos in die bedryf en akademie
          • Kode voorbeelde in C
        • Cons:
          • Kan so dig en ondeurdringbaar soos CLRS wees, en in sommige gevalle, kan CLRS 'n beter alternatief wees vir sekere onderwerpe
          • Hoofstukke 7, 8, 9 kan pynlik wees om te probeer volg, omdat sommige items nie goed verduidelik word nie en bonodig meer brain wat ek nie het nie
          • Moenie my misverstaan nie: Ek hou van Skiena, sy onderrig style, en manerismes, maar ek mag dalk nie Stony Brook materiaal wees nie
      • Algorime katalogus:
        • Die is die egte rede hoekom jy hierdie boek koop.
        • Die boek is beter as 'n algoritme verwysing, en nie iets wat jy lees om heel te dek nie.
    • Kan op Kindle huur
    • Antwoorde
    • Errata
  • Write Great Code: Volume 1: Understanding the Machine
    • Die boek was gepubliseer in 2004, en is sowat verouderd, maar dis 'n geweldige hulpbron om 'n rekenaar in kort te verstaan
    • Die outeur het HLA uitgeving, so vat noemings en voorbeelde in HLA met 'n graan sout. Nie wyd gebruik nie, maar goeie voorbeelde van hoe assembly lyk
    • Hierdie hoofstukke is die moeite werk om te lees vir 'n goeie fondament:
      • Hoofstuk 2 - Numeric Representation
      • Hoofstuk 3 - Binary Arithmetic and Bit Operations
      • Hoofstuk 4 - Floating-Point Representation
      • Hoofstuk 5 - Character Representation
      • Hoofstuk 6 - Memory Organization and Access
      • Hoofstuk 7 - Composite Data Types and Memory Objects
      • Hoofstuk 9 - CPU Architecture
      • Hoofstuk 10 - Instruction Set Architecture
      • Hoofstuk 11 - Memory Architecture and Organization
  • Introduction to Algorithms
    • Belangrik: Om hierdie boek te lees sal beperkte waarde hê. Die boek is 'n goeie revisie van algoritmes en datastrukture, maar sal jou nie leer hoe om goeie kode te skryf nie. Jy moet in staat wees om goeie, effektiewe oplossings te programeer
    • AKA CLR, soms CLRS, omdat Stein laat saamgekom het
  • Computer Architecture, Sixth Edition: A Quantitative Approach
    • Vir 'n ryker, meer geopdateerde (2017), maar langer behandeling

System Design, Scalability, Data Handling

Jy kan 'n paar ondtwerp vrae verwag as jy 4+ jare ondervinding het.

Bykomende Leer

Ek het hulle by gevoeg om jou te help 'n afgeronde sagteware ingeneur te word en bewus van sekere
tegnologies en algoritmes is, sodat jy 'n groter toolbox het.

Bykomende Detail op Sommige Vakke

Ek het die by gevoeg om sommige idees wat al klaar bo aagebied was, maar nie ingesluit was nie 
omdat dit te veel is, te versterk. Dis maklik om 'n onderwerp te oordoen
Jy wil in hierdie eeu aangestel word, nê?

Video Reeks

Sit terug en geniet.

Rekenaar Wetenskap Kursusse

Algoritmiese implementasie

Papers

LICENSE

CC-BY-SA-4.0