Всерьёз о языках I

Никто в этой индустрии не скажет вам правду. Никто. Будут мяться, идти на компромисс, искать белое в чёрном. Люди слабы. Но только не я. Потому получите.

Java. 20+ летняя кака мамонта. Язык, который на самом деле не менялся никогда. Нет, правда. Его задумали в 1990 году, выпустили в 1996 году, весело тормозили апплетами всё, что пыталось эти апплеты выдержать, а потом врата энтерпрайзного ада раскрылись во всю ширь. Не знаю другого языка, который так лёг бы на душу всех корпораций и корпорацишек мира. Бесконечные монотонные спецификации того, как клепать однообразный J2EE-код.
Вторую жизнь вдохнул Android (подозреваю, выбор на Java пал просто потому, что так получилось), но и там тоже прогресса нет. Всё, что в Java появляется под видом новых фич, давно сделано в других местах. Вечный догоняющий. Но действительно вечный, слава мегатоннам кода в банках и складах. Любой желающий стать корпоративным рабом в любой момент найдёт работу.
PS. ЭтоМоёКрутоеТипичноеПолезноеИмяКлассаНаJavaНуКакВам.

Python. Язык детей и data scientists. Его учат и используют те, у кого нет времени или желания учить что-нибудь другое. Вам не нужны все эти скучные лекции в вузах, толстые учебники программирования, оптимизации-шмоптимизации, вообще ничего не надо. Python — садись и пиши! (надо заметить, таким и замышлялся, недаром Россум запустил на нём CP4E) Короче, наш новый BASIC. На котором зачем-то пишут сервисы.
Но тоже кака мамонта и тоже безо всякого заметного развития. Принцип минималистичного синтаксиса наносит ответный удар. Также который год вялотекущая возня Python 2 vs Python 3 под ковром, так ещё и поставлен, кажется, рекорд самого тормознутого и неоптимального интерпретатора. Если у вас перед домом стоит ДЦ, который срочно надо чем-нибудь занять, напишите средненькое приложение на Python, ну и закиньте на тысячи машин. Всё равно мало будет. Заодно наймите пару толковых разработчиков, которые десятилетие будут вылавливать в этом приложении баги — они там обязательно найдутся.
PS. ‘ascii’ codec can’t encode character u’\u2019′ in position 16: ordinal not in range(128)

Perl. Язык, с которого следующие поколения разработчиков будут переписывать программы на какой-нибудь другой язык.
Или не будут.
Ибо характерен невозможностью понять код, который сам же написал пять минут назад. Недаром искусство one-liners возведено в ранг… искусства, да.
Ещё говорят, что можно случайно вызвать демона, если пытаться вслух зачитывать листинги Perl’овых скриптов. Я верю.
PS. perl -ne ‘push @a, $_; @a = @a[@a-10..$#a]; END { print @a }’

PHP. Вот не надо. Просто не надо. Клеймо на жопе и на совести. Запомните главное — никогда нигде не признавайтесь, что вы писали на PHP. Лучше на зоне пахану в глаз плюнуть, карма меньше пострадает.
PS. Нет. Просто не надо.

LISP. Очень важно — количество весёлых смайликов должно быть равно количеству грустных. Иначе всё сломается.
Ещё можно щегольнуть знанием, что SICP сначала преподавался на LISP (потом переделали на BAS… пардон, Python). И что что-то однажды было в Amazon’е на нём, кажется. Во, ещё это язык программирования emacs, который лучший в мире редактор скобочек.
Пожалуй, всё. Если в 2017 году человек находит аргументы в пользу написания сервиса на LISP, за ним выезжают добрые дяди с доброй рубашечкой.
PS. (defun factorial (n) (if (= n 0) 1 (* n (factorial (- n 1)))))

C++. Потрясающий язык. Столько способов убить себя и покалечить окружающих, что гестапо от зависти уйдёт в комсомол. Уверен, даже Страуструп уже не напишет на нём проект, в котором анализатор не найдёт утечку памяти или потенциально опасный код.
Любопытен спецификацией на 1300+ страниц. Которую никто не читал, конечно же. Что занятно, в Библии издания Российского Библейского Общества столько же страниц. Увесистый томик. Если осилите оба текста, сможете 1) свысока смотреть на НЕНАСТОЯЩИХ ПРОГРАММИСТОВ, 2) троллить свидетелей Иеговы уместными цитатами.
Хочется и C++ назвать какой мамонта, но настолько восхищает сорочий энтузиазм, с которым в каждую новую версию тащат фичи, что не буду.
PS. Не хочу сломать этот постик, потому кода не будет.

C. Единственный настоящий язык программирования.
Славься. Славься. Славься.
PS. main() { printf(“hello, world\n”); }

COBOL. Ваш папа ещё не родился, да и мама тоже. А софт на COBOL’е уже работал с пенсиями. Потом вас родили, вы пускали пузырики и агукали. А софт на COBOL’е уже работал с пенсиями. Вы тоже кого-нибудь уже рожаете, а софт на COBOL’е всё ещё работает с пенсиями. Когда правнуки ваших правнуков будут получать пенсию в постбиткоинах, зачислять их будет всё тот же софт на COBOL’е.
Заочно люблю этот язык. Единственная настоящая константа нашего мира.
PS. Я не шучу. В 2014 году новый учебник вышел, например.

Книги: I Heart Logs

I Heart Logs
Jay Kreps.
I Heart Logs.
O’Reilly, 2015.
Если вы считаете, что логи — это только запись access.log nginx’а, брошюра для вас.
Автор предлагает смотреть на логи как на продукт, на данные, вокруг которых строится инфраструктура. Такую инфраструктуру Крепс с товарищами построил в LinkedIn.
Предлагаются архитектурные схемы, рассказываются примеры, ну и немножко воды. В общем, эдакая большая-большая статья, которой хватило на несколько десятков страниц.
Для некоторого сдвига в сознании стоит почитать.

Miscellanea V

На самом деле в большинстве массовых алгоритмах нет ничего сложного (сложна ли древняя задачка о поимке льва в пустыне? нет. а это бинарный поиск). Они как колесо или как молоток, следуют из самой области решения проблем. Фигня для начинающих в познании всякой формализации вроде O-большого (ну и вообще всём, чем так богаты Кормен и Кнут) и логарифмов. А также в том, что зачастую нарушена последовательность преподавания. Сначала надо давать структуры / типы данных (в идеале на примере окружающего мира), а уже потом алгоритмы. Так выстраивается более стройная система в голове. Без внятного объяснения базовых структур знание алгоритмов подвисает в воздухе.

Повторюсь. Если код писался профессионалом (всё написано правильно в нужных местах нужными словами), вопрос “читабельности”, “поддерживаемости” и прочего уходит мячиком в уровень квалификации читателя и поддерживателя. Кажется очевидным, что для уровня знаний дворника Васи любой код будет сложным, ведь так? Если продолжать насыщать Васю знаниями, такого кода будет всё меньше. И то, что раньше казалось непонятным, станет понятным. Безусловно, если код написан левой пяткой в тамбуре электрички, несущейся в ад, Вася хоть боженькой греческим растопырится, толку не будет.

И снова повторюсь. N лет назад информационный фон о программировании состоял из кода. Достаточно вспомнить всякие “Компьютеры + программы” и “Dr. Dobb’s”. Даже “Наука и жизнь” печатала статьи про алгоритмы и о том, как их реализовывать. Сейчас… ну хоть и подписан на кучу всякого, хоть и легально год листал ACM’овый ледокол, но постоянно ловлю себя на мысли, что листаю каталоги софта. Вот как каталоги лифчиков и корма для утят, так вот и софт. Словно есть фабрики по производству, а программист свёлся к водятлу, роль которого зазубрить правила и следовать им. И с каждым годом всё меньше людей, которые могут меня понять.

Болтал с олдовым разработчиком на тему того, почему в России нет флагманских продуктов на мировом рынке софта. Вспомнили очевидное. Для сотворения флагмана нужен лидер. Лучше два. Но хватит и технического — того, чья конструкторская и специальная квалификация позволяет делать что-то большое и важное. Все эти именные КБ вроде Туполева, Ильюшина и т.п. с главными и генеральными конструкторами. А для появления таких лидеров нужна среда (экономическая, культурная, образовательная, карьерная). Как в спорте для выращивания спортсменов олимпийского уровня система начинается с детских секций и продолжается до регуляторов вроде МОК, так и с инженерами / изобретателями. При всех иных негативных явлениях в СССР неплохо понимали нужду в такой среде и как-то, но обеспечивали. А всё. Прошляпили несколько поколений, считай, прошляпили десятилетия. Есть мысль, что уже и не нагнать.

Давно пора усвоить, что программист — не самурай. Не воин-поэт, которого усиленно развивали в разные стороны. Современный 25..30-летний программист по общему развитию (эрудиция, культура, воспитание, ширина и глубина разума в отсеках, отвечающих не за программирование) ничем не отличается от таксиста, например. Те же тройбаны за безграмотный текст, то же смешение Гоголя с Гегелем, та же невозможность обсудить Диогена или Набокова, то же незнание названия дерева, что растёт под окном. Вот я по сию пору усвоить не могу, да всё поджигаю асбестовую прокладку между задом и креслом.

Как сделать разработчика мудрее

Вот знаете, вся эта фигня про eat your own dog food — фигня. В лучшем случае авторы софта выправят назойливые баги, ну и добавят пару очевидных фич. Разработку надо воспитывать иначе.
Разработку надо отправлять в tech support на год. И уверяю, столько всего интересного в голову приходит уже на десятом пользователе… как-то иначе смотришь на поделия.

Во-первых, отсутствие документации приведёт к разработчику тех, кто хочет что-то сделать, но не понимает. Разок наш Вася выдержит. Ну, пяток юзеров. А когда в десятый раз придётся рассказывать одно и то же, нервы начнут дрожать. В следующий раз Вася каждую запятую будет снабжать бумажкой.
Во-вторых, отсутствие стабильной работы сервиса сначала отнимет у Васи время жизни на рестарты, чтение логов и бесконечные чашки кофе, а потом начнёт накапливаться праведным гневом пользователей. Вася начнёт лично понимать, что такое десятый Петя, у которого что-то не работает потому, что фигово работает результат профессионализма Васи. В следующий раз Вася будет более тщательным и осторожным.
В-третьих, оригинальность мышления Васи может привести пользователей, которые, ну… обычные люди. Вот лично персонально я с [плохо] скрытым удовольствием наблюдаю за тем, как извращённо [на пустом месте] оригинальные решения разбиваются о реальность. Иногда Васи после такого начинают делать продукты не для себя любимых, но для пользователей. У которых две руки, две ноги и одна голова на одной шее. Нет, правда, это не пересказать, надо видеть.
В-четвёртых, за косяки должно быть возмездие. Не административное, но техническое. Сделал багу? Будь любезен исправить. Что, уже год прошёл? Ничего, сядь и исправь. Что, сделал десять багов и тебе уже не очень интересно? Ничего, сядь и исправь. Что, промахнулся со стратегией библиотечки? Так замечательно. Ты сейчас в пяти сервисах наладишь работу круглого в квадратном, после чего задумаешься о том, как писать софт. Ты уже всё забыл? Ничего, вспомни. Заодно оценишь читаемость и логичность кода. После такого Вася трижды хорошенько подумает до того, как не проверить, срезать угол, полениться, фигакнуть костыль в костыль и т.д.
В-пятых, десятки пользователей обязательно оценят удобство Васиных решений (особенно в области интерфейса) и обязательно напишут десятки писем о том, как интерфейс улучшить. А ещё попросят Васю самого делать то, для чего он написал код по замечательной архитектуре. Оно бывает занятно. Вроде как Вася делал тележку для удобного перетаскивания яблок, но вместо этого пользователи теперь таскают на руках ещё и тележку. Но с яблоками. Но на руках. Потому расстраиваются и просят Васю потаскать. Десять тележек — бац, Вася задумался об удобстве.

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