Crack the System Design interjú: tippek egy Twitter szoftvermérnöktől

Nemrég írtam arról, hogy miként kaptam ajánlatokat több csúcsminőségű technológiai vállalattól. Interjúm előkészítési folyamata során rengeteg anyagot olvastam fel, és készítettem egy sor megjegyzést a rendszertervezési problémák kezeléséről. Ebben a cikkben ezeket a tippeket szeretném megosztani mindenkivel.

Ha friss diplomát szerzett, és nincs tapasztalata nagyszabású elosztott rendszerek terén, vagy akár gyakorlott mérnök, aki több éves tapasztalattal rendelkezik az öv alatt, ez a cikk hasznos lesz az Ön számára.

Frissítés (2019.03.24.) : Ha csatlakozni szeretne egy diákcsoporthoz, hogy többet megtudjon a rendszer tervezéséről, egy kis osztályt szervezek együtt! Ha többet szeretne megtudni, keresse fel ezt a linket, vagy további információért látogassa meg a webhelyemet: zhiachong.com.

Ez a cikk a következő négy szakaszra oszlik:

  • Tegyen fel tisztázó kérdéseket
  • Használd a hátteredet
  • Szisztematikusan kezelje a problémát
  • Tartsa meg saját jegyzeteit

Tegyen fel tisztázó kérdéseket

A rendszertervezési interjú alapvető célja, hogy lehetőséget adjon a jelöltnek tudásának bemutatására.

Nincsenek szigorúan helyes vagy rossz válaszok. Egy jó rendszertervezési kérdés általában nagyon félreérthetően hangzik, és ennek az az oka, hogy állítólag lehetőséget ad az alábbiak bemutatására:

  • Hogyan gondolkodna a problématerületről
  • Hogyan gondolkodik a szűk keresztmetszetekről
  • Mit tehet e szűk keresztmetszetek megszüntetése érdekében.

Képzelje el, hogy felkérnek egy fekete doboz tervezésére. Hogyan kezelné a problémát? Nincsenek egyértelmű útmutatások arról, hogy mit kell itt felépítenie, eltekintve attól, hogy a doboz képes néhány elemet benne tartani.

Az egyik leghasznosabb stratégia, amelyet személyesen alkalmazok, az, hogy kérdezősködjek. Melyek a „jó” tisztázási kérdések?

Egy jó pontosító kérdés segít elérni egy vagy több dolgot:

  1. Segít szűkíteni a tennivalók körét
  2. Segít tisztázni, hogy mi a felhasználó elvárása a rendszertől
  3. Útmutatást ad a folytatáshoz
  4. Tájékoztatja a lehetséges szűk keresztmetszetekről / problémás területekről

A fekete doboz példában megkérdezheti: „Nos, mit tart a doboz? Hány tárgy van benne? És ki a tervezett felhasználó?

Erre mondhatnám, építsünk egy sárga dobozt, amelyen egy mosolygó látható, amely legfeljebb 1 teniszlabdát tartalmazhat. Ez azonban nem egy hétköznapi teniszlabda. Legalább 0,5 m sugarú lesz és súlya körülbelül 1 kg. Azt akarja, hogy átölelje, és ne tartsa meg, ezért nem akarok semmilyen fogantyút rajta.

Tessék, ez a doboz.

Mindig tegyen fel tisztázó kérdéseket. Nem az alapján ítélik meg, hogy feltett-e egy konkrét kérdést az interjú során, hanem azt, hogy hogyan gondolkodik a problématerületről.

Például, ha arra kérnélek benneteket, hogy most tervezze meg a Twitteret, hogyan tenné? Szánjon rá néhány percet a gondolkodásra, és talán még egy papírlapra is felvázolja. Menjen a lehető legmélyebben és szélesebb körben, majd térjen vissza ehhez a cikkhez. Még jobb, ha az alábbi megjegyzésekben hagyhatja jegyzeteit, és további megbeszéléseket folytathatunk.

Ha még nem jött rá, a fenti gyakorlat végeredménye jelentősen eltérő eredményeket hozna. Saját saját háttéremre nézve talán nagyon elmélyülök az API tervezésében és a háttér-infrastruktúrában. Valószínűleg az iPhone-specifikus problémákat is felfedezném, tapasztalataim miatt. Beszélek arról, hogy az ügyfél hogyan lép kapcsolatba a középső szintű végpontokkal, hogyan működne a naplózás, hogyan tervezném meg a háttérprogramot az üzemidő biztosítása érdekében, és így tovább.

Ezek nagyon érdekes beszélgetések, amelyeket meg lehet folytatni egy kollégájával, és ez nagyon erős jel, amelyet egy kérdező keres.

Használja a hátterét előnyére

Gyakran látom, hogy a mérnökök megpróbálják kitalálni, hogy mit kérdez az interjúztató, majd válaszukat kielégítik az elvárásoknak megfelelően.

Több okból is nagyon elbátortalanítom ezt:

  1. Mindenkinek egyedi háttere van. A rendszertervezési interjúban alkalom nyílik arra, hogy bemutassa, mik az erősségei. Ne pazarolja a lehetőséget arra, hogy kitalálja, mire számíthat valaki más tőled.
  2. Lehet, hogy az interjúztató bólintott a válaszaidon, de tudták, hogy csak blöffölsz és nem gondolsz a problémára.

Tapasztalata és háttere nagyban eltérhet a következő jelölttől. Olyan értékrendet és szakértelmet hoz az asztalra, amelyet senki más nem tud. Ez tesz téged értékesé és pótolhatatlanná. Függetlenül attól, hogy milyen területen te vagy, az emberek törődnek mit akkor hozhat az asztalra.

Szisztematikusan kezelje a problémát

Most, szaktudásomat szem előtt tartva, számos dologra gondolok, amikor új rendszerrel foglalkozom. Nagyon ajánlom, hogy fogalmazzon meg egy kritériumot vagy lépést önmagának is.

Néhány gondolat, amikor új rendszeren dolgozom:

  • Mi a rendszer célja?
  • Kik a rendszer felhasználói?
  • Milyen skálán dolgozunk?
  • Ez egy új / régi rendszer? Hogyan kezeljük a verziószámot?

Többek között…

Lásd, az én kritériumkészletem különbözik a front-end mérnök kritériumaitól. Ezeket a kritériumokat használom a kép megfogalmazására a fejemben, és ezek irányítják a döntéshozatali folyamatomat.

A kérdésekre adott válaszokkal felvértezve elkezdhetem kezelni a problémát, majd szisztematikusan lebontani az egyes összetevőkre.

Egy jó gyakorlat, amit szeretek csinálni, hogy hogyan tervezzek meg egy kávé-rendelési rendszert . Erre gondoltam, amikor egy nap a Starbucksban ültem, és rájöttem, hogy jó lenne, ha a telefonomra rendelhetnék egy turmixot, és a helyi Starbucks-nál átvenném.

Az agyam különböző irányokba kezdett:

  • Mit csinál ez a kávérendelő gép?
  • Ha megépítem, eladhatom a Starbucks-nak, vagy felcímkézhetem és szolgáltatásként eladhatom?
  • Hány felhasználót kell támogatnom, ha eladom a Starbucks-nak?
  • Alternatív megoldásként, ha fehér címkével látom el, eladhatom-e a kávézó-rendelési szolgáltatásom kezelőfelületét, és ezután segíthetek az ügyfeleknek egy háttérprogram kiépítésében, hogy a helyi gépeiken tárolhassák a rendeléseket?

Amint választ kapok ezekre a kérdésekre, végre teljes képet alkothatok arról, hogy mit csinál a kávét megrendelő szolgáltatásom. Így néz ki a kávé-rendelési szolgáltatásom verziója :

A kávé-rendelési szolgáltatásom egy szoftver mint szolgáltatás (SAAS). Felületet kínál a különböző partnerek számára, amelyekhez csatlakozni lehet.

  • Van egy API-ja, az addCoffeeForMerchant néven , amely megadja a kávé nevét, a kávé árát és a kávé összetevőit.
  • Van egy GET API, az úgynevezett getCoffeesForMerchant , amely egy adott kereskedőazonosítóhoz tartozó kávék listáját adja vissza.
  • A kereskedői azonosító egy egyedi azonosító (UUID), amelyet valamilyen kivonatoló mechanizmus segítségével állítanak elő, amelyet az ügyféllel tovább tisztázhat.
  • A szoftver csak olvasható műveletekre van optimalizálva, mert az ügyfelek többsége egyszer elkészíti a menüjét, és a nap folyamán többször is elolvassa.
  • Gyorsítótárazott mechanizmusa van, amely a legkevésbé használt (LRU) kilakoltatási stratégiát használja, mert ha a menüpontot egy ideje nem rendelték meg, akkor az ügyfelemnek mindegy, hogy kissé lassabban jelenik-e meg a menüben.
  • Abban az esetben, ha valamelyik adattároló kitör, a kávé-rendelési szolgáltatásom az USA nyugati és keleti partvidékein át replikálja az adatokat az egyes klaszterek között, mert egyelőre csak az amerikai piacot célozom meg.

Alternatív megoldásként minden más kávé megrendelési szolgáltatás, amelyre gondolhat, szintén nagyon valószínű. Csak az a kérdés, hogy mire optimalizál. Úgy gondolom, hogy ezek nagyon érdekes problémák, és nagyszerű szellemi gyakorlat, hogy az elmédet elkötelezd.

Tartsa meg saját jegyzeteit

Mint szoftvermérnök, ez a tanulás soha véget nem érő folyamata. Nagyon ajánlom, hogy az Evernote vagy a Moleskin segítségével jegyzeteljen. Én személy szerint hordozok egy kis jegyzetfüzetet a gyors ötletekhez, amelyeket le kell írnom, és amikor csak tehetek, különféle egyéb dolgokat tartok az Evernote-on.

Van egy „Programozás” nevű Notebook az Evernote-ban. Valahányszor valami új vagy érdekes dologba ütközöm, további utalás céljából feljegyzem a füzetembe.

Havonta vagy negyedévente átnézem és címkéket rendelek ezekhez az új jegyzetekhez, hogy megbizonyosodjak a jegyzetek rendszerezéséről. Például van egy „Design” címke mindenre, ami a rendszer tervezéséhez kapcsolódik. Ez lehet valami, mint egy link egy YouTube-videóra, amelyet érdekesnek találtam, vagy érdekes érv, amelyet munkatársam megfogalmazott, és amelyre nem gondoltam.

Ez egy példa az egyik jegyzetem küllemére:

Az egyik dolog, amit nemrégiben tanultam egy munkatársától, az az, hogy a NoSQL kiválóan használható prototípusok készítéséhez, mert nincs szükség sémai megbeszélésekre más csapatokkal. Ha meg akartam változtatni a sémát, akkor ezt egy NoSQL adatbázissal nagyon gyorsan meg tudom csinálni. Ez egy kulcsfontosságú tanulás volt a munkából, amelyet betettem a „Programozás” jegyzetfüzetembe.

A jegyzeteimet a következőkre bontom:

  1. Rendszertervek
  2. Interjú (tapasztalat + áttekintés a korábbi interjúimról, cégnév szerint csoportosítva)
  3. Véletlenszerű bitek, CS jó ismeretek, például hasznos bash szkriptek vagy parancssori trükkök
  4. Olvasások / YouTube videók

A fenti megjegyzések mindegyike a „Programozás” alatt található. Idővel azt tapasztalom, hogy álszervezett gyűjteményem van azokról a dolgokról, amelyeket vagy korábban olvastam, vagy felfedeztem.

Mint bárki, aki személyes szinten ismer engem, nem vagyok túl szervezett ember. Így csak a dolgok 10-15% -át gyűjtöttem össze, így sokkal több van hátra.

A tudás és a gyakorlat kéz a kézben járul hozzá a rendszertervezés javításához. Ha úgy érzi, hogy jelenlegi munkája nem engedi meg Önnek a lehetőséget a rendszertervezésre, akkor vagy meg kell találnia egyet, amelyik igen, vagy meg kell próbálni megtervezni a meglévő architektúra egy kis részét úgy, hogy vagy gyorsabb, olcsóbb, robusztusabb legyen, vagy a jövőben könnyebben módosítható.

Források, amelyeket ajánlok

Bevezetés: Architektúra és rendszertervezések - Remek Youtube oktatóprogram egy ex-Facebook mérnöktől a rendszertervezési problémák kezeléséhez.

Adatigényes alkalmazások tervezése - Egy másik jó forrás a méretarányos tervezés megtanulásához. Különböző dolgokról beszél, amelyeket egy tipikus szoftvermérnök természetesnek vesz - hogyan működnek az adatbázisok (mySQL és noSQL), mikor kell ezeket használni, a különféle technikák előnyeivel és hátrányaival a skála kezelésére stb. Nagyon ajánlom?

Gúnyinterjúk - A tényleges interjút utánzó szimulált környezet rendkívül hasznos az interjúkra való felkészülés során. Ha találsz egy barátot, aki megteszi helyetted, akkor nagyon ajánlom. Álinterjúkat is folytatok, így ha érdekel, keressen bátran a zhiachong.com címen!

Amit minden szoftvermérnöknek tudnia kell a valós idejű adatok egységesítő absztrakciójáról - Nagyon hosszadalmas és technikai vita a naplókról, a kompromisszumokról. Még nem fejeztem be, de nagyon ajánlott egy munkatárstól.

Evernote - A legjobb? jegyzetelő alkalmazás, amit használtam. Számos oktatóanyag található az Evernote legjobb kihasználásáról. Még nem éltem át őket, egyszerűen azért, mert csak notebookként használom. Mindent naplózok, amit megtanulok, majd időnként átmegyek és átszervezem őket.

Moleskin notebook - ezt nagyon élvezem. A minősége rendkívül magas. Az ár valamivel magasabb, de mivel napi szinten használom, jó befektetésnek tartom. Ha mindennap gyönyörű notebookot tartok a kezemben, akkor izgatottabb vagyok, ha további jegyzeteket írok.

Pilot G2 (fekete) - Könnyen a legjobb tollak, amiket valaha használtam, és az egyetlenek, amelyeket használok. Tömegesen vásárolom őket az Amazon-tól, és mindenhol tartom őket. Van egy a hátizsákomban, egy az irodában és egy az otthoni irodámban, így mindig toll van körülöttem. Remekül ír, a tinta zökkenőmentesen folyik, és egyszerűen imádom az írás érzését vele. A Moleskinnel együtt néha csak fel akarom venni a G2-t, hogy véletlenszerű dolgokat írjak oda, mert ez a kettő annyira tökéletes együtt.

Grokking a rendszerterv interjú - Ez a barátok ajánlása. Ez egy online tanfolyam, amely megtanítja, hogyan kell részletesen megtervezni az elosztott rendszert. Ez egy 79 dolláros tanfolyam. Csapatárak vannak. Ha van valamilyen érdeklődés, megkérdezem tőlük, hogy lehetséges-e csoportot létrehozni csoportos kedvezményre.

Kövessen a Twitteren, a Facebookon és a LinkedIn-en. Iratkozzon fel a levelezőlistámra, ahová rendszeresen küldök tippeket, trükköket és iparági ismereteket.

Ha tetszett ez a cikk, kommentálja alább: mi a tippje egy skálázható, megbízható rendszer kiépítéséhez?