ПОДГОТОВКА ЗА ИНТЕРВЮ

Ката за боулинг

Овладяване на интервюто за кодиране на живо

Ката е упражнение в бойните изкуства, при което практикувате едно и също нещо отново и отново, като всеки път правите малки подобрения. Същата концепция може да се приложи към програмирането, тя помага на програмистите да усъвършенстват уменията си и да бъдат по-добри в работата си.

Като изпитана концепция с много онлайн ресурси, кандидатурите за работа започнаха да използват това предизвикателство за кодиране за своето интервю за кодиране на живо на място.

В тази статия ще проуча ката за кодиране, резултата от боулинга и как да го реша в контекста на интервю.

Ще ви бъдат дадени поредица от входове и очакван изход за всеки вход, а очакваният резултат е да кодирате всичко между тях (класове, методи, тестове на модули), за да получите желания резултат.

Ще преминем през процеса на мислене, стъпките, които трябва да предприемем, когато се представи проблем, и някои съвети и трикове, които да ви помогнат, когато сте заседнали в пътуването за решаване на това предизвикателство.

Ката за резултат от боулинг

В игра на боулинг получавате десет рунда, за да избиете 10 кегли с топка за боулинг. Във всеки кръг, наречен рамка, имате два опита. Ако ги съборите при първия опит, това се нарича удар, ако го направите на два, се нарича резервен. В края на 10-те фрейма играчът с най-много точки печели.

Точките се изчисляват въз основа на резултат от рамка:

  • Ако не е страйк или резерв, се изчислява сборът на хвърлянията.
  • За резервен, получавате следващото хвърляне, добавено като бонус.
  • За удар получавате следващите две хвърляния, добавени като бонус.
  • Ако имате резервен удар или страйк в последния фрейм, получавате още едно хвърляне като бонус.

В интервю обикновено получавате обяснение като това по-горе и поредица от входни/изходни стойности като примери, които можете да използвате, за да проверите своето решение. Като този:

От описанието и примерите можем да съберем няколко прозрения:

  • Получаваме масив от числа като вход и очакваме число, общия резултат, като изход.
  • Страйк винаги е последван от числото 0.
  • Дължината на масива от ролки е 20, а в случай на удар / резерв на последния кадър е 21.
  • Фреймът се състои от две хвърляния, а играта е съставена от десет фрейма.

Имайки това предвид, можем да започнем да кодираме нашето решение и първата стъпка от това е да напишем няколко модулни теста.

Започвайки с Unit тестове

Започването първо с единични тестове е задължително за всеки процес на интервю. Не е нужно да практикувате „TDD“ редовно на работа или да следвате стриктно рамката „Red, Green, Refactor“, но писането на тестовете първо ви помага да мислите на малки стъпки за даден проблем.

Изведнъж не е нужно да решавате голям сложен проблем, трябва да разрешите множество малки проблеми и можете да ги решавате един по един.

А чрез писане на модулни тестове можете да покажете своя мисловен процес извън уменията си за кодиране. Интервюиращите са много заинтересовани да видят как кандидат мисли за границите на грешката в даден проблем и се справя с него по съответния начин.

От изискванията можем да съберем няколко невалидни входа:

  • Когато дължината на входните ролки е по-малка от 20
  • Когато дължината на входните ролки е по-голяма от 21
  • Когато имаме отрицателни числа сред въведените ролки
  • Когато две хвърляния в рамка имат сбор по-голям от 10 (има само 10 пина, които можете да ударите)
  • Когато следвате удар, имате друго число, различно от 0

Само като мислим за границите на грешките, това също ни помогна с нашия дизайн, защото, за да ги тестваме срещу тях, трябва да кодираме по специфичен, детайлен начин.

Например, за да проверим дали две хвърляния в рамка имат сума, по-голяма от 10, сега правим извод, че имаме нужда от функция, която обработва логиката за конкретен кадър.

Посочването на тези невалидни данни на интервюиращия ще ви спечели много точки, но имайте предвид, че имате ограничено време. Така че можете да кодирате един или два, но имате предвид по-голямата картина. Нищо не е по-лошо от това интервюиращият да ви спре, за да ви уведоми, че имате още 5 минути.

Приготвяме се да започнем

Ако приемем, че началната ни функция е нещо подобно:

Нека напишем нашия първи тест, за да се предпазим от невалидни входове:

Бързи съвети относно тестването:

  • Следвайте модела AAA (ПОДРЕДЕТЕ, ДЕЙСТВАЙТЕ, УТВЪРДЯВАЙТЕ), когато пишете тест
  • Имайте само едно твърдение за единичен тест
  • При тестване, кодиране и отстраняване на грешки можете да използвате помощни функции, за да фокусирате само един тест или блок от тестове

Връщайки се към нашия първи тестов случай, трябва да кодираме решение за случаите, когато имаме твърде малко хвърляния като вход.

Изпълнението на тестовете с фокус върху първия ни тест ще върне първото ни зелено. Добра работа!

По същия начин сега можем да направим същото за останалите, като се погрижим да го правим един по един и да изпълняваме теста всеки път, в случай на грешка в нашия код, така че да не губите време за отстраняване на грешки.

Тук обикновено, ако не сте стресирани навреме, бих премахнал оператора if в друга функция, която обработва оператора за преобръщане на невалиден вход, но е по-важно първо да завършите заданието и да преработите по-късно.

Мислене в рамки за боулинг

Занапред следващите два невалидни входа са по-трудни за тестване веднага, тъй като не ги разделяме на рамки. Така че нека създадем нова функция, която обработва логиката на единичен кадър и да преместим нашите невалидни тестове към тази функция.

Нека създадем нашата функция calculateFrame. Обикновено рамката трябва да върне или сумата от две хвърляния, символ за удар, ако рамката е била удар, или резервен символ, ако рамката е била резерва. Първо обаче, нека се погрижим за нашите невалидни входове.

Сега е време да тестваме щастливия път и първата ни задача е да завършим функцията на рамката.

Имаме нужда от рамката, за да върнем сумата от хвърлянията или съответния символ за резервен/страйк. Символът „/“ за резерв и „X“ за удар.

Разширявайки нашия невалиден код за потвърждение, просто трябваше да върнем сумата. Доста просто, след като започнете с грешките, сега всичко, което трябва да направим, е да се справим със стачка и резервна.

За резерва, ако сумата е 10, върнете символа за резерв „/ и за Strike, ако първото хвърляне е 10, тогава връщаме символа „X“.

Всички игри имат карта с резултати

Вече разполагаме с нашите тестове, които проверяват нашата реализация, така че можем да преработваме колкото си искаме, и което е по-важно, имаме първия си блок в нашето решение.

Следващата стъпка сега е да надградите тази функция, за да стигнете до крайния правилен резултат.

След това искаме карта с резултати, при произволен брой рамки, нека видим резултата като в нормална игра на боулинг. Виждаме номера на рамката и сумата от тази рамка, символ за удар или резервен символ.

Отново можем да тестваме множество сценарии, когато нямаме удари или резервни части, когато имаме резервни, когато имаме удар и когато имаме множество удари / резервни части.

Вече имаме функция за рамка, която връща правилния резултат, просто трябва да зациклим рамките, да приложим функцията за рамка и да съхраним резултата в низ.

Проста и елегантна функция, която прави само едно нещо.

Събиране на резултата ви

Имаме нашата карта с резултати и сега е време да изчислим резултата от нея.

Нека дадем на тази функция трите вече тествани карти с резултати и да потвърдим правилния отговор.

Първата стъпка би била да преминете през низа, да анализирате всяка стойност като цяло число и да изчислите сумата. След това трябва да изчислим сложните неща, когато имаме резервен и страйк.

За резерва трябва да добавим следващото хвърляне като бонус, така че за да направим това, картата с резултати не е достатъчна, трябва също да имаме достъп до масива от кадри.

Остава още една стъпка, за удара трябва да добавим следващите две хвърляния като бонус и тук става трудно, можем да направим същото като по-горе и да добавим следващите две стойности в бъдещия кадър, но какво ще стане, ако следващият кадър също е стачка? След това ще добавим 0 по погрешка, трябва да проверим дали е стачка и да планираме съответно.

Точно както преди, трябва да проверим за удар и да добавим следващите хвърляния в forEach:

Това ще разреши нашия първоначален тестов случай, но ако имаме две последователни предупреждения, това ще добави 0 вместо 10 към второто предупреждение, така че трябва да проверим дали не добавяме грешна 0 и да бъдем много внимателни, в случай че 0 е от удар или нормален пропуск.

За да преминем този тест, трябва да проверим за бъдещ удар в нашето изчисление

В горния код се случват множество неща, миризма, която можем да извлечем в различна функция, но по същество се опитва да добави следващите две хвърляния към резултата. Но за да направи това, първо проверява дали имаме две хвърляния преди този удар и ако имаме, проверява за бъдещ удар.

Сглобяване на парчетата

Сега имаме изписана цялата логика, всичко, което остава, е да я съберем заедно в нашата функция bowlingScore.

listToMatrix е проста помощна функция, която генерира двуизмерна матрица (нашите рамки) от масив. Ето го:

И това е! Поздравления, току-що завършихте първата си ката. Занапред можете да го преработите и да се опитате да го оптимизирате колкото искате.

Заключение

Можете също да намерите готовия код тук.

TLDR:Ако сте пропуснали статията, ето ключовите елементи, които се надявам да останат с вас по време на вашето интервюиране:

  • Първо напишете тестове, проверете изхода си с модулни тестове, а не с конзолата
  • Когато пишете модулни тестове, следвайте модела AAA, използвайте само един ASSERT на тест и се възползвайте от помощната функция „only()“, за да се съсредоточите върху един тест.
  • Винаги мислете за границите на грешките и валидирането на входа
  • Започнете с кодиране на малка проста функция и увеличете решението оттам.
  • Наименуването има значение! Моля, отделете време, за да наименувате вашите функции и променливи с ясни и кратки имена.
  • С правилните модулни тестове е лесно и безопасно да преработите кода си.
  • Оставете рефакторинга за края, когато вече сте завършили заданието
  • Следете часовника, не искате интервюиращият да ви напомня, че ви остават 5 минути.

Благодаря ви за отделеното време! Надявам се тази статия да ви помогне да намерите мечтаната работа в прекрасния свят на софтуерното инженерство.