О JavaScript, фреймворках и найме
Недавно мой коллега и друг Кевин Эннис написал интересную статью под названием Вы неправильно думаете о фреймворках. Там есть отличная цитата, которую я хотел бы обсудить:
«Я хочу сказать, что, преувеличивая важность фреймворков, мы получаем целую армию технических специалистов, а не инженеров. Делая вид, что Ember или Angular могут решить все наши проблемы, мы создаем ложное впечатление, что простое изучение «правильного» фреймворка - это все, что вам нужно, чтобы быть эффективными. Но это не так ».
- Кевин С. Эннис, эсквайр
Любой, кто знает, как я отношусь к JavaScript и веб-разработке в целом, не удивится, что я полностью согласен с его мнением здесь. Но здесь я хотел бы пояснить более тонкий вывод.
Если в примечании Кевина говорится, что из фреймворков часто делают лучше техников, чем инженеров, возникает вопрос ...
Как я могу стать более эффективным разработчиком JavaScript?
Примечание. Приведенные здесь предложения предназначены для кандидатов, проходящих собеседование на должности среднего и старшего уровня с большим количеством JavaScript. Это лишь небольшая часть основных дыр, которые я заметил при приеме на работу.
Ответ: Изучите JavaScript.
Хорошо, это может звучать немного сардонично (и это так), но по моему опыту собеседований с разработчиками JavaScript за последние несколько лет я обнаружил некоторые тревожные закономерности, которые можно легко исправить с помощью скромного количества чтения и экспериментов.
1) Разберитесь в подъеме.
Этот фрагмент вас смущает?
var foo = 'bar'; (function() { console.log( foo ); // logs `undefined` var foo = 'baz'; })();
Подъем деклараций может стать источником множества проблем по отладке для младших инженеров, понимание того, как это происходит, может сэкономить вам и вашей команде множество циклов в будущем.
В Starry мы фактически применяем руководство по стилю JS, которое требует, чтобы все объявления переменных располагались в верхней части заданной функции, чтобы устранить любую двусмысленность.
Приведенный выше фрагмент кода не прошел бы наши автоматизированные тесты CI, и для успешного прохождения его пришлось бы переписать следующим образом:
var foo = ‘bar’; (function() { var foo; console.log( foo ); // logs `undefined` foo = ‘baz’ ; })();
Несмотря на то, что это очень надуманный пример, этот новый фрагмент гораздо менее запутан, и, по-видимому, разработчик никогда не намеревался изначально регистрировать неопределенное значение, поэтому в этом случае мы опередили ошибку.
2) Понять прототипы.
На мой взгляд, прототипное наследование настолько важно для надежного дизайна приложения, что меня обычно удивляет отсутствие открытости у большинства инженеров (даже опытных разработчиков).
На технических собеседованиях я часто спрашиваю следующее:
// How would we set up the inheritance chain, such that // Bar inherits from Foo? function Foo() { console.log(‘Initializing…’); this.init(); } Foo.prototype.init = function() { console.log(‘Initialized!’); }; function Bar() { } var bar = new Bar(); // should log ‘Initializing…’ and ‘Initialized!’
Некоторым это может показаться тривиальным - и я думаю, что это так, - но на самом деле большинство инженеров, которые были обучены абстракции высшего порядка для создания приложений (а-ля Angular, Ember и др.), Возможно, никогда не столкнулись с ситуацией, когда наследование представляло собой очевидную (или даже полезную) закономерность.
Я с пониманием отношусь к этим людям, поскольку в прошлом я работал в среде, нагруженной фреймворками, но буду ли я оптимистичен, если найду их на важную роль? Скорее всего, не.
Некоторые могут утверждать, что наследование несущественно для эффективного проектирования приложений, особенно для одностраничных веб-приложений. А тем, кто сказал бы: я категорически не согласен.
3) Понять закрытие.
Представьте, что вы получили спецификацию или пользовательскую историю для модуля оценки в игре, которую разрабатывает ваша компания. При приемочных испытаниях требуется:
1) Модуль оценки должен иметь свойство с именем score. Каждый раз, когда это целое число изменяется каким-либо образом, шаблон ДОЛЖЕН также обновляться.
Есть 101 способ добиться этого. Но понимание замыканий предлагает действительно краткую и понятную реализацию:
function ScoreModule() { this.tmplString = ‘Score: {{ score }}’; this.elem = document.querySelector(‘#my-score-elem’); (function() { var score = 0; Object.defineProperty( this, ‘score’, { get: function(){ return score; }, set: function( val ) { score = val; this.elem.innerHTML = template( tmplString, { score: score } ); } }); }).call( this ); } var scoreModule = new ScoreModule(); scoreModule.score = 5; // auto templating abound!
Если бы кандидат мог показать мне такой код - даже с нулевым опытом работы с фреймворками - я бы с гораздо большей вероятностью нанял его, а не эквивалентного разработчика Angular, который не смог бы понять этот шаблон.
Но все используют [Framework X], разве я не должен погрузиться в рыночную жизнь ?!
Абсолютно! Я большой поклонник Backbone / Marionette и призываю людей выбирать правильный инструмент для работы, а также для той культуры, которую вы хотите создать в своей организации. Будь то React / Flux, Angular, Ember или Backbone; им всем есть что предложить. Прочтите документы / исходники и найдите то, что вас волнует.
Но это пристрастие к инструментам не должно затмевать ваше желание и способность развивать экспертные знания веб-платформы, особенно языка JavaScript.
Если что-то из этого находит отклик у вас - я нанимаю инженеров по JavaScript, пишите: [email protected].
Первоначально опубликовано на spmurrayzzz.com