Профессионализм в разработке ПО

Моя интерпретация замечательного доклада Роберта Мартина


[youtube video=»p0O1VVqRSK0″]

I am your new Project Manager

Сегодня утром я проснулся и решил сделать что нибуть такое что не делел никогда ранее. Решил побывать в новой "шкуре". А для этого решил сам себя поднять по карерной лестнице. И так решил быть ПМом. Но вам сегодня сказочно повезло, потому что вы попадаете под "роздачу" и быть вам девелоперами у меня на проекте.

Я ваш новый PM. Правда не знаю что случилось с вашим предыдущим. Но его уже нет! Но я теперь с вами и буду в ближайшем будущим.

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

Are we professionals?

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

Так, профессионалы ли мы?

We need to be.

Разработка с каждым днём становится все более и более важной сферой деятельности. Посмотрите вокруг!

Как много ПО вокруг вас сейчас работает? Прямо сейчас, в сию секунду. Я б не сказал что слишком много, но вполне достаточно. Не считая компьютеры, к примеру, в каждого сейчас в кармане смартфон (иногда даже 2), сколько их? Сколько ПО там работает? Каждый день вы приходите на работу через электронный замок, есть ли там ПО? В самой картке-ключе, есть ПО? Кофеварка, батарейка ноутбука/телефона, холодильник, лифт, котлы отопления и термометры. Даже простые "аналоговые/домашние" телефоны работают на ПО. Переходя дорогу встречаешь светофоры, автомобили в которых ПО управляет мотором и тормозами, думаю список можно продолжать бесконечно. Сколько раз за день вы отдаёте свою жизнь в руки условному оператору if? Написанному, 23 летнем "сеньором" в 4 часа ночи? Мы должны быть профессионалами! Кто нибудь слышал о "Night Capital"? Не? Компания занималась трейдингом. Сейчас уже не существует. Некоторый разработчик оставил тестовую систему онлайн. Другой трейдер который не работал на компанию, начал торговать з ней. Так как программа была не доделана и трейдер, тупо выторговал от неё 4.5 млн денег за несколько часов! Директор проснулся с утра уже не имея компании. Её просто не стало. За одну ночь!

Да! просто через простого разработчика. Убил всю компанию! Думаю все наслышаны багах в космическом ПО, и об потерянных спутниках на миллионы денег и за опущенной запятой. Но может случиться ещё более страшные нежели потерянные спутники или потеря 4.5 млн. денег, через этих проклятых разработчиков. К примеру, жизни людей.

К стати есть кто нибуть кто не слышал об произошедшем с концерном фольцваген. Ну они там отзывають автомобили как бы по причине того что в их авто програмисты оставили функционал который на тестах показывал меншее количество токсичных выбросов. Ето официальне заявление директора между прочим.

Но я не хочу чтобы побобное случилось в нас, я бы хотел сказать что вы, точнее мы: профессионалы.

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

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

I Expect...

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

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

We will not ship shit.

Боюсь мне не удаться перенести весь колорит фразы на русский/украинский. Но я все ж спробую. Если коротко и упрощенно то оно звучит: "Мы не будем говнячить". Итак, мы ни при каких обстоятельствах не будем отдавать заказчику говно. Мы этого просто не будем делать. Никакое расписание, план или подталкивающий менеджер, не заставит нас это сделать! Всем кто сунет нос и прикажет: "отдавайте клиенту это говно, черт побери(чорт заберай)". Если оно говно, мы не отдаём! Это фундаментальная ответственность профессионализма. Именно поэтому нас наняли как профессионалов. Чтоб знать что если что то говно то чтобы мы могли сказать -- парни простите, но мы не отдаём это говно! Нужно немного подождать пока оно перестанет быть говном. Это может занять некоторое время. Как на меня уже было достаточно отдано заказчикам говнеца в прежние годы. Этот период закончился. Мы больше этого делать не будем.

You will Always be Ready

Я ожидаю что вы всегда будете готовы. Хм. Что это значит? Это значит что мы всегда будем готовы вылить код на прод, готовы отдать код заказчику. И я не хочу слышать: оххх, релиз не готов. Я не хочу слышать: QA не закончили смоук тести или регресию. Я не хочу слышать: что мы не можем запустить две фитчи одновременно. Я хочу чтоб вы были всегда готовы. Чтоб код был всегда стабилен. Не, ну я конечно могу понять задержку в несколько часов, если нам необходимо доделать несколько вещей. Я ещё могу понять день или несколько, в крайнем случае недели задержки. Но я когда я приду и кажу ребята надо отдать релиз и вы говорите что мы не готовы и нам надо ещё неделю-две. Нее, я хочу чтоб вы были готовы. И готовы все время. Если вы можете делать релиз каждый день, я хочу чтоб вы делали каждый день. Если можете каждый час, я хочу чтоб было каждый час. Найдите какой нибудь способ это сделать, и меня не интересует как вы это сделаете.

Кто нибудь с вас слышал про периоды стабилизации? После того как вы сделали релиз, вы должны стабилизировать проект. Неделю пишем код, другую неделю фиксим баги. Не-не-не, я однозначно не хочу слышать ничего об периоде стабилизации! Держите проект стабильным всегда! Он всегда должен работать и всегда готов к развертыванию. Я ожидаю что вы сможете добавлять новый функционал таким способом что если я скажу нужно развернуть проект завтра вы скажете: ОК. Вы можете не успеть доделать весь функционал, это я понимаю. Я понимаю что не весь функционал готов. Я не понимаю почему нельзя развернуть проект.

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

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

Stable productivity

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

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

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

Inexpensive Adaptability

Я ожидаю дешёвую адаптацию. Это значит что если клиент сменит своё мнение, что конечно же бывает в очень и очень редких случаях. Я ожидаю от вас что вы скажете: ОК. И я не желаю ужасных естимейтов, я не хочу чтоб люди мне говорили: о, боже! ты понимаеш что это значит, нужно все с нуля переделывать. Я ожидаю от вас как профессионалов определить те части системы которая стабильная от той которая может или будет изменяться, и вы будете держать эти части изолированными друг от друга. Поэтому когда надо сделать изменения просто делайте их.

К примеру, мы можем захотеть сменить jQuery на Zippo или Dojo (возможно они лутше покажут себя на мобилке), или что для десктопа был jQuery а для мобилок Zippo. И я ожидаю что вы это сделаете без большой стоимости и за короткий период времени. Просто выдернуть оттуда jQuery и вставить Dojo. Я ожидаю что это займет у вас ну скажем неделю. Но никак не целый месяц. Да, я понимаю раньше могли быть проблемы с этим, но я не ожидаю их в будущем. Так же я слышал хороших вещей про Angular, и я хочу иметь возможность перйти на его истользование.

что еще мы можем захотеть? ну например, сменить базу данных, знаете сегодня у нас MySQL, но может какая ни будь компании сделает базу лучше и мы решим сменить базу так как новую будет лучше. И опять вы просто убираете оттуда MySQL и вставляете новую базу. Да, я знаю что раньше могли быть проблемы со сменой реляционной бази на реляционную и я теперь не ожидаю их. также я везде слышал много хорошего про какую то нереляционную, NoSQL вроде как... так вот, я верю что в нас не будет сложностей перейти на нее. К примеру, если я вам скажу что мы переходим на CouchDB - я надеюсь услишить: да повелитель - будет сделано. Ну "повелитель" можете опустить.

Что еще может быть изменено? Например, веб-сервер. О, или не так. Я помню времена когда не было веба и были только десктопные приложения. Кто нибудь помнит приложения которые надо устанавливать? Теперь веть все по сути находиться в веб. К чему это я? Я хочу чтоб разрабатываемые приложения можно было использовать и на десктопе, и в сети. Я ожидаю что вы спроектируете приложение так чтоб веб или десктопный интерфейс был как плагин, и его можноб сменить как перчатки - без естимейтов в месяцы!

Continuous improvement

Я не хочу чтоб кто нибуть пришёл ко мне и говорил что всю систему надо переделать или отрефакторить! НЕТ! Мы не будем перепроектировать систему никогда. Я хочу чтоб вы держали систему постоянно чистой. Это значить что вы должны постоянно её совершенствовать и всегда держать актуальной чтоб она никогда не устарела. Я не хочу чтобы энтропия взяли и уничтожила наш крутой код! Я хочу чтоб вы постоянно держали систему оновленной, чистой. Если есть новая библиотека, я хочу чтоб вы её использовали.

Держите её постоянно чистой и постоянно работающей. Слышали ли вы о правиле бойскаутов? Бойскауты имеют это правило уже годы. И оно очень простое: оставьте территорию лагеря более чистой, чем она была до вас. Звучит как очень хорошая идея. Оставьте код более чистым нежели он был перед вами. Каждый раз при каждом комите улучшайте код. Никогда не оставляйте его в худшем состоянии. Всегда его улучшайте.

Fearless Competence

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

Этот страх... он не профессионален. И я ожидаю что вы будете работать совсем другим способом. А именно, если вы будете видеть в коде что то неправильное, я хочу чтоб вы исправили это. Сразу!. Без страху и без сомнений. Я ожидаю что вы будете мастерами коду, вы же профессионалы. Вы написали его весь! Я ожидаю что вы будете его формировать, скручивать, сжимать, переделывать, я хочу чтоб он был ваш, в истинном понимании этого слова. И вы сможете это сделать без не малейшей ноты сомнения.

И, да. Я ни малейшего понятия не имею как вы собираетесь это сделать. Я слышал что есть некоторые дисциплины для этого. Дисциплины емм, с какими то тремя буквами в названии. Ах да "ТДД", я слышал что они вам могут помочь в достижении того что я ожидаю. Но мне собственно без разницы, решение принимать вам: профессионалам. Я просто ожидаю что вы никогда не будете боятся модифицировать код. Я ожидаю что будете переделывать, чистить, агрессивно улучшать без страху и сомнений. Это нужно если мы собираемся выжить в суровом мире программистов.

Extreme Quality

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

У меня недавно были дома строительные работы. И один из строителей сделал одну из неожиданных вещей для меня. Он случайно разбил окно, ценою несколько тысяч. И он сказал: "ну, это моя ошибка и я исправлю это за свой счёт". Ну я подумал и сказал что мол это довольно много и что ни будь придумаем. На что он ответил: "не, это моя ошибка и я это исправлю". Что если вы сделаете ошибку в коде? И она будет стоить компании 10к денег. Вы сделаете так как сделал строитель? Вы компенсируете компании убыток? Я не могу просить вас это сделать, потому что компания принимает риски далеко за вашими возможностями их покрыть. Но все же. Вы должны посмотреть на это и подумать: "только что я стоил компании 10к денег, нужно что то придумать что с этим можно сделать". И одно что вы точно можете сделать это убедится что этого больше никогда не случиться.

QA will Find Nothing

Я хочу чтоб QA ничего не находили! Или что мы ожидаем чтоб QA находили? Почему они должны находить тоны и тоны багов? Как? Код был в нас в руках, мы что то сделали и отдали это QA. Почему они должны там найти баги? Все же иногда ошибки случаются, и они могут приходить с одним или двоима багами, но я не хочу чтоб они приходили с целыми списками багов! QA должны переживать почему они вообще работают в компании! И это наша работа сделать чтоб они переживали об этом! Когда они ничего не находят, мы сделали свою работу. Если они нашли что ни будь мы должны разобраться в том как такое могло вообще случиться. Как этот баг туда попал? Мы должны найти эту прогалину и полечить чтоб этого больше не случилось в будущем. Другими словами мы не должны надеяться что QA что нибуть то найдут.

Недавно я думал на тему того какая професия ближе всего к програмированию, и мне кажется я нашел. Это бухгалтерия. У ник так же много чисел, купа формул, и тоже постоянно изменяются правила... но вот незадача у них нет з плечами отдела QA. И все же они делают свою работу. Если задуматься над тем как же они получать на выходе болле качественный результат чем мы, то ответ доволно простой. У них есть свои дисциплины для этого. Например, двойная запись. Почему у нас такого нет, или почему не используеться?

Знаю раньше бывали случаи когда фича застревала между разработчиками и тестировщиком. Функционал написан разработчиком не пропускал отдел QA потому что там были баги и возвращал обратно на доработку. И так несколько итераций. Но мы не будем говорить об этом. Это уже в прошлом.

We cover for each other.

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

Honest Estimates

Я ожидаю честных естимейнов. Что такое честный естимейт? Самый честный естимейт это: "я не знаю". Если вы не знаете то я ожидаю это услышать. Но так же я ожидаю что вы выясните сколько все же этом может занять времени. Но если вы не знаете, то я хочу чтоб эти три слова прозвучали с ваших уст. Если у вас есть идея сколько примерно это может занять, я хочу чтоб вы были очень осторожны в этот момент. и хорошо подумали как вы это озвучите. Если вы скажете: "я думаю это может занять три дня", я знаю, вы соврали. Оно не займёт три дня. То что вы пробуете сказать, это может занять два дня а также может занять десять дней и возможно оно займёт три. То что я хотел услышать от вас это тот самый диапазон. Я хочу чтоб вы сказали мне: "ну наиболее вероятно оно займёт три дня, но есть хороший шанс что это может занять 10 дней, и маловероятный шанс что займёт 2 дня". Я хочу чтоб вы описали мне кривую вероятностей, и хочу чтоб вы постоянно давали оновленную информацию о состоянии дел. О том укорачивается ли срок, или наоборот. Каждый день я хочу чтоб вы говорили: "мы получили новую информацию и думаю ми можем укоротит сроки". Я не хочу чтоб вы говорили мне дату. Потому что дата это вранье. Диапазон - правда. И пожалуйста, сделайте этот диапазон, реальным!

Все же люди есть люди, и какой ни будь менеджер может подойти и сказать: "чувак, давай сделаем быстрее". И вы должны сказать: "НЕТ!"

You to say 'No'

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

Какая наихудшая вещь которую вы можете сказать? Нееет, "да" это хорошо если вы уверены в тому что сможете сделать. "да" это хорошо. Но самая худшая вещь которую я не хочу услышать это "я попробую"! Пожалуйста, поясните мне что вы будете делать иначе чтоб достичь результата сказав это волшебные слова "я попробую"? Что вы измените в поведении? Какую новую магию вы будете применять? Я знаю что значит "я попробую", вы скажете мне "я попробую" для того чтоб я отстал! -- ок, я попробую а теперь вали отсюда! Я знаю что это значит.

Automation!

Я ожидаю... И я не знаю почему я это должен говорить на презентации полной программистов. Но я ожидаю автоматизации! Я ожидаю что вы никогда не будете применять людей для работы которую нужно повторять. Например, тестирование системы. Ради бога почему люди должны выполнять тест кейсы снова, снова и снова? Зачем мы за это платим людям если, это могут делать компьютеры? Я ожидаю что вы автоматизируете ваши тествые скрипты, build скрипты, деплой скрипты и миграции. Или все другое что вы можете автоматизировать. Все что могут делать машины пускай они делают по клику кнопки. Я не хочу что б кто ни будь мирился з ручной работой.

Continuous aggressive learning

Я хочу чтоб вы постоянно агрессивно обучались! Программисты похожи на докторов или юристов. Программисты одни из тех кто должен постоянно получать новые знания, постоянно читая, постоянно быть впереди тенденций. Мы видим множество новых языков, вы должны знать хотя бы поверхностно их всех, но основные фитчи знать обязательно. Если выходит новый язык вы должны разобраться с ним. Если выходит новая библиотека вы должны знать её. Если новая техника, все так же вы должны знать её. Вы можете достичь этого только обучаясь. Если же нет... что ж, есть люди которые обучаться. И я их найду. И я ожидаю что вы будете обучать. Я хочу чтоб вы взяли новичков и обучали их. Каждый день. вы должны говорить с ними и показать как не допускать ошибки которые сделали мы.

Добавить комментарий