Мою фичу не сделали!

Всем и всегда советую смотреть на любую ситуацию со всех доступных воображению сторон.
Итак, вполне обычная штука. Вам нужна фича (feauture) в сервисе Слоник. Приходите. Запрашиваете. Вам отказывают. Вы настаиваете. Фича-то нужна вам, вот нужна-нужна. Вам отказывают. Вы в гневе. Сервис плохой. Команда плохая. Все плохие. Слоны сволочи. Миру не быть прежним.
Как это может выглядеть с другой стороны..? Опишу строго реальные кейсы.

Во-первых, это может быть глупая фича. Такое бывает. Даже самый умный и хороший человек иногда с энергичной упоротостью несёт в горшочке глупость, стараясь не расплескать. Никакие аргументы и доводы не работают, остаётся лишь твёрдо отвечать “нет”. Людей клинит. Хочет он пятое колесо у телеги. Сбоку. На выдвижной полочке. Чтобы ехать по болоту. Пусть даже телега утонет в метре от берега. Вот хочет и всё тут.
Во-вторых, приоритеты. Всегда есть более важные задачи. Спасти мир или покрасить забор? Спроектировать роддом или покрасить забор? Ускорить документооборот завода на 25% или покрасить забор? Перенести сервис из 2013 года в 2020 год или покрасить забор? Всегда можно делать шашечки и получать одобрение от бабушек на лавочке, но первично заставить что-то ехать. Никто в здравом уме не будет повышать приоритет маловажного вперёд важного.
В-третьих, сложность реализации фичи. Вам может казаться, что приделать бутылку с шампанским на капот автомобиля просто. Возьми клей, да и приделай. Пять минут дела! Ау, слоны, вы совсем безрукие и ленивые? Да нет. Слоны всё-таки думают о процессах производства, про аэродинамику, про влияние бутылки на водителя при аварии, про сдачу такого авто стандартам, про наполнение шампанским (вам же не просто так бутылку?), про юристов (кого потянут в суд за не ту этикетку?). Наконец, о том, куда и как поедет водитель после такой бутылки и желает ли Слон поощрять таким образом пьянство за рулём. Обычно пользователь о таком не задумывается. Он просто хочет.
В-четвёртых, ресурсы. Сто задач, один разработчик. Ваша фича потенциально сто первая задача. Очень сложно бывает объяснить Пупкину, что до него пришла сотня Пупкиных, забивших очередь задач до упора. И что вы, сто первый Пупкин, ровно такой же пользователь, у которого может хоть третья мировая из-за отсутствия фичи разгораться, но у той сотни всё точно так же. И волевым решением реализуется всё в порядке живой очереди. Сделать вчера? Хотя бы сегодня? Нет.
В-пятых, не в тот продукт. Продукт — не просто набор фич. Это набор взаимосвязанных, непротиворечивых, стратегически единых идущих в будущее фич, которые в сумме призваны решать набор проблем определённого класса. Никто не приделывает к пистолету детскую соску. Они из разных миров. Но всегда находятся пользователи, которым хочется соску у ствола. Один на тысячу, но он будет. Таким тоже очень сложно объяснить, что да, у тебя, дорогой Пупкин, почему-то в жизни так сложилось, что ты кормишь младенца во всеоружии. Но вспомни, пожалуйста, что Слон делает бухгалтерский софт для складов макаронного завода. Нет? Не работает? Тогда просто “нет”.
В-шестых, можно сделать иначе. Многие задачи можно решить уже имеющимися средствами. Тоже довольно часто бывает. Но пользователи не хотят именно этими средствами. Причины, к слову, разные, но только у одного из десяти объективные. Обычно пользователи не хотят осваивать новый / другой / немного отличающийся инструмент. У этого молотка рукоять не так окрашена, сделайте новый молоток! У этого гвоздя шляпка не так шершава, сделайте другой гвоздь! Я не хочу покупать блокнот с линейкой, сделайте мне автоматическую трёхмерную линейку в мобиле, чтобы я раз в год туда покупки заносила! Команда смотрит на приоритеты… на планы… на ресурсы… Нет.

Всегда надо помнить, что вы видите только свой маленький кусочек реальности.
PS. Ну и да, особенно касается всех, кто занят в разработке: граждане, не ленитесь включать воображение и становиться на сторону тех, кто получает от вас “хочу! хочу!! хочу!!!” — оно карму очищает, да и в целом развивает.

Книги: Кибервойн@. Пятый театр военных действий

Кибервойн@
Шейн Харрис.
Кибервойн@. Пятый театр военных действий.
Альпина нон-фикшн, 2016.
Сразу надо отметить, что отечественные издатели схитрили, но понимаешь только после прочтения. Оригинал книги называется “@War: The Rise of the Military-Internet Complex”, что в достаточной мере отражает содержание — восхождение АНБ в США, а также участие Пентагона в кибервойнах. Ничего про мир вне США в книге нет.
Также следует учитывать, что в основном речь идёт о событиях до 2013 года.
Итак… книга на троечку.
Во-первых, типовой текст американской книжной публицистики. Очень много воды. Очень много повторов. Очень много предложений, которые можно выкинуть и смысл текста не изменится. Книгу смело сократить вдвое.
Во-вторых, акцент книги на политическую часть. Мне, честно говоря, несколько до лампочки то, что в США какой-то генерал стал главой какого-то подразделения, после чего начал продавливать свой взгляд на безопасность. Как именно это происходит? Где детали? Где нормальное описание разных видов атак? А нет. Читателям на Амазоне норм, кстати. У них это важная часть жизни.
В-третьих, на 9/10 текст состоит из уже известного и уже опубликованного в СМИ. Если вы хоть краем глаза посматриваете в новости ИБ, ничего нового не узнаете.
Потому… можно посоветовать тем, кто хочет узнать, откуда у АНБ и ФБР появились такие занятные права и возможности. Не буду советовать тем, кто читает газеты / журналы.

Эволюция в три этапа

Разработчик за время работы эволюционирует. Надеюсь. Один из векторов эволюции — понимание того, чем он занимается.

Этап #1 = я решаю тикет. Кто-то создаёт issue в трекере, разработчик приходит, пишет код, вуаля. Всё хорошо, пока не оказывается, что можно было решить так, можно было эдак, но действительно верным является третий вариант. На этом этапе развития разработчик не видит дальше условия, да и не хочет видеть. Он кодер (программист, специализирующийся на кодировании — написании исходного кода по заданным спецификациям) и пишет код.
Фактически это обычный уровень junior’ов со всем вытекающим. Не дать сложную задачу. Надо тщательно и детально описывать всё в тикетах. Надо постоянно следить за тем, что код пишется в стратегически верном направлении.
Требуемые skill’ы: уметь писать код.
Типичный тикет такого уровня: вот в это место вбить такой-то гвоздь.

Этап #2 = я решаю задачу. Более продвинутая версия первого этапа. Разработчик начинает осознавать, что мир немножко больше, немножко сложнее. При чтении текста тикетов начинает задаваться вопросами категории “зачем? почему?” Он не просто пишет код, но расширяет свою зону ответственности и на другие технические области, начинает осваивать смежные специальности. В конце концов, он становится генератором тикетов.
Фактически это большинство разработчиков. Почти все middle и senior’ы решают задачи разного уровня сложности, надувая свою техническую квалификацию до универсальности (например, моднявые full stack developers). На топовом уровне это крутые программисты, которые под ключ сдадут вам сервис с отличной архитектурой, ещё и внуков переживёт.
Требуемые skill’ы: уметь писать проекты.
Типичная задача такого уровня: выстроить забор (middle), построить дом (senior).

Этап #3 = я решаю проблему. До этого доходит один из тысячи. До этого хочет дойти один из тысячи (многие сознательно не хотят). Всё потому, что примерно здесь пролегает граница между разработчиком и внешним миром, а разработчики не любят внешний мир. Там странные люди хотят странного, а тебе их понять, да ещё и помочь. Более того, иногда может оказаться, что через месяц осмысления и планирования разработчик решает проблему без единой строчки кода.
Фактически это уровень вне категории. Программирование — инструмент. Не всегда главный. Дизайн, управление, экономика, коммуникации, технологии и т.д. — всё включается в орбиту использования. На этом этапе уже не получится забиться в угол и тихонько копаться в сервисе, становясь самым главным специалистом по Java или наивеличайшим вкладывателем div’а в div.
На этом этапе у разработчика меняются приоритеты — если в интересах решения проблемы прошивка базы на Луне должна быть написана на VBScript, она (прошивка) будет написана на VBScript. Если для этого надо VBScript транслировать в ассемблер, так и будет. Если для этого требуется переучить группу биологов-аналитиков в группу low level geeks, разработчик убедит переучиться. Надо сначала самому всё осилить? Осиливается. И т.д.
Требуемые skill’ы: всё предыдущее с добавлением всего социального с добавлением человеколюбия.
Типичная проблема такого уровня: уберечь людей от замерзания зимой.

Потому… разработчики, не ныкайтесь по углам. Учитесь общаться. Оно и в целом-то полезно, а уж на лесенке этапов всяко обязательно.

Книги: Code Simplicity

Code Simplicity
Max Kanat-Alexander.
Code Simplicity. The Fundamentals of Software.
O’Reilly, 2012.
Книга, в которой всё правильно, но всё бесполезно. Разве что давать читать самым junior’ам, но у них это знание превращается в понимание только через опыт, потому тоже как-то в никуда.
Автор объясняет, что… блин, даже не пересказать. Что софт делается для людей. И надо проектировать. Но при этом не ударяться в перепроектирование. И что читабельность важна. И у вас будут ошибки, но их надо исправлять. Чтобы ошибок было меньше, надо писать только нужный код и лучше бы проще. Чем сложнее, тем хуже.
В общем, да, конечно, всё верно. Но и? Все знают, что быть здоровыми и богатыми было бы здорово.
Не читать. Пустая трата времени.

Разработчик и депрессия

Детям не рассказывают при выборе профессии, но разработчик должен обладать нехилой стойкостью к депрессии. С одной стороны в нём должна быть нота перфекционизма, с другой стороны он видит, что мир катится в жопу и труд Сизифа вечен.
Опишу понедельник разбросанными фактами.

Утром проверял почту, завис браузер. Стожополиардная версия, в которой каждая строка должна быть вылизана за десятилетие. Завис.
Приехало стожополиардное обновление Adobe Flash player. Уверен, все разработчики этого выкидыша индустрии будут гореть в аду. Невероятно жрёт память, спамит обновлениями, регулярно тупит.
После ребута системы браузер не дожидается поднятия WiFi и пытается открыть вкладки. Не открываются. Удивительно. Проверить сеть и подождать никак?
Весь день бегаю белкой в колесе, горящей жопой прислушиваясь к подземным стукам то в одной системе, то в другой. Ни строчки кода. Я же разработчик. Именно так мы и разрабатываем.
Вечером открыл фильм в VLC. Нет звука. Закрыл VLC. Открыл фильм в VLC. Звук появился. Спасибо.
В метро читал о том, как китайцы засеяли вирусами и бекдорами все сети США, включая правительственные и секретные, ибо дырищ в безопасности больше, чем китайцев.
Пока писал эссе в Medium, страничка потеряла сервер и не досохранила черновик.
В Preview в Mac OS X открыты две небольшие PDF’ки. Preview занимает 2.74 Gb памяти. М… Ну ок. Firefox с 12’ю вкладками откусил 1.63 Gb.
Драйвер USB-мышки завис в состоянии “loading”, т.к. мышка не подключена. Ага. Ведь USB-мышку никогда не вытаскивают. Производитель, кстати, топовый. Софт тоже, видимо, топовый.
Почитал текст вакансии. В топовой IDE мирового уровня “Пока что используется Java 6 (из-за трудностей с последующими версиями Java на MacOS)”. Java 6 — это штука, у которой релиз был 2006–12–23, последний публичный апдейт 2013–04–16, а с января 2016 года её даже скачать уже не дают. И почти 7 лет на Java 6 постоянно накатывались security fixes — свыше 260. Обнять и плакать.
Кстати, про IDE. Переключил git branch — из дерева проекта пропала треть названий папок. Сами папки на месте. И узлы дерева. Можно кликнуть по пустоте и получить результат. Удобно.
Jabber-клиент вдруг умер. Я не знаю причину. Он умер. Я запустил заново.
В чате Telegram-клиента невероятной толерантности подсветка URL’ов. URL’ом считается всё, что может им быть. Даже то, что им не является. Логика марсиан, по которой “глав.ком” — это сайт, а “глав.ру” не сайт.
YouTube в поиске внезапно выдал мне ленту роликов на испанском и немецком. Алё, я фигову тучу лет смотрю только на русском и английском. Куда сломалось ранжирование?
У лектора из МГУ на слайдах опечатки.
Каждый второй доклад highload-конференций о том, как выжить системе в условиях тотальной гибели всего. То железо взрывается, то софт падает, то сеть пропадает, то всё вместе отстреливается. Если вы накопаете (а это легко) статистику по возврату брака железа в сервисные центры или сроки жизни железа в ДЦ… ну… даже десятикратное дублирование не покажется параноидальным.
Мимо проехала Toyota Prius. Помню статьи о том, как их массово отзывали для фикса баги, убивающей движок.

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

Python и Ruby без будущего

Заголовок желтушный, конечно, но пусть.
Посмотрите на то, как развиваются языки и почему появляются новые. Потому, что развивается железо. На каждом этапе обнаруживается точка, в которой тяжёлые игроки осознают, что используют имеющиеся ресурсы (как железные, так и человеческие) не шибко эффективно, а то и вовсе не используют. В этой точке начинается волна выхода новых языков в production.
Сейчас 2016 год. Давайте оценим некоторые рынки:
  • Mobile — только в 2013 году мобильных девайсов в мире было больше, чем людей — свыше 6.8 миллиарда.
  • Embedded — вообще не подсчитать, от утюга до Боинга.
  • Industrial — промышленные роботы, ЧПУ. Тоже фиг подсчитаешь, но много.
  • Transport — свой занятный мир софта для автомобилей (кстати, для Tesla пишут на C), самолётов, кораблей.
  • Communication — и тоже особый мир связи и связистов от древней телефонии до современных спутниковых сетей.
  • Data Storage — планета баз данных (точнее, их management systems), которых в мировом production под сотню.
  • Gaming — куда ж без невдолбенной индустрии игр, которая в 2016 году оценивается под 100 миллиардов долларов дохода.
Беда в том, что ни в одном из этих пунктов нет ни Python, ни Ruby. Языки изначально заняли нишу оптимизации человеческого ресурса на дешёвых задачах класса “быстро написать средней руки web service”, что достаточно конечно в плане развития языка, особенно в сравнении с тем, какой простор для развития у тех, что хоть как близки железу и highload.

Более того, судя по новой волне (Rust, Go, Swift), нынешний прогресс разработки вообще не рассматривает пару P&R в качестве доноров архитектуры, стиля, методологии. Понемногу удобный сахар из синтаксиса натырили, да и всё.
Также P&R потеряют часть рынка и потому, что новая волна таки думает о том, чтобы на них и web services можно было писать удобнее, чем на старых добрых C/C++ (Java, впрочем, с интересом смотрит на происходящее с позиции крупнейшего игрока этой деятельности). Как минимум, в соответствующие фреймворки для Swift сейчас очень активно вкладываются, особенно IBM.
Также следует помнить, что P&R и без того никогда не были лидерами в топах используемых по миру языков. Даже вошедший в академические сферы и в анализ данных Python так и болтается в TIOBE на своих 4% (C++ 6%, C 12%, Java почти 20%). И это при минимальном пороге входа в язык — садись и пиши.

Как итог… я фиг знаю. Мне кажется, из “их” поколения скриптовых языков хоть как на плаву останется только PHP, отобрав себе всю прослойку скриптобекендов и генераторов web-страниц. Релиз PHP 7 показал, что за движок взялись всерьёз и от цивилизации отставать не собираются. А вот куда судьба заведёт P&R — не понять. Медленные и ресурсоёмкие сервисы в современных условиях “давайте тратить стойки в ДЦ не на обогрев воздуха” как-то не очень, но превращать P&R во что-то другое никто, кажется, не собирается, т.к. этих монстров уже не переписать.
Вангую в следующую пару-тройку лет падение рейтингов и переход в другие, более утилитарные и узкие ниши.

Романтика

Раз за разом бойцы вспоминают минувшие дни под бутылку годного.
1-QN-7kicmqhq7O7aNap8s9A
В 1954 году понимали
Как ни крути, а раньше (с 70-х по 90-е) в разработке романтики было больше. И тому объективные причины.

Во-первых, любительский порог входа в профессию был выше. Для того, чтобы заниматься чем-либо компьютерным, надо было действительно этого хотеть — компьютеров было мало. Либо ты сам паяешь по схемам журнала “Радио” (привет тем, кто таки собрал Радио-86РК), либо находишь в округе (Дворец пионеров, у родителей на работе, у соседей неведомо как добытый один на квартал).
Во-вторых, компьютерами в основном решали важные насущные задачи, которых на заре автоматизации было на порядки порядков больше, чем компьютеров и программистов. Можете представить, чтобы кто-нибудь в здравом уме тратил время железки на фигню, если каждая минута этого времени оседает заметным числом в бюджете? Едва ли не половина того, что было — сопровождение научной работы или часть научной работы. Отсюда и остатки советской системы подготовки программистов — в первую очередь из тебя лепили физика-математика.
В-третьих, решение задач требовало от программиста незаурядности мышления. Представить легко. То, что вы разрабатываете сейчас, попробуйте разработать на железе, работающем в миллион раз медленнее и обладающем памятью в 640K. Из языков… скажем, BASIC и FORTRAN. IDE нет. Интернета нет. Документация в соседнем шкафу занимает три полки (и да, она бумажная). Терпимость к ошибкам нулевая — у вас нет времени сто раз опечататься, сто раз отловить это в сборке и сто раз поправить — займёт неделю вместо современного часа.
В-четвёртых, от программиста требовалась бОльшая эрудиция и универсальность в сумме с изворотливостью. Ещё раз: интернета нет. Для решения возникающих проблем у вас есть только голова и звонок другу (ну или на завод-производитель). Основной инструмент — ручка и тетрадь. Иногда паяльник. В сравнении с современным миром разработки… вас выкинули на необитаемый остров. Это действительно очень сильный skill, который сейчас никак не нарабатывают.
В-пятых, программист всё время делал что-то новое. Нет софта. Нет готовых библиотек на каждый писк “заказчика”. А те, что есть, сделаны под другой компьютер. Open source, кстати, тоже нет. Это довольно сильный внутренний мотиватор, нежно оглаживающий ЧСВ и наделяющий программиста шелковистой лысиной.
В-шестых, программистов было мало. Сейчас их (professional software developer в терминах IDC) по миру ~20M (две Греции можно одними программистами заселить). В 1996 году в США ~600K, в 2014 ~3.6M. В 70-х и 80-х все программисты планеты друг друга в лицо знали, кажется. Это тоже создавало ауру некоторой кастовости. Вас мало. Вы умны. Вы всем нужны. У вас в руках bleeding edge цивилизации. Вы действительно каждой строчкой кода решаете действительно важные проблемы. Быть программистом — это круче, чем быть дочкой генерала КГБ.

Как-то так. Программист образца 201x года и программист образца 197x года — очень разные по внутреннему мироощущению. Ну и вода была мокрее, конечно.