Crack the System Design -haastattelu: vinkkejä Twitter-ohjelmistoinsinööriltä

Kirjoitin äskettäin siitä, kuinka sain tarjouksia useilta huipputason teknologiayrityksiltä. Haastattelun valmisteluprosessin aikana luin paljon materiaalia ja valmistelin sarjan muistiinpanoja järjestelmän suunnitteluongelmien ratkaisemisesta. Tässä artikkelissa haluaisin jakaa nuo vinkit kaikille.

Jos olet uusi tutkinto, jolla ei ole kokemusta laajamittaisista hajautetuista järjestelmistä, tai edes kokenut insinööri, jolla on vuosien kokemus vyön alla, tämä artikkeli on hyödyllinen sinulle.

Päivitys (24.3.2019) : Jos haluat liittyä opiskelijaryhmään oppimaan lisää järjestelmän suunnittelusta, järjestän pienen luokan yhdessä! Voit siirtyä tälle linkille saadaksesi lisätietoja tai vierailemalla verkkosivustollani: zhiachong.com saadaksesi lisätietoja.

Tämä artikkeli on jaettu seuraaviin neljään osaan:

  • Esitä selvennyskysymyksiä
  • Käytä taustasi
  • Käsittele ongelma järjestelmällisesti
  • Pidä omat muistiinpanosi

Esitä selvennyskysymyksiä

Järjestelmäsuunnitteluhaastattelun päätavoitteena on antaa ehdokkaalle mahdollisuus osoittaa tietonsa.

Ei ole ehdottomasti oikeita tai vääriä vastauksia. Hyvä järjestelmäsuunnittelukysymys kuulostaa yleensä hyvin epämääräiseltä, ja syyn sille on tarkoitus antaa sinulle mahdollisuus osoittaa seuraava:

  • Kuinka ajattelet ongelmatilaa
  • Kuinka ajattelet pullonkauloja
  • Mitä voit tehdä näiden pullonkaulojen poistamiseksi.

Kuvittele, että sinua pyydetään suunnittelemaan musta laatikko. Kuinka käsittelisit ongelmaa? Ei ole selkeitä ohjeita siitä, mitä sinun on rakennettava täällä, lukuun ottamatta laatikkoa, joka pystyy pitämään joitain esineitä siinä.

Yksi hyödyllisimmistä strategioista, joita henkilökohtaisesti käytän, on esittää selvityskysymyksiä. Mitä "hyviä" selvennyskysymyksiä kysyt?

Hyvä selvennyskysymys auttaa sinua saavuttamaan yhden tai useamman useista asioista:

  1. Auttaa sinua kaventamaan tehtäviesi laajuutta
  2. Auttaa selventämään järjestelmän käyttäjien odotuksia
  3. Antaa sinulle ohjeita siitä, mihin edetä
  4. Ilmoittaa mahdollisista pullonkauloista / ongelma-alueista

Mustan laatikon esimerkissä saatat kysyä: "No, mitä laatikko pitää sisällään? Kuinka monta tuotetta siinä on? Ja kuka on tarkoitettu käyttäjä? "

Ehkä voin sanoa, rakennetaan keltainen laatikko, jossa on hymiö, johon mahtuu enintään 1 tennispallo. Tämä ei kuitenkaan ole tavallinen tennispallo. Sen säde on vähintään 0,5 m ja paino noin 1 kg. Se on tarkoitettu halattavaksi, ei pidettäväksi, joten en halua mitään kahvaa siihen.

Tässä menet, tämä on laatikko.

Esitä aina selvennyskysymyksiä. Sinua ei arvioida sen perusteella, kysyitkö haastattelun aikana tietyn kysymyksen vai ei, mutta sen perusteella, miten ajattelet ongelmatilasta.

Esimerkiksi, jos pyytäisin sinua suunnittelemaan Twitterin juuri nyt, miten tekisit sen? Käytä muutama minuutti ajatellaksesi sitä, ja ehkä jopa luonnosta se paperille. Mene niin syvälle ja laajasti kuin voit, ja palaa sitten tähän artikkeliin. Parempi vielä, voit jättää muistiinpanosi alla oleviin kommentteihin ja voimme keskustella edelleen.

Jos et ole vielä ymmärtänyt sitä, yllä olevan harjoituksen lopputulos tuottaisi merkittävästi erilaisia ​​tuloksia. Oman tietyn taustani vuoksi voisin todella syventyä API-suunnitteluun ja backend-infrastruktuuriin. Tutkisin todennäköisesti myös iPhone-kohtaisia ​​ongelmia kokemukseni vuoksi. Puhun siitä, miten asiakas on vuorovaikutuksessa keskitason päätepisteiden kanssa, miten lokitiedostot toimisivat, kuinka suunnittelen taustakuvan käyttöajan varmistamiseksi ja niin edelleen.

Nämä ovat melko mielenkiintoisia keskusteluja, joita voit käydä kollegan kanssa, ja se on erittäin vahva signaali, jota haastattelija etsii.

Käytä taustasi eduksi

Usein näen insinöörien yrittävän selvittää, mitä haastattelija yrittää kysyä, ja sitten järjestää vastauksensa vastaamaan odotuksia.

Suosittelen todella ketään tekemästä tätä useista syistä:

  1. Jokaisella on ainutlaatuinen tausta. Järjestelmäsuunnitteluhaastattelussa se on sinulle mahdollisuus osoittaa vahvuutesi. Älä tuhlaa mahdollisuutta yrittää selvittää, mitä joku muu voi odottaa sinulta.
  2. Haastattelija on saattanut nyökkää vastauksillesi, mutta he ovat ehkä tienneet, että bluffit vain läpi etkä itse ajattele ongelmaa.

Kokemuksesi ja taustasi voivat vaihdella suuresti seuraavasta ehdokkaasta. Tuo pöydälle joukko arvoja ja asiantuntemusta, jota kukaan muu ei voi. Se tekee sinusta arvokkaan ja korvaamattoman. Riippumatta siitä, missä kentässä olet, ihmiset välittävät siitä, mitä voit tuoda pöydälle.

Käsittele ongelmaa järjestelmällisesti

Asiantuntemukseni huomioon ottaen ajattelen nyt useita asioita, kun käsittelen uutta järjestelmää. Suosittelen, että muotoilet joukko kriteerejä tai vaiheita myös itsellesi.

Joitakin asioita mielessäni työskennellessäni uuden järjestelmän parissa ovat:

  • Mikä on järjestelmän tavoite?
  • Ketkä ovat järjestelmän käyttäjiä?
  • Missä laajuudessa työskentelemme?
  • Onko tämä uusi / vanha järjestelmä? Kuinka käsittelemme versiota?

Muiden joukossa…

Katsokaa, minun kriteerijärjestelmäni eroaa käyttöliittymän suunnittelijan kriteerijoukosta. Käytän näitä kriteereitä muotoillakseni kuvan päähäni, ja nämä ohjaavat päätöksentekoprosessiani.

Vastauksena näihin kysymyksiin voin alkaa käsitellä käsillä olevaa ongelmaa ja sitten jakaa sen järjestelmällisesti yksittäisiin osiin.

Hyvä harjoitus, jonka haluan tehdä, on kuinka suunnitella kahvin tilausjärjestelmä . Ajattelin tätä istuessani yhden päivän Starbucksissa ja tajusin, että olisi mukavaa, jos voisin tilata smoothie puhelimelleni ja noutaa sen paikalliselta Starbucksilta.

Mieleni alkoi mennä eri suuntiin:

  • Mitä tämä kahvinkeitin tekee?
  • Jos rakennan sellaisen, voinko myydä sen Starbucksille, vai voinko merkitä sen valkoisella merkinnällä ja myydä sen palveluna?
  • Kuinka monta käyttäjää minun on tuettava, jos myyn sen Starbucksille?
  • Vaihtoehtoisesti, jos merkin sen valkoisella merkinnällä, voinko myydä käyttöliittymän kahvin tilauspalvelulle ja auttaa asiakkaita sitten rakentamaan taustajärjestelmän, jotta he voivat tallentaa tilaukset paikallisiin koneisiinsa?

Kun saan vastaukset näihin kysymyksiin, voin vihdoin muodostaa täydellisen kuvan siitä, mitä kahvini tilauspalvelu tekee. Tältä näyttää versioni kahvia tilaavasta palvelusta:

Kahvin tilauspalveluni on ohjelmisto palveluna (SAAS). Se tarjoaa käyttöliittymän useille kumppaneille.

  • Sillä on API, nimeltään addCoffeeForMerchant , joka lisää kahvin nimen, kahvin hinnan ja kahvin ainesosat.
  • Sillä on GET-sovellusliittymä, nimeltään getCoffeesForMerchant , joka palauttaa kahvilistan tietylle kauppiastunnukselle.
  • Kauppiaan tunnus on yksilöllinen tunniste (UUID), joka luodaan käyttämällä jotain hajautusmekanismia, joka voidaan selvittää asiakkaan kanssa.
  • Ohjelmisto on optimoitu vain luku -toimintoihin, koska suurin osa asiakkaistani luo valikkonsa kerran ja lukee sen useita kertoja koko päivän.
  • Siinä on välimuistimekanismi, joka käyttää vähiten äskettäin käytettyä (LRU) häätöstrategiaa, koska jos valikkokohtaa ei ole tilattu jonkin aikaa, asiakkaani ei välitä, näkyykö se hieman hitaammin valikossa.
  • Jos jokin tietovarastoista purkautuu itsestään, kahvitarjoilupalveluni replikoi tietoja eri klustereista Yhdysvaltojen länsi- ja itärannikolla, koska kohdistan vain toistaiseksi Yhdysvaltain markkinoille.

Vaihtoehtoisesti kaikki muut kahvin tilaamispalvelut, jotka voit ajatella, ovat myös erittäin todennäköisiä. Kyse on vain siitä, mihin optimoit. Mielestäni nämä ovat erittäin mielenkiintoisia ongelmia, ja se on hieno henkinen harjoitus pitää mielesi mukana.

Pidä omat muistiinpanosi

Ohjelmistoinsinöörinä se on loputon oppimisprosessi. Suosittelen, että käytät muistiinpanojen tekemiseen joko Evernotea tai Moleskinia. Henkilökohtaisesti minulla on pieni muistikirja nopeita ideoita varten, jotka minun on kirjoitettava muistiin, ja pidän useita muita asioita Evernotessa aina kun pystyn.

Minulla on muistikirja nimeltä “Ohjelmointi” Evernotessa. Aina kun törmään johonkin uuteen tai mielenkiintoiseen, kirjoitin sen muistikirjaani myöhempää käyttöä varten.

Käyn läpi ja annan tunnisteet näille uusille muistiinpanoille kuukausittain tai neljännesvuosittain varmistaakseni, että muistiinpanot on järjestetty. Minulla on esimerkiksi "Suunnittelu" -tarra kaikelle, mikä liittyy järjestelmän suunnitteluun. Se voi olla jotain linkkiä YouTube-videoon, jonka pidin mielenkiintoisena, tai mielenkiintoinen argumentti, jonka työtoverini esitti ja jota en ollut ajatellut.

Tämä on näyte yhdestä muistiinpanostani:

Yksi asioista, jotka opin äskettäin työtoverilta, on se, että NoSQL soveltuu erinomaisesti prototyyppien tekemiseen, koska ei tarvitse käydä skeemakeskusteluja muiden tiimien kanssa. Jos halusin muuttaa mallia, voin tehdä sen todella nopeasti NoSQL-tietokannalla. Se oli keskeinen oppiminen työstä, jonka laitoin "Ohjelmointi" -muistikirjaani.

Jaan muistiinpanoni seuraaviin:

  1. Järjestelmämallit
  2. Haastattelu (kokemus + arvostelu aikaisemmista haastatteluista, ryhmitelty yrityksen nimen mukaan)
  3. Satunnaiset pienet bitit, CS-hyvä tietää, kuten hyödylliset bash-komentosarjat tai komentorivin temput
  4. Lukemiset / YouTube-videot

Kaikki yllä olevat huomautukset ovat kohdassa ”Ohjelmointi”. Ajan myötä minulla on näennäisesti järjestetty kokoelma asioita, joita olen joko lukenut tai tutkinut aiemmin.

Kuten kuka tahansa, joka tuntee minut henkilökohtaisella tasolla, en ole kovin organisoitu henkilö. Siksi olen kerännyt vain 10-15 prosenttia asioista, joten siellä on paljon enemmän tehtävää.

Tietämys ja käytäntö kulkevat käsi kädessä parantamalla järjestelmäsuunnittelua. Jos sinusta tuntuu, että nykyisellä työlläsi ei ole sinulle mahdollisuutta tehdä järjestelmäsuunnittelua, sinun pitäisi joko löytää sellainen, joka tekee, tai yrittää suunnitella pieni osa olemassa olevasta arkkitehtuurista siten, että se on joko nopeampi, halvempi, vankempi, tai helpompi muokata tulevaisuudessa.

Suosittelen resursseja

Johdanto: Arkkitehtuuri- ja järjestelmäsuunnittelu - Upea Youtube-opetus entiseltä Facebook-insinööriltä, ​​miten lähestyä järjestelmien suunnitteluongelmia.

Tietointensiivisten sovellusten suunnittelu - Toinen hyvä resurssi mittakaavan suunnittelun oppimiseen. Siinä puhutaan useista asioista, joita tyypillinen ohjelmistosuunnittelija pitää itsestäänselvyytenä - kuinka tietokannat (mySQL ja noSQL) toimivat, milloin niitä käytetään, eri tekniikoiden etuja ja haittoja mittakaavan käsittelyyn jne. Suosittelen sitä erittäin paljon?

Haastattelut - Simuloitu ympäristö, joka jäljittelee varsinaista haastattelua, on erittäin hyödyllinen haastatteluihin valmistautumisessa. Jos löydät ystävän tekemään sen puolestasi, suosittelen sitä erittäin paljon. Suoritan myös pilkhaastatteluja, joten jos olet kiinnostunut, ota rohkeasti yhteyttä minuun osoitteessa zhiachong.com!

Mitä jokaisen ohjelmistosuunnittelijan tulisi tietää reaaliaikaisen datan yhdistävästä abstraktista - erittäin pitkä ja tekninen keskustelu lokeista, kompromisseista. En ole vielä valmis, mutta se on erittäin suositeltavaa työtovereilta.

Evernote - paras? käyttämäni muistiinpanosovellus. On monia opetusohjelmia siitä, miten Evernotea voidaan parhaiten hyödyntää. En ole vielä käynyt läpi niitä yksinkertaisesti siksi, että käytän sitä vain muistikirjana. Kirjaan kaiken oppimani sinne ja käyn silloin tällöin läpi ja järjestän ne uudelleen.

Moleskin-muistikirja - nautin todella tästä. Sen laatu on erittäin korkea. Hinta on hieman korkeampi, mutta koska käytän sitä päivittäin, pidän sitä hyvänä sijoituksena. Kauniin muistikirjan pitäminen käsissäni tekee minusta innostuneempaa kirjoittaa lisää muistiinpanoja.

Pilot G2 (musta) - helposti parhaat kynät, joita olen koskaan käyttänyt, ja ainoat kynät, joita käytän. Ostan niitä irtotavarana Amazonista ja pidän niitä kaikkialla. Minulla on yksi repussa, yksi toimistossa ja yksi kotitoimistossani, joten minulla on aina kynä ympärillä. Se kirjoittaa hyvin, muste virtaa sujuvasti, ja rakastan vain sen kirjoittamisen tunnetta. Moleskinin kanssa joskus haluan vain poimia G2: n kirjoittaa satunnaisia ​​asioita sinne, koska nämä kaksi ovat niin täydellisiä yhdessä.

Grokking System Design Haastattelu - Tämä tulee ystävien suositukseksi. Se on verkkokurssi, joka opettaa hajautetun järjestelmän suunnittelun yksityiskohtaisesti. Se on kuitenkin 79 dollarin kurssi. Siellä on joukkuehinnoittelu. Jos on kiinnostusta, tarkistan heidän kanssaan, onko mahdollista muodostaa ryhmä ryhmäalennusta varten.

Seuraa minua Twitterissä, Facebookissa ja LinkedInissä. Rekisteröidy postituslistalleni, josta lähetän säännöllisesti vinkkejä, vihjeitä ja alan oppimista.

Jos pidit tästä artikkelista, kommentoi alla: mikä on vihjeesi rakentamaan skaalautuva, luotettava järjestelmä?