Программирование
Секрет простого кода
Этот секрет — ключевое различие между средней и в 10 раз лучшей производительностью. Используя рычаги, которые предоставляет этот секрет, вы можете быть на несколько порядков эффективнее в создании кода.
Есть ли короткий путь к тому, чтобы стать в 10 раз лучшим разработчиком? Есть ли какой-нибудь волшебный ингредиент, который — если бы вы его только знали — открыл бы для вас совершенно новый мир мастерства и производительности в разработке программного обеспечения?
Здесь сомневающиеся думают: «Коротких путей нет! Всем нужно много тренироваться, чтобы стать лучше!» И это достаточно верно, но что именно тренируют самые продуктивные разработчики программного обеспечения, есть ли один ключевой момент, который может иметь огромное значение?
Да! Он есть!
Но даже если я поделюсь им с вами — даже если я расскажу его и подробно изложу — вам может потребоваться 10 лет, чтобы вырасти и полностью осознать его простоту.
По крайней мере, так случилось со мной. Этот прием был объяснен мне простым английским языком моим школьным учителем программирования. Я шаг за шагом прошел через весь процесс его применения, используя некоторые примеры кода. Но только спустя 10 лет я начал понимать его. Теперь, благодаря опыту, я глубоко признателен за этот урок, и хотя я знаю, что это урок, который вы не можете по-настоящему оценить с первого взгляда, я собираюсь поделиться им с вами.
Этот секрет — ключевое различие между средней и в 10 раз лучшей производительностью. Используя рычаги, которые предоставляет этот секрет, вы можете быть на несколько порядков эффективнее в создании кода.
Вы можете написать код, который можно использовать повторно и который с меньшей вероятностью сломается, когда появятся новые требования или что-то изменится в окружающем коде.
Секрет того, чтобы стать в 10 раз более продуктивным, заключается в овладении навыками абстракции. Многие разработчики относятся к абстракции как к грязному слову. Вы услышите (в остальном правильный) совет вроде «не абстрагируйся слишком рано» или знаменитое высказывание в Zen of Python «явное лучше, чем неявное», подразумевающее, что конкретное лучше абстрактного. И это все хорошие советы — в зависимости от контекста.
Но современные приложения используют огромное количество кода. Если вы распечатаете исходный код 10 самых популярных современных приложений, эти стопки бумаги будут конкурировать по высоте с небоскребами, а поддержка программного обеспечения стоит больших денег. Чем больше кода вы создадите, тем больше это будет стоить.
Абстракция — ключ к простому коду
Правильные абстракции могут сделать код более читаемым, адаптируемым и поддерживаемым, скрывая детали, которые не важны для текущего контекста, и сокращая объем кода, необходимого для выполнения той же работы — часто на порядки.
Простота заключается в том, чтобы убрать очевидное и добавить значимое, — Джон Маэда, «Законы простоты».
Абстракция — это не улица с односторонним движением. На самом деле она состоит из двух взаимодополняющих концепций:
- Обобщение (Generalization) — удаление повторяющихся частей (очевидное) и сокрытие их за абстракцией.
- Специализация (Specialization) — применение абстракции для конкретного варианта использования, добавление только того, что должно отличаться (значимого).
Рассмотрим следующий код:
По сути, в коде нет ничего неправильного, но он содержит множество деталей, которые могут не иметь значения для данного конкретного приложения.
- Он включает в себя подробную информацию об используемой структуре данных (массив), что означает, что он будет работать только с массивами. Он содержит зависимость формы состояния.
- Он включает в себя логику итерации, что означает, что если вам нужны другие операции, которые также должны обходить каждый элемент в структуре данных, вам также нужно будет повторить очень похожую логику итераций в этом коде. Он вынуждает повторять, что может нарушить принцип DRY ((Don’t Repeat Yourself, не повторяйтесь).
- Он включает явное присвоение, а не декларативное описание операции, которую необходимо выполнить. Это многословно.
Во всем этом нет необходимости. Все это можно спрятать за абстракцией. В данном случае абстракция настолько универсальна, что изменила способ построения современных приложений и уменьшила количество явных циклов for, которые нам нужно написать.
Если вы прикоснетесь к одной вещи с глубоким осознанием, вы коснетесь всего, — Тич Нат Хан.
Используя map операцию , мы можем сократить код до однострочного, удалив очевидное (части, которые мы, вероятно, будем повторять в аналогичном коде), и сосредоточившись на значимом (просто на том, что должно быть другим в нашем случае):
Junior-разработчики думают, что им нужно писать много кода, чтобы получить большую ценность.
Senior-разработчики понимают ценность кода, который никому не нужно писать.
Представьте себя программистом, который использует операции map в языках программирования, таких как JavaScript. Map абстрагируется от таких деталей, как тип данных, которые вы сопоставляете, тип структуры данных, содержащей данные, и логики итераций, необходимой для обхода каждого узла в структуре данных. Это повысило эффективность всех приложений, которые я создал за последнее десятилетие.
Джереми Ашкенас сделал несколько таких операций популярными в JavaScript и проложил путь для многих замечательных сокращений синтаксиса, которые мы сейчас принимаем как должное в JavaScript, впервые применив их в CoffeeScript. Он создал Underscore, породивший Lodash (по-прежнему самые популярные утилиты в функциональном программировании в JavaScript), и Backbone, который популяризировал архитектуру MVC в JavaScript и подготовил почву для Angular и React.
Джон Ресиг создал jQuery, который стал настолько популярным и влиятельным, что сформировал самую большую коллекцию многократно используемых инкапсулированных модулей JavaScript (jQuery plugins), пока несколько лет спустя не появились стандартные модули Node и модули ES6. API селектора jQuery был настолько популярным, что составил основу современных API выбора DOM. Я и сейчас почти ежедневно пользуюсь этим API jQuery при модульном тестировании компонентов React.
Правильные абстракции — это мощные рычаги, которые могут существенно повлиять на производительность. Абстракция — это не ругательство. Модули, функции, переменные, классы — все это формы абстракции, и вся причина их существования состоит в том, чтобы упростить абстракцию и композицию абстракций.
Невозможно построить сложное программное обеспечение без абстракций. Даже ассемблер использует абстракции — имена для инструкций, переменные для адресов памяти, кодовые точки для перехода к подпрограммам (например, вызовам функций) и т.д. Современное программное обеспечение представляет собой слоеный пирог с полезными абстракциями, и все эти слои дают вам преимущества.
Дайте мне точку опоры и я переверну Землю, — Архимед.
Ключ к простоте и секрет, который мы ищем, заключается в том, как уменьшить объем кода, который мы создаем, — как сделать гораздо больше с гораздо меньшими затратами. Когда вы овладеете этим, вы станете в 10 раз более продуктивным программистом. Я это гарантирую.