Miscellanea X

При том, что GCC ещё долго будет в бою (более того, по бенчмаркам GCC 8 во многом лучше CLang 6), стратегически он уже проиграл войну CLang в частности, платформе LLVM в целом. Вообще хороший пример того, как правильная архитектура поначалу буксует и вызывает скепсис, но по мере выравнивания (в том числе содержимого голов) обязательно отгрызает пирог. Хоп! и университетский проект стоит на плечах Apple и Google. Ну хорошо, хопу уже 18 лет, но это норма.

В России в 2012 году сменился стандарт хэш-функции на ГОСТ Р 34.11-2012. Неофициально функция называется «Стрибог». Всё потому, что в конце текста стандарта одно из значений примера при преобразовании в Windows-1251 даёт текст «Се ветри, Стрибожи внуци, веютъ с моря стрелами на храбрыя плъкы Игоревы» из «Слова о полку Игореве». Няшненько.

История Minix vs Linux (раскручивать можно с поста на Хабре) очень-очень показательна. Обычно смотрят под углом вечного спора «монолит vs микроядро», но история показательна в другом. Упрощу ситуацию. Есть крутая проверенная система (Unix) за много денег. Есть крутая система, совершенно не готовая к production и вообще человекам (Minix). Есть наскоро сделанное нечто среднее — не крутое, но бесплатно и с ним можно работать (Linux). Риторический вопрос: что останется на рынке и начнёт распространяться в массах? Кейс настолько чистый, что должен входить в учебники. Не менее любопытно прикинуть стратегии выхода и удержания позиций для каждого варианта.

Продолжаю краем наблюдать за темой промышленного хранения данных в ДНК. Оказывается, пропустил новость, а ведь в конце февраля IARPA (то же, что и «военная» DARPA, но свежая и для разведки) сделало шаг в эту сторону в виде Molecular Information Storage (MIST) research program. Уже интересно. Как и список тех, кто готов вписаться: Harvard, Intel, Stanford, Western Digital и др. Всё это только начало и публично государство только принюхивается к задаче, но интригующе то, что заход сделала разведка через агентство, которое в фигне пока особо замечено не было.

Все слышали про язык Ada (хотя бы по тому, как часто говорят, что первая программист была Ада Лавлейс). Что-то, что в музее красиво стоит на полочке и красиво пылью покрывается. Ан нет. Во-первых, попался на глаза список 2014 года: Who’s Using Ada. Оооочень много суровых приложений языка. Во-вторых, у меня в голове стандарт ошибочно застыл на Ada 95 (эдакий последний реверанс в сторону эпохи), ан снова нет! Есть Ada 2005 и Ada 2012. Порыскал ещё и совсем вычеркнул язык из «забытых». Вовсю используется военными (в NATO чуть ли не must use) и авиацией с космонавтикой. Такие дела.

Miscellanea XIX

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

Вот занятно. До последнего поколения у языков были авторы-люди. C++ создал Страуструп, C создали Ритчи и Томпсон, Python Гвидо, Java Гослинг и т.д. Сейчас время больших батальонов, что косвенно выражается в уходе личностей за ширму. Да, у любого языка есть конкретные авторы, но Go — это Google, Swift — Apple, Rust — Mozilla, Kotlin — JetBrains. И вроде объективно ничего не изменилось, раньше языки тоже появлялись или активно развивались внутри компаний, но вот.

Между тем, в мире разворачивается драма из высших уровней кровавого энтерпрайза. Раскручивать содержание темы можно от Phoenix Pay System, ленивым кратко перескажу. В 2009 году правительство Канады решило заменить свою 40-летней давности систему начисления и выплат зарплат, ну и вообще автоматизировать и экономить. Выбор пал на IBM с Oracle. Пацаны вроде крутые, опытные, будет счастье. В 2016 году систему запустили, с тех пор мечтают погасить, ибо бракобажище получилось лютейшее, что при общих тратах бюджета в $790M несколько фраппирует канадскую общественность. С другой половины планеты одобряюще улюлюкают австралийцы, наступившие на эту мину ранее. Оба кейса интересны тем, что большой бизнес может по контракту поставлять неработающие решения за огромные деньги и не пострадать. Совсем другие правила игры.

ALGOL любопытен тем, что этот язык очень, очень повлиял на развитие программирования, но при этом почти не использовался в разработке. Даже была шутка 60-х: ALGOL нужен для того, чтобы описать алгоритм, а потом реализовать его на FORTRAN. Одна из основных причин, если верить копипасте из статей в статьи — чуваки не стандартизировали I/O, что для промышленной разработки фу и кака. Ситуацию в какой-то мере выправляли диалекты (вроде ALGOL W), но язык это не спасло. Как был очень влиятельным, но академическим, так и остался.

Иногда встречаю разработчиков, которые считают, что знают Java, если у них опыт работы и знание Java 7, не дальше. Народ. Между Java 7 (2011 год) и Java 8 (2014 год) пропасть (стримы, лямбды, default и static в интерфейсах, новый Time API и т.д.). В 2018 году вообще уже пора Java 9 осваивать и про Java 10 думать. Хочется спросить, почему за 4 года вне работы, если она прибила семёрку гвоздями, не освоил изменения? Пофиг было? Тогда зачем «джавист»? Не надо так.

Miscellanea VIII

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

Думаю, любой разработчик сталкивался с проблемой синхронизации данных из разных часовых поясов, да и просто с разным временем. Тем занятнее было в статье «Первая машинная обработка траекторных измерений спутника Земли» встретить следующий эпизод:

Когда, наконец, мы получили желанную орбиту спутника (точнее, хорошо наблюдаемой визуально ракеты-носителя второго ИСЗ), она привела нас в шоковое состояние. Оказалось, что в южном полушарии орбита проходила… под поверхностью Земли. Это, конечно, не могло быть правдой, так как данные наблюдений были недельной давности, а появления спутника регистрировались и позднее. Пришлось разбираться. Мы обнаружили, что в измерениях присутствовали ошибки времени их выполнения, доходившие до 5 секунд (около 40 км вдоль орбиты)! При таких ошибках и с учетом малой доступной базы измерений (лишь в пределах территории Советского Союза) точное вычисление эксцентриситета орбиты практически невозможно (полуось орбиты мы определяли хорошо, зная период обращения). Стала очевидной необходимость создания системы единого времени на пунктах наблюдения, что очень непросто, если пункты находятся достаточно далеко, например, на разных континентах

60+ лет прошло, а отсутствие точного единого времени всё так же наносит удары.


Кстати, про историю. Восьмибитный байт в СССР появился не сразу. Дело в том, что отечественные машины использовали в основном либо семибитный байт (Минск-32), либо шестибитный (БЭСМ-6, Весна, М-220 и др.), либо вообще переменной длины (привет Уралам). Потому решение взять IBM System/360 и всюду насадить в середине 60-х было очень интересным с точки зрения миграции софта. Ну и вообще история процесса любопытна в контексте дискуссий о том, почему в какой-то момент отечественный компьютерпром «по решению правительства и партии» свернул в другую сторону. Если кратко, то заигрались в зоопарк. А любой нормальный производственник терпеть не может зоопарк. С остальным всё было неплохо, но вот.

Любопытная (и уже слегка устаревшая) деталь китайского импортозамещения. В Китае суперкомпьютеры Тяньхэ-1А и Тяньхэ-2 построены на базе Intel. В 2015 году США решили, что нефиг китайцам ядерное оружие помогать считать, потому поставки процессоров Intel в вычцентры были запрещены. И тут в 2016 году ход конём: на архитектуре ShenWei китайцы внезапно делают процессоры ShenWei SW26010, на которых делают самый суперкомпьютер в мире — Sunway TaihuLight. Понятия не имею, в какую сторону всё-таки отразятся санкции на России (и спорить об этом не хочу), но вот Китай, на котором гроздь санкций не первый год, вполне толково выкручивается во всех областях, ещё и умудряется экономически рычагами поигрывать в нужных местах. При этом их IT/CS сообщество живёт в резервации, в собственном мире. Оттуда нет новостей, нет учебников, нет широко известного сугубо китайского софта (кроме Alibaba’шного). Есть забор. За которым миллионы программистов успешно что-то делают.

Не перестаю думать о том, как для англоязычных выглядит исходный код программ. На Хабре докликался до старой статьи, а там скрин языка Рапира:

8e49a97e331143d7a092574c5a2cc333
СССР, конец 70-х, язык для школоты

Ну… Да. Как-то так. Пожалуй, хорошо, что английский не родной.

Miscellanea VII

Между тем в США столкнулись с ситуацией, к которой приводит сокращение обучения до ввода человеческого ресурса в строй. Иными словами, моряки теперь не умеют ходить по морям, но являются больше операторами чего-нибудь. Вот важная для меня цитата:

Yet many current and former officers say the problem dates back to 2003, when the Navy made severe cuts to SWO’s initial training under the belief the young officers would just learn their trade at sea.

At the same time, the Navy’s growing reliance on technology has eroded basic seamanship skills, former officers say.

Если чуть глаз скосить… не миграция ли программистов в разработчики?


Смешно (ок, не смешно), но одна из самых проблемных тем на собеседованиях (если собеседуется не студент матфака) — таблицы истинности. Редкий разработчик долетит до середины. Хотя, казалось бы, совершенно базовые и обязательные знания. Градус пугливости можно повышать, идя по лесенке вопросов: 1) таблица OR, 2) таблица XOR, 3) таблица XNOR. Следующий коварный вопрос: сколько входов может быть у булевой функции? Вот именно в таком виде и задавать.

Перестал понимать, зачем нужны разработчики, которые не хотят сделать код лучше / правильнее. Ну да, код плохой… Ну да, так однажды сделал кто-то… Ну да, оно не работает… Так возьми и сделай лучше, блин. Ладно ситуации, когда руководитель по рукам бьёт, ему норм такая кака под боком. Но если по рукам не бьют и дают добро на любую инициативу, что мешало? Постоянно что-то мешает таким ребятам. А ответ один и простой: им не надо. Не интересно. Им пофиг. Вот не очень понятно, зачем нужны те, кому пофиг. Если вы такой, вас однажды заменят. Или не заменят, но вы вечно будете сидеть в тёмной норе с одними и теми же норными задачами уровня «выкопать камень, притащить туда».

Хороший пример «реактивной разработки» (когда что-то делается в качестве реакции на взорвавшуюся проблему, а не превентивно) происходит сейчас с прошивкой дронов DJI. Дроны во время работы ходят в сеть мимо юзерских желаний. DJI многократно были пинаемы, но многократно откладывали нежелание юзеров такой фичи в ящик. Что в итоге? В итоге Пентагон запретил дроны DJI. Теперь бойцы рвут жилы, чтобы как можно быстрее сделать offline режим. Хотя, казалось бы, послушай пользователей, подумай, сделай всё вовремя и без убытка.

Есть занятная лакуна в разработчиках. Типовой разработчик делает сервис. Подключает кучу интересных библиотек. В процессе так подхачит. Эдак. Пару баз развернёт. То из исходников соберёт, это (к слову, никак не пойму, почему с таким опозданием Python 3.6.x оказывается в Ubuntu). Вообще всячески развлекается. А потом громом с неба предложение написать мануал по установке сервиса на голую машинку. Мануал, который можно дать другому человеку и не стоять за спиной. Тут-то проза жизни. Страница прозы. Другая. Может, в следующий раз шевельнётся чего в размышлениях. Ибо невероятно легко спихивать всё на админов, конечно же.

Miscellanea VI

Движняк вокруг темы «убьют ли роботы человечество» интересно рассмотреть в контексте нищей (но плодящейся) части планеты и богатой (но демографически отрицательной) части. Акцент дискуссии сместится в циничную сторону: успеют ли богатые наделать умных и злых роботов, чтобы компенсировать свои угасающие человеческие ресурсы в грядущей войне за мир (нефть, воду, бокситы, ураны и т.д.) во всём мире. Или просто генерировать столько еды, что хватит всем. На некоторое время. Вообще же крайне любопытно читать всякую футурологию, держа в памяти голодных АК-47-носителей Африки, Азии и Латинской Америки.

Адский прорыв Индии на мировой рынок IT выливается в одно заметное практическое неудобство — на YouTube всё больше лекторов с индийским английским. Крайне специфический язык. Кажется, я могу понять какую-нибудь канадскую разновидность реднека (если его не выращивала квебекская бабушка), но монотонный речитатив человека, который думает на хинди… И если в книгах (авторы которых тоже всё чаще «оттуда») совершенно пофиг, то как избавиться от таких ребят в поисковой выдаче — не понять.

Вне хипстерских новостных лент тихонько проходит одна из революций. Это вам не восторгаться стопицотым ботом или новым смартфоном — «биопрограммирование». В библиотеках молекулы, языки программирования компилируют в ДНК, а из бактерий делают вычислительные кластера (к слову, ещё в 2007 году такую забаву опробовали). Новости мелькают год за годом, но скучно же, ага. Важно следующее: так появляется один из всадников грядущего киберпанка. Импланты, телоформация, биороботы, весёлые конструкторы «создай семилапую кошечку». Тем забавнее наблюдать за бесшумностью этого всадника.

Любителям думать, что железный вычтех гонится за мегагерцами, будет полезно почитать про RAD6000. Забавная штука. 33 мегагерца! Кэш в 8KB! Гуляй, рванина! И стоило столько, что можно за эту пару-тройку сотен тысяч долларов купить грузовик современных i7. Современные космические хипстеры, впрочем, могут ставить на своё железо условно новые RAD750 — почти всё в 5..10 раз лучше. Ну и далее по линейке. Всё это ставят до сих пор. Всё это до сих пор стоит конские сотни тысяч.

Уже не в первой книге / статье встречаю хороший нюанс современного ML + BigData. Если алгоритм обучился на терабайтах данных и совершает миллиарды операций, он превращается в магию. Ответ есть. Даже правильный зачастую. Но ход решения и причины решения вы проследить уже не можете в разумное время разумными ресурсами, слишком много всего под полом. Считаю, цивилизация дойдёт до лжесингулярности — компьютер всё ещё не будет «умнее» человека, интеллект не получит, но будет совершать настолько сложные количественно действия, что мы начнём натягивать на эту сложность «человечность», ошибочно подразумевая качество.

Miscellanea V

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

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

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

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

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

Miscellanea IV

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

Pokemon Go — один из великолепных примеров наступающего киберпанка. Миллионы роящихся существ, прикипевших глазами к смартфону. Ещё один шаг привычки к внешнему сигналу от корпорации, чтобы что-нибудь сделать (ах, столько людей вышли на свежий воздух! а чё, самостоятельно выйти в парк мозжечок не велит?). Убийство времени, т.к. не хочешь / не можешь тратить его с пользой, будучи заменяемым винтиком какой-нибудь фигни. Перед стадом зомби помахали покемонами, зомби стали веселее.

Десять лет назад пользователь радовался, если существовал рычаг, который можно опустить вниз и произойдёт что-нибудь. Сейчас меня выбешивает инфантильность 30-летних людей с высшим образованием, с опытом работы, порою даже с семьями, но устраивающими гиперактивный движняк по причинам, которые даже до смешных не дотягивают. Ай, вы не так мне спички в коробке уложили, надо, чтобы микрон зазора был! Ай, почему эта большая кнопка не нажимается сама?! Я хочу, чтобы яблочко уже в виде пюрешечки на дереве росло! Хочу! Хочухочухочу!!! Вот это неутоляемое хочухочухочу!!! — первый признак того, что ребёнок ещё не вырос, что его рано из гнёздышка тёплого вытащили. С другой стороны… благодаря этим 30-летним детям у сотен тысяч людей есть работа — автоматизировать застилание постельки утром “руками” мегасовременного робота (с обязательной покупкой новой версии через год) за каким-нибудь Васенькой можно бесконечно.

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

Amazon выпустил свой Slack (или Lync, или GoToMeeting). Стопицотое средство сказать кому-нибудь “привет”. В этой оргии коммуникаторов интересно другое. Вы заметили то, как Amazon живёт на рынках, которые ему не свойственны, казалось бы? Хорошо, Kindle понятен — отличный канал распространения медийных товаров. Но десять лет назад появились Amazon Web Services с облаками и вот этим всем. Amazon Echo — шаг в “умный дом”. Зоопарк сервисов доставки того или иного товара даже не упоминаю. Но Amazon — это также Audible Inc. (производство и распространение аудио-книг), Twitch.tv (геймерский стриминг), Goodreads (активная и огромная UGC-база о книгах), IMDb (ага, с 1998 года владелец Amazon)… и ещё десятки купленных компаний. Занятно, как “витрина для товаров” ни фига не витрина для товаров, если присмотреться. Учимся вести бизнес.

Miscellanea III

Видят пользователи список. В списке значения. Имена. Или числа какие. Или картинки. И частенько пользователи гадают, как оно отсортировано. Теории сортировки. Может, по цвету? Или по первой букве? Только разработчик знает, что сортировки явной там нет. Есть неявная — какой-нибудь default базы, из которой выгребают. А она может сортировать по primary key. Или использовать какой-нибудь служебный порядок типа natural в MongoDB. Почему? Да потому. Страшная тайна “сортировок” этой планеты.

Уверен, следующий кардинально новый рывок разработки — софт не для людей, но для животных. И не залипухи с рыбками для котов, но полноценные системы. Шлем VR хомяку с богатым внутренним миром. Экзоскелеты для мопсов, чтобы ротвейлеров кошмарили. Управляемые настроением кормилки и поилки для коров. Всё такое. Возможно, животные начнут эволюционировать, развиваясь от использования интерфейсов, тут-то и наступит эра зоокиберпанка.

Не стесняйтесь устраивать своим сервисам нагрузочное тестирование. Даже если штатно собираетесь жить под 10 RPS, влепите 1K RPS и посмотрите, как себя ведёт потребление ресурсов, как и куда деградирует приложение, ловите баги, которые стреляют на 100500-м запросе. Скучно, банально, но важно.

Абзац итальянской кухни: помимо Spaghetti code (лапшевидный код с огромным количеством ветвлений) есть ещё Ravioli code и Lasagna code. Равиоли — исходник состоит из множества маленьких атомарных кусочков, апофеоз декомпозиции с инкапсуляцией, от чего ориентироваться в этом блюде сложно, да и мелкой копипасты хватает. Лазанья — исходник состоит из слоёв (layers), общающихся друг с другом строго через строго определённые строгие интерфейсы, в чём по сути нет ничего плохого, но при упоротой реализации приводит к тому, что в рамках сервиса передача одного байта из одного модуля в другой превращается в приключение “байт отдать в layer A, там его сунут в layer B, откуда он пойдёт в layer C, а там подхватится в layer D”.

И снова про AI. Вангую, что самой массовой стратегией борьбы (игровой или натуральной) с AI будет хаотичный рандом. Что-то вроде направленного fuzz testing’а. Вы должны быть тем голубем из анекдота (“Как с голубем в шахматы играть — прилетел, перевернул фигуры, насрал и улетел, считая себя победившим”). Взять тех же Терминаторов. У них нейронки и базы внутри заточены на 99.99% человеческих поведений. Вы даже не успеете подумать о выстреле, а уже ответка прилетает. А вот если человек перед Терминатором голышом начнёт прыгать и гимн СССР орать на туркменском, есть вероятность закоротить схемы и вызвать зависание.

Miscellanea II

На самом деле откровенно плохой код в production встречается не очень часто. Ну вот прям плохой-плохой, ужас-ужас. Просто потому, что оно хоть как-то, но работает, что уже критерий. Зато откровенно плохая архитектура на среднем уровне (то, что умещается в ООП-архитектуру, в разброс модулей, в общий стиль, так сказать, внутренней интеграции) в каждом втором проекте. Одноразовая. Понятная только создателю. Ушедшая от предметной области невообразимо далеко. И всё из лучших побуждений ведь. Написать очень гибко. Написать очень академически. Написать очень, очень изящно и красиво. И чтобы сущность “яблоко” выражалась через десять метаабстракций. Слишком уж крестьянски выражать яблоко яблоком. Или хотя бы фруктом. Пусть это будет SomePatternObjectDomainClass. А перевыпилить эту пакость крайне ресурсоёмко.

Парадокс языков вроде Ruby и Python в том, что на них очень легко начать и легко писать всякое, но с линейным ростом сложности сервиса сложность написания качественного кода возрастает экспоненциально. Не могу пока это как-то формализовать толком, но вот так опыт подсказывает. Ну т.е. чтобы хорошо написать большой проект на Python, вкладываться сильными ресурсами надо так же, как если бы этот проект был на Java / C++.

Сложно понять людей, которым равнодушно происходящее на самом деле. Есть какая-то конструкция языка, отражающая что-то, что человеку не нравится. Допустим, унарный инкремент. Вот фу-фу прям. В языке эту конструкцию убирают, но не убирают трансляцию / компиляцию в неё. Человеку сразу норм. Или заменяют каким-нибудь сахаром. Едва ли не макросом. И снова человеку норм. Как он при этом может не знать и не думать о том, что на самом деле он всё равно пишет тот же унарный инкремент — не понимаю.

Фигня относительно большой текучки кадров в том, что у тебя меньше шансов (на|пере)учить разработчика в стратегических вопросах. В 1817 году ты ему говоришь, что вот так делать нельзя, через пару лет при текущей динамике база лопнет, сервис ляжет, пользователи разрыдаются. Не убедил. Разработчик в 1818 году увольняется в закат. В 1819 году база лопнула, сервис лёг, пользователи рыдают. А ты сидишь дурак дураком и некому сказать “я же говорил! давай ты больше так делать не будешь”. А он уже в другом месте такую же ошибку совершает.

Допустим, ваша команда не успевает в срок. Допустим, то, что успевает, работает плохо и уныло. Что иногда делают? Ровно наперекор анекдоту (“Когда в борделе падает доход, следует менять блядей, а не передвигать кровати”) — меняют технологический стек, методологии, подход к разработке. О, давайте теперь писать функционально. И чтобы аджайл. И скрам! И уберём стулья, работать стоя прикольно и модно. Уииии! Это не спасает. Разве что вы писали сервисы на BASIC, а потом додумались до языков 2016 года. Почти всегда проблемы не в технологиях, но в людях. Эти проблемы и надо решать, а не кровати двигать. Казалось бы, общее знание, но бесконечно одно и то же. Утомляет листать десятки страниц Youtube с выдачей вида “используйте язык / технологию / утилиту XYZ и ваши рабы запрыгают быстрее”.