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

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

Это напоминает мне об одном случае. Недавно я был в поездке с парой моих друзей, когда мы обсуждали тему кулинарии. Один из моих друзей прокомментировал мой кулинарный стиль так: «Ты не то чтобы готовишь, ты собираешь. Вы получаете предварительно смешанные специи, предварительно нарезанные овощи, предварительно испеченный хлеб и соусы; все, что вы делаете, это смешиваете и нагреваете их. Это не кулинария». На это другой мой друг отвечает: «Хорошо, тогда завтра мы пойдем на ферму и будем выращивать собственные злаки, специи и овощи».

Абстракция — это, по сути, компромисс между «временем и усилиями» и «производительностью». Если вы создадите все с нуля, у вас может быть самая производительная система, но вы также потратите много времени и усилий на создание и оптимизацию того, что уже существует. Сказав это, много раз вам, возможно, придется изобретать велосипед и создавать пару блоков для оптимизации производительности. Кроме того, просто интересно понять, как работает каждый блок, и сделать его. Готовить с нуля и писать небольшие задачи по сборке и сборке компьютеров из гейтов весело, не говоря уже о том, что это дает очень детальное понимание того, что может быть использовано где-то в будущем.

Контрольные точки при использовании абстракций

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

  1. Определение того, какой параметр важен для вашего приложения, а какой параметр можно пропустить.
  2. Оценка производительности различных блоков, чтобы, когда вам нужно оптимизировать приложение, вы знали, замена или изменение какого блока даст наиболее радикальный эффект.
  3. Использование общих блоков, доступных у разных поставщиков/источников, чтобы снизить риск их отсутствия на складе или потери поддержки.

Абстракции как источник ошибок

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

Недавно я работал над проектом Embedded C, где столкнулся с ошибкой. Моя переменная типа uint16 становилась связанной с другой переменной uint16, всякий раз, когда изменялась вторая переменная, первая переменная также нежелательно менялась. Основная причина оказалась в настройках оптимизации компилятора, где компилятор немного сжимал эти две переменные в один 32-битный регистр для экономии памяти. Программное обеспечение/блоки с закрытым исходным кодом являются огромным источником ошибок, которые могут оставить вас на отладку в течение большого количества времени, даже не выяснив основную причину.

Темная сторона простоты использования

Есть два общих подхода, когда кто-то начинает изучать программирование. Один из них — начать с языка программирования более низкого уровня, такого как C, и постепенно достраивать его до C++ и Python. Другой — непосредственно изучить Python. Были дебаты о том, какой из подходов лучше, с соответствующими вопросами, поднятыми сторонниками Python, такими как «Зачем мне изучать C, если я просто собираюсь использовать Python здесь после этого?», «Так сложно понять синтаксис C по сравнению с Python». Чтобы ответить на этот вопрос, обучение с нуля дает программисту представление о том, как все происходит внутри, что дает им больше шансов решить такие ошибки, как

Эти проблемы еще больше усугубляются появлением платформ графического программирования, таких как LabVIEW, NodeRED и т. д., где все становится еще более абстрактным.

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

Заключение и призыв к действию

Недавно я смотрел видео о том, как все человечество на десятилетия забыло метод создания важного соединения и было вынуждено потратить миллионы на его воссоздание. Хотя первопричиной было отсутствие документации, я потенциально могу предвидеть, что подобные инциденты участятся в будущем. Недавно была статья, в которой упоминалось, что всего несколько десятков человек во всем мире действительно понимают, как работает шифрование RSA. Алгоритм настолько важен, что вся наша интернет-инфраструктура основана на нем, и если что-то пойдет не так, вскоре может не оказаться никого, кто знал бы достаточно, чтобы это исправить.

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

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

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

Кредиты и ссылки

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