Строим детскую площадку

Оригинальные файлы:

Refactoring: Improving the Design of Existing Code / Рефакторинг: улучшение дизайна существующего кода

Refactoring (noun): a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior.

Refactoring (verb): to restructure software by applying a series of refactorings without changing its observable behavior.

О книге

Ах, Мартин Фолер, каждый программист хотя бы один раз слышал его имя. По какой-то ещё не осознанной причине, я всегда ассоциирую Мартина со своеобразным духовным лидером разработчиков и архитекторов. Его выступления всегда заставляют задуматься. На этой неделе я с грустью дочитал его книгу по теме рефакторинга. С грустью? Я очень, очень медленно шел по последним 30 страницам книги, переодически останавливаясь, откладывая «на потом». Что-то внутри меня не хотело заканчивать эту книгу – хотелось чтобы приключение продолжалось. Но все хорошее когда-либо заканчивается, а значит пора подвести итог.

Заметок и мыслей собралось у меня много и поэтому начну с конца: книга хорошая – стоит времени и денег! Я лично считаю, что мне стоило прочитать эту книгу на пару лет раньше – возможно, это помогло бы мне с некоторыми неправильными представлениями о разработке и рефакторинге. У книги есть 2-е редакции, первая базирована на языке Java, а вторая на Javascript. Я прочитал вторую редакцию и, хотя мой “боевой” язык программирования Java, мне очень понравились приведённые в книге примеры и идеи на Javascript-е. Стоит отметить – я НЕ фанат Javascript-а по многим причинам, однако после Java, это как доза беспечной свободы и креатива – делай что хочешь, как хочешь, даже если тебя это впоследствии убьет. Также, по словам автора, он изменил пару советов во второй редакции, так как за прошедшее время некоторые традиции в программировании изменились, однако большинство советов остались прежними. Книга делится на две части: первые 100 страниц – история о разработке софта, почему и как рефактор является неотъемлемой частью разработки и дизайна. Вторая часть (300 страниц) – “бесконечные” техники рефакторинга из одной структуры кода в другую и наоборот, с объяснениями и хорошо разобранными примерами. В итоге, я считаю, что книга подойдет разработчикам с разными уровнями опыта, но возможно не начинающим! Как ни странно (сарказм), но автор очень сильно опирается на тесты, поэтому желательно усвоить тематику заранее, а также быть хотя бы немного знакомым с TDD, не зря со-автором книги является Кент Бэк.

Итого:
+: Простое и доступное изложение
+: Детально описанные примеры
+: Набор методик с объяснениями
+: Для всех разработчиков, за исключением начинающих
+: Отличные наставления
=: Хорошая, доступная, полезная книга – стоит вкладывать деньги и время.

Название: Refactoring: Improving the Design of Existing Code
Авторы: Martin Fowler & Kent Beck
Обложки:

Разработка и жизненный опыт

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

Не рефактор

“If someone says their code was broken for a couple of days while they are refactoring, you can be pretty sure they were not refactoring.”

“Если кто-то сказал что код был сломан пару дней, потому что они делали рефакторинг, можете быть уверены, это был не рефакторинг”.

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

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

Много

“The whole purpose of refactoring to me is to program faster, producing more value with less effort”. “Refactoring is always done to make the code easier to understand and cheaper to modify.”

“Для меня, вся цель рефакторинга – программировать быстрее, создавая больше ценности с меньшим усилием”.
“Рефакторинг всегда делается для того, чтобы код было легче понимать и дешевле модифицировать”.

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

Теоретически, проблему можно решить на корню – писать минимальный и чистый код, однако реальность диктует свои правила. Когда первый раз решаешь проблему, то редко получается с первого раза. Вариаций на “первый раз” может быть много: новая платформа, новая библиотека, отсутствие опыта, незнание домена и так далее. Реалистичное решение проблемы – постоянный рефакторинг: начал работать над кодом; прочитал; понял; посмотри, что можно исправить (очень часто, исправить можно много чего). Добавил код, пройдись ещё раз, посмотри, если ты понимаешь что-то лучше теперь, чем изначально, исправь – сделай проще.

Энтузиасты

“To really operate in an agile way, a team has to be capable and enthusiastic refactorers – and for that, many aspects of their process have to align with making refactoring a regular part of their work.”

“Чтобы по настоящему работать в agile, команда должна состоять из способных и полных энтузиазма «рефакторов» – а для этого много аспектов рабочего процесса должно выстраиваться так, чтобы рефакторинг был частью повседневной работы.”

К большому сожалению опыта с этим у меня нет. Для меня рефакторинг это часть моего личного процесса разработки. Перед тем как я пишу код, я читаю много кода, пытаясь понять что происходит и как оно работает. Пока я это делаю, я также рефакторю код по мере возможности и ценности. Потом я добавляю новую фичу и опять читаю, смотрю, думаю и рефакторю код по мере возможности и ценности. Такой режим работы возможен потому что:
⁃Я практикую TDD
⁃Большинство команды или практикует TDD или пишет хорошие тесты (советую книгу)
⁃ Там, где тестов нет или они плохие, я делаю рефакторинг исключительно автоматизированными средствами IDE.

Теперь большинство команды смотрит очень вяло на рефакторинг и обходят его стороной по возможности. Это происходит по нескольким причинам. Первая: способности и знания самих программистов у нас довольно тусклые. Вторая: культура компании такова – если ты все делаешь быстро (даже тяп-ляп и в продакшен), то ты герой и лавры тебе, а потом хоть потоп – это кто-нибудь другой разгребет. Третья: долгое время старшие программисты и архитекторы не давали рефакторить, даже банальные и простые вещи, ссылаясь на качество наших программистов. В итоге, когда я начал мой рефактор-путь, меня много критиковали, вставляли палки в колеса и так далее. Но я выжил и по меньшей мере сейчас никто ничего мне не говорит, даже если я изменил очень много кода. Но тут важное “но” – я никогда не оставляю код в сломанном состоянии и очень редко добавляю баги по причине рефакторинга. Баги в основном прокрадываются там, где плохие тести или их нет.

Методические рекомендации

“Here’s a guideline Don Roberts gave me: The first time you do something, you just do it. The second time you do something similar, you wince at the duplication, but you do the duplicate thing anyways. The third time you do something similar, you refactor.“

“Вот методические рекомендации от Дона Робертса: Когда ты первый раз что-то делаешь, то просто сделай. Когда ты делаешь что-то похожее второй раз, поморщись и сделай дубликат кода. Когда ты делаешь похожее третий раз, то делай рефакторинг”.

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

Оптимизация цикла

Я всегда придерживался аксиомы: дубликат кода – всемирное зло, которое должно быть найдено и уничтожено. Часто, когда обрабатываешь массив данных, используешь for-loop (цикл), в котором находятся “правила” изменения данных. Если правил много, то кода в цикле получается тоже много. Читать такой код занимает время и можно было бы все упростить, если сделать несколько циклов и выполнять разные правила в разных циклах по мере необходимости. Однако такой подход значит, что по массиву надо будет проходить несколько раз – в свою очередь большая “О” будет расти, а это как мы знаем из обучения в университете – зло!

Мартин на это смотрит в точности наоборот! Приоритет должен отдаваться не количеству подобных циклов, а чистоте и легкости понимания кода. Автор считает, что лучше иметь чистый код в цикле и пусть с дубликатами, чем один цикл, но без дубликатов. Объяснений тут несколько, первое: компиляторы умные и могут оптимизировать код, второе: проблемы производительности редко приходят из обработки данных в памяти, третье: если нужно оптимизировать производительность кода, то это куда легче сделать с простым кодом, чем со сложным.

Для меня это был немного сложный разворот, однако, немного подумав о своем личном опыте, я понял что это действительно так. Частенько все вкладывается в один цикл на “благо ради”, а потом код в цикле разрастается и в определенный роковой момент, кто-то по необходимости добавляет звонок на внешний ресурс (база данных, сервис или файлик). Если система начинает тормозить и нужно оптимизировать, то это превращается в кошмарный сон, так как нужно рефакторить все и сразу.

Когда хочется написать комментарий

“When you feel the need to write a comment, first try to refactor the code so that any comment becomes superfluous.”

“Когда чувствуешь, что нужно написать комментарий, сперва попробуй отрефакторить код таким образом, чтобы комментарий стал излишним”

Честно говоря, я даже не помню когда последний раз писал комментарии на код. Мартин не первый человек который обсуждает эту тему, на мой взгляд тематика лучше разобрана в книге дядюшки Боба – Чистый код.

Не будьте великим программистом

Statement Kent Beck often makes about himself: “I’m not a great programmer; I’m just a good programmer with great habits.”

Кен Бек часто говорит о себе: “Я не великий программист, я просто хороший программист с отличными привычками”.

Из личного опыта мне довелось поработать с великим программистом и опыт довольно интересный. С одной стороны “писькомер” с другой “Дартаньян”. Для этого великого программиста ВСЁ было крайне просто: написать сложный код; пропустить тесты, потому-что “код тривиальный”; оптимизировать до того как надо. С одной стороны я выучил много чего, работая с ним, с другой я видел ошибки, которые он делал и он не хотел даже выслушивать доводы. Великий программист ушел, его код остался и до сих пор его дизайн поражает воображение, так как там черт ногу сломит, программисты обходят его код стороной!

Тут я хочу дать пару советов программистам. Учитесь, всегда учитесь, практикуйтесь, читайте книги, блоги и документацию! Не изобретайте колесо там где оно уже давно есть. Практикуйтесь писать чистый, понятный код – помните простота сестра таланта. Изучите разные техники, включая TDD, оно всегда поможет. Заприте свое эго под большой замок, оно никому не нужно и в итоге будет только мешать. Взращивайте отличные привычки и знания.

Что говорить менеджеру о рефакторе

“What do I tell my manager about refactoring? Of course, many managers and customer don’t have the technical awareness to know how code base health impacts productivity. In these cases I give my more controversial advice: Don’t tell!”

“Что говорить менеджеру о рефакторинге? Конечно, многие менеджеры и клиенты не имеют технических знаний о том как хороший код влияет на продуктивность. В таких случаях я даю свой спорный совет: Не говорите!”

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

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

Тесты

“I’m sure you have heard many times that you cannot prove that a program has no bugs by testing. That’s true, but it does not affect the ability of testing to speed up programming.“

“Я уверен что вы слышали много раз, что нельзя доказать что в программе нет багов через тестирование. И это правда, однако это не значит что тесты не помогают вам программировать быстрее.”

“Don’t let the fear that testing can’t catch all bugs stop you writing tests that catch most bugs”

“Не позволяйте страху остановить себя от написания тестов которые поймают большинство багов, лишь потому что тесты не поймают все баги”

“A suite of test is a powerful big detector that decapitates the time it takes to find bugs”

“Набор тестов это очень мощный детектор, который позволяет сократить время поиска багов”

Я лично фанат TDD и почти всегда пишу тесты. Теперь стоит отметить, что я не фанатик и понимаю, что не всегда и не везде нужно писать тесты, однако по большинству я их всегда пишу. К такому состоянию я пришел из личного опыта написания кода и считаю что тесты действительно помогают писать код быстрее и допускать меньше ошибок. Если взять один момент из моего опыта, то тесты спасли меня когда я в аварийном режиме разрабатывал патч для прода, работал по 12 часов в день и если бы не тесты, я бы не успел закончить во время. Так же стоит отметить что на протяжении почти 2-х лет, код работал четко и без ошибок или багов. Позже код был удален, так как больше не был востребован.

Pull Request

“The common pull request model, where a reviewer looks at code without the original author, doesn’t work too well. It’s better to have the original author of the code present because the author can provide context on the code and fully appreciate the reviewers’ intentions for their changes. I’ve had my best experience with this by sitting one-on-one with the original author, going through the code and refactoring as we go. The logical conclusion of this style is ‘pair programming’: continuous code review embedded within the process of programming.”

“Обще принятая модель пул реквестов, где рецензент просматривает код без автора, не работает особо хорошо. Намного лучше сидеть с автором кода, который может предоставить контекст к изменениям и обьяснить, почему были приняты те или иные решения. Из моего опыта лучше всего сидеть вместе с автором, разбирая код и делая рефакторинг на лету. Логическое завершение такого стиля работы называется: “парное программирование”, где процесс рецензии происходит по ходу разработки.”

У меня на работе пул реквест модель является де-факто. К большому сожалению, все косяки этой модели выходят на лицо, когда невозможно понять почему именно так было сделано. Сидеть с автором редкая реальность, а парное программирование запретная практика. Менеджмент считает, что это бесполезная трата денег. Я лично считаю, что это большая ошибка, так как когда работаешь парно (а с этим опыт у меня есть), то код разрабатывается быстрее. Так же довольно легко передается опыт и ремесло. Например: если новый джун. программист работает один, то зачастую это потерянное время. Он делает много ошибок или не может сделать сам вообще ничего. В итоге после нескольких дней, ему все равно приходится работать с другим программистом. Если подсчитать, было бы быстрее и дешевле сразу так сделать. Когда два опытных программиста работают вместе, то получается быстрее, проще и чище.

Однако у парного программирования есть и свои косяки. Одна большая проблема – это личность человека. Не все могут работать в паре, может кто-то жуткий интроверт и ему очень тяжело. Так же если в команде нет способа избавиться от непригодного программиста (допустим он не хочет учиться и/или не умеет программировать, а такое тоже бывает), тогда парная работа превращается в один работает, а другой спит! У нас на работе такое явление частое, а команда ничего по этому поводу сделать не может. Менеджмент по непонятным причинам не увольняет таких чудо-работников, а дает бесконечные вторые шансы. В таких ситуациях программисты начинают отказываться работать парно и по понятным причинам, в итоге результат на лицо.

Переименуй

“Renaming is not just an exercise in changing names. When you can’t think of a good name for something, it’s often a sign of a deeper design malaise. Puzzling over a tricky name has often led us to significant simplifications to our code.”

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

Как говориться в программировании есть две сложные задачи: придумывать названия и кэширование. Интересно, сколько существует вариаций этой шутки? Я даже не знаю сколько раз я повторял выше описанное своим программистам. Когда я перешел в новую команду и посмотрел на их тесты, то вздрогнул. Спустя пару месяцев я ввел обязательную методику по названию тестов (если интересно, пишите я раскажу) и ещё 8 месяцев объяснял почему и как, не раз объясняя, если тест не соответсвует названию, то тест слишком сложный – разбейте на несколько отдельных тестов. Уже на данный момент все идет по маслу, битв больше нет, тесты плюс/минус в хорошем состоянии. Невероятно как маленькие изменения в названии ведут к большим изменениям в коде и работе.

Запомните это

“I was just as surprised myself when Kent Beck showed me how to do this in a hotel room in Detroit two decades ago. The key to effective refactoring is recognizing that you go faster when you take tiny steps, the code is never broken, and you can compose those small steps into substantial changes. Remember that – and the rest is silence.”

“Я был очень удивлен, когда 20 лет назад Кен Бэк показал мне как это делается в комнате гостиницы в Детройте. Ключ к эффективному рефакторингу – это осознание что ты программируешь быстрее когда делаешь маленькие изменения, код никогда не ломается и ты можешь составлять маленькие изменения в большие. Запомни это, а остальное тишина.”

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

Я советую вам попробовать этот подход на себе, главный трюк – разбить работу на маленькие шаги. Стратегий много и описывать их не буду, однако оставить с пустыми руками тоже не могу – посмотрите на “Как это решить”.

Presto! / Вуаля!

Эта книга валялась у меня некоторое время. С одной стороны она всегда была на горизонте и даже хотелось за нее взяться, с другой не была приоритетом — всегда находилось что-то более важное или полезное. Однако под конец 2019 года, я в очередной раз потерпел неудачу с очередной диетой. И тут стоит заметить, с весом я страдаю всю свою жизнь и скорее всего именно это в конечном итоге подтолкнуло меня к прочтению книги. Но почему именно этой книги? Дисклеймер: потому что мне нравится автор: Penn Jillette. Много лет назад я был поклонником “Penn & Teller: Bullshit!” шоу и мне нравился ход мысли и шутки.

Пора поговорить о книге, она о диете и лучше чем все остальные? Нет! Она не лучше, скажу даже больше, в плане объяснения “как оно все работает”, книга скорее парит в районе нуля. Там очень мало рецептов (питания), мало физиологических и научных объяснений. Из этой книги вы не узнаете ничего полезного о протеинах, кетонах и какой-либо релевантной научной информации. Стоп, а книга вообще о диете? Нет! Книга о том как Пенн сбросил более 100 фунтов веса и приключениях по пути.

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

С практической точки зрения, книга служит как забавная история и/или как навигационный маяк. Однако и в том и другом случае есть “но”. В плане маяка, книга служит больше как вдохновение и потенциальное направление, однако изучать и копать придется самим (диетологом у Пенна был Ray Cronise). В плане забавной истории, стоит учесть специфическое чувство юмора автора и язык 18+. Я полагаю, что не всем придется по вкусу язык и шутки Пенна.

Итого:
+: Простое и доступное изложение
+: Замещающий опыт
+: Вдохновительная история
+: Интересная перспектива на Американскую диету
+: Шутки и язык (очень субъективно)
=: Книга написана хорошо и мне очень понравилась. Думаю, прочитаю ещё раз, но позже. Её стоит читать, если вы хотите интересную реальную историю, ищите вдохновение или начальную точку для вашего личного покорения веса, а если ищите факты, науку и диетические рецепты, то не стоит — там их почти нет.

Название: Presto!: How I Made Over 100 Pounds Disappear and Other Magical Tales
Авторы: Penn Jillette
Обложки:

Стеклянная белая доска

Пару дней назад я наконец-то повесил новые стеклянные белые доски и обнаружил маленький момент, но начнем по порядку.

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

Первыми досками я обзавелся 3 года назад, когда мой друг при переезде отдал мне его старые доски. Доски были большими (3 на 4 фута), но старыми – куча фантомов и проблемы с очисткой. Я переодически ими пользовался, один раз восстанавливал и наконец-то решил купить новые доски.

Основным требованием было легкая очистка доски, даже если записи оставались месяцами. После небольшого исследования я понял, что основательное решение это стеклянная доска. Если над стеклом не издеваться (царапать, обжигать, разбивать) то оно будет служить практически вечно.

Если стеклянная доска такая крутая, то почему их не везде используют? Со стеклом две основные проблемы: цена и вес! Если обычные белые доски можно легко повесить на липучки 3M, то со стеклом так не получится – его нужно капитально прикручивать и это работа на двоих (стекло: 3 на 4 фута). Цена тоже довольно высокая, если дешевую белую доску такого размера можно купить за $35+ долларов, то стеклянная обойдется в $110+. Получается, умножить цены и добавить стоимость установки (например в офисе), то складывается довольно внушительная сумма.  Справедливости ради отмечу, стекло выйдет дешевле, если постоянно использовать, но это все вычисляется по обстоятельствам.

Один маленький момент, который я не учел, покупая дешевую стеклянную доску, – яркость написанного. После долгих поисков, я случайно набрел на стеклянную доску от Амазона (amazon basic) за которую хотели $79. 

Не долго думая (отходил от ценового шока), я заказал две. После установки, я использовал мой повседневный зеленый маркер и в этот момент я осознал – на этом стекле написанное видно намного хуже.

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

Задняя мысль:

Я целиком доволен покупкой, даже с учетом снижения яркости текста – черный маркер решает все. Купил бы я ещё раз такую доску – да, $79 того стоит.

Notes to a software team leader / Заметки руководителю группы разработчиков программного обеспечения

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

Рулить группой программистов довольно интересное занятие, в особенности в ситуации, когда компания в лице менеджмента марширует под лозунгом Аджайла и самоорганизующейся команды, а на месте у руководителя нет полномочий принимать решения, плюс он завален всеми техническими проблемами. Как говорится: “денег нет, но вы держитесь”. Многие программисты и менеджеры ошибочно считают, что руководитель команды является основным программистом – цели и задача которого чинить косяки, помогать всем и без посторонней помощи допиливать релиз. Как ни странно, но такое я наблюдал как в своей компании, так и на интервью в другой компании, где вопрос ставился ребром: “сроки горят, денег нет, вариантов не осталось, ты руководитель, что будешь делать?”.

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

Изначально руководитель занимает роль диктатора, цель и задача которого: ограничить количество и установить границу в плане доставляемой работы, тем самым получить время для развития команды. На этой стадии диктатор принимает все технические решения, даже если команда этого не хочет, например “мы используем гит для хранения и версионности кода”. Режим диктатора ни в коей мере не должен быть постоянным и служит исключительно одной цели – выбраться из хаоса. Стадия хаоса является самой сложной по многочисленным причинам. Первая причина психологическая: руководитель себя чувствует комфортно, работая героем: “я лично починил косяк в продакшене, все меня любят, начальство ценит и какой всплеск адреналина”, вообщем “я Дартаньян, а все пи…”

Вторая причина практическая: руководителю нужно выбить ресурсы – время, вызвав на ковер бизнес/начальство. Тут прийдется торговаться, бороться и говорить “нет”. Это занятие опасное для карьеры – она может быстро прерваться. Однако, если у команды нет времени думать, учиться и пробовать, то команда так и останется в стадии хаоса.

Следующая стадия – рост. В этой стадии руководитель занимает роль наставника, он должен проводить много времени с командой, как обучая, так и подталкивая индивидуальных членов команды к росту. Цель и задача этой стадии в том, чтобы команда не нуждалась в руководителе. Автор приводит много интересных тактик для роста. Одна важная тактика: когда член команды приходит с проблемой (технической или социальной), внимательно выслушав, руководитель должен задать один вопрос: “Что ты будешь по этому поводу делать?”. Автор отмечает, что вопрос может показать человеку грубым и отталкивающим, однако это заставляет “пациента” думать и решать свои собственные проблемы. Тут важно отметить, руководитель не должен оставить все на самотек, однако он не должен все время решать все проблемы – трюк в том, чтобы подтолкнуть человека к решению своих собственных проблем. Интересная заметка: если вы боитесь, беспокоитесь, не уверены, чувствуете себя не комфортно – это значит что вы учитесь! Вы вышли из зоны комфорта и попали в новое русло. Данная стадия нужна для того, чтобы все члены команды научились решать свои проблемы, научились учиться и выходить из зоны комфорта.

Не менее важный момент стадии роста это дисциплина! Нет не армейская, а дисциплина по доставке обещанного. Если команда не доставляет обещанные фичи бизнесу, то жизнь станет крайне сложной и вполне может вернуться на стадию хаоса. В этом плане, автор рекомендует использовать командный язык: “я доделаю фичу к 18:00 сегодня”, “я вышлю спецификацию после встречи сегодня в 13:00” и так далее. Теперь все программисты знают, что многие вещи не возможно доставить в определенный срок – например починить баг. Может баг простой, а может засосать на очень долго. С этого ракурса нужно использовать технику тайм-боксинга (ограничения по времени) и сказать: “я буду работать над этим багом 2 дня”. Если по истечению времени баг все ещё не отремонтирован, то можно остановиться и пересмотреть решения, как технические, так и ресурсные – добавить время, добавить программиста, перенести проблему на следующий релиз и тому подобное.

Последняя стадия – самоуправление. В этой стадии руководитель занимает пассивную роль – переставая на прямую управлять командой и отдавая бразды правления команде. Руководитель фокусируется на ограничениях вокруг команды, помогая из вне. Насколько я понимаю, эта та самая стадия, которая описывается в книгах по скраму (scrum), где нет руководителя.

Книга весьма интересная, но короткая – всего 200 страниц! Автор правильно подобрал название: “Заметки… “, а не «Полное руководство…». Также стоит отметить, что в книге есть опечатки и кривое форматирование. Как говорил Даниэль Суарэз: у вас есть все возможное время, когда вы пишете свою первую книгу, а после этого нужно укладываться в рамки. Не уходя от критики, книга разбита на две части: заметки от самого автора и вторая половина: гости. Вторая половина книги устроена простым принципом: один гость, одна глава. Хотя бывает, что один и тот же гость пишет две главы. Каждая глава большое напоминает быстрый рецепт к “выздоровлению” и местами отдает рекламой другого материала. Справедливости ради, некоторые темы достойны отдельной книги, но все же, возможно стоило сфокусировать, добавить авторов и расширить материал – хотя это спорный момент.

Итого:
+: Простое и доступное изложение
+: Детальное обсуждение проблем и решений
+: Чувствуется аутентичный опыт автора
+: Хороший возврат по затратам (ROI)
-: Книга короткая и хотелось бы больше сценариев по управлению командой
=: Книга хорошая и будет полезна многим программистам, в особенности тем, кто уже или собирается стать главой/руководителем команды разработчиков. Я советую посмотреть семинар, если вам он показался полезным то вперёд за книгой. Бэкап копия семинара

Название: Notes to software team leader
Авторы: Roy Osherove
Обложки:


Influencer — the new science of leading change / Инфлуинсер — новая наука как возглавить перемены

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

Однако книга все же интересная и тут я не говорю «верьте всему написанному», я говорю «дайте шанс». Книга содержит довольно много полезных советов, подкрепленных историями и примерами. В центре всей концепции лежит шесть основных принципов влияния:

  • Личные мотивации
  • Личные способности
  • Социальные мотивации
  • Социальные способности
  • Структурные мотивации
  • Структурные способности

Авторы объясняют, что суть любого поведения всегда сводится к выше описанным факторам. Чтобы стать “властелином влияния” нужно овладеть всеми шестью принципами. Однако, не всегда нужно использовать все принципы, изначально нужно понять какие принципы поведения являются основными и какие принципы помогут это исправить. Чем сложнее проблема, тем больше принципов влияния нужно использовать одновременно!

На персональном уровне авторы отбрасывают идею воли (одним дано, другим нет) и утверждают, что само-контролю можно научиться, используя нехитрые трюки. Например: если вам очень хочется шоколадку, то можно отвлечь свое сознание мыслями о другом или играми. В таком же ключе можно бороться с раздражением и яростью, если чувствуете что «надвигается» тут же забросьте свой мозг какой-нибудь интеллектуальной задачей, да по-сложнее. Люди часто занимаются «не натуральными» занятиями — тем, что им не свойственно (например, чистка зубов), трюк в том чтобы сделать это занятие желаемым. В этом ракурсе человеку нужно ответить только на два вопроса: стоит ли оно того? И могу ли это сделать? Если ответ «да» на оба вопроса, то человек будет это делать!

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

На социальном уровне “игра” переходит на следующий уровень. Как ни странно, но люди — социальные животные и, соответственно, восприимчивы к соц. давлению, поэтому считаются с мнением лидеров / уважаемых в обществе людей. Один из подходов — найти лидеров и внедрять изменения через них — “если лидер так делает, то…”. Так же можно использовать групповую ответственность — все помогают и отвечают друг за друга, однако тут нужно убедиться в возможности открытого и безопасного обсуждения. Если ты видишь проблему, то она моментально должна быть вынесена на обозрение — никакого кода молчания! Так же не стоит забывать о простом методе “пряника и кнута”, но с ним нужно быть очень тактичным и острожным. Потенциальная проблема с “пряником” заключается в том, что она может привить неправильное поведение, например: раздаем “пряники” за перевыполнение плана — штампуем больше, качество меньше и в итоге компания несет убытки. Момент с кнутом: если не готов хлестать, то не угрожай. Люди очень быстро “схватывают” ваше бессилия и это может привести к пониженной продуктивности с вытекающими последствиями. Тут мне вспоминается книга: “Сначала надо нарушить все права”

Структурный уровень один из моих любимых по одной простой причине — чисто инженерский подход, который может легко пережить поколения! Многие советы приходят из мира массового производства, как в книге “14 принципов Тойоты”. Если сделать правильную архитектуру и/или устройства, то люди будут использовать их без какой-либо задней мысли, следуя заданному поведению. Тут поделюсь личным опытом: когда на работе решили повышать качество кода и установили автоматическую систему анализа, то люди резко стали смотреть на ошибки и исправлять найденое. И тут отмечу — да, система не идеальная, и знающие программисты легко могут “танцевать” вокруг неё! Однако стоит обратить внимание на 3 очень важных фактора:

  • Никому не хочется много танцевать, проще смириться и писать код по-лучше.
  • Система анализа предоставляет результаты в простой и доступной всем форме — очень легко найти и понять на что она жалуется.
  • Все программисты просматривают код друг друга.

По отдельности каждый фактор не несет большой пользы, однако взятые вместе, предоставляют эффективное устройство для нахождения и исправления ошибок.

Итого:
+: Простое и доступное изложение
+: Примеры и байки
+: Обсуждение каждого принципа
+: Много пересечений с уже пройденными материалами, плюс к доверию?
-: Книга коротка относительно материала – создается ощущение, что нужно “докупить” опыт на отдельных семинарах
=: Материал довольно интересный и, если у вас есть время, то рекомендую для общего развития. Я считаю, книга будет полезна тем кто находиться в позиции, где можно и нужно что-то менять.

Название: Influencer – the new science of leading change
Авторы: Joseph Grenny, Kerry Patterson, David Maxfield, Ron McMillan, Al Switzler
Обложки:

Beat the bank / Победи банк

Победи банк – канадский путеводитель к простому инвестированию.

Как ни странно, но за все надо платить. После рождения ребёнка, моя жена узнала, что канадское государство дарует деньги на высшее образование ребёнка. Формула достаточно простая: открываешь специальный образовательный банковский счёт на имя ребёнка и кладёшь туда деньги.  В свою очередь государство за каждые вложенные $2 доллара, вкладывает $1 с лимитом в районе $1300 в год. Однако держать деньги без какого-либо инвестирования довольно плохое решение, так как инфляция берет своё, а вдобавок, скажем $30000-$40000 для 4-х летнего университетского образования – маловато! Что делать? Инвестировать!

Я никогда не интересовался инвестициями, так как нечего было инвестировать – «все есть, а денег нет.». Однако ребёнок подтолкнул в правильную сторону и моя жена взялась за работу. Она прочитала книгу, изучила разные варианты инвестирования и сказал: вот книга, ты ее читаешь!

Скажу прямо, книга довольно шокирующая, так как раскрывает одну важную тему: комиссии больших банков на ваши инвестиции! Например, такой сценарий: вы работаете, откладываете, вкладываете в пенсионный фонд, проходит 30 лет, а вы узнаете что 40% вашего капитала ушли на оплату всяких банковских комиссий. Бред! Как такое может быть? Автор книги раскрывает секреты мастерства канадских банков: «…. иииии денег нет!»

Книга не глубокая, все банально и просто – автор упрощает все для читателя со средним образованием в 9 классов, обходя стороной теоретические темы! С одной стороны такой подход мне не нравится, с другой стороны это простой путеводитель по инвестированию – другого не обещали! Я лично считаю, что книга является отличным стартовым местом – разложены разные пути инвестирования, а так же предоставлено достаточно информации чтобы копать дальше самим.

Итого:
+: Легко читается
+: Все просто и наглядно
+: Раскрывает глаза на “мир”
+: Достаточно информации чтобы жить и не париться
-: Автор затрагивает тему налогообложения, но абсолютно поверхностно
=: Рано или поздно нам всем нужно откладывать деньги на пенсию. Автор написал хорошую, простую книгу для всех и, возможно, она спасет ваши накопления от комиссий больших банков.

Название: Beat the Bank: The Canadian Guide to Simply Successful Investing
Авторы: Larry Bates
Обложки:

Quotes from the book:

The stock market is a device for transferring money from the impatient to the patient. — Warren Buffet

There is nothing so passionate as a vested interest disguised as an intellectual conviction. — Frank Herbert, Author

Freedom is realizing you have a choice. — T. F. Hodge, Author

Архив Канадского Лося и Со. с rpod.ru

Сегодня перебирал старые файлы и нашел HTML архив подкаста “Канадского Лося и Со.” с первого русского подкаст-терминала Russian Podcasting (rpod.ru) – кто помнит те времена???

Сперва подумал стереть, но тут же передумал – какая память пропадает!?!?! Всем кому интересно, выкладываю 1.2 GB архив.