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

Nemrég írtam arról, hogy hogyan fogadtam el több csúcstechnológiát kínáló vállalat ajánlatát. Az interjúk előkészítése során sok anyagot olvastam és megjegyzéseket készítettem a rendszer tervezési problémáinak kezelésére. Ebben a cikkben szeretném megosztani ezeket a tippeket mindenkinek.

Ha Ön frissen végzett diplomás, nincs tapasztalata nagyszabású elosztott rendszerekben, vagy akár tapasztalt mérnök, aki éves tapasztalattal rendelkezik az övé alatt, ez a cikk hasznos lesz az Ön számára.

Frissítés (24/3/2019): Ha csatlakozni szeretne egy diákcsoporthoz, hogy többet megtudjon a rendszer tervezéséről, együtt szervezem egy kis osztályt! Megnézheti ezt a linket, ha többet szeretne megtudni, vagy látogasson el a webhelyemre: zhiachong.com további információkért.

Rendszer-tervezés: Tippek egy Twitter szoftvermérnöktől

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

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

Tegyen fel tisztázási kérdéseket

A rendszer-tervező interjú alapvető célja, hogy lehetőséget biztosítson a jelöltnek tudásuk bemutatására.

Nincs szigorúan helyes vagy rossz válasz. Egy jó rendszertervezési kérdés általában nagyon kétértelműnek tűnik, és ennek oka az, hogy feltételezhetően lehetőséget ad neked a következő bemutatására:

  • Hogyan gondolná a problémát?
  • Hogyan gondolsz a szűk keresztmetszetekről?
  • Mit tehetsz ezeknek a szűk keresztmetszeteknek a megszüntetése érdekében?
Hogyan kell megtervezni ezt a fekete dobozt?

Képzelje el, hogy egy fekete doboz tervezését kéri tőlük. Hogyan kezelné a problémát? Nincs egyértelmű útmutatás arról, hogy mit kell itt építenie, eltekintve attól a doboztól, amely bizonyos elemeket képes tartani benne.

Az egyik leghasznosabb stratégia, amelyet személyesen alkalmazok, tisztázási kérdések feltevése. Mit kérdezel, mi a „jó” pontosítás kérdése?

Egy jó tisztázási kérdés segít elérni egy vagy több dolgot:

  1. Segít szűkíteni annak a hatókörét, amelyet tennie kell
  2. Segít tisztázni, hogy mi a rendszer felhasználói elvárása
  3. Útmutatást ad a továbblépéshez
  4. Tájékoztatja a lehetséges szűk keresztmetszeteket / problémás területeket

A fekete doboz példájában azt kérdezheti: „Nos, mit tart a doboz? Hány elem tart? És ki a tervezett felhasználó? ”

Ehhez mondhatnék: építsünk egy sárga dobozt egy mosolyogással, amelyen legfeljebb 1 teniszlabda tartható. Ez azonban nem egy közönséges teniszlabda. Legalább 0,5 méter sugarú és körülbelül 1 kg súlyú lesz. Úgy érte, hogy megöleljük, nem tartjuk, ezért nem akarok rajta egy markolatot.

Menj, ez a doboz.

Ideális dobozom mosolygó arccal

Mindig kérjen tisztázó kérdéseket. Nem az Ön megítélésén múlik, hogy adott-e valami konkrét kérdést az interjú során, hanem azt, hogy hogyan gondolkodik a problématérről.

Például, ha most felkérném Önt, hogy készítsen Twitter-et, hogyan csinálja? Szánjon rá néhány percet, hogy gondolkozzon rajta, és talán még rajzolja ki egy darab papírra. Menjen minél mélyebben és szélesebb körben, majd térjen vissza ehhez a cikkhez. Még jobb, ha megjegyzéseit az alábbi megjegyzésekbe hagyhatja, és tovább megvitathatjuk.

Ha még nem jött rá, a fenti gyakorlat végeredménye lényegesen eltérő eredményeket eredményezne. Saját saját hátteremet illetően valóban mélyen belemerül az API-tervezésbe és a háttér-infrastruktúrába. Valószínűleg az iPhone-specifikus problémákat is feltártam, tapasztalataim miatt. Beszélni fogok arról, hogy az ügyfél hogyan működik együtt a középső szintű végpontokkal, hogyan működne a naplózás, hogyan terveztem meg a háttérképet az üzemidő biztosítása érdekében, és így tovább.

Ez nagyon érdekes beszélgetés, amelyet kollégájával folytathat, és ez egy nagyon erős jel, amelyet egy interjúzó keres.

Használja ki a háttér előnyeit

Gyakran látom, hogy a mérnökök megpróbálják kitalálni, mit kérdeznek az interjúkészítő, majd válaszokat adnak az elvárásoknak megfelelően.

Számos ok miatt nagyon visszatartom bárkit attól:

  1. Mindenkinek egyedi háttérképe van. Rendszer-tervező interjúban ez egy alkalom, hogy bemutassa, mi az erőssége. Ne pazarolja a lehetőségeket, amikor kitalálja, mire számíthat másoktól mások.
  2. Az interjúkészítő esetleg bólintott a válaszaival szemben, de tudhatták, hogy csak az átfutáson megy keresztül, és valójában nem gondolt a problémára.

Tapasztalata és háttere nagyban különbözhet a következő jelölttől. Értékek és szakértelem sorozatát hozza az asztalra, amelyet senki más nem tud. Ez az, ami értékes és pótolhatatlanná tesz téged. Függetlenül attól, hogy milyen területen vagy, az emberek törődnek azzal, hogy mit hozhat az asztalra.

Szisztematikusan kezelje a problémát

Most, a tudásomat szem előtt tartva, számos dologra gondolok, amikor egy új rendszerrel foglalkozom. Nagyon javaslom, hogy fogalmazzon meg kritériumokat vagy lépéseket saját maga számára is.

Néhány dolog, amire gondolok, amikor egy ú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ókészítést?

Többek között…

Lásd: a kritériumcsoportom különbözik a front-end mérnök kritériumkészletétől. E kritériumok alapján képet formázok a fejemben, és ezek irányítják a döntéshozatali folyamatomat.

E kérdésekre adott válaszokkal felfegyverkezve elkezdem kezdeni a jelenlegi probléma kezelését, majd azt szisztematikusan bontani egyes komponensekre.

Egy jó gyakorlat, amit szeretek csinálni, az, hogy hogyan tervezek egy kávérendelési rendszert. Erre gondoltam, miközben egy nap a Starbucks-on ültem, és rájöttem, hogy jó lenne, ha megrendelem egy turmixot a telefonomra, és felvehetem a helyi Starbucks-on.

A fejemben különböző irányokba kezdtem menni:

  • Mit csinál ez a kávérendelő gép?
  • Ha építek egyet, eladhatom-e a Starbucks-nak, vagy felcímkézhetem, és szolgáltatásként eladhatom?
  • Hány felhasználót kell támogatnom, ha a Starbucksnek eladom?
  • Alternatív megoldásként, ha fehér címkével látom el, eladhatom-e a felületet a kávé-megrendelő szolgáltatásomnak, és segíthetek az ügyfeleknek a háttérrendszer felépítésében, hogy a megrendeléseket a helyi gépeken tárolhassák?
Hogyan lehet megközelíteni ezt a problémát?

Amint megkapom a válaszokat ezekre a kérdésekre, végre teljes képet tudok készíteni arról, hogy mit csinál a kávét rendelő szolgáltatásom. Így néz ki a kávérendelési szolgáltatás verzióm:

Kávé-rendelési szolgáltatásom egy szoftver mint szolgáltatás (SAAS). Interfészt kínál a különféle partnerek számára a csatlakoztatáshoz.

  • Van egy addCoffeeForMerchant nevű API, amely beszúrja a kávé nevét, a kávé árát és a kávé összetevőit.
  • GET API-val rendelkezik, getCoffeesForMerchant néven, amely egy adott kereskedő-azonosítóhoz tartozó kávék listáját adja vissza.
  • A kereskedő azonosítója egy egyedi azonosító (UUID), amelyet valamilyen hash mechanizmus segítségével állítanak elő, amelyet az ügyféllel tovább lehet tisztázni.
  • A szoftvert csak írásvédett műveletekre optimalizálták, mivel az ügyfelek többsége egyszer létrehozza a menüt, és a nap folyamán többször elolvassa.
  • Van egy gyorsítótárazási mechanizmus, amely a legkevésbé használt (LRU) kilakoltatási stratégiát használja, mert ha egy adott idő alatt a menüelemet nem rendelték el, ügyfelemet nem érdekli, ha kissé lassabban jelenik meg a menüben.
  • Abban az esetben, ha az egyik adattároló önállóan kitör, a kávérendelő szolgálatom replikálja az adatokat az USA nyugati és keleti partjai közötti különböző klaszterekben, mivel csak az USA piacát célozom meg.

Alternatív megoldásként minden egyéb kávémegrendelés is nagyon valószínű. Csak az a kérdés, hogy mit optimalizál. Úgy gondolom, hogy ezek nagyon érdekes problémák, és nagyszerű mentális gyakorlat, ha elméjét elkötelezik.

Tartsa meg saját jegyzeteit

Mint szoftvermérnök, ez egy végtelen tanulási folyamat. Nagyon javaslom, hogy az Evernote vagy a Moleskin használjon jegyzeteket. Személy szerint hordok egy kicsi notebookot gyors ötletekhez, amelyeket le kell írnom, és különféle egyéb dolgokat tartok az Evernote-on, amikor csak tudok.

Az Evernote-ban van egy „Programozás” nevű notebook. Ha valami új vagy valami érdekes dolgot találok, lejegyzem a notebookomba további referencia céljából.

Havonta vagy negyedévente átmegyek és címkéket adok ezeknek az új jegyzeteknek, hogy megbizonyosodjék arról, hogy a jegyzetek szerveződnek-e. Például van egy „Design” címkém mindenre, ami köze van a rendszer tervezéséhez. Ez lehet valami olyan link, mint egy YouTube-videó linkje, amelyet érdekesnek találtam, vagy érdekes érv, amelyet munkatársam tett fel, és amire még nem gondoltam.

Ez egy minta arról, hogy néz ki az egyik jegyzetem:

Elnézést a rossz nyelvtan és a helyesírási szabályok miatt: p

Az egyik dolog, amelyet a közelmúltban megtanultam egy munkatárstól, az, hogy a NoSQL kiválóan alkalmas prototípus készítésre, mivel nincs szükség sémamegbeszélésekre más csoportokkal. Ha meg akarom változtatni a sémát, ezt nagyon gyorsan megtehetem egy NoSQL adatbázis segítségével. Ez kulcsfontosságú tanulás volt a munkából, amelyet beillesztettem a „Programozás” jegyzetfüzetbe.

A jegyzeteimet a következőkre bontom:

  1. Rendszertervek
  2. Interjúk (tapasztalat + a különféle interjúk áttekintése, amelyek múltban voltam, cégnév szerint csoportosítva)
  3. Véletlen apróbb bitek, CS jó tudni, mint például hasznos bash szkriptek vagy parancssori trükkök
  4. Olvasások / YouTube-videók

Az összes fenti megjegyzés a „Programozás” alatt található. Az idő múlásával azt tapasztalom, hogy álruhával szervezett gyűjteményem van a dolgokról, amelyeket a múltban olvastam vagy feltártam.

Mint bárki, aki személyesen ismer engem, nem vagyok túl szervezett ember. Így csak a dolgok 10–15% -át gyűjtöttem össze, tehát még sok más van hátra tenni.

Az ismeretek és a gyakorlat kéz a kézben járnak a rendszerek tervezésének javításában. Ha úgy érzi, hogy jelenlegi munkája nem engedi meg neked a lehetőséget, hogy rendszerterveket készítsen, akkor vagy keressen egyet, amely megteszi, vagy megpróbálja megtervezni egy meglévő architektúra egy kis részét oly módon, hogy gyorsabb, olcsóbb, robusztusabb, vagy könnyebben módosítható a jövőben.

Források, amelyeket ajánlok

Bemutatkozás: Építészet és rendszerek tervezése - Nagyszerű Youtube oktatóprogram egy ex-Facebook mérnöktől arról, hogyan lehet megközelíteni a rendszerek tervezési problémáit.

Adatintenzív alkalmazások tervezése - További jó forrás a méretarányos tervezés megtanulásához. Különféle dolgokról beszél, amelyeket egy tipikus szoftvermérnök magától értetődik - hogyan működnek az adatbázisok (mySQL és noSQL), mikor kell ezeket használni, a különféle technikák előnyeit és hátrányait a skála kezelésére stb. Nagyon ajánlom it

Mock Interjúk - A szimulált környezet, amely utánozza a tényleges interjút, rendkívül hasznos az interjúkra való felkészüléshez. Ha talál egy barátot, aki meg tudja csinálni érted, akkor nagyon ajánlom. Modell interjúkat is tartok, tehát ha érdekli, nyugodtan keressen meg engem a zhiachong.com webhelyen!

Amit minden szoftvermérnöknek tudnia kell a valós idejű adatok egyesítő absztrakciójáról - Nagyon hosszú é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 jegyzetfüzet-alkalmazás, amelyet használtam. Számos útmutatás található arról, hogyan lehet az Evernote-ot legjobban kihasználni. Még nem néztem át őket egyszerűen azért, mert csak notebookként használom. Naplózza mindent, amit ott tanulok, majd alkalmanként átmegy és átszervezi őket.

Moleskin notebook - ezt nagyon élvezem. Minősége rendkívül magas. Az ár kissé magasabb, de mivel naponta használom, jó befektetésnek tartom. Ha minden nap gyönyörű notebookot tart a kezemben, izgatottabb lesz, hogy további jegyzeteket írjak.

Pilot G2 (fekete) - Könnyen a legjobb tollak, amelyeket valaha használtam, és az egyetlen tollak, amelyeket használok. Ömlesztve vásárolom őket az Amazon-tól, és bárhol is tartom őket. Van egy a hátizsákban, egy az irodában és egy az otthoni irodámban, így mindig van egy toll körül. Nagyon jól ír, a tinta simán folyik, és én nagyon szeretem azt a érzést, hogy vele írjak. A Moleskin-kel együtt néha csak azt akarom, hogy felvegye a G2-et, hogy véletlenszerű dolgokat készítsen rajta, mert ezek a kettő annyira tökéletes.

A rendszertervezési interjú felvázolása - ez a barátok ajánlása. Ez egy online tanfolyam, amely megtanítja az elosztott rendszer részletes kidolgozását. Ez egy 79 dolláros tanfolyam. Van egy csapat ára. Ha érdeklődik, kérdezem velük, hogy lehetséges-e csoportot létrehozni csoportkedvezményre.

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

Ha élvezte ezt a cikket, kommentálja az alábbiakat: mi a tippe egy méretezhető, megbízható rendszer felépítéséhez?