Spikrer dit iOS-interview i Silicon Valley

Jeg har for nylig opbygget mig en studieplan for at forberede mig til seks internt iOS-interviewsløjfer hos virksomheder som Facebook og Apple. Her er hvad jeg studerede for at lande alle seks tilbud.

Introduktion

Selvom der er mange og mange ressourcer online, hvis du leder efter et "typisk backend" -job (her løst defineret som "ikke iOS-koncerten, som jeg sigtede på på det tidspunkt"), finder jeg ud af, at der er en mangel på iOS-studiemateriale tilgængeligt online. Dette strækker sig fra algoritmeproblemer (specifikt idiomatiske løsninger til dem i Objekt-C) og systemdesignproblemer til generelle spørgsmål om iOS-viden.

Du skulle aldrig studere med det mål kun at blive spurgt om ting, som du studerede. Men du skal vide, hvor hullerne i din viden er forud for tiden og uddanne dig korrekt. Jeg ville sammensætte et indlæg, der samler alt det studiemateriale, jeg sammensatte for mig selv, inden mine interviews. Selvom jeg ikke kan videregive oplysninger om spørgsmål, jeg har modtaget i interviews, kan jeg give et bredt oversigt over grundlæggende iOS-koncepter, som du kan bruge til at kontrollere dig selv.

Algoritmer

Nedenfor viser jeg nogle af de løsninger, jeg gjorde i Objekt-C, mens jeg øvede. Husk, at jeg uploadede disse løsninger før mine interviews, så de muligvis ikke indeholder faktiske interviewspørgsmål. Du skal også bruge mindst 15 minutter på at prøve at løse disse, før du ser mine måske suboptimale løsninger. Jeg brugte meget længere tid på mange, og meget af den faktiske læring, jeg gjorde, var i den periode, hvor jeg prøvede at finde ud af tingene.

Jeg vil kun medtage linkproblemer, der har et matchende Leetcode-problem for nemheds skyld, selvom disse næsten altid blev taget fra en anden ressource end Leetcode (CtCI / EPI). De hårdere problemer gjorde jeg på tavler, så jeg ikke har de nævnte.

  • 8. String to Heeltal (atoi) (min Objekt-C-løsning)
  • 15. 3Sum (min mål-C-løsning)
  • 17. Bogstavkombinationer af et telefonnummer (min Objekt-C-løsning)
  • 21. Flet to sorterede lister (min Objekt-C-løsning)
  • 26. Fjern duplikater fra sorteret matrix (min Object-C-løsning)
  • 33. Søg i roteret sorteret matrix (min Object-C-løsning)
  • 49. Gruppeanagrammer (min Objekt-C-løsning)
  • 67. Tilføj binær (min Objekt-C-løsning)
  • 100. Samme træ (min Objekt-C-løsning)
  • 102. Traversal af binært træniveau (min mål-C-løsning)
  • 109. Konverter sorteret liste til binært søgetræ (min mål-C-løsning)
  • 112. Path Sum (min Object C-løsning)
  • 121. Bedste tid til at købe og sælge aktie (min Object-C-løsning)
  • 122. Bedste tid til at købe og sælge Aktie II (min Objekt-C-løsning)
  • 123. Bedste tid til at købe og sælge Aktie III (min Objekt-C-løsning)
  • 125. Valid Palindrome (min Objekt-C-løsning)
  • 127. Word Ladder (min Objekt-C-løsning)
  • 133. Klongrafik (min Objekt-C-løsning)
  • 153. Find minimum i roteret sorteret matrix (min Object-C-løsning)
  • 173. Binær søgning Tree Iterator (min Object-C-løsning)
  • 236. Laveste fælles stamfar til et binært træ (min mål-C-løsning)
  • 252. Mødelokaler (min Objekt-C-løsning)
  • 253. Mødelokaler II (min Objekt-C-løsning)
  • 283. Move Zeroes (min Objekt-C-løsning)
  • 309. Bedste tid til at købe og sælge lager med cooldown (min Objekt-C-løsning)
  • 339. Indlejret vægt sum (min Objekt-C-løsning)
  • 416. Partition Equal Subset Sum (min Object-C-løsning)
  • 543. Diameter af binært træ (min Objekt-C-løsning)
  • 572. Undertræ af et andet træ (min mål-C-løsning)

Mens ovenstående skaber et dejligt udgangspunkt, bør dit mål være at selv opbygge en liste som ovenstående. Find lignende problemer. Kod dem ud i mål-C (eller dit valg af sprog). Tænk på dine egne testsager. Prøv dem. Øvelse på Leetcode ved hjælp af Java (forudsat at du forbereder dig til en iOS-samtale) og spamming af "Kør kode" er ikke meget effektiv som metodisk at opbygge en løsning på det sprog, du vil interviewe.

For mere klarhed om, hvordan jeg valgte og valgte, hvilke problemer jeg skulle gøre, se mit forrige indlæg, men hvad jeg ovenfor har forberedt mig temmelig godt.

System Design

Spørgsmål om systemdesign i iOS er i det væsentlige alle variationer af "design denne app på tavlen". Der er intet trick for dem; alle har forskellige niveauer af designfærdigheder, og det skalerer normalt med erfaring. Som et resultat involverer det at øve sig til systemdesigninterviews at sidde med en anden udvikler, der gentagne gange kan bede dig om at retfærdiggøre dele om dit design / tilføje nye funktioner / stille spørgsmål til visse designbeslutninger. Jeg kan muligvis spare tid på at hjælpe folk med at træne også - se CS Career Hackers-community på Discord, da jeg flyder rundt der nogle gange. Hvis jeg ikke er der, vil andre være det. :)

Bare gå gennem min telefon, her er et par ting, jeg ville spørge, hvis jeg holdt et interview, sammen med de opfølgninger, jeg ville spørge; husk, at jeg ikke blev stillet nogen af ​​disse spørgsmål specifikt:

  • Design Messages-appen på iPhone. Hvordan opdaterer du meddelelser? Hvordan ser dine modeller ud? Hvordan vedvarer du dem (hvis du overhovedet gør det)? Hvordan ville du lægge brugergrænsefladen ud fra et UIKit-perspektiv?
  • Design Gmail-appen på iPhone. Hvordan opdaterer du din e-mail-liste? Hvilke API'er har du brug for fra backend? Vil du paginere? Hvorfor? Hvordan vil du fortsætte data? Har du brug for det? Hvad er dine modeller? Hvordan ser din UI-infrastruktur ud?
  • Design Spotify-appen på iPhone. Hvordan ser dine modeller ud? Hvilke API'er har du brug for? Hvordan ser din klientinfrastruktur / klassediagram ud for alle de stykker, du har brug for? Vil du fortsætte data? Hvorfor eller hvorfor ikke?
  • Design Instagram-appen på iPhone. Hvordan ville du oprette brugergrænsefladen? Vil du cache-billeder? Hvordan? Vil du vedvare billeder? Hvordan? Hvilke API'er har du brug for? Hvordan kan du sikre dig, at din app er performant?
  • Design Pinterest-appen på iPhone. Hvordan vil du opbygge varemærke-brugergrænsefladen? Hvilken slags vedholdenhed ville du anvende? Hvor er vedholdenhed passende? Hvilke API'er ville give mening?

Jeg kom med alle dem, der var på farten ved at se på min hjemmeskærm og tænke på de første spørgsmål, der kom til mit hoved. Du er velkommen til at vælge enhver tilfældig app og gøre det samme, men jeg ville øve med en ven, hvis det er muligt. Hvis du træner alene, vil du ikke (per definition) finde ud af, hvilke områder du normalt ikke tænker på.

iOS-viden

Først og fremmest tror jeg, det ville være til fordel for alle parter, hvis du lærte det grundlæggende i mindst et af Swift / Objekt-C og vidste meget om det andet. Det simulerer mere det job, du vil udføre hos en af ​​disse virksomheder; kan du stærkt foretrække og kende det ene sprog, men du vil bestemt se det andet. Det kan være meget at bede om, men det gør dig mere brugbar og en bedre udvikler generelt.

Nedenfor har jeg anført en masse ting, som jeg kunne forvente, at nogen ville vide, om jeg interviewede dem. Du skal være i stand til at besvare alle disse med flere sætninger, hvis du blev presset til at gå i detaljer. Hvis du ikke kender en af ​​dem, skal du sørge for, at du gør det. Dette er ikke nødvendigvis de spørgsmål, jeg blev stillet i interviews, men det er de grundlæggende, jeg ville forvente, at alle iOS-interviewpersoner kender til en rimelig dybde. De blev stort set plukket fra Matt Galloways effektive mål-C 2.0.

  • Egenskaber: hvad betyder stærk? Hvad betyder svage? Hvornår vil du bruge det ene over det andet? Hvor er svage ofte brugt? Hvad betyder ikke-atomisk? Hvad med atomisk? Hvornår vil du bruge det ene over det andet?
  • KVO: hvad er KVO? Hvornår vil du bruge det? Hvornår vil du ikke bruge det? Hvordan kan du lave noget KVO-kompatibelt? Hvad er gotchas forbundet med KVO?
  • Klasse-afkobling: hvad er de forskellige måder, du kan afkoble kodenheder på? Hvad er fordelene ved hver enkelt? Hvad er ulemperne ved hver enkelt?
  • Kørsel: hvad er unikt ved, hvordan metoder kaldes i Objekt-C sammenlignet med C? Hvis en underklasse ikke tilsidesætter en metode i mål-C, hvordan kaldes superklassens implementering? Hvad sker der, hvis du kalder en metode på noget, der ikke implementerer metoden? Hvad hvis du kalder en metode på nul?
  • UIKit: hvad er livscyklusmetoder for en UIViewController? Hvordan tilføjer du en visning som en undervisning, og hvordan vil du gøre den tilpasningsdygtig til størrelsesændringer?
  • Hukommelsesadministration: hvordan fungerer hukommelsesstyring i iOS? Sørg for at forstå dette grundigt og ikke bare huske en sætning!
  • Samtidig: hvad er de forskellige måder at håndtere samtidighed på iOS? Hvad er sager med almindelig brug? Hvad er gotchas?
  • Blokke: hvad er faldgruberne i blokke i mål-C? Hvor bruges de ofte? Hvordan kan du undgå tilbageholdelsescykler?
  • Kategorier / udvidelser: hvad er de? Hvornår bruger du dem? Hvilke begrænsninger er der forbundet med dem? Hvad er en klassekontinuitetskategori? Hvilke særlige regler har den?

Kritiske ressourcer

Alt nedenfor vil jeg sige et kritisk stykke viden, når det kommer til iOS-interviews. Jeg vil sørge for, at du kender hvert eneste link nedenfor. Hvis noget kun var noget nyttigt, udeladte jeg det fra denne liste. Du behøver ikke at huske alt i hvert link, men du skal bestemt få kerne i det hele. Jeg studerede alle nedenstående før mine interviews, og det er jeg glad for.

  • NSFast Enumeration / NSEnumerator (NSHipster)
  • NSString og Unicode (objc.io)
  • Tråd-sikker klassedesign (objc.io, meget mere dybtgående end mit indlæg)
  • Effektiv Objekt-C 2.0 (en bog jeg har læst et par gange i løbet af de sidste to år; absolut min bedste ressource gennem alt dette, hvad angår sprogoplysninger)
  • Foundation Collection Classes (objc.io)
  • Cracking the Coding Interview (algoritme prep)
  • Elements of Programming Interviews (preprogram algoritme)

Jeg vil også anbefale at tjekke App Arkitektur: iOS-applikationsdesignmønstre i Swift fra objc.io, men det er ikke påkrævet læsning. Det er bare interessant og får dig måske i det rigtige tankestemning.

Wrap-Up

Der er et tilbagevendende tema i min vejledning, da det angår samtale: praksis med en ven og praksis konsekvent. Jeg vil fortsat understrege det, hvor det er relevant, fordi de fordele, du får ved at simulere et interviewmiljø, er umulige at overdrive. Jeg kan varmt anbefale at bruge alle ovenstående spørgsmål og interviewe en ven (som kunne slå svaret på forhånd, hvis de ikke er sikker).

Godt studere, alle sammen!

Denne historie er offentliggjort i The Startup, Medium's største iværksætterpublikation efterfulgt af +419.678 personer.

Abonner for at modtage vores tophistorier her.