Есть ли способ улучшить свои навыки в 10 раз? Есть ли какой-то волшебный секрет, который — если бы вы только знали это — открыл бы для вас совершенно новый мир мастерства и производительности в разработке программного обеспечения?
Вот где сомневающиеся думают: «Здесь не удастся срезать углы! Каждый должен практиковаться, чтобы стать хорошим!» И это действительно так, но что практикуют специалисты чтобы ускорить разработку программного обеспечения, и есть ли одна ключевая вещь, которая может иметь огромное значение?
Да! Есть!
Но даже если я поделюсь им с вами — даже если я подробно изложу его для вас — вам может потребоваться 10 лет, чтобы вырасти и полностью оценить его простоту.
По крайней мере, так случилось со мной. Это было изложено мне на простом английском языке моим школьным учителем программирования. Я прошел шаг за шагом через процесс его применения, используя некоторые примеры кода. И это действительно произошло только через 10 лет. Но теперь, благодаря опыту, я глубоко ценю этот урок, и хотя я знаю, что вы не можете по настоящему оценить его с первого взгляда, я собираюсь поделиться им с вами.
Этот секрет является ключевым отличием между средней производительностью и 10-кратной производительностью. Используя рычаги, которые дает этот секрет, вы можете быть на порядок эффективнее.
Вы можете написать код, который будет более пригоден для повторного использования и с меньшей вероятностью сломается, когда вводятся новые требования и в коде происходят изменения.
Секрет того, чтобы быть в 10 раз более продуктивным, заключается в овладении абстракцией. Многие разработчики относятся к «абстракции» как к грязному слову. Вы можете услышать совет, например, «не абстрагируйтесь слишком рано» или знаменитое в Zen Python «явное лучше, чем неявное», подразумевая, что конкретное лучше, чем абстрактное. И все это хорошие советы — в зависимости от контекста.
Но современные приложения используют огромное количество кода. Если вы распечатаете исходный код 10 лучших современных приложений, эти стопки бумаги будут конкурировать с высотой небоскребов, а обслуживание программного обеспечения стоит больших денег. Чем больше кода вы создаете, тем больше он стоит.
Абстракция — ключ к простому коду
Правильные абстракции могут сделать код более читабельным, адаптируемым и обслуживаемым, скрывая детали, которые не важны для текущего контекста, и уменьшая объем кода, необходимый для выполнения той же работы — часто в несколько раз.
«Простота — это вычитание очевидного и добавление значимого».
— Джон Маэда: The Laws of Simplicity
Абстракция это не улица с односторонним движением. Она сформирована двумя дополнительными понятиями:
- Обобщение — удаление повторяющихся частей (очевидных) и скрытие их за абстракцией.
- Специализация — применение абстракции для конкретного случая использования, добавление только того, что должно отличаться (содержательно).
Рассмотрим следующий код:
const doubleList = list => {
const newList = [];
for (var i = 0; i < list.length; i++) {
newList[i] = list[i] * 2;
}
return newList;
};
В коде нет ничего неправильного, но он содержит много деталей, которые могут быть не важны для этого конкретного приложения.
- Он включает подробную информацию об используемой структуре данных контейнера (массив), что означает, что он будет работать только с массивами. Он содержит зависимость формы состояния.
- Он включает в себя логику итерации, что означает, что если вам нужны другие операции, которые также должны посещать каждый элемент в структуре данных, вам также потребуется повторить очень похожую логику итерации в этом коде. Это вызывает повторение, которое может нарушить принцип DRY (не повторять себя).
- Он включает в себя явное присваивание, а не декларативное описание выполняемой операции. Это многословно.
Ничего из этого не нужно. Все это можно спрятать за абстракцией. В этом случае, настолько универсальной абстракции, которая изменила способ создания современных приложений и уменьшила число явных циклов for, которые нам нужно написать.
«Если вы трогаете одну вещь с глубоким осознанием, вы касаетесь всего».
— Тхих Нхат Хань
Используя операцию map, мы можем сократить код до однострочного, убрав очевидное (части, которые мы, вероятно, повторим в аналогичном коде), и сосредоточившись на значимом (только том, что должно отличаться для нашего использования). Пример:
const doubleList = list => list.map(x => x * 2);
Джуниор разработчики думают, что им нужно написать много кода, чтобы получить большую ценность.
Старшие разработчики понимают ценность кода, который никому не нужно было писать.
Представьте себя программистом, который популяризировал использование операции map в таких языках программирования, как JavaScript. Map абстрагируется от таких деталей, как тип данных, которые вы сопоставляете, тип структуры данных, содержащей данные, и логики итерации, необходимой для перечисления каждого узла данных в структуре данных. Это повысило эффективность каждого приложения, созданного мной за последнее десятилетие.
Джереми Ашкенас сделал несколько таких операций популярными в JavaScript и проложил путь для многих великолепных синтаксических ярлыков, которые мы теперь считаем само собой разумеющимся в JavaScript, впервые применив их в CoffeeScript. Он создал Underscore, которая породила Lodash (все еще самый популярный инструмент для функционального программирования в JavaScript) и Backbone, который популяризировал архитектуру MVC в JavaScript и заложил основу для Angular и React.
Джон Резиг сделал jQuery, который был настолько популярным и влиятельным, что он сформировал самую большую коллекцию повторно инкапсулированных модулей JavaScript (плагинов jQuery), пока через несколько лет не появились стандартные модули Node и модули ES6. API селектора jQuery был настолько влиятельным, что стал основой современного API DOM. Я почти ежедневно получаю пользу от этого API, когда я тестирую компоненты React.
Правильные абстракции — это мощные рычаги, которые могут существенно повлиять на производительность. Абстракция не ругательное слово. Модули, функции, переменные, классы — все это формы абстракции, и вся причина, по которой они существуют, состоит в том, чтобы упростить абстракцию и составление абстракций.
Вы не можете создавать сложные программы без абстракций. Даже на ассемблере используются абстракции — имена для инструкций, переменные для адресов памяти, кодовые точки для перехода к подпрограммам (например, к вызовам функций) и т. д. Современное программное обеспечение представляет собой слой полезных абстракций, и эти слои дают вам преимущество.
«Дайте мне достаточно длинный рычаг и точку опоры, на которую я мог бы опереться, и я сдвину с места весь мир.»
— Архимед
Ключ к простоте: секрет, который мы ищем, — это как уменьшить объем кода, который мы создаем, — как сделать намного больше с гораздо меньшим количеством. Когда вы овладеете этим, вы станете программистом в 10 раз лучше. Я гарантирую это.
Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:
- Курс по Machine Learning (12 недель)
- Обучение профессии Data Science с нуля (12 месяцев)
- Профессия аналитика с любым стартовым уровнем (9 месяцев)
- Курс «Python для веб-разработки» (9 месяцев)
lair
Говорят, 10x programmers — это миф. Упс.
Неа. Секрет того, чтобы быть 10x programmer — в том, чтобы убедить всех вокруг, что ты — 10x programmer. Больше ничего.
Здравствуй, подмена. Не абстракция — ключ к простому коду, а правильная абстракция. Точно так же как правильное именование, правильный дизайн и вообще правильное программирование.
Вот уж действительно — нет ярлыков...
freecoder_xx
Правильные абстракции — это прежде всего абстракции. Так что подмены тут нет.
lair
Есть-есть. Если я создам проект, в котором будет 100 плохих абстракций и ни одной хорошей, получил ли я ключ к простому коду?
freecoder_xx
Вы просто интерпретируете суждение как "всякая абстракция — ключ", но квантора всеобщности там нет.
lair
Потому что утверждение "какая-то абстрация — ключ" непродуктивно. Никогда же не знаешь, ту ты взял, или нет.
freecoder_xx
На первом этапе нужно хотя бы сообразить, что вам нужна именно абстракция, а уже потом решать, какая хорошая, какая — нет. Я вижу именно это начальное суждение в данном заголовке, потому что не для всех очевидно, что со сложностью нужно бороться с помоцью абстракции.
lair
Еще нужно сообразить, что абстракция не нужна.
Опять же, со сложностью нужно бороться подходящими методами. Иногда — абстракцией. Иногда — нет.
funca
Эрик это один из тех волшебных авторов, рассматривая тексты которых под микроскопом хочется цепляться к каждому слову, уточнять и дополнять, однако кто в целом излагает весьма толковые вещи. Из части своих постов на медиуме Эрик насобирал книжку «Composing Software» medium.com/javascript-scene/composing-software-the-book-f31c77fc3ddc. Но потом устроился в стартап с блокчейнами, где его кажется покусали маркетологи. Теперь посты, которые не входят в книжку, он заполняет «продающими» лозунгами, что выглядит еще более спорно и даже вульгарно. Но основные мысли по прежнему здравые.
На мой взгляд Эрика лучше читать в оригинале и подряд. По крайней мере англоязычная терминология не несет в себе столько лишних коннотаций, сколько добавляют переводы на русский, что несколько снижает градус абсурда (это не претензия к переводу, скорее общее ощущение разницы культур).
lair
Вот только не новые совсем.