
Преди няколко дни проведох интервю с JavaScript разработчик, който кандидатстваше за позицията на старши. Колега, който също присъстваше на интервюто, помоли кандидата да напише функция, която да извършва HTTP заявка и при неуспех да я повтори няколко пъти.
Той пишеше кода директно на дъската, така че беше достатъчно да нарисува нещо приблизително. Ако просто бе показал, че добре разбира същността на задачата, щяхме да сме напълно удовлетворени. Но, за съжаление, не успя да намери удачно решение. Тогава, като отдадохме вината на вълнението, решихме да облекчим задачата и го помолихме да преобразува функцията с обратни повиквания в функция, базирана на промиси.
Но за съжаление. Да, беше очевидно, че такава част от кода му е била известна преди. Той общо взето знаеше как всичко работи. Важното за нас беше, че ни трябваше концептуален чертеж на решението, който да демонстрира разбиране на концепцията. Въпреки това кодът, който кандидатът пишеше на дъската, беше пълна безсмислица. Той имаше изключително неясно разбиране за това какво са промисите в JavaScript и не можеше да обясни защо са нужни. За джуниор това би било още приемливо, но за позиция на старши вече не минаваше. Как този разработчик би могъл да отстрани грешки в сложна верига с промиси и да обясни на другите какво точно е направил?
Разработчиците считат готовия код за очевиден.
В процеса на разработка постоянно се сблъскваме с повтарящи се материали. Прехвърляме фрагменти от код, за да не се налага да ги пишем отново и отново. Съответно, концентрирайки вниманието си върху ключовите части, гледаме на готовия код, с който работим, като на нещо очевидно – просто предполагаме, че всичко в него ще работи както трябва.
И обикновено наистина работи, но когато възникнат сложности, разбирането на механиката му повече от компенсира.
Така нашият кандидат за позицията на старши разработчик смяташе, че обектите promise са очевидни. Вероятно си представяше как да ги управлява, когато среща код на друг, но основният принцип не разбираше и не успя да го повтори на интервюто. Може би е запомнил фрагмент наизуст – не е толкова трудно:
return new Promise((resolve, reject) => {
functionWithCallback((err, result) => {
return err ? reject(err) : resolve(result);
});
});И аз също съм го правил – вероятно всеки от нас е преминавал през това. Просто запомняхме парче код, за да го използваме в работата, като само общо сме си представяли как всичко е устроено. Но ако разработчикът наистина разбираше концепцията, нямаше да му се налага да запомня нищо – той просто би знаел как става и без усилие щеше да възпроизведе всичко необходимо в кода.
Обърнете се към източниците
През 2012 г., когато все още не се утвърдиха фреймовете на фронтенда, jQuery владеше света и четях книгата , написана от Джон Резиг, създателя на jQuery.
Книгата учи читателя как да създаде собствен jQuery от нулата и предлага уникална възможност да се запознаем с начина на мислене, който води до създаването на библиотеката. В последните години jQuery загуби старата си популярност, но все пак настоятелно я препоръчвам. Най-впечатляващо за мен беше нарастващото усещане, че мога и сам да се добера до всичко това. Стъпките, които описва авторът, изглеждаха толкова логични и разбираеми, че наистина ми се стори, че бих могъл да създам jQuery, ако само се захвана с това.
Разбира се, в реалността нищо подобно нямаше да успея – би ми се сторило, че е невъзможно трудно. Собствените ми решения щяха да изглеждат твърде прости и наивни, за да проработят и щях да се откажа. Би трябвало да приемам jQuery за нещо очевидно, в работата на което просто трябваше да имам сляпа вяра. По-късно едва ли щях да отделя време да се зачитам в механиката на тази библиотека, а просто щях да я използвам като някаква черна кутия.
Но запознаването с тази книга промени мен. Започнах да чета изходния код и открих, че реализирането на много от решенията на практика е много прозрачно, дори очевидно. Не, разбира се, да се добереш до нещо подобно – това е от друга оперинга. Но именно изучаването на чужд код и възпроизвеждането на вече съществуващи решения ни помага да измислим нещо свое.
Вдъхновението, което ще извлечете, и моделите, които ще започнете да забелязвате, ще променят начина, по който се развивате като разработчик. Ще откриете, че онази прекрасна библиотека, която ползвате постоянно и за която сте свикнали да мислите като за магически артефакт, не работи с магия, а просто решава проблема лаконично и находчиво.
Понякога ще трябва да се потрудите с кода, анализирайки го стъпка по стъпка, но именно така, напредвайки с малки последователни стъпки, ще можете да повторите пътя на автора към решението. Това ще ви позволи да се потопите по-дълбоко в процеса на писане на код и ще ви даде повече увереност при търсенето на ваши собствени решения.
Когато тъкмо започвах да работя с обещания, ми се струваше, че това е чиста магия. После научих, че в основата им стоят същите обратни извиквания, и моят програмистки свят се преобърна. Т.е. моделът, чиято цел е да ни избави от обратните извиквания, сам се реализира чрез обратни извиквания?!
Това ми помогна да погледна на нещата с нови очи и да осъзная, че пред мен не стоят някакви абстрактни парчета код, запределно сложни, които никога в живота си няма да схвана. Това са просто модели, които лесно могат да бъдат усвоени с достатъчно любопитство и дълбочина. Именно така хората учат програмиране и растат като разработчици.
Пренапишете това колело отново
Така че смело пренаписвайте колелата: напишете самостоятелно код за свързване на данни, създайте домашен обещание или дори направете сами решение за управление на състояния.
Няма значение, че никой никога няма да ползва всичко това – важното е, че сега можете да го направите. А ако по-късно имате възможност да използвате тези разработки в собствените си проекти, това ще е наистина страхотно. Ще можете да ги развивате и ще научите още нещо.
Смисълът тук не е да изпратите кода си в продукция, а да усвоите нещо ново. Самостоятелно написването на реализация на вече съществуващо решение е отличен начин да учите от най-добрите програмисти и да усъвършенствате своето майсторство.
Източник: habr.com
