Программистам не чуждо понятие абстракции, и хотя в другой области оно может быть незнакомо как слово, я уверен, что они используют его каждый день. Абстракция — это концепция построения черного ящика и его повторного использования, надстройки над ним и сокрытия информации под ним. Думайте об этом как о черном ящике, где вы знаете, что такое входы и выходы, и вы можете использовать его без необходимости знать, что происходит внутри них. В электронике вам не нужно точно знать, что происходит внутри ИС, чтобы использовать ее, если вы знаете, что она делает и как ее использовать. Для производства вам не нужно знать, как именно работает машина, чтобы использовать ее. В кулинарии мне не нужно знать точную смесь специй, если я знаю, какой вкус она придаст моему блюду.
Справедливости ради следует сказать, что без абстракции мы до сих пор были бы охотниками-собирателями. Если вам нужно точно знать, как работает каждая вещь, вы мало что сможете понять за свою короткую жизнь.
Это напоминает мне об одном случае. Недавно я был в поездке с парой моих друзей, когда мы обсуждали тему кулинарии. Один из моих друзей прокомментировал мой кулинарный стиль так: «Ты не то чтобы готовишь, ты собираешь. Вы получаете предварительно смешанные специи, предварительно нарезанные овощи, предварительно испеченный хлеб и соусы; все, что вы делаете, это смешиваете и нагреваете их. Это не кулинария». На это другой мой друг отвечает: «Хорошо, тогда завтра мы пойдем на ферму и будем выращивать собственные злаки, специи и овощи».
Абстракция — это, по сути, компромисс между «временем и усилиями» и «производительностью». Если вы создадите все с нуля, у вас может быть самая производительная система, но вы также потратите много времени и усилий на создание и оптимизацию того, что уже существует. Сказав это, много раз вам, возможно, придется изобретать велосипед и создавать пару блоков для оптимизации производительности. Кроме того, просто интересно понять, как работает каждый блок, и сделать его. Готовить с нуля и писать небольшие задачи по сборке и сборке компьютеров из гейтов весело, не говоря уже о том, что это дает очень детальное понимание того, что может быть использовано где-то в будущем.
Контрольные точки при использовании абстракций
Когда вы работаете в области системной инженерии, интегрируя различные блоки и решения, разработанные несколькими организациями, и создавая несколько собственных, мало что становится важным.
- Определение того, какой параметр важен для вашего приложения, а какой параметр можно пропустить.
- Оценка производительности различных блоков, чтобы, когда вам нужно оптимизировать приложение, вы знали, замена или изменение какого блока даст наиболее радикальный эффект.
- Использование общих блоков, доступных у разных поставщиков/источников, чтобы снизить риск их отсутствия на складе или потери поддержки.
Абстракции как источник ошибок
Абстракция вносит ошибки, когда мы не знаем, что происходит под капотом. Если вы просто имеете дело с абстракциями, незнание того, как все работает, может оставить вас в неведении относительно матрицы производительности и решения, которое будет крайне неоптимальным.
Недавно я работал над проектом Embedded C, где столкнулся с ошибкой. Моя переменная типа uint16 становилась связанной с другой переменной uint16, всякий раз, когда изменялась вторая переменная, первая переменная также нежелательно менялась. Основная причина оказалась в настройках оптимизации компилятора, где компилятор немного сжимал эти две переменные в один 32-битный регистр для экономии памяти. Программное обеспечение/блоки с закрытым исходным кодом являются огромным источником ошибок, которые могут оставить вас на отладку в течение большого количества времени, даже не выяснив основную причину.
Темная сторона простоты использования
Есть два общих подхода, когда кто-то начинает изучать программирование. Один из них — начать с языка программирования более низкого уровня, такого как C, и постепенно достраивать его до C++ и Python. Другой — непосредственно изучить Python. Были дебаты о том, какой из подходов лучше, с соответствующими вопросами, поднятыми сторонниками Python, такими как «Зачем мне изучать C, если я просто собираюсь использовать Python здесь после этого?», «Так сложно понять синтаксис C по сравнению с Python». Чтобы ответить на этот вопрос, обучение с нуля дает программисту представление о том, как все происходит внутри, что дает им больше шансов решить такие ошибки, как
Эти проблемы еще больше усугубляются появлением платформ графического программирования, таких как LabVIEW, NodeRED и т. д., где все становится еще более абстрактным.
С возрастом ИИ все больше споров вокруг его плюсов и минусов. Хотя я за ИИ, я вижу одну проблему, если мы будем все больше полагаться на ИИ, это то, что будущее поколение вообще не будет знать, как все работает, и представит на рынке массу ошибок и неоптимальных приложений. По мере снижения барьера входа на любой рынок количество некачественных приложений резко возрастает. Это достаточно очевидно в магазине игр с тысячами приложений, чтобы выполнять одну и ту же задачу, что еще больше усугубляет парадокс выбора, не имея никакой метрики качества приложения.
Заключение и призыв к действию
Недавно я смотрел видео о том, как все человечество на десятилетия забыло метод создания важного соединения и было вынуждено потратить миллионы на его воссоздание. Хотя первопричиной было отсутствие документации, я потенциально могу предвидеть, что подобные инциденты участятся в будущем. Недавно была статья, в которой упоминалось, что всего несколько десятков человек во всем мире действительно понимают, как работает шифрование RSA. Алгоритм настолько важен, что вся наша интернет-инфраструктура основана на нем, и если что-то пойдет не так, вскоре может не оказаться никого, кто знал бы достаточно, чтобы это исправить.
С появлением простых в использовании инструментов обучение следующего поколения основам становится все труднее, и это проблема, которую необходимо решить в ближайшее время.
Еще один сдвиг в мышлении будет заключаться в переходе к программному обеспечению с более открытым исходным кодом, что даст разработчикам лучшее понимание того, что происходит под капотом.
Наконец, без черных ящиков никакая разработка не была бы завершена. Сказав, что матрица производительности и результаты тестирования при выпуске любого блока будут необходимы для обеспечения того, чтобы уровень абстракции работал должным образом. Компромисс между удобством абстракции и необходимостью понимания лежащих в основе механизмов должен быть тщательно продуман, чтобы предотвратить потенциальные системные сбои или неэффективность. Показатели производительности и результаты тестирования не только подтверждают функциональность и эффективность этих «черных ящиков», но также дают ценную информацию для будущих улучшений и адаптаций. Поэтому, хотя абстракция может значительно ускорить процессы разработки, никогда не следует упускать из виду тщательное тестирование и всестороннее понимание данных о производительности.
Кредиты и ссылки
- Блог об оптимизации встроенных систем, в котором программное обеспечение с закрытым исходным кодом стоило компании больших усилий по оптимизации своего решения.