20 spørgsmål til iOS-Udviklerintervju

gør dig klar til din iOS-samtale

den store dag kommer op. Uanset om det er en telefon, online eller personligt samtale, er det altid lidt stressende. Så, for at lette stress du gjorde nogle prep arbejde-afsluttet lektier på det selskab, du samtaler med, stalked leje manager og halvdelen af ingeniør team på virksomheden efter eget valg på linkedin & github, du børstet op på nogle af de færdigheder og viden, du ikke har brugt i et stykke tid – du er klar til at gå.

men efter Us Navy Seals motto “To er en og en er ingen” lad os gennemgå en anden hurtig genopfriskning for at hjælpe dig med at få den iOS-samtale. Så lad os komme lige ind i det!

lad os starte med nogle af de grundlæggende spørgsmål, som jeg håber, du allerede er klar til. De kan virke indlysende, men du ville blive chokeret over, hvor mange ingeniører der svigtede dem i løbet af de 12 år, jeg har lavet tekniske samtaler.

tekniske spørgsmål

Ok, nu hvor vi har fået det dækket, lad os springe ind i de tekniske spørgsmål.

se slideshare for alle tekniske spørgsmål!

spørgsmål 1

om en Passendevisioncellekonstruktør:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

hvad er reuseIdentifier brugt til?

reuseIdentifierbruges til at indikere, at en celle kan genbruges i en UITableView. For eksempel når cellen ser ens ud, men har andet indhold. UITableView opretholder en intern cache på UITableViewCell ‘ s med reuseIdentifier og tillader dem at blive genbrugt, når dequeueReusableCellWithIdentifier: kaldes. Ved at genbruge tabelcellens rulleydelse er tabelvisningen bedre, fordi der ikke skal oprettes nye visninger.

spørgsmål 2

Forklar forskellen mellem atomare og ikke-atomiske syntetiserede egenskaber?

Atomic og ikke-atomic refererer til, om settere/getters for en ejendom vil atomisk læse og skrive værdier til ejendommen. Når atomnøgleordet bruges på en ejendom, vil enhver adgang til det blive “synkroniseret”. Derfor vil et opkald til getter garanteres at returnere en gyldig værdi, men dette kommer med en lille præstationsstraf. Derfor bruges nonatomic i nogle situationer til at give hurtigere adgang til en ejendom, men der er en chance for, at en race-tilstand får ejendommen til at være nul under sjældne omstændigheder (når en værdi indstilles fra en anden tråd, og den gamle værdi blev frigivet fra hukommelsen, men den nye værdi er endnu ikke fuldt ud tildelt placeringen i hukommelsen for ejendommen).

spørgsmål 3

Forklar forskellen mellem kopi og behold?

fastholdelse af et objekt betyder, at antallet af fastholdelser øges med et. Det betyder, at forekomsten af objektet vil blive holdt i hukommelsen, indtil det er behold tæller falder til nul. Ejendommen gemmer en henvisning til denne forekomst og deler den samme forekomst med alle andre, der også har bevaret den. Kopi betyder, at objektet klones med duplikatværdier. Det deles ikke med nogen anden.

vil du ace din tekniske samtale? Planlæg en teknisk samtale praksis Session med en ekspert nu!

spørgsmål 4

Hvad er metoden, der svirrer i Mål C, og hvorfor ville du bruge den?

metode, der svirrer, gør det muligt at skifte implementering af en eksisterende vælger ved kørsel for en anden implementering i en klasses forsendelsestabel. Svirrende giver dig mulighed for at skrive kode, der kan udføres før og/eller efter den oprindelige metode. For eksempel måske for at spore den tidsmetode, der blev udført, eller for at indsætte logopgørelser

#import "UIViewController+Log.h"@implementation UIViewController (Log) + (void)load { static dispatch_once_t once_token; dispatch_once(&once_token, ^{ SEL viewWillAppearSelector = @selector(viewDidAppear:); SEL viewWillAppearLoggerSelector = @selector(log_viewDidAppear:); Method originalMethod = class_getInstanceMethod(self, viewWillAppearSelector); Method extendedMethod = class_getInstanceMethod(self, viewWillAppearLoggerSelector); method_exchangeImplementations(originalMethod, extendedMethod); }); } - (void) log_viewDidAppear:(BOOL)animated { ; NSLog(@"viewDidAppear executed for %@", ); }@end

spørgsmål 5

Hvad er forskellen mellem ikke-kørende, inaktive, aktive, baggrunds-og suspenderede udførelsestilstande?

  • ikke kører: Den app er ikke blevet lanceret eller kørte, men blev opsagt af systemet.
  • inaktiv: appen kører i forgrunden, men modtager i øjeblikket ikke begivenheder. (Det kan dog være at udføre anden kode.) En app forbliver normalt kun i denne tilstand, da den overgår til en anden tilstand.
  • Aktiv: appen kører i forgrunden og modtager begivenheder. Dette er den normale tilstand for forgrundsapps.
  • baggrund: appen er i baggrunden og udfører kode. De fleste apps indtaster denne tilstand kort på vej til at blive suspenderet. En app, der anmoder om ekstra eksekveringstid, kan dog forblive i denne tilstand i en periode. Derudover kommer en app, der lanceres direkte i baggrunden, ind i denne tilstand i stedet for den inaktive tilstand.
  • suspenderet: appen er i baggrunden, men udfører ikke kode. Systemet flytter apps automatisk til denne tilstand og underretter dem ikke, før de gør det. Mens suspenderet, en app forbliver i hukommelsen, men udfører ikke nogen kode. Når der opstår en tilstand med lav hukommelse, kan systemet muligvis rense suspenderede apps uden varsel for at give mere plads til forgrundsappen.

spørgsmål 6

Hvad er en kategori, og hvornår bruges den?

en kategori er en måde at tilføje yderligere metoder til en klasse uden at udvide den. Det bruges ofte til at tilføje en samling af relaterede metoder. En almindelig brugssag er at tilføje yderligere metoder til indbyggede klasser i Kakaorammerne. For eksempel at tilføje async-overførselsmetoder til UIImage – klassen.

spørgsmål 7

kan du få øje på fejlen i følgende kode og foreslå, hvordan du løser det:

@interface MyCustomController : UIViewController @property (strong, nonatomic) UILabel *alert; @end @implementation MyCustomController - (void)viewDidLoad { CGRect frame = CGRectMake(100, 100, 100, 50); self.alert = initWithFrame:frame]; self.alert.text = @"Please wait..."; ; dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(10); self.alert.text = @"Waiting over"; } ); } @end 

alle UI-opdateringer skal udføres på hovedtråden. I koden ovenfor kan opdateringen til alarmteksten muligvis ikke ske på hovedtråden, da den globale forsendelseskø ikke giver nogen garantier . Derfor skal koden ændres for altid at køre UI-opdateringen på hovedtråden

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(10); dispatch_async(dispatch_get_main_queue(), ^{ self.alert.text = @"Waiting over"; });}); 

spørgsmål 8

Hvad er forskellen mellem viewDidLoad og viewDidAppear?
hvilken skal du bruge til at indlæse data fra en fjernserver, der skal vises i visningen?

viewDidLoadkaldes, når visningen er indlæst, enten fra en Storyboard eller programmatisk oprettet i loadView. viewDidAppear kaldes hver gang visningen præsenteres på enheden. Hvilken der skal bruges afhænger af brugssagen til dine data. Hvis dataene er ret statiske og sandsynligvis ikke ændres, kan de indlæses i viewDidLoad og cachelagres. Men hvis dataene ændres regelmæssigt, er det bedre at bruge viewDidAppear til at indlæse det. I begge situationer skal dataene indlæses asynkront på en baggrundstråd for at undgå at blokere brugergrænsefladen.

spørgsmål 9

hvilke overvejelser har du brug for, når du skriver en UITableViewController som viser billeder hentet fra en fjernserver?

dette er en meget almindelig opgave i iOS, og et godt svar her kan dække en lang række viden. Det vigtige stykke information i spørgsmålet er, at billederne er hostet eksternt, og de kan tage tid at hente, derfor når den beder om “overvejelser”, bør du tale om:

  • Hent kun billedet, når cellen rulles til visning, dvs.når cellForRowAtIndexPath kaldes.
  • henter billedet asynkront på en baggrundstråd for ikke at blokere brugergrænsefladen, så brugeren kan fortsætte med at rulle.
  • når billedet er hentet til en celle, skal vi kontrollere, om cellen stadig er i visningen, eller om den er blevet genbrugt af et andet stykke data. Hvis det er blevet genbrugt, skal vi kassere billedet, ellers skal vi skifte tilbage til hovedtråden for at ændre billedet på cellen.

andre gode svar vil fortsætte med at tale om offline caching af billederne ved hjælp af pladsholderbilleder, mens billederne hentes.

spørgsmål 10

Hvad er en protokol, og hvordan definerer du din egen, og hvornår bruges den?

en protokol ligner en grænseflade fra Java. Det definerer en liste over krævede og valgfrie metoder, som en klasse skal/kan implementere, hvis den vedtager protokollen. Enhver klasse kan implementere en protokol, og andre klasser kan derefter sende beskeder til den klasse baseret på protokolmetoderne uden at den kender typen af klassen.

@protocol MyCustomDataSource- (NSUInteger)numberOfRecords;- (NSDictionary *)recordAtIndex:(NSUInteger)index;@optional- (NSString *)titleForRecordAtIndex:(NSUInteger)index;@end

en almindelig brugssag giver en datakilde til UITableVieweller UICollectionView.

spørgsmål 11

hvad er KVC og KVO? Giv et eksempel på at bruge KVC til at indstille en værdi.

KVC står for Key-Value Coding. Det er en mekanisme, hvormed et objekts egenskaber kan tilgås ved hjælp af strengens ved kørsel i stedet for statisk at kende egenskabsnavnene på udviklingstidspunktet. KVO står for Nøgleværdiobservation og tillader en controller eller klasse at observere ændringer i en egenskabsværdi.

lad os sige, at der er en ejendom name på en klasse:

@property (nonatomic, copy) NSString *name;

vi kan få adgang til det ved hjælp af KVC:

NSString *n = 

og vi kan ændre dens værdi ved at sende den beskeden:

spørgsmål 12

Hvad er blokke, og hvordan bruges de?

blokke er en måde at definere en enkelt opgave eller adfærdsenhed uden at skulle skrive en hel Objective-C-klasse. Under dækslerne er blokke stadig objektive C-objekter. De er en funktion på sprogniveau, der gør det muligt at understøtte programmeringsteknikker som lambdas og lukninger i Objective-C. oprettelse af en blok udføres ved hjælp af syntaksen ^ { } :

 myBlock = ^{ NSLog(@"This is a block"); }

det kan påberåbes som sådan:

myBlock();

det er i det væsentlige en funktionspeger, som også har en signatur, der kan bruges til at håndhæve typesikkerhed ved kompilering og runtime. For eksempel kan du videregive en blok med en bestemt signatur til en metode som sådan:

- (void)callMyBlock:(void (^)(void))callbackBlock;

hvis du ønskede, at blokken skulle få nogle data, kan du ændre signaturen for at inkludere dem:

- (void)callMyBlock:(void (^)(double, double))block { ... block(3.0, 2.0);}

spørgsmål 13

hvilke mekanismer giver iOS til understøttelse af multi-threading?

  • NSThread opretter en ny tråd på lavt niveau, som kan startes ved at kalde start – metoden.

NSThread* myThread = initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];; 
  • NSOperationQueue tillader en pulje af tråde, der skal oprettes og bruges til at udføre NSOperations parallelt. NSOperation s kan også køres på hovedtråden ved at spørge NSOperationQueuefor mainQueue.
NSOperationQueue* myQueue = init];; ;
  • GCD eller Grand Central Dispatch er et moderne træk ved Objective-C, der giver et rigt sæt metoder og API ‘ er til brug for at understøtte fælles multi-threading opgaver. GCD giver en måde at kø opgaver til afsendelse på enten hovedtråden, en samtidig kø (opgaver køres parallelt) eller en seriel kø (opgaver køres i FIFO-rækkefølge).
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(myQueue, ^{ printf("Do some work here.\n");});

spørgsmål 14

Hvad er Responder-kæden?

når en begivenhed finder sted i en visning, f.eks. en berøringshændelse, affyrer visningen begivenheden til en kæde af UIResponderobjekter, der er knyttet til UIView. Den første UIResponder er selve UIView, hvis den ikke håndterer begivenheden, fortsætter den op ad kæden til indtil UIResponder håndterer begivenheden. Kæden inkluderer UIViewControllers, forælder UIViews og deres tilknyttede UIViewController s, hvis ingen af dem håndterer begivenheden, bliver UIWindow spurgt, om den kan håndtere den, og til sidst, hvis den ikke håndterer begivenheden, bliver UIApplicationDelegate spurgt.

hvis du får mulighed for at trække denne ud, er det værd at gøre for at imponere intervjueren:

indtast billedbeskrivelse her

spørgsmål 15

Hvad er forskellen mellem at bruge en delegeret og anmeldelse?

begge bruges til at sende værdier og meddelelser til interesserede parter. En delegeret er til en-til-en-kommunikation og er et mønster, der fremmes af Apple. I delegation klassen hæve begivenheder vil have en egenskab for den delegerede og vil typisk forvente det at gennemføre nogle protocol. Den delegerende klasse kan derefter kalde _delegate_s protokolmetoder.

notifikation giver en klasse mulighed for at udsende begivenheder på tværs af hele applikationen til alle interesserede parter. Broadcasting-klassen behøver ikke at vide noget om lytterne til denne begivenhed, derfor er Anmeldelse meget nyttig til at hjælpe med at afkoble komponenter i en applikation.

 postNotificationName:@"TestNotification" object:self];

spørgsmål 16

Hvad er din præference, når du skriver UI ‘ er? Filer, Storyboards eller programmatisk UIView?

der er ikke noget rigtigt eller forkert svar på dette, men det er en fantastisk måde at se, om du forstår fordelene og udfordringerne med hver tilgang. Her er de almindelige svar, jeg hører:

  • storyboards er gode til hurtigt at producere UI ‘ er, der matcher et design spec. De er også virkelig nemme for produktledere at visuelt se, hvor langt langs en skærm er.
  • Storyboard er også gode til at repræsentere en strøm gennem en applikation og tillade en visualisering på højt niveau af en hel applikation.
  • Storyboards ulemper er, at de i et teammiljø er vanskelige at arbejde sammen, fordi de er en enkelt fil, og Fusion er blevet vanskelige at administrere.
  • Storyboards og filer kan også lide af dobbeltarbejde og blive vanskelige at opdatere. For eksempel hvis alle knapper har brug for at se ens ud og pludselig har brug for en farveændring, kan det være en lang/vanskelig proces at gøre dette på tværs af storyboards og Vibs.
  • programmatisk konstruktion UIView ‘s kan være verbose og kedelig, men det kan give mulighed for større kontrol og også lettere adskillelse og deling af kode. De kan også lettere enhedstestes.

de fleste udviklere vil foreslå en kombination af alle 3, hvor det giver mening at dele kode og derefter genanvendes UIView s eller Xib filer.

spørgsmål 17

hvordan ville du sikkert gemme private brugerdata offline på en enhed? Hvilke andre sikkerhed bedste praksis bør tages?

igen er der ikke noget rigtigt svar på dette, men det er en fantastisk måde at se, hvor meget en person har gravet ind i iOS-sikkerhed. Hvis du taler med en bank, forventer jeg næsten helt sikkert, at nogen ved noget om det, men alle virksomheder skal tage sikkerhed alvorligt, så her er den ideelle liste over emner, jeg forventer at høre i et svar:

  • hvis dataene er ekstremt følsomme, skal de aldrig gemmes offline på enheden, fordi alle enheder kan knækkes.
  • nøglering er en mulighed for at gemme data sikkert. Men det er kryptering er baseret på PIN-koden på enheden. Brugerens er ikke tvunget til at indstille en pin-kode, så i nogle situationer kan dataene ikke engang krypteres. Derudover kan brugerens pin-kode let hackes.
  • en bedre løsning er at bruge noget som f.eks. Krypteringsnøglen kan håndhæves af applikationen og adskilles fra brugerens pin-kode.

andre sikkerhed bedste praksis er:

  • Kommuniker kun med eksterne servere via SSL/HTTPS.
  • hvis det er muligt implementere certifikat pinning i ansøgningen for at forhindre man-in-the-middle angreb på offentlige trådløst internet.
  • Ryd følsomme data ud af hukommelsen ved at overskrive det.
  • sørg for, at al validering af data, der indsendes, også køres på serversiden.

spørgsmål 18

Hvad er MVC, og hvordan implementeres det i iOS?
hvad er nogle faldgruber, du har oplevet med det? Er der nogen alternativer til MVC?

MVC står for Model, visning, Controller. Det er et designmønster, der definerer, hvordan man adskiller logik, når man implementerer brugergrænseflader. I iOS leverer Apple UIView som en basisklasse for alle _vise_s, UIViewController leveres for at understøtte controlleren, der kan lytte til begivenheder i en visning og opdatere visningen, når data ændres. Modellen repræsenterer data i et program og kan implementeres ved hjælp af en hvilken som helst NSObject, herunder dataindsamlinger som NSArray og NSDictionary.

nogle af de faldgruber, som folk rammer, er oppustet UIViewController og ikke adskiller kode i klasser ud over MVC-formatet. Jeg vil meget anbefale at læse op på nogle løsninger på dette:

  • https://www.objc.io/issues/1-view-controllers/lighter-view-controllers/
  • https://speakerdeck.com/trianglecocoa/unburdened-viewcontrollers-by-jay-thrash
  • https://programmers.stackexchange.com/questions/177668/how-to-avoid-big-and-clumsy-uitableviewcontroller-on-ios

med hensyn til alternativer er dette ret åbent. Det mest almindelige alternativ er MVVM ved hjælp af Reaktivkakao, men andre inkluderer VIPER og brug af funktionel reaktiv kode.

spørgsmål 19

en produktchef i din virksomhed rapporterer, at applikationen går ned. Hvad laver du?

dette er et godt spørgsmål i ethvert programmeringssprog og er virkelig designet til at se, hvordan du løser problemet. Du får ikke meget information, men nogle samtaler vil give dig flere detaljer om problemet, når du går sammen. Start simpelt:

  • få de nøjagtige trin til at gengive det.
  • find ud af enheden, iOS-version.
  • har de den nyeste version?
  • Hent enhedslogfiler, hvis det er muligt.

når du kan gengive det eller har mere information, så start med at bruge værktøj. Lad os sige, at det går ned på grund af en hukommelseslækage, jeg forventer at se nogen foreslå at bruge instrumenter læk værktøj. En virkelig imponerende kandidat ville begynde at tale om at skrive en enhedstest, der gengiver problemet og debugging gennem det.

andre variationer af dette spørgsmål omfatter langsom UI eller ansøgningen frysning. Igen er ideen at se, hvordan du problemløser, hvilke værktøjer ved du om det ville hjælpe, og ved du, hvordan du bruger dem korrekt.

spørgsmål 20

Hvad er AutoLayout? Hvad betyder det, når en begrænsning er “brudt” af iOS?

AutoLayout er en måde at lægge UIViews på ved hjælp af et sæt begrænsninger, der angiver placering og størrelse baseret i forhold til andre visninger eller baseret på eksplicitte værdier. AutoLayout gør det lettere at designe skærme, der ændrer størrelse og layout ud deres komponenter bedre baseret på størrelsen og retningen af en skærm. _constraint_s inkluderer:

  • indstilling af vandret/lodret afstand mellem 2 Visninger
  • indstilling af højde/bredde til at være et forhold i forhold til en anden visning
  • en bredde/højde/afstand kan være en eksplicit statisk værdi

nogle gange er begrænsninger i konflikt med hinanden. Forestil dig for eksempel en UIView, som har 2 højdebegrænsninger: den ene siger at gøre UIView 200ph høj, og den anden siger at gøre højden dobbelt så høj som en knap. Hvis iOS runtime ikke kan tilfredsstille begge disse begrænsninger, skal den kun vælge en. Den anden rapporteres derefter som “brudt” af iOS.

Standard spørgsmål

“Fortæl mig om dig selv.”

dette er en virkelig vanskelig! Så mange mennesker læser deres CV højt (glemmer jeg ser lige på det!), notering af hver klasse, de tog på college, hver stilling, de nogensinde har haft (og det tilføjer virkelig til Senioringeniører) og ethvert ansvar (som ofte sker for at være det samme på tværs af 2 eller 3 virksomheder, som den pågældende person har arbejdet på. Så 20 minutter senere ved jeg stadig ikke noget nyt/uden for CV ‘ et om kandidaten, vi er 20 minutter inde, og da tror jeg, at de lige så godt kan være robotter (og robotter har tendens til ikke at passe meget godt sammen med dynamiske hold).

så gør dig selv (og ansættelseslederen) en tjeneste ved at forberede en 2min lang elevatorhøjde af din baggrund – hold det enkelt, kortfattet og kort, og tilføj derefter noget personligt i slutningen. Elsker du at løbe? Træner du din datters fodboldhold? Die hard stjerne krige fan? Tilføjelse af en lille smule personlighed I er en stor isbryder, og vil skabe en fantastisk overgang til den dybere del af samtalen.

” Beskriv et interessant problem, og hvordan du løste det.”

din chance for at høre denne er dybest set 99%, så du har bedre et godt svar klar til dem! Her er et par tip: tænk på et særligt fantastisk projekt, som du er stolt af. Forstået? Fedt! Tag nu et stykke papir og opsummer det i 5 kuglepunkter.
1st bullet point – meget kort baggrundshistorie af omstændighederne bag projektet
2nd bullet – selve projektets art
3rd bullet – de problemer, du har stødt på, mens du løste det/dem
4thbullet – hvordan løste du vanskelighederne ovenfor
5th bullet point – hvad har du lært af det.

find nu nogen, der vil lytte (en ven, partner, kollega) og spørg dem, om historien giver mening (minus tekniske aspekter af det, hvis den person, du taler med, ikke er din peer). Det er en fantastisk måde at validere, hvis historien holder sig sammen.

du ville blive chokeret over, hvor mange gange jeg har hørt ting som “og så gik jeg til John, og han brugte det værktøj, han har oprettet for at fjerne den kritiske fejl, som derefter……”. Hvem er Tom? Din manager? Praktikant? Peer? Hvorfor gik du til ham af alle i din virksomhed? Hvad er det magiske værktøj, han har sammensat? Hvilken kritisk fejl nøjagtigt fjernede den, og hvordan? Hvad blev resultatet?

du får ideen 😃

ekstra bonus? Du har nu 5 punkttegn, du kan bruge som et snydeark under din samtale uden at ligne den fyr, der læser sit CV højt.

lad os nu springe ind i de underlige spørgsmål, som nogle ansættelsesledere gerne smider ind for at tippe dig ud af dit spil.

  • hvordan ville du teste en brødrister?
  • hvor mange penne kan du passe ind i et fly?
  • hvor mange vinduer er der i San Francisco?
  • hvor mange golfbolde kan passe i en skolebus?
  • hvor mange Big Macs sælger McDonald ‘ S hvert år i USA?

listen bliver ved og ved. Selvom det ikke har noget at gøre med dine tekniske færdigheder, gør det et godt stykke arbejde med at kontrollere, hvordan du håndterer kurvekugler, og for at se, om du er i stand til logisk trinvis problemløsning. I de fleste tilfælde er der ikke perfekte svar på den type spørgsmål (selvom du kan google dem for din ro i sindet). Det handler om, hvordan du forklarer din logik til din samtalepartner.

her er svaret på golfboldsspørgsmålet af Michael Beauchamp, så du får ideen om, hvad jeg taler om:

jeg regner med, at en standard skolebus er omkring 8ft bred med 6ft høj med 20 fod lang – Dette er bare et gæt baseret på de tusindvis af timer, jeg har været fanget bag skolebusser, mens trafikken i alle retninger er stoppet.

det betyder 960 kubikfod, og da der er 1728 kubik inches i en Alen fod, betyder det omkring 1,6 millioner kubik inches.

jeg beregner mængden af en golfbold til at være omkring 2,5 kubikcentimeter (4/3 * pi * .85) som .85 tommer er radius af en golfbold.

Opdel de 2,5 kubikcentimeter i 1.6 millioner og du kommer op med 660.000 golfbolde. Men da der er sæder og crap derinde optager plads og også da den sfæriske form af en golfbold betyder, at der vil være betydelig tom plads mellem dem, når stablet, vil jeg runde ned til 500.000 golfbolde.

se? Trinvis. Og pludselig er det et relativt simpelt, logisk spørgsmål. Bare bliv rolig, og i stedet for at prøve at komme med et øjeblikkeligt nummer i dit hoved, skal du gå intervjueren gennem dit tanketog med dig.

brug for virkelige liv praksis? Du er velkommen til at planlægge en mock-samtale med Matt, der har lavet tekniske samtaler i 12 år, og bede om hans feedback!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.