Како напредовати док студирате за кодирање интервјуа

Заглављивање никад није забавно. Нарочито када радите заиста напорно. Па ипак, откривам да се то дешава људима који се стално припремају за кодирање интервјуа.

Доследно сте радили. Прошли сте стотине проблема са вежбањем и блокирали сат времена за учење. Али ти једноставно не напредујеш.

Чак и након свих ових припремних радова, и даље осећате да је сваки проблем нови изазов који не знате како да решите. Проблеме можете решавати већину времена, али чини се да то не постаје толико лакше.

Када радим са клијентима који подучавају 1: 1, управо у тој ситуацији их често затекнем. И у готово свим случајевима, када идентификујемо ствар (или ствари) која их кочи, они доживљавају велика открића. Решавање ових проблема запослило је моје клијенте у Амазону, Блоомбергу, Уберу и многим другим!

Па шта вас тачно кочи? Шта вас спречава да постигнете напредак који желите? У овом чланку ћу вам показати десет најчешћих проблема са којима се људи боре. Међутим, поштено упозорење: заиста је тешко препознати ове проблеме у себи. Ако заиста желите да се пробијете кроз проблеме, саветујем рад са тренером.

1. Развити јаке темеље

Већ сам разговарао о овом питању, али један од најважнијих кључева успеха у кодирању интервјуа је постојање чврстих основа основа рачунарских наука.

Временом сам развио много различитих техника како бих својим студентима помогао да побољшају решавање проблема у својим интервјуима, попут ФАСТ методе. Међутим, ниједна од ових техника није вредна ако немате јаке основе испод појаса.

На пример, ФАСТ метода је дизајнирана да помогне ученицима у динамичком програмирању. Први корак ФАСТ методе је проналажење почетног рекурзивног решења грубе силе. То је нешто што требате бити у стању да урадите сами да би вам ФАСТ метода била од користи. Чак и ако разумете методологију, неће вам помоћи ако не знате како да дођете до тог почетног решења.

Ако имате јаке основе, онда је рекурзија нешто што вам не би требало бити тешко. То је тема која се појављује довољно често да бисте могли да је избаците кад год желите.

Такав је случај са свим осталим темељним структурама података и алгоритмима. Ако не знате како да примените повезану листу, онда није важно колико трикова научите за решавање проблема повезане повезане листе.

Ако вам недостаје формална позадина рачунарских наука или једноставно откријете да вам препоручене технике решавања проблема за кодирање интервјуа заправо не помажу, онда би ваш први корак требало да буде посветити се учењу свих основних структура података и алгоритама.

Најбољи начин за то је похађање курса МИТ (Питхон) или Принцетон (Јава) структура података и алгоритама. Купите књигу, урадите задатке и положите испите. Ако се потрудите, курс можете лако завршити за 3 месеца или мање и имаћете јаку основу за напредак.

2. Набавите више искуства са кодирањем

Да ли сте икада покушали нешто да урадите први пут? Када сам први пут учио како свирати гитару, требало би ми 30 секунди да добијем прсте за основни акорд. У теорији бих могао да одсвирам било коју песму ако бих имао довољно времена и имао акорде испред себе, али то не би звучало баш добро.

Понекад радим са студентима који су у сличном положају са својим кодирањем. Једноставно још нису достигли ниво стручности где могу лако да напишу код у свом интервјуу.

У теорији, кодирање компоненте интервјуа требало би да буде лакши део. Све док вежбате на белој табли, најтежи део вашег интервјуа требало би да буде решење пре свега пре него што икада напишете ред кода. Ако ово није тачно, вероватно ћете морати да побољшате своје вештине кодирања.

Постоје и неке групе које су више погођене овим питањем од других. Првенствено они који имају мање искуства са кодирањем. Често видим боотцамп студенте, студенте мастер студија који су прешли на рачунарске науке за своје магистре из друге области или дугорочне менаџере који се једноставно нису кодирали већ неко време борећи се највише са кодирањем.

Овде је кључно једноставно добити више вежбања у кодирању, и идеално је то учинити у окружењу у којем добијате добре повратне информације о свом коду. Један од најбољих начина да се то постигне је допринос пројектима отвореног кода. Не само да је ово сјајан начин да покажете своје искуство, већ ћете добити предност темељних прегледа кода и учења како радити у производном окружењу.

Ако сте нови у раду са отвореним кодом, Фирст Тимерс Онли је одличан ресурс за оне који желе да започну. Они деле туторијале о томе како да дају свој допринос и саставили су листу потенцијалних пројеката који би били добри за почетнике.

3. Стратешки приступите сваком питању за интервју

Када иде у битку, сваки генерал који очекује успех има детаљан план. Ако желите да успете у свом интервјуу, морате да имате и детаљан план.

Најчешћи план за решавање проблема са интервјуима изгледа отприлике овако:

  1. Погледајте проблем
  2. Размислите о проблему
  3. Дођите до решења
  4. Напишите решење
  5. Успех

Међутим, да ли овде примећујете проблем? Надам се да је прва ствар коју сте питали било „Како да пронађем решење?“ Овом плану потпуно недостаје било каква стратегија за проналажење решења. Претпоставља се да ће се решење тек појавити.

И тако већина људи размишља о проблемима са интервјуима. Они памте тоне решења с надом да ће једно од њих бити довољно слично проблему с којим се суочавају у свом интервјуу да ће се решење магично материјализовати.

Ово је у најбољем случају ризично.

Далеко бољи начин интервјуа је да имате јасан план игре како ћете приступити сваком интервјуу и сваком проблему у интервјуу. Ево грубог прегледа како можете приступити једносатном интервјуу:

[0: 00–0: 05] Средите се и побрините се да у потпуности разумете проблем који они постављају. Прегледајте све понуђене примере улаза.

[0: 05–0: 10] Смислите грубо решење проблема. У овом тренутку нема кодирања, само разговарајте и нацртајте слике ако вам је то корисно. Ако заглавите у изналажењу решења грубе силе, покушајте ручно да решите проблем и преведете поступак за његово решавање у алгоритам.

[ 0: 10–0: 15] Оптимизујте своје решење. Одвојите ових 5 минута да бисте схватили апсолутно најбоље решење које сте могли у овом временском периоду. Када упоређујете решења, узмите у обзир временску сложеност.

[0: 15–0: 35] Кодирајте своје решење. Чак и ако није оптимално, боље је имати потпуно, неоптимално решење него непотпуно, оптимално решење.

[0: 35–0: 50] Тестирајте свој код и решите проблеме. Ово је невероватно важно. Није важно да ли ваш код није савршен први пут, али боље је да будете у могућности да идентификујете грешке.

[0: 50–1: 00] Питања за вашег интервјуера.

Пратећи ове кораке, истовремено постижете две ствари. Прво, ефикасно финансирате своје време. Најфрустрирајућа ствар на свету остаје без времена када потпуно знате како да решите проблем.

Друго, ови кораци ће вам помоћи да обезбедите да увек дођете до решења. Почевши од решења грубе силе и оптимизације, готово можете да гарантујете да ћете бар донети неко решење. Често вам није најоптималније решење ако вам добро иде у остатку интервјуа.

4. Размотрите различита могућа решења

Да ли сте знали да већина питања за интервју има више тачних решења? Знам, шокант, зар не? Међутим, тоне људи пронађу решење и онда се ту зауставе не тражећи даље.

Ово ме увек разочара. Често постоји друго решење које би било још боље и било је тако близу. Или су можда постојала упоредива решења која су имала различите компромисе.

На пример, размотрите овај проблем:

  • Једно решење има O(n)сложеност времена и сложеност O(1)простора
  • Друго решење има O(log n)сложеност времена и сложеност O(log n)простора

Које од ових решења је боље?

Па, то зависи од тога шта заправо тражимо. Ако имамо огроман скуп података и немамо пуно меморије, прво решење би могло бити боље. Међутим, ако меморија није проблем, онда очигледно желимо да се одлучимо за друго решење.

Овде је кључно да, иако у неким случајевима може постојати једно „најбоље“ решење, постоји много више проблема у којима можете направити различите компромисе и морате одлучити које ћете направити. Као анкетар, волим да видим кандидате који одмеравају различите могућности.

Када осмишљавате решења, одвојите тренутак и размислите о другим начинима на које бисте могли да решите исти проблем. Да ли бисте могли да направите компромисе који би побољшали коришћење простора у односу на време или обрнуто?

Коначно, увек бисте требали узети у обзир сложеност простора и времена сваког решења које дођете. Ово вам даје објективан начин да процените која су решења боља од других и помаже вам да донесете информисанију одлуку о томе које решење да одаберете. Ако имате више упоредивих решења, разговарајте са испитивачем и заједнички одлучите који би од њих био бољи приступ.

5. Почните са раствором грубе силе

То сам већ споменуо у пролазу у савету 3, али једна од највећих грешака коју људи праве када покушавају да реше проблеме са интервјуима је та што одмах покушавају да нађу најоптималније решење проблема.

Али да вас питам следеће: шта је боље, решење грубе силе или решење?

Рећи ћу вам да је проналажење решења за грубу силу 1000% боље него не решење уопште. А ако започнете тако што ћете одмах покушати пронаћи оптимално решење, лако ћете запети и на крају завршити без комплетног решења.

Иако заправо не морате да га кодирате, препоручујем вам да барем на кратко напоменете како бисте проблем могли да решите грубом силом пре него што наставите да покушавате да га оптимизујете. Овим се постижу две важне ствари:

  1. Даје вам резервни план. Ако покушате да оптимизујете своје решење и не успете, можете да зауставите након 5 или 10 минута и једноставно кодирате своје решење грубе силе. Још увек можете проћи интервју. Немају сви проблеми оптимална решења.
  2. Помаже вам да разјасните проблем. Дефинисање решења за грубу силу може вам помоћи да тачно разумете шта је све укључено у проналажење решења за овај проблем. То је кључно. Разумевање проблема на овај дубоки начин олакшаће оптимизацију.

Покушај да се одмах пронађе оптимално решење може изгледати као прави приступ, јер ће уштедети драгоцено време. Међутим, сматрам да збрка која настаје услед таквог приступа често губи много више времена него што стекнете.

Почевши од решења грубе силе даје вам јасноћу и полазну тачку да све остало учините лакшим.

6. Испланирајте потпуно решење пре него што кодирате

Постоје неке супер отмене табле. Али шансе су да бела табла коју ћете користити неће имати опцију цопи-пасте. То значи да желите да имате добар преглед свог кода пре него што га напишете.

Често људи зарони право у писање кода чим им се постави проблем у интервјуу. Сада је потпуно у реду ако желите да унапред дефинишете своју методу, али то би требало да буде обим кода који пишете док не разрадите решење у потпуности. Писање више кода од тога је критична грешка из два разлога.

Прво, као што рекох, беле табле немају функцију цопи-пасте. То значи да ако желите да померате редове кода, морате их или избрисати и преписати или нацртати стрелице које иду свуда. Не желите заправо да ваша табла изгледа овако:

Одржавање беле табле је лакше и вама и вашем испитивачу. Њима је лакше да разумеју ваше решење, а много је лакше да пратите шта се дешава. А ако одлучите да само препишете ствари, изгубићете тону драгоценог времена.

Друго питање код почетка кодирања је да вас може закључати на одређени начин размишљања о проблему. О овоме ћемо више говорити у тачки 7, али ово може бити невероватно штетно за перформансе вашег интервјуа.

Замислите да видите проблем и решење вам одмах падне на памет. Почнете да га кодирате, али схватате да то више није оптимално. Тешко да ћете желети да све избришете и почнете испочетка. Па чак и ако то учините, бићете закључани у том начину размишљања.

Постоје проблеми код којих оптимално решење није потпуно повезано са решењем грубе силе, а покушаји оптимизације решења грубе силе неће успети. Ако сачекате да започнете са кодирањем, избегавате да свој ум усмерите у један од начина гледања проблема.

Због ове забринутости увек предлажем да у потпуности разумете решење које желите да програмирате пре него што напишете код. Цртајте слике, пишите псеудо-код, радите све што је потребно да бисте разумели решење. Једном када започнете са кодирањем, требало би да буде тривијално, јер већ тачно знате шта треба да напишете.

7. Имајте на уму велику слику

Један од највећих проблема који видим код искуснијих програмера је тај што они потпуно заглаве у корову са проблемом. Почињу да се опсесирају да ли би требало да буде петља <; Н or &лт; = Н и не могу да схватим који је прави приступ.

Ово је савршен пример губитка шуме због дрвећа. Питање које покушавају да реше постане питање „Како да правилно напишем ову петљу?“ уместо „Коју сврху ова петља служи у већем контексту мог кода?“

Савршен пример овога је проблем када покушавате да употребите погрешну структуру података. Рецимо да складиштите вредности индексиране из 1-Nи одлучите да желите да користите ХасхМап. Можете убацити 1 -> valуе 1, 2 ->вредност2 и тако даље.

Али сада када желите да их прегледате редом, то ће бити мука јер морате све елементе преузети из ХасхМап-а и сортирати. Међутим, ако сте се повукли корак уназад и погледали шта заправо покушавате да урадите, само желите да сачувате вредност у сваком индексу и да се њиме прелистате. Низ би био много лакша структура података за употребу.

Сад можда мислите: „Никад не бих учинио нешто тако глупо“, али верујте ми, то се стално дешава. Ваш процес размишљања је нелинеаран када решавате проблеме, па сте можда помислили да вам је потребна ХасхМап због неке друге линије размишљања коју сте у међувремену напустили.

Због тога је толико важно зауставити се свако толико, посебно ако почнете да радите нешто што вам се чини изазовним и осврнете се на велику слику онога што покушавате да урадите. Кад год радите нешто што вам се чини непотребно компликованим, погледајте свој крајњи циљ и видите да ли можете поједноставити свој приступ.

8. Користите апстракцију у своју корист

Волим да постављам компликоване проблеме са интервјуима. Ако проблем укључује неколико различитих компоненти, ви као анкетар добијате тако сјајан увид у то како кандидат управља својим размишљањем када се толико тога може одједном одрадити.

Кључ успешног решавања ових проблема је употреба апстракције. У основи то значи разбијање кода на мање функције с одређенијим сврхама.

Размотримо једноставан пример. Рецимо да смо желели да исписамо повезану листу обрнутим редоследом. Након обраде овог проблема схватамо да постоји O(n)временско и просторно решење проблема помоћу стека (гурните сваки елемент у стек док се превлачимо по листи, а затим ставимо сваку ставку и исписујемо), али проблем можемо решити у O(n)време и O(1)простор окретањем повезане листе.

Сада би било довољно лако преокренути повезану листу у нашем коду, али шта ако бисмо имали функцију која би то учинила уместо нас? То би нам олакшало живот. Само позивамо функцију на повезаној листи, прелиставамо све на листи и исписујемо је, а затим листу поново преокрећемо тако да свој унос вратимо у првобитно стање.

Помоћу те логике сада можемо изоловати процес преокретања повезане листе и размислити како то ефикасно урадити. Иако је овај проблем врло једноставан пример, лако је видети како ово смањује количину сложености о којој морамо размишљати у било ком тренутку.

Ако имате сложенијих проблема, препоручујем вам да поставите себи питање „Која функција би ми сада олакшала живот?“ Ако постоји јасна функција или функције, напишите свој код под претпоставком да те функције већ постоје. Тада се можете вратити назад и применити те функције, сада када остатак вашег кода већ ради.

Ово има неколико предности:

  1. Ако вам понестане времена, у основи још увек имате шифру која ради. Апстракција вам омогућава да се усредсредите на целокупну структуру, а да не морате да упадате у ситнице. Ако имате вишка времена, можете да бринете о ситницама, али чак и ако немате, интервјуеру је јасно да знате шта се дешава.
  2. Јасноћа размишљања и кода. Кажу да чист радни сто значи бистар ум, а исто је и са кодом. Што боље организирате свој код и подијелите га на управљачке компоненте, то је лакше размишљати о њему.

Сматрам да што је проблем више умешан, то вредније може бити разбијање ствари на управљачке компоненте.

9. Тестирајте свој код

Када радимо нешто ново, склони смо да заборавимо многе ствари које већ знамо. Претпостављамо да се ствари које већ знамо не примењују.

Размотрите овај пример: У слободно време учим како свирати гитару. Борио сам се да напредујем, па сам замолио свог учитеља за помоћ, а он ми је предложио да запишем неке циљеве о томе шта желим да постигнем. „ДУХ“. Стално пишем о таквим стварима, али нисам успео да успоставим везу између припреме за интервју за кодирање и вежбања гитаре.

На исти начин, откривам да многи студенти заборављају да примене најбоље праксе које познају из стварног кодирања на своје интервјуе. Претпостављају да су интервјуи за кодирање потпуно различити, па се ствари које би иначе радили не примењују.

Једна од ствари коју људи непрестано заборављају је тестирање решења за интервју. Али да ли бисте икада поставили код у стварном свету, а да га претходно нисте темељито тестирали?

Тестирате свој код јер желите да се уверите да је тачан и да ради оно што мислите да треба. Ово је још важније у стресном окружењу интервјуа јер сте склонији грешкама.

Кључ тестирања ваших решења је пролазак кода ред по ред, праћење вредности сваке променљиве и ефикасно „покретање“ кода. Ако само прочитате код на високом нивоу, врло лако можете пропустити мање проблеме са кодом. Снимио сам видео који тачно показује како се пролази и тестира код.

Сматрам да многи студенти наглашавају да им је код први пут савршен, а иако је ово добра тежња, то се ретко дешава. Готово се никад не дешава у стварном свету, па зашто бисте очекивали да се то догоди у стреснијем окружењу интервјуа? Међутим, ако темељито тестирате свој код, можете да отклоните све грешке и ипак добијете решење А +.

10. Добијте добре повратне информације

Одржавање интервјуа у стварном свету је одличан начин да се побољша интервјуисање. Можете се угодније упознати са искуством и пружити си пуно прилика за успех. Стратегија која се често препоручује је да закажете гомилу интервјуа са онима који су вас најмање узбуђени. На тај начин ћете се увежбати у интервјуима где вам заправо није стало до исхода, тако да ћете бити спремнији када се појаве важни интервјуи.

Иако мислим да ова стратегија има предности, постоји једна кобна мана: Компаније су лоше кад вам дају било какве значајне повратне информације.

„Па“, могло би се рећи, „Кога брига? Могу само да проценим свој учинак. “

Па да, то је истина, али може бити заиста тешко просудити себе. Не знате које критеријуме тражи ваш анкетар (само добијање оптималног решења за један проблем можда га неће смањити). А ако се борите за успех, постоји шанса да постоји нешто што не видите.

Због тога су лажни интервјуи, а поврх тога идеално рад са тренером, толико важни. Лажни интервјуи дају вам прилику да добијете детаљне повратне информације о свом учинку. Анкетар вам такође може рећи да ли постоје ствари које нисте приметили

Ако заиста озбиљно желите да радите добро у својим интервјуима, такође вам препоручујем да радите са тренером на врху лажних интервјуа. Лажни интервјуи су појединачне тачке података. Кажу вам да сте се у одређеном тренутку у одређеном тренутку добро или лоше показали. Међутим, тренер може да погледа све ове тачке података и помогне вам да успоставите везе. Они вам могу помоћи да видите конкретне ствари на којима требате радити како бисте побољшали различите аспекте изведбе интервјуа.

На крају, лажни интервјуи вам дају тачке података, а тренери вам помажу да повежете тачке. Добијање оваквих повратних информација је најбољи могући начин да убрзате напредак у интервјуу.

Повремено видим како људи застају у својим интервјуима. И то је готово увек из једног од горе описаних разлога. Ако не напредујете онако како желите, пажљиво прочитајте овај чланак. Утврдите своје проблематично подручје (подручја) и потрудите се да га исправите. Временом ћете моћи да усавршите своје интервјуисање и почнете да примате позиве које желите да чујете.