В мире кодирования абстракции упрощают работу.

Нужно ли вашему коду просматривать длинный список имен и каким-то образом изменять их? В нативном JavaScript код для этого обычно выглядит примерно так:

for (var i = 0; i < namesList.length; i++) {
//do whatever
}

Абстракции позволяют вам тратить меньше времени на то, как что-то сделать (обратите внимание, как кропотливо выглядит приведенный выше код), и позволяют вам просто указать, что вы хотите сделать, вместо того, чтобы слишком сосредотачиваться на том, как это сделать.

jQuery (очень популярная библиотека JavaScript) помогает вам сделать это, абстрагируя запутанные детали кода выше. Если вы хотите пройтись по каждому значению в списке и запустить для него некоторый код, вы просто пишете:

$.each(namesList, function(){
//do whatever
});

Вы просто говорите jQuery, что хотите что-то сделать с каждым именем в списке (интуитивно пишется как $.each). В первом примере кода требуется указать дополнительные переменные, вычислить длину списка в качестве индикатора остановки цикла и увеличить итератор. jQuery позволяет вам перестать беспокоиться о логистике и сосредоточиться на том, чтобы ваш код просто делал что-то с каждым элементом.

Это очень простой пример концепции, которая экономит значительное количество времени кодирования. Однако компьютерное программирование — не единственное место, где я заметил эту концепцию в игре.

Эта идея применима везде (серьезно)

Когда я обдумывал идею абстрагирования от сложности (т. е. простое указание того, что вы хотите сделать, а не того, как именно это нужно сделать), я понял, что это применимо не только к коду.

Я вспомнил о еде на вынос, которую ел ранее той ночью. Я уверен, что существовала ошеломляюще сложная логистика, связанная с выращиванием продуктов на ферме, транспортировкой продуктов по стране (с сохранением их свежести, конечно), а затем их приготовлением в соответствии с моими точными требованиями.

Тем не менее, я понятия не имел, как произошла эта логистика. Специфика того, как еда была создана и предоставлена ​​мне, была абстрагирована. Я просто указал, что я хотел (пад тай), и логистика была сделана для меня, без моего ведома.

В конце концов я понял, что это относится и к достижениям. Мы часто платим людям (например, личным тренерам), чтобы они избавлялись от беспорядочных инструкций для нас. Мы просто приходим в спортзал, а персональный тренер занимается планированием и управлением тренировкой. Вы просто говорите личному тренеру, чего хотите достичь, и он решает, как это сделать.

Система личного развития, которую я разработал также абстрагируется от сложности отслеживания целей. Я просто рассказываю ему, что я сделал, в очень общих чертах, и он управляет всеми вычислениями, чтобы сообщить мне, как у меня дела, на основе модели достижений, которую я разработал для себя.

Абстракции иногда ломаются

В конце концов, абстракция не может должным образом управлять базовой логистикой, и вы вынуждены исследовать, что происходит внутри.

Например, предположим, что jQuery не очень хорошо подходит для определенного типа данных, и код $.each() из предыдущего поста внезапно генерирует ошибку в моем скрипте.

Если бы я полагался на этот код $.each() в течение многих лет, и вдруг он перестал работать, я бы не имел ни малейшего представления о том, как начать устранение неполадок, поскольку я никогда не удосужился изучить лежащую в основе логистику того, как $. each() обрабатывает все запутанные детали для меня.

Абстракция «просочилась», и мое внимание привлек низкоуровневый код. И поскольку я не был готов работать с низкоуровневым кодом, моя способность добиваться прогресса в моем проекте резко остановилась до дальнейшего уведомления. Мне нужно либо изучить низкоуровневый код, либо найти другую абстракцию (например, другую библиотеку JavaScript), которая сможет правильно обрабатывать мой код.

Идея дырявых абстракций была предложена Джоэлом Спольски, известным программистом, в статье под названием Закон дырявых абстракций. Джоэл пишет:

Закон дырявых абстракций означает, что всякий раз, когда кто-то придумывает новый хитрый инструмент для генерации кода, который должен сделать нас всех невероятно эффективными, вы слышите, как многие люди говорят: «Сначала научитесь делать это вручную, а затем используйте умный инструмент для экономии времени». Инструменты генерации кода, которые делают вид, что что-то абстрагируют, как и все абстракции, допускают утечку, и единственный способ компетентно справиться с утечками — узнать, как работают абстракции и что они абстрагируют. Таким образом, абстракции экономят наше время на работе, но не экономят время на обучение.

И все это означает, что, как это ни парадоксально, даже когда у нас появляются инструменты программирования все более и более высокого уровня с все более и более совершенными абстракциями, стать опытным программистом становится все труднее и труднее.

Дырявые абстракции также повсюду

Поскольку абстракции есть везде, рискну сказать, что и дырявые абстракции есть везде. Поэтому я бы сказал, что приведенная выше цитата Джоэла распространяется на достижения и дизайн поведения.

Что происходит, когда еда, которую вы едите на вынос, вызывает у вас болезни и лишний вес? Вам нужно выяснить, как оно приготовлено (содержит ли оно аллергены, некачественные ингредиенты, много добавленного сахара?), или пойти поесть в другом месте.

И с каждым нововведением в технологии пищевой промышленности становится все труднее и труднее сказать, полезна ли эта обработанная пища для нас. (Считаются ли добавленные антиоксиданты «полезными»? Пальмовое масло полезнее, чем масло канолы? И так далее.)

Что происходит, когда вы следуете совету своего личного тренера, но не видите результатов? Это заставляет вас либо погрузиться в особенности плана питания и упражнений, который вы используете, чтобы диагностировать проблему, либо перейти к другому личному тренеру и надеяться, что его абстракция (то есть его управление тем, как) будет более эффективным.

Что происходит, когда система геймификации, которую вы используете для мотивации, внезапно перестает работать для достижения определенной цели? Вам придется либо погрузиться в психологию геймифицированной системы, либо перейти к другой системе в надежде, что их абстракция мотивации окажется более эффективной. (Этот конкретный пример случался со мной много раз, поэтому я решил научиться геймифицировать свои собственные цели.)

Вывод таков: Абстракции уменьшают вашу повседневную нагрузку, но не требования к обучению.

Другими словами, абстракции склонны к утечкам, поэтому вам все равно нужно в определенной степени знать лежащую в их основе логистику, чтобы быть готовым к тому, что они сломаются. В противном случае каждый раз при утечке абстракции вы будете сталкиваться с проблемой, с которой не справитесь. И проблемы, с которыми вы не можете справиться, могут быстро привести вас к полной остановке.

Такой успешный человек, как вы, не должен мириться с такими постоянными тупиками. Каждый резкий рывок делает экспоненциально трудным возвращение на подножку (особенно для достижения самых сложных целей). И постоянно прыгать от решения к решению тоже нецелесообразно.

Примите абстракции… но только после того, как вы научитесь

Сообщение здесь ясное: принимайте абстракции, но только после того, как вы изучите основы системы, которую вы абстрагируете.

  • Изучите основы приготовления и обработки пищи, прежде чем брать что-нибудь, что хорошо выглядит с полки.
  • Изучите основы человеческой мотивации, прежде чем переходить от приложения к приложению, от продукта к продукту, которые утверждают, что помогают вам в достижении ваших целей.
  • Изучите основы онлайн-рекламы, прежде чем тратить много денег на оплату агентству за управление вашей рекламой.

Давайте будем реалистами: вы не можете изучить основы всего. Но с помощью всемогущего поиска Google вы можете узнать основы чего-то важного для вас за считанные часы. Так что выберите три вещи, которые наиболее важны для вас, и изучите эти основы.

Когда дерьмо попадет в вентилятор, вы будете готовы. И, будучи человеком, который может обойти препятствия и справиться с дырявыми абстракциями, вы будете тем, кто будет тяжелее, лучше, быстрее, сильнее, чем все остальные.