Krekinga sistēmas dizaina intervija: Twitter programmatūras inženiera padomi

Nesen es rakstīju par to, kā es pieņēmu piedāvājumus no vairākiem augstākā līmeņa tehnoloģiju uzņēmumiem. Interviju sagatavošanas laikā es izlasīju daudz materiāla un sagatavoju piezīmju kopu par to, kā risināt sistēmas dizaina problēmas. Šajā rakstā es vēlētos dalīties šajos padomos ar jums visiem.

Ja esat svaigs absolvents, kuram nav pieredzes liela mēroga izplatītās sistēmās, vai pat pieredzējis inženieris ar vairāku gadu pieredzi zem jostas, šis raksts jums būs noderīgs.

Atjauninājums (24.03.2019.): Ja vēlaties pievienoties studentu grupai, lai uzzinātu vairāk par sistēmas noformējumu, es kopā organizēju mazu klasi! Varat apmeklēt šo saiti, lai uzzinātu vairāk, vai apmeklēt manu vietni: zhiachong.com, lai iegūtu vairāk informācijas.

Kā izstrādāt sistēmu: Twitter programmatūras inženiera padomi

Šis raksts ir sadalīts četrās sadaļās:

  • Uzdodiet paskaidrojumus
  • Izmantojiet savu fonu
  • Sistemātiski risiniet problēmu
  • Saglabājiet savas piezīmes

Uzdodiet paskaidrojumus

Sistēmas dizaina intervijas galvenais mērķis ir dot kandidātam iespēju parādīt savas zināšanas.

Nav stingri pareizu vai nepareizu atbilžu. Jautājums par labu sistēmas noformējumu parasti izklausās ļoti neviennozīmīgi, un tā iemesls ir paredzēts, ka tas jums dos iespēju parādīt sekojošo:

  • Kā jūs domājat par problēmu telpu
  • Kā jūs domājat par sašaurinājumiem
  • Ko jūs varat darīt, lai novērstu šos sašaurinājumus.
Kā noformēt šo melno kasti

Iedomājieties, ka jums tiek lūgts noformēt melno kasti. Kā jūs risinātu problēmu? Šeit nav skaidru norāžu par to, kas jums jāveido, izņemot lodziņu, lai tajā varētu turēt dažus priekšmetus.

Viena no visnoderīgākajām stratēģijām, ko personīgi izmantoju, ir uzdot skaidrojošus jautājumus. Kādi ir “labie” precizēšanas jautājumi, jūs uzdodat?

Labs precizēšanas jautājums palīdz sasniegt vienu vai vairākas no vairākām lietām:

  1. Palīdz sašaurināt to, kas jums jādara
  2. Palīdz noskaidrot, kādas ir lietotāju cerības uz sistēmu
  3. Norāda, kur rīkoties
  4. Informē jūs par iespējamām vājām vietām / problemātiskajām jomām

Melnās kastes piemērā jūs varētu jautāt: “labi, ko tā rūtiņa tur? Cik vienumus tajā glabā? Un kurš ir paredzētais lietotājs? ”

Uz to es varētu teikt, uzbūvēsim dzeltenu lodziņu ar smaidiņu, kurā vajadzētu būt ne vairāk kā 1 tenisa bumbiņai. Tomēr šī nav parasta tenisa bumba. Tas būs vismaz 0,5 m rādiusā un sver apmēram 1 kg. Tas ir domāts, lai apskautu, nevis turētu, tāpēc es nevēlos, lai uz tā būtu kāds rokturis.

Tur jūs ejat, šī ir kaste.

Mana ideālā kaste ar smaidošu seju

Vienmēr uzdodiet paskaidrojumus. Tevi nevērtē pēc tā, vai intervijas laikā uzdevi konkrētu jautājumu vai ne, bet tevi vērtē pēc tā, kā tu domā par problēmu telpu.

Piemēram, ja es lūgtu jūs tūlīt izveidot Twitter, kā jūs to darītu? Veltiet dažas minūtes, lai par to domātu, un varbūt pat ieskicējiet to uz papīra. Dodieties pēc iespējas dziļāk un plašāk, un pēc tam atgriezieties pie šī raksta. Vēl labāk, ja savas piezīmes varat atstāt komentāros zemāk, un mēs varam diskutēt tālāk.

Ja jūs to vēl neesat sapratuši, iepriekšminētā vingrinājuma gala rezultāts sniegtu ievērojami atšķirīgus rezultātus. Ņemot vērā manu specifisko fonu, es varētu dziļi ienirt API projektēšanā un aizmugures infrastruktūrā. Es, iespējams, arī savas pieredzes dēļ izpētīšu problēmas, kas saistītas ar iPhone. Es runāšu par to, kā klients mijiedarbojas ar vidējā līmeņa galapunktiem, kā darbosies reģistrēšana, kā es izstrādāju aizmugures sistēmu, lai nodrošinātu darbības laiku utt.

Šīs ir diezgan interesantas diskusijas, kas jums var būt ar kolēģi, un tas ir ļoti spēcīgs signāls, ko meklē intervētājs.

Izmantojiet savu fonu savā labā

Bieži vien es redzu, kā inženieri mēģina izdomāt, ko intervētājs mēģina uzdot, un pēc tam ēd savas atbildes, lai tās atbilstu cerībām.

Patiesībā es ļoti nevienu atturēju to darīt vairāku iemeslu dēļ:

  1. Ikvienam ir unikāls fons. Sistēmas dizaina intervijā tā ir iespēja jums parādīt, kādas ir jūsu stiprās puses. Neizniekojiet iespēju, mēģinot izdomāt, ko no jums varētu gaidīt kāds cits.
  2. Intervētājs, iespējams, pamāja ar galvu uz jūsu atbildēm, bet viņi varēja zināt, ka jūs vienkārši blefojat un nedomājat par problēmu.

Jūsu pieredze un pieredze var ļoti atšķirties no nākamā kandidāta. Jūs nesat galda vērtību un zināšanu kopumu, ko neviens cits nevar. Tas ir tas, kas padara jūs vērtīgu un neaizvietojamu. Neatkarīgi no tā, kurā laukā atrodaties, cilvēkiem rūp tas, ko jūs varat dot galdā.

Sistemātiski risiniet problēmu

Tagad, paturot prātā savas zināšanas, ir vairākas lietas, par kurām domāju, strādājot pie jaunas sistēmas. Ļoti iesaku formulēt kritēriju vai darbību kopumu arī sev.

Dažas no lietām, kas, manuprāt, strādājot pie jaunas sistēmas, ir:

  • Kāds ir sistēmas mērķis?
  • Kas ir sistēmas lietotāji?
  • Ar kādu mērogu mēs strādājam?
  • Vai šī ir jauna / veca sistēma? Kā mēs apstrādājam versijas?

Starp citiem…

Redziet, mans kritēriju komplekts atšķirsies no priekšējās klases inženiera noteiktajiem kritērijiem. Es izmantoju šos kritērijus, lai noformulētu attēlu manā galvā, un tie vadīs manu lēmumu pieņemšanas procesu.

Apbruņojoties ar atbildēm uz šiem jautājumiem, es varu sākt risināt esošo problēmu un pēc tam to sistemātiski sadalīt atsevišķās sastāvdaļās.

Labs vingrinājums man patīk, kā noformēt kafijas pasūtīšanas sistēmu. Es domāju par to, kad kādu dienu sēdēju Starbucks, un sapratu, ka būtu jauki, ja es varētu pasūtīt smoothie telefonā un paņemt to manā vietējā Starbucks.

Mans prāts sāka iet dažādos virzienos:

  • Ko dara šī kafijas pasūtīšanas mašīna?
  • Ja es tādu būvēju, vai es varu to pārdot Starbucks, vai es to varu marķēt ar baltu etiķeti un pārdot kā pakalpojumu?
  • Cik lietotāju ir jāatbalsta, ja es tos pārdodu Starbucks?
  • Alternatīvi, ja es to marķēju ar baltu etiķeti, vai es varu pārdot interfeisu savam kafijas pasūtīšanas pakalpojumam un pēc tam palīdzēt klientiem izveidot aizmugures sistēmu, lai viņi varētu saglabāt pasūtījumus vietējās mašīnās?
Kā pieiet šai problēmai

Kad esmu saņēmis atbildes uz šiem jautājumiem, es beidzot varu izveidot pilnīgu priekšstatu par to, ko dara mans kafijas pasūtīšanas pakalpojums. Lūk, kā izskatās mana kafijas pasūtīšanas pakalpojuma versija:

Mans kafijas pasūtīšanas pakalpojums ir programmatūra kā pakalpojums (SAAS). Tas piedāvā saskarni, kuru var pievienot dažādiem partneriem.

  • Tam ir API, ko sauc par addCoffeeForMerchant, kas ievieto kafijas nosaukumu, kafijas cenu un kafijas sastāvdaļas.
  • Tam ir GET API ar nosaukumu getCoffeesForMerchant, kas atdod dotā tirgotāja ID kafijas sarakstu.
  • Tirgotāja ID ir unikāls identifikators (UUID), kas tiek ģenerēts, izmantojot kādu sajaukšanas mehānismu, ko var vēl vairāk noskaidrot ar klientu.
  • Programmatūra ir optimizēta tikai lasāmām darbībām, jo ​​lielākā daļa manu klientu vienreiz izveido savu izvēlni un visu dienu to lasa vairākas reizes.
  • Tam ir kešatmiņas saglabāšanas mehānisms, kas izmanto vismazāk izmantoto (LRU) izlikšanas stratēģiju, jo, ja izvēlnes vienums pēc kāda laika nav pasūtīts, manam klientam ir vienalga, vai tas ir nedaudz lēnāk redzams izvēlnē.
  • Gadījumā, ja kāds no datu veikaliem patstāvīgi izvirdīsies, mans kafijas pasūtīšanas pakalpojums atkārtos datus dažādās kopās visā ASV rietumu un ASV austrumu piekrastē, jo es pagaidām orientējos tikai uz ASV tirgu.

Kā alternatīvs risinājums ir arī jebkurš cits kafijas pasūtīšanas pakalpojums, par kuru varat padomāt. Tas ir tikai jautājums par to, ko jūs optimizējat. Es domāju, ka šīs ir ļoti interesantas problēmas, un tas ir lielisks garīgais vingrinājums, lai jūsu prāts būtu nodarbināts.

Saglabājiet savas piezīmes

Kā programmatūras inženierim tas ir nebeidzams mācību process. Es ļoti iesaku piezīmju glabāšanai izmantot vai nu Evernote, vai Moleskin. Es personīgi nēsāju nelielu piezīmju grāmatiņu, lai ātri iegūtu idejas, kuras man jāpierakstās, un es glabāju dažādas citas lietas Evernote vietnē, kad vien varu.

Manā Evernote ir piezīmju grāmatiņa ar nosaukumu “Programming”. Ikreiz, kad man rodas kaut kas jauns vai kaut kas interesants, es to pierakstīšu piezīmjdatorā, lai iegūtu tā tālākas atsauces.

Es eju cauri un piešķiru etiķetēm šīm jaunajām piezīmēm katru mēnesi vai ceturksni, lai pārliecinātos, ka piezīmes ir sakārtotas. Piemēram, man ir etiķete “Dizains” visam, kas saistīts ar sistēmas dizainu. Tas varētu būt kaut kas līdzīgs saitei uz YouTube videoklipu, kas man šķita interesants, vai interesants arguments, kuru izvirzīja mans kolēģis, par kuru es pat nebiju domājis.

Šis ir piemērs tam, kā izskatās viena no manām piezīmēm:

Atvainojiet par slikto gramatiku un pareizrakstības kļūdām

Viena no lietām, ko nesen uzzināju no kolēģa, ir tāda, ka NoSQL ir lieliski piemērots prototipu veidošanai, jo nav nepieciešams iziet shēmas diskusijas ar citām komandām. Ja es vēlētos mainīt shēmu, es to varu izdarīt ļoti ātri, izmantojot NoSQL datu bāzi. Tā bija galvenā mācīšanās no darba, kuru es ievietoju piezīmjdatorā “Programmēšana”.

Es sadalu savas piezīmes:

  1. Sistēmu projektēšana
  2. Intervēšana (pieredze + dažādu iepriekš veikto interviju pārskats, sagrupēts pēc uzņēmuma nosaukuma)
  3. Nejauši sakopti biti, CS labi zināmi, piemēram, noderīgi bash skripti vai komandrindas triki
  4. Lasījumi / YouTube video

Visas iepriekš minētās piezīmes atrodas sadaļā “Programmēšana”. Laika gaitā es atklāju, ka man ir pseidoorganizēta lietu kolekcija, ko esmu lasījis vai izpētījis pagātnē.

Kā ikviens, kurš mani pazīst personīgā līmenī, es neesmu ļoti organizēts cilvēks. Tādējādi es esmu savācis tikai 10–15% lietu, tāpēc darāmā ir palicis daudz vairāk.

Zināšanas un prakse iet roku rokā, lai labāk apgūtu sistēmu dizainu. Ja jūtat, ka pašreizējais darbs nedod jums iespēju veikt sistēmu projektēšanu, jums vajadzētu vai nu atrast tādu, kurš to izstrādā, vai arī mēģināt noformēt vienu mazu esošās arhitektūras daļu tā, lai tā būtu vai nu ātrāka, lētāka, izturīgāka, vai vieglāk pārveidojamas nākotnē.

Resursi, kurus iesaku

Ievads: Arhitektūra un sistēmu dizains - Liela Youtube apmācība no bijušā Facebook inženiera par to, kā vērsties pret sistēmu projektēšanas problēmām.

Datu ietilpīgu lietojumprogrammu izstrāde - vēl viens labs resurss, lai iemācītos veidot mērogu. Tas runā par dažādām lietām, kuras tipisks programmatūras inženieris uzskata par pašsaprotamām - kā darbojas datu bāzes (mySQL un noSQL), kad katru no tām izmantot, dažādu metožu plusiem un mīnusiem, kā rīkoties ar mērogu utt. Es to ļoti iesaku

Izspēles intervijas - Gatavojoties intervijām, ļoti noderīga ir modelēta vide, kas imitē faktisko interviju. Ja jūs varat atrast draugu, kas to izdarītu jūsu labā, es to ļoti iesaku. Es vadu arī izspēles intervijas, tāpēc, ja jums ir interese, sazinieties ar mani vietnē zhiachong.com!

Kas katram programmatūras inženierim būtu jāzina par reāllaika datu vienojošo abstrakciju - ļoti ilga un tehniska diskusija par žurnāliem, kompromisiem. Es to vēl neesmu pabeidzis, bet to ļoti iesaka kolēģis.

Evernote - labākā piezīmju glabāšanas lietotne, ko esmu izmantojis. Ir daudz konsultāciju par to, kā vislabāk izmantot Evernote. Es vēl neesmu tos cauri apskatījis, vienkārši tāpēc, ka to izmantoju tikai kā piezīmju grāmatiņu. Es tur reģistrēju visu uzzināto un pēc tam laiku pa laikam tos pārdomāju un pārkārtoju.

Moleskin piezīmju grāmatiņa - man šis ļoti patīk. Tā kvalitāte ir ārkārtīgi augsta. Cena ir nedaudz augstāka, taču, tā kā es to lietoju ikdienā, uzskatu to par labu ieguldījumu. Ikdienā turot rokās skaistu piezīmju grāmatiņu, tas mani uzbudina, rakstot vairāk piezīmju.

Pilot G2 (melns) - vienkārši labākās pildspalvas, kādas es jebkad esmu lietojis, un vienīgās pildspalvas, kuras izmantošu. Es tos pērku vairumā no Amazon un glabāju visur, kur dodos. Man mugursomā ir viens, birojā un mājas birojā viens, lai vienmēr būtu pildspalva. Tas raksta lieliski, tinte plūst vienmērīgi, un es vienkārši mīlu sajūtu, ka rakstu ar to. Kopā ar Moleskinu dažreiz es vienkārši gribu paņemt G2, lai tur ierakstītu nejaušas lietas, jo šie abi ir tik perfekti.

Sistēmas dizaina intervijas uzlabošana - šī ir draugu rekomendācija. Tas ir tiešsaistes kurss, kurā iemācīts detalizēti noformēt izkliedēto sistēmu. Tomēr tas ir USD 79 kurss. Ir komandas noteiktā cena. Ja ir interese, es sazināšos ar viņiem, lai noskaidrotu, vai ir iespējams izveidot grupu, lai saņemtu grupas atlaidi.

Sekojiet man Twitter, Facebook un LinkedIn. Reģistrējieties savā adresātu sarakstā, kur regulāri sūtu padomus, padomus un nozares zināšanas.

Ja jums patika šis raksts, komentējiet zemāk: kāds ir jūsu padoms mērogojamas, uzticamas sistēmas izveidošanai?