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

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

Явный код

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

Однако…

На безбрежном пространстве свободы лежит тяжелая мантия ответственности, ибо по мере того, как расширяются границы выбора, должны расширяться и совесть и ответственность освобожденной души. — Чат GPT

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

Неявный код

Неявный код — полная противоположность. Разработчику нужно сосредоточиться только на бизнес-логике, в то время как большая часть сложности абстрагируется самим языком или фреймворком. Как правило, языки и фреймворки, использующие этот подход, весьма самоуверенны, когда дело доходит до обработки данных и управления потоками. Это также приводит к тому, что разработчику приходится поддерживать меньше кода, что во многих случаях может быть полезным. Однако бывают случаи, когда такой подход может быть не идеальным.

Спектр

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

Ад метапрограммирования

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

Javascript 2023 года

Язык JavaScript воплощает более неявный подход из-за его характеристик, таких как динамическая типизация, свободный синтаксис и автоматическое приведение типов. Однако развивающаяся экосистема в 2023 году подталкивает язык к царству ада метапрограммирования.

Хотя эта статья направлена ​​на обсуждение экосистемы в целом, важно выделить фреймворк Vercel Next.js. Почему? Потому что Next.js в настоящее время привлекает значительное внимание, а Vercel играет решающую роль в управлении будущим экосистемы JavaScript.

Next.js подтолкнул JavaScript к критическому моменту, приближая точку невозврата. Он почти превратился в инструмент с низким кодом, тем самым уменьшая контроль разработчика и способствуя неявному характеру языка.

Почему Next.js — это ад метапрограммирования?

Представьте, что вы написали функцию JavaScript. Как автор, вы должны иметь четкое представление о том, что делает функция. Однако фактический результат выполнения ВАШЕЙ функции может зависеть от нескольких факторов:

  • Как называется ваша функция?
  • Как называется файл, в котором была написана ваша функция?
  • Включает ли имя файла символ ( или [ или даже …([{ ?
  • Как называется папка, в которой находится файл?
  • Какую версию Next.js вы используете?
  • Файл начинается с «использовать клиент» или «использовать сервер»?

Даже если вы считаете, что контролируете все эти факторы, что происходит, когда кто-то новый присоединяется к вашей команде и ему нужно исправить ошибку в функции, которую вы написали? Они не могут просто интерпретировать код. Во-первых, они должны ознакомиться с используемой конкретной версией Next.js.

Кроме того, что, если Vercel решит выпустить новую основную версию, а ваша команда решит обновить? Система маршрутизации могла претерпеть значительные изменения (как это было в прошлом), что потребовало от всей вашей команды повторного изучения Next.js.

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

Заключение

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

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

Просто подумай об этом! (и, может быть, дать шанс флаттерной паутине (?) IDK).