среда, 24 августа 2022 г.

[prog.flame] Еще раз о сложности C++. Аналогия со сложностью высшей математики

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

Одним из регулярно встречающихся аргументов против C++ выступает "а вы видели, что криворукие программисты на плюсах вытворяют?"

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

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

Сегодня хочется сказать про другое.

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

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

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

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

Наиболее яркими примерами в учебной программе стали функциональный анализ (+ частично затронутая в его рамках теория функций комплексной переменной) и уравнения матфизики. И если в матанализе я просто ничего не понимал, то в том же функциональном анализе уже ничего не понимал от слова совсем.

Но мне не приходит в голову говорить, что ТФКП -- это говно, потому что сильнасложна и нивазможнаасилить.

Нет. ТФКП -- это сложно, потому что это было разработано для решения сложных проблем. Просто моих мозгов на ТФКП не хватает.

Признаваться в собственной тупости, конечно, неприятно. Но вещи все-таки нужно называть своими именами.

C++ сложен. Так уж получилось.

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

И да, раз уж инструмент сложен, то не всем хватит мозгов осилить C++. Ну вот мне с высшей математикой же не хватило. И это нормально.

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

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

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

Но, жизнь показывает, что далеко не всегда это так. Кому-то тупо не хватает мозгов освоить такой сложный язык, как C++. Это так же естественно, как и то, что у меня не хватило мозгов на изучение высшей математики. Неприятно, но естественно.

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

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


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

PPS. То, что человеку не хватило ума освоить C++ (или Haskell, или Agda, или SQL, или еще что-то) вовсе не означает, что он умственно отсталый. Он просто недостаточно хорош именно в этом. Но может быть чрезвычайно одарен и продвинут в других областях, в той же математике, например.

PPPS. Я сам современный C++ уже понимаю далеко не всегда и везде. Какие-то места просто запомнил, к каким-то даже не приближаюсь. Но, за счет большого багажа, более-менее успешно применяю то, что знаю, без особых проблем. И не факт, что мне удалось бы освоить современный C++ начни я его изучать сегодня.