Intro
Невозможно ошибиться, если на вопрос о самых сложных программах - упомянуть прошивки FADEC и автопилот Бурана. Что между ними общего? Это ultra-reliable код, исполняемый в RTOS-условиях - то есть буквально апогей программирования с выверенным каждым тактом и несколькими уровнями отказоустойчивости программ. Тем удивительнее, что все программы такого уровня разрабатываются только по Low-Code методикам - и началось это задолго до текущего хайпа.
В данной статье предлагаю немного разобраться - где же проходят условные границы требуемых навыков и применимости подходов.
Retro
Давайте сразу уточним терминологию: "программировать" (programming) - это буквально декомпозировать и структурировать задачу в набор и последовательность конкретных действий. А "кодировать" (coding) - это превращать последовательности действий непосредственно в код.
Очевидно, практически не существует исключительно программирования или чистого кодинга, но суть обсуждаемой темы - именно в их процентном соотношении в различных задачах. На заре программирования, когда не существовало "библиотек" на каждый случай жизни и различного высокоуровнего инструментария (а также, что немаловажно, миллионов типовых задач а-ля "три в ряд") - основная работа программистов сводилась к глубокому анализу задач и хардкорной математике. И только после детального листинга формул начинался довольно рутинный низкоуровневый кодинг.
Однако, [с приходом интернета, мобильных приложений и цифровизации] за последние 10-15 лет всё диаметрально перевернулось - индустрия стала генерировать тысячи довольно идентичных проектов без необходимости тяжёлой математики, а соответствующее развитие высокоуровневых языков окончательно сместило акцент требуемых от SW-разработчиков навыков с программирования на кодинг. Здесь можно было бы резонно возразить, что даже ширпотребную современную программу сложно представить без навороченного фильтра, сортировки и/или FFT - но именно они в первую очередь и представлены в виде готовых кусков кода, а математически придуманы десятилетия назад.
И вот тут мы подошли к самой сути различий современных программирования и кодинга.
Разница постановки задач
Давайте для ясности картины возьмём две довольно типовые задачи с явным доминированием одного аспекта над другим.
Кодинг:
"Надо сделать онлайн банкинг с вот таким облачным бэкэндом, таком интерфейсом и с такими кнопками вызывающими такие опции. Нужен быстрый MVP и будем допиливать релизы."
Программирование:
"Есть вот такой реактивный двигатель с сотнями взаимосвязанных нелинейных переменных. По нажатию кнопки он должен автоматически поддерживать заданную скорость при любых допустимых условиях эксплуатации." (К слову - это и есть упомянутая выше прошивка FADEC).
Утрируя, современный кодинг - это когда в требуемой среде/языке реализуется конкретный функционал с любым доступным инструментарием и любым количеством костылей с возможностью последующей доработки. А чистое программирование... Ну вы поняли :)
Так и что же такое Low-Code программирование?
Задачи программирования становятся всё сложнее и требуют минимальной вероятности ошибки, а задачи кодирования таких программ становятся всё более стандартизованными. В итоге, уже как пару десятилетий назад были разработаны такие среды программирования, как SimuLink, VisSim и т.п. Именно они стали пионерами "Low-Code" философии задолго до появления устоявшегося термина.
В Low-Code средах программисту отводится самая ответственная роль - грамотно разработать прозрачную программу, используя заранее заготовленные куски идеального кода. Весь листинг компилируется автоматически, и может быть даже транслирован в готовый машинный код (исторически, компиляция шла преимущественно в языки группы С, но развитие LowCode-философии расширяет этот перечень).
Очевидно, такой подход полностью избавляет от ошибок на уровне синтаксиса и механической работоспособности кода.
Также, большим плюсом является удобство оптимизации программы для минимизации требуемых вычислительных ресурсов.
Фактически любое развитие и переработку проекта можно совершить без создания огромного теневого легаси и кучи костылей.
Но, конечно, есть и минусы:
Финальный скомпилированный листинг практически нечитаем человеком при необходимости. (Эта проблема известна давно, но особенно получила развитие в свете AI и нейросетей - нам далеко не всегда понятно как вообще работает этот сумбурный код).
Хотя процессорную часть можно гибко оптимизировать, работа с памятью в полученном листинге может быть далеко не лучшей.
Опять же, такие среды программирования совершенно не способствуют изучению современных методик кодирования.
Кодинг на высоком уровне абстракций
С другой стороны, к однозначным и крайне важным плюсам подхода собственноручного высокоуровневого кодирования (особенно на языках типа JS, Py, и тп) можно отнести следующее:
Крайне низкий порог входа в индустрию: фактически, уже лет с 5 можно начинать писать простой исполняемый код, а старшеклассники и студенты давно массово работают на фрилансе и в небольших проектах.
Быстро, понятно, результативно: когда нужен конкретный небольшой продукт, его намного проще написать "руками", чем корячиться через визуализацию.
Гипер-раздутая индустрия с приоритетом ручного кодинга имеет и свои негативные нюансы:
Низкая индивидуальная ответственность, особенно в корпоративном сегменте. Тут, конечно, ещё наложились злополучные вотерфолы и канбаны, которых в серьёзном программировании всё-же поменьше.
Огромное количество легаси, и весь функционал добавляется преимущественно "сверху". Низкая возможность фундаментальной переработки продукта.
Пара слов о рынке труда
Уровень зарплат - это безусловно отдельная огромная тема. Но если максимально кратко, то, как говорится в народе, "рыночек порешал": до недавнего времени даже ведущие инженеры-программисты в СНГ получали отсилы как джуны в типовом SW-кодинге - при чудовищной разнице в требуемом уровне квалификации совсем не в пользу последних.
С другой стороны, недавно выяснилось, что 60% рядовых IT-сотрудников США в лучшем случае не мешают работать остальным. (Об этом: помпезно на русском, грустно на английском, и немного сухих фактов от хабровчан).
Итого
В современном мире - программирование, очевидно, не является завершенной деятельностью без кодирования, но и кодирование является лишь малой частью огромного айсберга программирования.
На мой взгляд, развитие LowCode подходов для более широкого круга проектов позволит значительно оздоровить и перебалансировать рынок SoftWare-разработки (хотя и не без потерь), что, в конечном счёте, однозначно хорошо в средне-дальней перспективе.