суббота, 29 февраля 2020 г.

[prog.flame] Наглядное подтверждение изречения про два типа языков программирования...

...которое, если я не ошибаюсь, звучит как-то так: "Есть всего два типа языков программирования: те, которые все ругают, и те, которыми никто не пользуется". И вот статья про язык Gо под названием "I want off Mr. Golang's Wild Ride" наглядно показывает, что Go принадлежит к языкам первого типа.

Вообще, как мне думается, данная статья является еще одним проявлением давнего вселенского плача под названием "worse is better". Может из молодежи кто-то не в курсе, но лет 15 назад вокруг этого самого "worse is better" в этих наших интернетиках были большие срачи. Хотя те, 15-летней давности срачи были всего лишь очередной волной подобных срачей после самой формулировки этого принципа в начале 1990-х.

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

Собственно, упомянутая статья наглядно это демонстрирует на примере косяков языка Go и его стандартной библиотеки. Да, косяки есть. Да и вообще сам по себе Go не столько прост или, правильнее сказать, примитивен. Это откровенно "тупорылый" язык.

Только вот те, кто гнобят Go и противопоставляют Go другим, гораздо более сложным в освоении языкам, не понимают простой вещи: именно эта "тупорылость" и делает Go мегаценным для определенной части рынка разработки ПО.

Потому что в этой части рынка ничего сложнее нынешнего Go и первых версий Java/C#, в которых еще и генериков не было, просто не приживается.

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

Тут мне хочется отпрыгнуть в сторону и рассказать о двух ярко выраженных типах программистов, с которыми доводилось сталкиваться.

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

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

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

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

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

Так вот, по моему мнению, "реалистов" гораздо больше, чем "пуристов-прагматиков". Можно долго и много рассуждать, почему это так. Но тем не менее, мне думается, что "реалистов" больше. Се ля ви, ёптыть.

Ну и следствием из этого является то, что языки вроде Go, Java или даже чистого Си, находят гораздо более широкое применение, нежели что-то вроде Modula-2, Eiffel, Ada или Rust. Просто Go и Java гораздо ближе к народу, под которым прежде всего понимается множество "реалистов".

Отсюда и плач на тему "worse is better": если ты "пурист-прагматик" (не говоря уже про случай "пуриста-идеалиста"), то то, что для тебя "worse", для "реалиста" как раз таки "better". И наоборот. В общем, извечный спор "тупоконечников" и "остроконечников". Ну а упомянутая вначале статья, похоже, была написана "пуристом-прагматиком". Отсюда и ее содержание.


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