Русский
Русский
English
Статистика
Реклама

Командная работа

Организация рабочего процесса в команде на IT проекте

21.10.2020 14:12:03 | Автор: admin
Привет друзья.

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

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

В свое время я как раз и попал на такой проект, где были все эти прелести.

Никто не хотел брать на себя ответственность за проект (большой сервисный маркетплейс), текучка была страшная, заказчик просто рвал и метал. СЕО как-то подошел ко мне и сказал, что ты имеешь нужный опыт так вот тебе и карты в руки. Забирай проект себе. Облажаешься, проект закроем и всех выгоним. Получится, будет круто, тогда веди его и развивай, как считаешь нужным. В итоге я стал тимлидом на проекте и все легло на мои плечи.

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

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

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

Поскольку на моем проекте это работает, то может быть кому-то это также сможет помочь. Итак, сам процесс, который помог нам спасти проект:

Процесс работы команды на проекте Мой любимый проект


a) Внутри командный процесс (между разработчиками)

Все задачи создаются в системе Jira

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

Любая фича, если она достаточно сложная, разбивается на много мелких тасок

Команда работает над фичами, как единой таской. Вначале делаем все вместе одну фичу, отдаем ее на тестирование, затем берем следующую.

Каждая задача маркируется, для бэкенда или фронтенда она

Есть типы тасок и багов. Нужно верно их указывать.

После выполнения задачи она переводится в статус ревью кода (при этом создается пулл реквест на своего коллегу)

Тот кто выполнял задачу сразу же трекает свое время для этой задачи

После проверки кода, ПР апрувится и после этого, тот, кто выполнял эту задачу, самостоятельно мержит ее в мастер ветку, после чего изменяет ее статус в готова для деплоя на дев сервер.

Все задачи, готовые к деплою на дев сервер, деплоятся тимлидом (его зона ответственности), иногда членом команды, если что-то срочное. После деплоя все таски с готова к деплою на дев переводятся в статус готова к тестированию на деве

Все задачи тестирует заказчик

Когда заказчик протестировал задачу на деве, он переводит ее в статус готова для деплоя на прод

Для деплоя на прод мы имеем отдельную ветку, куда мержим мастер только перед деплоем

Если во время тестирования заказчик находит баги, то он возвращает задачу на доработку, устанавливая ей статус возвращена на доработку. Таким образом мы отделяем новые задачи от тех, которые не прошли тестирование

В итоге все задачи проходят путь от создания до завершения: To Do In Development Code Review Ready deploy to dev QA on dev (Return to dev) Ready deploy to prod QA on prod Done

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

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

Разработчики в первую очередь выполняют приоритетные задачи.

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

Все задачи, которые создает заказчик, попадают к тимлиду, который их оценивает, и либо просит заказчика доработать либо назначает на одного из членов команды.

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

Каждый день в одно и то же время (у нас это в 12.00) мы проводим митинг между всеми членами команды

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

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

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

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

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

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

Если разработчику не понятна суть задачи, а заказчик не смог толково ее разъяснить, то он приступает к следующей задаче. А текущую забирает тимлид и сам обсуждает ее с заказчиком.

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

Рабочий процесс происходит по скраму. Все разбито на спринты. Каждый спринт длится две недели.

Спринты создает, наполняет и закрывает тимлид.

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


б) Процесс работы с заказчиком

Каждый разработчик может и должен коммуницировать с заказчиком

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

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

Все диаграммы/блок-схемы/логику и т.д. мы сохраняем в Конфлюенсе/Жире, где просим заказчика в комментариях подтвердить правильность будущей реализации.

Мы стараемся не грузить заказчика техническими подробностями. Если нам нужно понимание того, как заказчик хочет, то рисуем примитивные алгоритмы в виде блок-схемы, которые заказчик может понять и сам все исправить/доработать.

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

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

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

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

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

Перед тем, как взять в работу любую задачу, мы должны удостоверится, что эта фича входила в условия нашего договора/контракта. Если это новая фича, которая выходит за пределы наших первоначальных договоренностей, то мы обязательно должны заэстимейтить эту фичу ((примерное время выполнения + 30%) х 2) и указать заказчику, что у нас уйдет столько-то времени на нее, плюс дедлайн смещается на время эстимейта помноженное на два. Сделаем задачу быстрее замечательно, все от этого только выиграют. Если нет, то мы подстраховались.

в) Что мы не приемлем в команде:

Необязательность, несобранность, забывчивость

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

Бровады и похвальбы от человека, который не доказал еще делом свои возможности и профессионализм. Если доказал, то можно, в рамках приличия :)

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

Когда специалист все время в офлайне и к нему сложно достучаться в рабочее время.

Токсичность в команде не допускается! Если кто-то с чем-то не согласен, то все вместе собираются на митинг и это обсуждают и решают.

________________________________________________________________________________

И еще ряд вопросов/тезисов, которые я иногда задаю своему заказчику, чтобы снять все недопонимания:

1. Какие у вас критерии качества?
2. Как вы определяете есть ли в проекте проблемы или нет?
3. Нарушая все наши рекомендации и советы по изменению/улучшению системы, все риски несете только вы
4. Любые мажорные изменения проекта (например, всевозможные экста флоу) будут приводить к возможному появлению багов (которые мы будем, естественно, фиксить)
5. Невозможно в течении пары минут понять, что за проблема произошла на проекте, а тем более тут же ее пофиксить
6. Мы работаем по конкретному продукт флоу (Таски в Жира Разработка Тестирование Деплой ). А значит мы не может реагировать на весь поток просьб и жалоб в чате
7. Программисты являются именно программистами, а не профессиональными тэстировщиками, и не могут обеспечить надлежащее качество тестирования проекта
8. Ответственность за конечное тестирование и прием задач на проде лежит полностью на вас
9. Если мы уже взяли в работу задачу, то не можем сразу же переключаться на другие, пока не доделаем текущую (иначе это приводит к еще большим багам и увеличению времени разработки)
10. Людей в команде стало меньше (по причине отпусков или болезней), а работы стало больше и мы физически не успеем реагировать на все, что вы хотите
11. Просьба с вашей стороны сделать деплой на прод без протестированных задач на деве это только ваши риски, а не разработчиков
12. Когда вы ставите нечеткие задачи, без корректного флоу, без макетов дизайна, то это требуюет от нас намного больших усилий и сроков реализации, так как нам вместо вас приходиться делать дополнительный объем работы
13. Любые таски по багам, без детального описания их возникновения и скриншотов, не дают нам возможности понять, что пошло не так, и как нам сэмитировать этот баг
14. Проект требует постоянной доработки и улучшений для повышения производительности и безопасности. Поэтому команда тратит часть своего времени на эти улучшения
15. По причине того, что у нас бывают переработки по часам (срочные фиксы), то мы должны их компенсировать в другие дни

Как правило, заказчик сразу понимает, что не так все просто в разработке софта, и одного желания тут явно недостаточно.

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

Всем удачи на проектах. Не выгорайте и постарайтесь улучшать свои процессы.

Исходник в моем блоге: https://cleverman.org/post/organizaciya-rabochego-processa-v-komande-na-it-proekte
Подробнее..

7 soft skills, которые нужно начинать прокачивать уже сейчас

22.10.2020 12:07:47 | Автор: admin
image

Быть программистом в 2020 году не то же самое, что десять лет назад. Мир постоянно меняется, и многие из умений, которые были важны тогда, со временем отошли на второй план. А какими навыками должен обладать разработчик, чтобы оставаться востребованным специалистом, например, через пять лет? Если у вас их нет, возможно, стоит подумать над их развитием уже сейчас?

Я Анастасия Горелова, руководитель программ обучения Хаб Знаний МойОфис. Занимаюсь проектированием и реализацией программ развития hard и soft skills наших сотрудников, обучаю коллег, партнеров и клиентов работе с продуктами МойОфис, а также продвигаю наши образовательные проекты в школах и университетах.

В этом посте я хочу поговорить про навыки, которые помогут оставаться востребованным разработчиком даже в условиях постоянных изменений, и рассказать о том, как их развитие реализовано в МойОфис. Обычно IT-специалисты делают ставку на научно-техническую базу, важную для понимания функционирования системы в целом. Сюда входит знание принципов работы ОС, сетевого стека, баз данных и математического аппарата, который лежит в основе любого алгоритма или протокола, и др. Однако одних только hard skills недостаточно также необходимы коммуникативные навыки, умение выстраивать рабочий процесс с командой и/или незнакомыми людьми, гибкость в принятии решений и другие soft skills. Причем важно не просто обладать ими soft skills должны быть интегрированы в общий процесс разработки и идти в тесной связке с профскилами. О семи из них сегодня и пойдет речь.

1. Комплексное решение проблем


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

image

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

Вопрос для самопроверки:

  • Коллеги жалуются на часто повторяющуюся проблему. Если бы она возникла в вашей команде, с чего бы вы начали ее решение?
  • Просчитываете ли вы возможные риски при выборе определенного решения?
  • Как понять, что вы действительно решаете проблему, а не устраняете ее симптомы?

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

2. Умение убеждать


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

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

Вопросы для самопроверки:

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

Мы развиваем этот навык, стимулируя сотрудников как можно чаще выступать внутри своей команды и на общих встречах перед другими отделами. Если коллеге предстоит выступление на внешней конференции, Хаб Знаний помогает с подготовкой: пока это точечные курсы, направленные на конкретные цели (развитие навыков публичного выступления, ораторского искусства, работы с возражениями и пр.), однако сейчас мы работаем над созданием внутренней школы спикеров, записаться в которую смогут все желающие сотрудники.

3. Навыки сотрудничества и работы в команде


Думаю, многие согласятся, что в IT-среде значимую роль играет сообщество: опытные разработчики помогают коллегам и охотно делятся экспертизой (Habr тому подтверждение). Тем не менее есть стереотип, что для программиста нормально быть замкнутым, однако с закрытым человеком трудно взаимодействовать, так как он почти никогда не предлагает идеи и не склонен обсуждать текущие процессы. Поэтому все больше компаний обращают внимание на то, умеет ли специалист работать в команде, понимает ли он коллег так же хорошо, как и сам проект, способен ли давать и принимать обратную связь.

image

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

Вопросы для самопроверки:

  • Вам нужно заговорить с коллегой, которого вы не знали ранее. С чего вы начнете?
  • Один из участников команды раз за разом сдает работу с ошибками. Как вы поступите?
  • Какие слова вы подберете, чтобы критика прозвучала доброжелательно?
  • Отмечаете ли вы успехи коллег и говорите ли о них публично?
  • Что помогает вам почувствовать настроение собеседника и настроиться на его волну?

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

4. Умение планировать свою работу


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

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

Вопросы для самопроверки:

  • Вас просят назвать сроки готовности проекта. Чем вы будете руководствоваться при оценке?
  • Разгар рабочего дня, и вдруг коллега присылает вам ссылку. Вы знаете, что там полезная и важная статья. Как вы поступите?
  • Составляете ли вы рабочие и личные планы на день/неделю/месяц? Как много из них удается выполнить?
  • Знаком ли вам метод планирования времени матрица Эйзенхауэра?
  • Знаете ли вы, сколько времени у вас в среднем уходит на каждый тип задач?
  • Сколько минут / часов в день вы проводите в социальных сетях? Отслеживаете ли вы каким-либо образом эту статистику? Используете ли тайм-трекеры?
  • Практикуете ли отдых от соцсетей и интернета, digital detox?

Для планирования работ и фиксации промежуточных вех проекта некоторые отделы МойОфис используют методологию Scrum и обучают ей новых сотрудников, чтобы группа работала слаженно. Часть команды в Москве ориентирована на освоение стандартных методик управления проектами по методологии PMI PMBoK. Мы в Хабе Знаний в свою очередь пополняем библиотеку компании материалами по тайм-менеджменту коллегам доступны актуальные новинки, техники из которых они могут начать внедрять сразу после прочтения.

5. Критическое мышление


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

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

Вопросы для самопроверки:

  • Задумываетесь ли вы при чтении материалов в интернете о том, кто и с какой целью их публикует?
  • Как вы определяете, какой информации можно доверять? На какие критерии вы опираетесь при выборе источников информации?
  • Проверяете ли вы адреса сайтов и защищенность соединения при переходе по незнакомым ссылкам?
  • Есть ли у вас список доверенных источников информации?

Для развития этого навыка мы рекомендуем как можно чаще рассматривать разные точки зрения на одну и ту же тему, отслеживать свое отношение к прочитанному и анализировать аргументацию, которую использует оппонент.

6. Постоянное обучение long life learning


Многие ведущие компании стремятся нанимать full-stack разработчиков, которые свободно работают с разными технологиями и платформами. Такие специалисты понимают принципы любой разработки, начиная с уровня ядра сети и заканчивая уровнем интерфейса. Этого невозможно достичь, если не взять за правило постоянно изучать новое. Востребованного разработчика определяет не только владение редким стеком, но и способность легко переключаться между разными языками и стремление изучать новые инструменты каждый день.

image

Пример: хотя Java и C# уже несколько лет занимают значительную часть рынка, IT-компании все чаще используют более новые технологии (Kotlin, Swift и др). И логично, что разработчики, хорошо владеющие несколькими языками, дадут фору тем, кто знаком с одной-двумя технологиями. Через пять лет наверняка появятся новые стеки, поэтому чтобы оставаться востребованным, важно постоянно учиться и уметь выбирать подходящий инструмент для решения конкретной задачи, основываясь на комплексном анализе факторов.

Вопросы для самопроверки:

  • Участвуете ли вы в развитии open-source проектов? Сколько коммитов вы сделали за прошедший год? Сколько создали багов и предложений в трекере? На сколько вопросов ответили?
  • Как давно вы изучали незнакомую для себя технологию?
  • Как вы поступите, если узнаете о появлении нового языка, который набирает популярность?
  • Как вы реагируете, если вам предлагают пойти на обучающее мероприятие?
  • Какие профессиональные конференции вы посещаете?
  • Чему вы научились в вашей профессиональной области за последние полгода?

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

7. Соблюдение work-life balance


Cоблюдение work-life balance и ваше самочувствие прямо влияют на продуктивность: тот, кто заботится о себе, обычно живет дольше, работает эффективнее и успевает уделять должное внимание другим важным делам. Тема здоровья тесно связана со всеми сферами жизни, в том числе с работой. Не буду ничего говорить про биохакинг и вживление чипов под кожу (это тема отдельного поста а то и не одного), этот пункт больше про внимание к телу, к психоэмоциональному состоянию, а еще о том, что разделение личной и профессиональной жизни помогает им взаимно друг друга поддерживать. Старайтесь быть терпимее к другим, особенно если их точка зрения противоречит вашей, выражайте чувства без вреда окружающим и осознавайте, на что вы можете повлиять, а на что нет. Найдите хобби по душе и помните, что от того, как организована ваша жизнь после работы и учебы, будут отчасти зависеть и карьерные успехи.

Пример: чтобы чувствовать себя бодрым и больше успевать, вы вовремя ложитесь спать, не пользуетесь телефоном за два часа до сна и не хватаетесь за него первым делом с утра, не переедаете. Благодаря этому вы дольше остаетесь внимательным и энергичным.

Вопросы для самопроверки:

  • Когда вы последний раз проходили комплексное обследование?
  • Что вы делаете для того, чтобы ваше питание было сбалансированным?
  • Сколько часов в сутки вы спите? Высыпаетесь ли вы? Если нет, что вы можете сделать уже сейчас для улучшения качества вашего сна?
  • Утром вы чувствуете себя простывшим, но нужно ехать на работу. Как вы поступите?
  • Работаете ли вы в отпуске? Доделываете ли проекты в выходные? Пишете ли в рабочие чаты по вечерам?
  • Какие у вас хобби? Давно ли вы увлекались чем-то для себя новым?

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

Вместо послесловия


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

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

Рецепт дня готовим сообщество профессионалов, не выходя из своего отдела

14.01.2021 10:07:09 | Автор: admin

Историями о профессиональных сообществах сейчас вряд ли кого-то удивишь. Гильдии образуют по разным причинам: кто-то из интереса, кто-то чтобы быть в тренде, а кто-то из-за недостатка общения на профессиональные темы. Это история о том, как бизнес-направление компании ЦФТ, Денежные Переводы Online, желая производить больше и быстрее, в очень короткий срок утроило штат инженеров, которых не успели нормально заонбордить, и в итоге чуть не уронили качество продукта и не сожгли ключевых членов команды.

Доклад в виде пошагового рецепта QA-лидам, fullstack feature team-лидам, SM и всем тем, кто решает задачу эффективной настройки процессов команд, представила на конференции TeamLead Conf 2020 Head of Android QA одного из флагман-продуктов компании ЦФТ Надежда Потаенко.

Продукт ЦФТ Золотая Корона в 2016 году прочно стояла на позиции самой крупной системы денежных переводов без открытия счета на территории России и СНГ. В момент, о котором пойдет повествование, у пользователей появилась возможность начать отправлять переводы не только офлайн, но и через веб и мобильные фронты.

И команду разработки начало потихонечку взрывать, потому что в эти мобильные фронты резко устремились несколько миллионов активных клиентов.

Стало понятно, что продукт взлетел, и его надо срочно развивать. Именно высокая востребованность продукта заставила ЦФТ очень быстро вырасти. За три года команда разработки продукта Денежные Переводы Online увеличилась с 7 до 200+ человек. В какой-то момент старые производственные процессы просто перестали работать. Сотрудники вынуждены были отправиться на поиски новых конфигураций.

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

Для кого готовим?

Гильдия, о которой мы поговорим это 25 QA Android инженеров. Если вы не имеете отношения к качеству, это не страшно. Рекомендации, которые вы увидите здесь, легко портируются как на команду разработки, так и на команду аналитики. Информация может быть полезна даже agile-гуру и вообще всем людям, которые ищут точку опоры для создания профессионального сообщества, но пока что ее не нашли.

Пойдемте к холодильнику и посмотрим, что там было на момент, когда Надежда начинала готовить.

Что было в холодильнике?

Шел 2016 год, и в компании стал развиваться продукт, который начал активно зарабатывать деньги. Ранее этот продукт разрабатывала сравнительно небольшая команда из 20 человек (4 компонентные команды: Backend, Web, iOS, Android), все сидели в славном городе Томске и были экспертами в продукте. Казалось, все идет просто идеально!

Но как это часто бывает, заказчик с этим согласен не был. В 2017 году он начал задавать вопросы о том, почему продукт так долго релизят?

Так много и быстро производить не получалось просто не хватало рук. ОК, просили получайте!

Настал 2018, и боги провозгласили год найма и новых рук. Компания начала расти, причем не только в Томске, но параллельно в Новосибирске и в Питере. На графике видно, что в конце 2018 появилось 130 инженеров в 3 локациях, а в 2019 их стало больше 200. Это около 30 команд, которые сейчас совместно пилят один и тот же продукт: Денежные Переводы Online.

От такого роста ожидали увеличение скорости разработки и сокращение TTM, но получили совершенно иную картину.

В какой-то момент, когда количество людей начало стихийно расти, скорость разработки упала более, чем в два раза. Вместе с этим просело качество продукта. А в качестве негативного бонуса, у ключевых членов старой команды началось выгорание.

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

  • Не успевали качественно онбордить

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

  • Разный уровень hard skills в разных локациях

Но как оказалось, это была не единственная проблема. Из-за асинхронности найма обнаружилось, что в распределенной команде сильно отличается понятие о нормальном уровне hard skills по локациям.

Например, в Томске инженеры предпочитали вести тестовую документацию в виде чек-листов и подробно там ничего не расписывать. В Питере считали, что это хаос и вред, и каждое ответвление flow должно быть покрыто стопочкой тест-кейсов.

Другой пример: в Новосибирске инженеры считали, что побегать за аналитиком и дожать из него недостающую информацию это ОК. В Питере ребята сказали: Ну нет! Должен быть четкий Definition of Ready. Мы ни за кем бегать не будем!

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

  • Релизила по-прежнему одна команда

Главная боль всего 2018 и части 2019 года заключалась в том, что несмотря на увеличение количества команд, которые в изоляции друг от друга производили вполне годные фичи, стабилизацией, сборкой, багфиксингом, поставкой в прод занималась по-прежнему одна и та же релиз-команда. Конечно, она не могла качественно пропустить через себя такой объем производства.

Выпуская релизы раз в 2-3 недели, члены команды горели на работе, потому что жили там до 2 часов ночи. Они почти ненавидели новых людей, которых зачем-то кто-то нанял.

В какой-то момент Надежда поняла, что надо спасать коллег по цеху.

Шаг 1: Перемешать и поставить на плиту

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

  • Повысить степень причастности и ответственности;

  • Выровнять уровень понимания бизнес-логики продукта.

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

Шаг 2: Довести до кипения

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

Например, что-то тестили, попали на незнакомый flow, испугались, завели баг, кинули его в чат Android: кто-нибудь потом разберется. А на самом деле просто заехала новая фича, поменялся flow, а тест-кейсы еще не актуализировали.

Приправим все это классическими проблемами распределенных команд: в Питере сотрудники проснулись и пришли в офис, а в Томске и Новосибирске уже ушли. И команда заводила три одинаковых бага, потому что согласованности в работе не было.

Кроме того, существовала токсичность локаций в адрес друг друга. Например, эксперты в Томске были в ярости от того, что их коллеги заводят ненормированное количество багов, которые за ними надо перепроверять и закрывать. А новички злились на то, что какие-то распальцованные ребята в Томске закрывают их задачи без объяснения причин.

Как тушить все это, было непонятно.

Шаг 3: Остудить, еще раз перемешать

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

  • Выработать единый подход к регрессу;

  • Найти способы ускорить регресс;

  • Восстановить качество релизов;

  • Делиться друг с другом экспертизой в продукте.

Все QA в команде Денежных Переводов Online находятся в своих фича-командах. В каждом спринте у них есть собственные sprint goal. Но понимания, зачем QA-инженеры из этих обособленных фиче-команд раз в две недели собираются все вместе в трех локациях, чтобы кому-то помогать, ни у кого не было. Надежда решила начать сначала, и собрать всех очно в одной локации.

Это предпринималось для того, чтобы за аватарками в сети все увидели реальные лица, поняли, что все одинаково болеют за продукт, но из-за отсутствия настроенных процессов тянут в разные стороны, как лебедь, рак и щука.

А еще ей хотелось сформулировать цель совместной работы.

Летом 2019 года все собрались и познакомились, после чего родилась цель: выпускать качественный продукт быстро, чтобы заказчик и пользователи были довольны.

Качественно и быстро это отсылки к желаемому сокращению ТТМ и к восстановлению уровня качества.

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

Мозговой штурм был построен на базе книги 5 пороков команды Патрика Ленсиони. И на него было потрачено около 8 часов.

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

Когда участники встречи разъезжались, заряд community был такой мощный, что все говорили: Эге-гей! Да мы следующий регресс вообще за день бахнем!.

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

Шаг 4: Выпекать до готовности

В команде Денежных Переводов Online договорились проводить регулярные встречи гильдии раз в 2 недели.

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

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

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

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

Канал коммуникации очень простой: QA-инженеры раз в две недели встречаются онлайн в Microsoft Teams.

За счет таких встреч им удалось выработать единый подход к регрессу и найти способы ускорить его.

Осторожно! Горячо!

Так как речь идет о коммуникациях людей, нужно понимать, что регулярные встречи инженеров не всегда будут конструктивны

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

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

Шаг 5: Сбрызнуть соком лимона

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

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

В команде появился такой wishlist:

В Confluence сотрудники компании сами вписывают темы, которые они хотят послушать, или о которых готовы рассказать. Коллеги лайкают, и если тема популярна, она попадает в анонс. Казалось бы, что может быть проще и работоспособнее?

Но проблемы начались с самого первого митапа.

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

С тех пор в команде договорились, что все на 100% должны четко понимать, что именно будет обсуждаться.

А на другом митапе, где должны были говорить на интересную всем тему, докладчицы неожиданно засмущались и начали читать с листа, чем усыпили всех уже через пять минут. Теперь существует правило и на этот счет: должна быть прямая речь.

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

Шаг 6: Дать отдохнуть

В ДП Online решили отправлять сотрудников в командировки для того, чтобы они начали встречаться не только онлайн, но и лично. Когда появилась страничка графика поездок, очередь туда выстроилась до конца 2020 года. И все, естественно, хотели в Питер, ведь две другие локации находились в Сибири.

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

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

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

Профиты командировок:

  • Для продукта: быстрый шаринг экспертизы;

  • Для инженеров: сменить обстановку, пообщаться с иногородними коллегами.

За счет командировок сотрудникам QA-сообщества ДП Online удалось выработать единый подход к регрессу и найти способы ускорить его, восстановить качество релизов и делиться друг с другом экспертизой в продукте.

Что дальше?

В 2020 году в ЦФТ появились новые цели саморазвития гильдии.

  • Коммуникация с QA-гильдиями других платформ продукта;

Если в 2019 году сотрудники команды притирались и учились друг с другом общаться, то сейчас внутри Android community очень теплая и уютная атмосфера. Но там готовы раздвинуть границы и подсмотреть, что происходит у других сообществ. Уже запланированы встречи кросс-платформенного community.

  • Ежемесячные публикации блога с обзором новостей платформы и сообщества.

Обо всех нововведениях и текущих изменениях хочется рассказывать, поэтому в QA-сообществе начали выпускать блог с обзором новостей.

Есть и продуктовые цели.

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

Выводы в цифрах и фактах

На картинках активности, которые пробовали применять в QA-сообществе ДП Online.

Рост качества, произошедший на почве работы сообщества, напрямую отразился на количестве hot fixов на число выпущенных версий.

И немного статистики релизов продукта за 2018-2019 годы. Внизу красным подсвечены hot fixы. В 2018 году в ДП Online было нормой раз в 3-4 релиза выпустить hot fix. С 2019 года, когда начала собираться гильдия экспертов, hot fixов почти нет. За весь 2019 год выпустили всего 4. Причем речь не о клиентских, а о технических hotfixах, например, когда какое-то событие было потеряно в Google Analytics.

Кроме того, активности, которые были направлены на решение продуктовых проблем, принесли несколько положительных сайд-эффектов:

  • Тюнинг soft skills;

  • Единое информационное поле;

  • Здоровая конкуренция;

  • Новые лиды.

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

Программный комитет Saint TeamLead Conf 2021 ждет ваши доклады.

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

Присоединяйтесь!

Подробнее..

Переписывание истории репозитория кода, или почему иногда можно git push -f

22.09.2020 16:11:47 | Автор: admin


Одно из первых наставлений, которое молодой падаван получает вместе с доступом к git-репозиториям, звучит так: никогда не ешь жёлтый снег делай git push -f. Поскольку это одна из сотен максим, которые нужно усвоить начинающему инженеру-разработчику ПО, никто не тратит время на уточнение, почему именно так нельзя делать. Это как младенцы и огонь: спички детям не игрушки и баста. Но мы растём и развиваемся как люди и как профессионалы, и однажды вопрос а почему, собственно? встаёт в полный рост. Эта статья написана по мотивам нашего внутреннего митапа, на тему: Когда можно и нужно переписывать историю коммитов.



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

Для этого, в свою очередь, нам понадобится быстрый экскурс в физическую структуру git-репозитория. Если вы точно уверены, что знаете об устройстве репо всё, то можете пропустить эту часть, но даже я в процессе выяснения узнал для себя довольно много нового, а кое-что старое оказалось не вполне релевантным.

На самом низком уровне git-репо представляет собой набор объектов и указателей на них. Каждый объект имеет свой уникальный 40-значный хэш (20 байт в 16-ричной системе), который вычисляется на основе содержимого объекта.



Иллюстрация взята из The Git Community Book

Основные типы объектов это blob (просто содержимое файла), tree (набор указателей на blobs и другие trees) и commit. Объект типа commit представляет собой только указатель на tree, на предыдущий коммит и служебную информацию: дата/время, автор и комментарий.

Где здесь ветки и тэги, которыми мы привыкли оперировать? А они не являются объектами, они являются просто указателями: ветка указывает на последний коммит в ней, тэг на произвольный коммит в репо. То есть когда мы в IDE или GUI-клиенте видим красиво нарисованные веточки с кружочками-коммитами на них они строятся на лету, пробегая по цепочкам коммитов от концов веток вниз к корню. Самый первый коммит в репо не имеет предыдущего, вместо указателя там null.

Важный для понимания момент: один и тот же коммит может фигурировать в нескольких ветках одновременно. Коммиты не копируются при создании новой ветки, она просто начинает расти с того места, где был HEAD в момент отдачи команды git checkout -b <branch-name>.

Итак, почему же переписывание истории репозитория вредно?



Во-первых, и это очевидно, при загрузке новой истории в репозитории, с которым работает команда инженеров, другие люди могут просто потерять свои изменения. Команда git push -f удаляет из ветки на сервере все коммиты, которых нет в локальной версии, и записывает новые.

Почему-то мало кто знает, что довольно давно у команды git push существует безопасный ключ --force-with-lease, который заставляет команду завершиться с ошибкой, если в удалённом репозитории есть коммиты, добавленные другими пользователями. Я всегда рекомендую использовать его вместо -f/--force.

Вторая причина, по которой команда git push -f считается вредной, заключается в том, что при попытке слияния (merge) ветки с переписанной историей с ветками, где она сохранилась (точнее, сохранились коммиты, удалённые из переписанной истории), мы получим адское число конфликтов (по числу коммитов, собственно). На это есть простой ответ: если аккуратно соблюдать Gitflow или Gitlab Flow, то такие ситуации, скорее всего, даже не возникнут.

И наконец есть неприятная побочка переписывания истории: те коммиты, которые как бы удаляются при этом из ветки, на самом деле, никуда не исчезают и просто остаются навечно висеть в репо. Мелочь, но неприятно. К счастью, эту проблему разработчики git тоже предусмотрели, введя команду сборки мусора git gc --prune. Большинство git-хостингов, как минимум GitHub и GitLab, время от времени,
производят эту операцию в фоне.

Итак, развеяв опасения перед изменением истории репозитория, можно, наконец, перейти к главному вопросу: зачем оно нужно и когда оправдано?

На самом деле, я уверен, что практически каждый из более-менее активных пользователей git хоть раз, да изменял историю, когда вдруг оказывалось, что в последнем коммите что-то пошло не так: вкралась досадная опечатка в код, сделал коммит не от того пользователя (с личного e-mail вместо рабочего или наоборот), забыл добавить новый файл (если вы, как я, любите пользоваться git commit -a). Даже изменение описания коммита приводит к необходимости его перезаписи, ведь хэш считается и от описания тоже!

Но это тривиальный случай. Давайте рассмотрим более интересные.

Допустим, вы сделали большую фичу, которую пилили несколько дней, отсылая ежедневно результаты работы в репозиторий на сервере (4-5 коммитов), и отправили свои изменения на ревью. Двое-трое неутомимых ревьюверов закидали вас крупными и мелкими рекомендациями правок, а то и вовсе нашли косяки (ещё 4-5 коммитов). Затем QA нашли несколько краевых случаев, тоже требующих исправлений (ещё 2-3 коммита). И наконец при интеграции выяснились какие-то несовместимости или попадали автотесты, которые тоже надо пофиксить.

Если теперь нажать, не глядя, кнопку Merge, то в главную ветку (у многих она по старинке называется master) вольются полтора десятка коммитов типа My feature, day 1, Day 2, Fix tests, Fix review и т.д. От этого, конечно, помогает режим squash, который сейчас есть и в GitHub, и в GitLab, но с ним надо быть осторожными: во-первых, он может заменить описание коммита на что-то непредсказуемое, а во-вторых заменить автора фичи на того, кто нажал кнопку Merge (у нас это вообще робот, помогающий релиз-инженеру собрать сегодняшний деплой). Поэтому самым простым будет перед окончательной интеграцией в релиз схлопнуть все коммиты ветки в один при помощи git rebase.

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



У меня рука машинально потянулась к кнопке Report abuse, потому что как ещё можно охарактеризовать реквест из 50 коммитов с почти 2000 изменённых строк? И как его, спрашивается, ревьюить?

Честно говоря, у меня ушло два дня просто на то, чтобы заставить себя приступить к этому ревью. И это нормальная реакция для инженера; кто-то в подобной ситуации, просто не глядя, жмёт Approve, понимая, что за разумное время всё равно не сможет сделать работу по обзору этого изменения с достаточным качеством.

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

Сделать это всё нам поможет всё тот же git rebase с ключом --interactive. В качестве параметра надо передать ему хэш коммита, начиная с которого нужно будет переписать историю. Если речь о последних 50 коммитах, как в примере на картинке, можно написать git rebase --interactive HEAD~50 (подставьте вместо 50 вашу цифру).

Кстати, если вы в процессе работы над задачей подливали к себе ветку master, то сначала надо будет сделать rebase на эту ветку, чтобы merge-коммиты и коммиты из мастера не путались у вас под ногами.

Вооружившись знаниями о внутреннем устройстве git-репозитория, понять принцип действия rebase на master будет несложно. Эта команда берёт все коммиты в нашей ветке и меняет родителя первого из них на последний коммит в ветке master. См. схему:




Иллюстрации взяты из книги Pro Git

Если изменения в C4 и C3 конфликтуют, то после разрешения конфликтов коммит C4 изменит своё содержание, поэтому он переименован на второй схеме в C4.

Таким образом, вы получите ветку, состоящую только из ваших изменений, и растущую из вершины master. Само собой, master должен быть актуальным. Можно просто использовать версию с сервера: git pull --rebase origin/master (как известно, git pull равносилен git fetch && git merge, а ключ --rebase заставит git сделать rebase вместо merge).

Вернёмся наконец к git rebase --interactive. Его делали программисты для программистов, и понимая, какой стресс люди будут испытывать в процессе, постарались максимально сохранить нервы пользователя и избавить его от необходимости чрезмерно напрягаться. Вот что вы увидите на экране:


Это репозиторий популярного пакета Guzzle. Похоже, что rebase ему не помешал бы

В текстовом редакторе открывается сформированный файл. Внизу вас ожидает подробная справка о том, что тут вообще делать. Далее в режиме простого редактирования вы решаете, что делать с коммитами в вашей ветке. Всё просто, как палка: pick оставить как есть, reword поменять описание коммита, squash слить воедино с предыдущим (процесс работает снизу вверх, то есть предыдущий это который строчкой ниже), drop вообще удалить, edit и это самое интересное остановиться и замереть. После того, как git встретит команду edit, он встанет в позицию, когда изменения в коммите уже добавлены в режим staged. Вы можете поменять всё, что угодно в этом коммите, добавить поверх него ещё несколько, и после этого скомандовать git rebase --continue, чтобы продолжить процесс rebase.

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

Если вы запутались и кажется, что всё пропало, у вас есть кнопка аварийного катапультирования git rebase --abort, которая немедленно вернёт всё как было.

Вы можете повторять rebase несколько раз, затрагивая только части истории, и оставляя остальные нетронутыми при помощи pick, придавая своей истории всё более и более законченный вид, как гончар кувшину. Хорошим тоном, как я уже написал выше, будет сделать так, что тесты в каждом коммите будут зелёными (для этого отлично помогает edit и на следующем проходе squash).

Ещё одна фигура высшего пилотажа, полезная в случае, если надо несколько изменений в одном и том же файле разложить по разным коммитам git add --patch. Она бывает полезна и сама по себе, но в сочетании с директивой edit она позволит вам разделить один коммит на несколько, причём сделать это на уровне отдельных строк, чего не позволяет, если я не ошибаюсь, ни один GUI-клиент и ни одна IDE.

Убедившись ещё раз, что всё в порядке, вы наконец можете со спокойной душой сделать то, с чего начался этот туториал: git push --force. Ой, то есть, разумеется, --force-with-lease!



Поначалу вы, скорее всего, будете тратить на этот процесс (включая первоначальный rebase на master) час, а то и два, если фича реально развесистая. Но даже это намного лучше, чем ждать два дня, когда ревьювер заставит себя наконец взяться за ваш реквест, и ещё пару дней, пока он сквозь него продерётся. В будущем же вы, скорее всего, будете укладываться в 30-40 минут. Особенно помогают в этом продукты линейки IntelliJ со встроенным инструментом разрешения конфликтов (full disclosure: компания FunCorp оплачивает эти продукяы своим сотрудникам).

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

Спасибо за внимание всем, кто дочитал до конца! Надеюсь, что статья будет полезна не только вам, но и коллегам, которым ваш код попадает на ревью. Если у вас есть клёвые хаки для git делитесь ими в комментариях!
Подробнее..

Перевод Совместная игра в Factorio лучшее техническое собеседование, что мы проводили

09.04.2021 14:13:02 | Автор: admin
В последнее время много копий сломано вокруг технических собеседований. Очевидно, что инвертирование двоичного дерева на доске практически никак не связано с практическими навыками реального программиста. Примитивный Fizzbuzz по-прежнему остаётся самым эффективным тестом. Как следствие, выросло внимание к опенсорсным проектам, но оказалось, что это тоже не очень хороший показатель, потому что у большинства профессионалов нет на них времени.

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

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

Factorio?


Factorio это игра об автоматизации. Вероятно, лучшим введением будет этот трейлер, но, по сути, ваша задача построить автоматизированный завод, способный запустить ракету в космос.

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

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

Выбор направления


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

Конкретные ожидания можно сформулировать так:

  • Стажёр, как правило, должен быть в состоянии разместить чертёж и соединить его с чем-то ещё, например, с месторождением руды.
  • От джуниоров ожидают самостоятельного строительства производственной линии, пусть и не оптимальной. Им может понадобиться помощь старшего разработчика в том, как правильно направить конвейеры ко всем промежуточным сборочным автоматам.
  • Как только получено задание, миддл должен спроектировать почти оптимальную производственную линию (без маяков) с минимальным контролем.
  • Ведущий программист не нуждается в руководстве, способен сам определить цели и разработать план действий, а затем делегировать эти задачи другим программистам.

Командная работа


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

Если игрок уйдёт в себя, начнёт делать всё сам или молча исправлять проблемы, это быстро навлечёт на него гнев команды по тем же самым причинам, по которым коллеги злятся на программистов-ковбоев. К счастью, в Factorio есть встроенный эквивалент git blame: он показывает последнего игрока, который изменил любую сущность. Таким образом, если кто-то поставил костыль и не сообщил команде о проблеме, то когда этот костыль наконец сломается все узнают, кто виноват. Если хотите выиграть, придётся плотно сотрудничать с товарищами по команде.

Отладка


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

Отладка в Factorio быстро усложняется. Как только вы построите нефтеперерабатывающий завод, то займётесь крекингом, где на выходе три разных трубы (мазут, дизельное топливо и попутный нефтяной газ), и если какая-то из них по какой-то причине стопорится, то весь завод прекращает работу.

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

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

Код-ревью


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

Сопротивление фидбеку без веских причин хорошо известный красный флаг. Кроме того, настороженность вызывает программист, который неохотно принимает предлагаемые изменения и отказывается соответствующим образом корректировать будущие проекты. В итоге ему придётся постоянно напоминать о необходимости придерживаться какого-то стандартного способа решения проблемы. При этом человек не объясняет, почему ему не нравится предлагаемый метод. Это потенциально бомба замедленного действия в организации, потому что без присмотра он может быстро накопить технический долг для своих коллег. Такого рода проблемы практически невозможно уловить на традиционном собеседовании, только на стажировке.

Стиль написания кода и фреймворки


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

Конструкция магистрального ленточного конвейера включает 4-8 конвейеров, разделённых на две секции (для подземных конвейеров). Он помещается в центре фабрики, и всё производство происходит перпендикулярно ленте. Эта конструкция опирается на несколько правил, нарушение которых может привести к полному хаосу. Во-первых, всегда следует использовать разделитель на выходе с конвейера. Никогда нельзя перенаправлять всю ленту: пустое пространство для другой ленты означает, что вы теряете целый конвейер ресурсов, даже после апгрейда. Во-вторых, все заводы должны масштабироваться перпендикулярно основному конвейеру. Невозможность быстрого масштабирования приведёт либо к огромной потере пространства, либо к невозможности масштабирования производственной линии, потому что она окружена другими производственными линиями.


Логистическая сеть

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

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


Неоптимальный дизайн завода на дронах, источник

Многопоточность


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

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

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

Масштабирование


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

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

В конце игре для управления поездами требует перехода с push-архитектуры на pull-архитектуру, поскольку push-архитектура не справляется с высокой пропускной способностью. Это неизбежно приводит к использованию функции Train Limit и изучению, как использовать логические сети для кодирования базовой логики, чтобы станция запрашивала поезд только тогда, когда действительно готова полностью заполнить его ресурсами, вместо обычной игровой тактики в начале игры, когда куче поездов просто даётся команда ехать за железом. Новая схема сводит к минимуму количество поездов и при этом гарантирует, что в сети обслуживаются все станции.

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

Микросервисы и модули


В конце концов, заводы становятся настолько огромными, что приходится отказаться от простого дизайна с основным ленточным конвейером или спагетти-дизайна и перейти на более масштабируемую структуру. Чтобы выйти на мега-уровень, заводы обычно используют либо систему поездов, либо модульную систему, которая примерно соответствует микросервисам или архитектуре с плагинами.

Мегабазу на основе поездов иногда называют дизайном городских кварталов (city-block), где поезда вокруг кварталов завода контролируют все входы и выходы. Таким образом, каждый отдельный квартал изолирован от всех остальных, поскольку все входные данные чисты в том смысле, что они поступают из железнодорожной сети. Это почти идентично архитектуре микросервисов (по HTTP) или межпроцессному взаимодействию (IPC), с аналогичными потенциальными проблемами из-за задержек I/O, поскольку результаты не могут поступать постоянно, они должны передаваться в пакетах или поездах по железнодорожной сети.

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

Такие мегабазы представляют верхний уровень дефолтного сервера Factorio. Конечно, существует много модов, которые гораздо усложняют игру.

Распределённые системы


Space Exploration полностью переделанная версия Factorio для колонизации космоса. Здесь планеты становятся ограниченными ресурсами, требуя от игроков колонизировать другие миры и использовать ракеты для передачи ресурсов между планетами. Из-за огромной задержки с доставкой материалов между планетами, координация этих баз приводит к возникновению проблем, сходных с глобально распределённой системой баз данных. Даже в логической сети приходится бороться с задержкой, потому что автоматическая система теряет из виду элементы, которые запущены, но ещё не достигли целевой планеты. Если это не учитывать, возникают дубликаты запросов для всех нужных элементов. С точно такой же проблемой сталкиваются распределённые системы при попытке обеспечить согласованность между узлами.

Вывод


В целом софтверная индустрия не имеет ни малейшего представления, как находить и нанимать лучших разработчиков. Наверное, совместная игра в Factorio стала лучшим техническим собеседованием, которые мы когда-либо проводили. И это нас сильно смущает. Такое собеседование дико непрактично, занимает более 20 часов в мультиплеере с первого раза или 8 часов для команды опытных игроков. Что из этого можно извлечь? Не знаю. Мы, конечно, не можем перейти на Factorio в качестве метода собеседований с таким же успехом можно просто дать кандидату домашнее задание.

Но это уже лучше, чем собеседование на доске.
Подробнее..

Перевод Парное программирование цели, преимущества

08.06.2021 10:08:20 | Автор: admin

Это продолжение перевода статьи о парном программировании. С первой частью можно ознакомиться здесь.

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

Итак, как же работа в паре поможет достичь этих целей?

Обмен знаниями

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

Практические советы

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

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

Размышления

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

Практические советы

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

Сосредоточение

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

Практические советы

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

Ревью кода на ходу

Когда мы в паре, у нас есть 4 глаза для рассмотрения малых и больших дел: мы можем поймать больше ошибок прямо на ходу, а не после завершения работы.

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

Но совместное ревью кода имеет также и свои минусы. К ним мы вернемся позже.

Практические советы

Задавайте вопросы друг другу! Вопросы - самый мощный инструмент для понимания того, что вы делаете, и выбора наилучшего решения. Если одному из вас сложно прочитать код, попробуйте сделать по-другому, чтобы стало понятнее.

Совмещение двух моделей мышления

Как мы упоминали ранее (в первой части), рассматривая классическую модель Ведущий/Штурман, совместная работа позволяет получить разные взгляды на код. Мозг Ведущего обычно работает в режиме тактики, размышляет о деталях и текущих строчках кода. В то время как мозг Штурмана думает более стратегически и охватывает бОльшую картину, отмечает следующие шаги и идеи на клеющихся стикерах. Может ли один человек сочетать в себе оба режима одновременно? Конечно, нет! Поэтому такой "удвоенный" взгляд улучшает качество кода, так как включает рассмотрение и деталей, и общей картины.

Практические советы

Не забывайте регулярно меняться местом у клавиатуры и ролями. Это поможет взбодриться, не уставать и практиковать оба подхода.

Как "Штурман", избегайте тактического мышления, разбора деталей кода - того, что делает "Ведущий". Ваша работа - отойти на пару шагов и дополнить вашу пару в части тактики и среднесрочным планированием.

Коллективное владение кодом

Коллективное владение кодом исключает идею индивидуального владения модулями. Исходный код принадлежит всей команде и каждый может когда угодно вносить туда изменения.

Мартин Фаулер

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

Практические советы

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

Установка WIP-лимитов для команды

Ограничение числа незавершенных задач, как один из базовых принципов Канбан, увеличивает продуктивность сотрудников. Следование технике WIP-лимитов (аббревиатура от Work In Progress) помогает сосредотачиваться на ключевых задачах. Многозадачность неэффективна даже для одного человека, что говорить о целой команде. Парное программирование позволяет ограничить число задач, прорабатываемых параллельно, и тем самым увеличить общую сосредоточенность. Это гарантирует непрерывность рабочего процесса без подводных камней.

Практические советы

Ограничьте список задач в работе для нескольких разработчиков и обнародуйте в рабочем пространстве вашей команды (или в таск-менеджере). Сверяйтесь со списком перед постановкой новых задач. Это дисциплинирует и поможет закрепить привычку работать по парам.

Быстрая адаптация новых сотрудников

Так как совместная работа облегчает обмен знаниями, она также может помочь и в адаптации. Благодаря помощи напарника новички могут погрузиться в проект и дела компании. Это поможет рабочему процессу новичка: людям нужно время, чтобы познакомиться, а смена команды позволяет ускорить процесс благодаря постоянному общению, которого становится намного больше.

Практические советы

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

Составьте план по адаптации со списком тем. Для некоторых тем запланируйте специальные (тематические) сессии, для изучения которых новичок может скооперироваться для работы в паре. Если что-то изучено во время совместной работы - вычеркивайте из списка. Таким образом прогресс в адаптации будет виден каждому участнику команды.

Это были цели и преимущества парного программирования. Следующая часть статьи будет посвящена подводным камням парного программирования - с какими затруднениями можно столкнуться при работе в паре.

Подробнее..

Кодекс iOS джентльмена

14.09.2020 02:07:47 | Автор: admin

Кодекс iOS джентльмена


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

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

iOS джентльмен всегда вежлив.


Ваше плохое настроение или мания величия это еще не повод портить настроение другим людям. Думаю никому не понравиться если ему нагрубят. Поэтому старайтесь и Сами не грубить.

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

Всегда и при любых обстоятельствах нужно держать себя в руках и стараться быть вежливым.

iOS джентльмен всегда уважает свое время, а значит и уважает время других


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

Стоит вежливо уточнить, может ли нужный вам человек уделить время и помочь Вам. Если он сильно занят, то скорей всего он сможет помочь чуть позже.

iOS джентльмен уважает код и технические решения своих коллег.


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

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

iOS джентльмен не правит код другого разработчика без его ведома


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

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

iOS джентльмен не критикует чужой код без аргументов и без альтернатив


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

Бессмысленная критика приводить только к раздору в команде, что не очень сказывается на результате.

iOS джентльмен также умеет принимать критику достойно


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

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

Если критика действительно полезна, то стоит поблагодарить человека, который указал на Ваши погрешности.

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

iOS джентльмен пишет код в общем стиле


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

То же самое касается проектов. Старайтесь всегда придерживаться общепринятых правил и стандартов, даже если они Вам не нравятся, но команды им следует.

Подробнее..

Самодиагностика команды разработки

20.05.2021 08:20:21 | Автор: admin

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

С точки зрения каждого члена команды, мы полагаем, что "каждый сам себе CEO", тем самым, это зона ответственности каждого индивида. С точки зрения продукта - у нас есть менеджмент, который собирает метрики, делится своим видением будущего и планирует дорожные карты. Но с точки зрения команды - у нас есть мы сами, продукт и нам со всем этим нужно что-то делать.

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

Опросы

Да, это очередные опросы, но в нашем случае они приносят пользу и каждую ретроспективу поднимаем вопрос, нужны ли нам они или уже нет. У нас спринты длятся 2 недели, поэтому у нас есть еженедельный опрос и опрос в конце спринта.

Еженедельный опрос

В конце каждой недели мы получаем опросник на 30 секунд с вопросами: как часто у вас не было сил выполнять работу? Получал ли удовольствие от задачи? Сколько часов переработал? На выходе мы строим график для всей команды в динамике за последние 6 недель и обсуждаем на ретроспективе.

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

Опрос в конце спринта

Тут всё просто, мы за пару часов до ретроспективы всей командой отвечаем на простой вопрос "Как вам спринт"? Тут мы уже преследуем цель разговорить команду. До введения этого опроса, ретроспектива начиналась с молчания и попыток скрам-мастера разговорить людей, что, как правило, заканчивалось "да обычный спринт, ничего такого". Сейчас же команда стала более разговорчивой, больше обсуждают проблем и кидают больше идей.

Опросы раздражают

Тем не менее, хоть мы и используем опросы, они раздражают, т.к. есть ещё опросы от компании, но более эффективных инструментов, работающих для команды вне офиса, мы пока не придумали. Может быть, кто-то в комментариях подскажет более эффективный способ, подходящей для удалённой работы. Однако, люди также отвечают на эти вопросы сами себе и тоже делают выводы.

Мотивация

Наша команда разрабатывает B2B продукт, известный только в узких кругах компаний, и новые члены команды столкнулись с тем, что им никто не объяснил кто и для чего используют наш продукт. В итоге это выглядело так: вот вы, вот продукт с кучей легаси кода, вот Jira - поехали.

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

Как минимум, воодушевление пришло когда люди узнали кастомеров, например, "О, это мой банк", "У этих 3-х компаний больше миллиона сотрудников", "У меня машина этой компании" или "Я читаю финансовые новости от них". Думаю, в компаниях, названия которых встречаются хотя бы раз в месяц дела обстоят лучше.

Боли (от выполнения ручной/неудобной работы)

Когда мы взяли новых членов команды, то от них услышали, что некоторые процессы сложные/долгие/непонятные. Возможно, ранее так казалось и другим, но со времени все привыкли/забили/смирились. Т.к. у нас появилась возможность выявить слабые стороны, мы решили ею воспользоваться. Для этого мы начали:

  • Выслушивать и записывать недовольства всех членов команды. Про долгий билд, про QA автоматизацию, про непонимание того, на что нужно делать акцент в продукте и т.д.

  • Сравнивать затреканое время в Jira между нашей командой и другими командами, чтобы понять, кто делает что-то лучше нас и почему мы не делаем также.

  • Опять же посмотреть в Jira и рассмотреть что мы можем делать лишнего, или что уже не актуально и можно упразднить. Например, мы рассматривали релиз-тикеты и пытались понять какие моменты мы можем делать быстрее. Так мы обнаружили, что security scan кода занимал по 20-30 минут, мы подумали, что можно делать всё проще и в итоге сейчас это занимает около 5-10 минут.

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

В результате у нас всё задокументировано в Jira в эпиках (с чем мы уже можем прийти к PO для обсуждения включения этих улучшений в дорожную карту на следующий квартал), у нас уже есть правило, что 10% времени в спринте каждый тратит на развитие своих навыков, и у нас уже был план кто и что будет изучать. В нашей компании у всех есть доступ к обучающим курсам на разных площадках, поэтому вопрос самообучения был решён автоматически, но мы договорились о следующем:

  • Изучение будет происходить в паре/тройке. Так и интересней, и если кто-то уйдёт в отпуск - работа не встанет.

  • Пары/тройки будут меняться в будущем. Чтобы команда не дробилась на небольшие "кружки по интересам" и оставалась одной командой.

  • Внутри пары/тройки нет ограничений на источник обучения. Кому-то могут нравиться курсы с LinkedIn, кому-то с Udemy, а кто-то вообще нашёл крутой разбор темы на YouTube на своём родном языке.

Больше болтовни

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

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

Также мы заметили, что когда люди включают web-камеру - они более искренне и более разговорчивы. Если вся команда не разговорчива, мы просто используем Wheel Of Names и там уже рандомом выбираем кто будет говорить.

Фидбеки

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

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

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

  • Кастомеры задавали вопросы на одни и те же сообщения в логе. Суть в том, что в логе мы печатали что-то вроде "Module: service XXX call, RC = Y, RSN = ZZ". Т.к. это вообще не понятно никому, L2 выстраивали у себя сводную таблицу таких сообщений, чтобы отвечать кастомерам. Если какая-то новая комбинация - то это шло дальше в L3 (к разработчикам). Решением было простым: мы просто написали функцию которая по кодам печатает user-friendly сообщения с полным описанием причины проблемы.

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

В результате мы упростили работу нашей L2 поддержки. Но как это помогло нашей команде? У ребят из L2 появилось больше времени, и они тратили его на более глубокое изучение продукта, что позволяло отвечать самостоятельно на большую часть вопросов. Тем самым, количество обращений в саппорт уменьшилось, а также уменьшилось количество тикетов переходящих от L2 в L3. Тем самым, разработчики высвободили себе больше времени для решения реальных и актуальных проблем.

Ежедневный отчёт

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

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

Свои метрики

Внутри команды у нас есть свои метрики. Некоторые пересекаются с менеджерскими, некоторые уникальны.

Например, кастомерские проблемы идут в приоритет и нам, как команде, очень важно, чтобы оно в L3 находилось как можно меньше времени. Поэтому мы стараемся отвечать на проблему, либо находить реальную причину (например, баг) как можно быстрее. Менеджмент всего лишь следит, чтобы ответ был не дольше чем за 2/7 дней (в зависимости от важности проблемы - у них свои метрики).

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

Мы используем и другие метрики, включая самые очевидные: процент покрытия кода юнит-тестами, покрытие QA тестами функционала продукта, время жизни пулл-ревквеста или velocity команды.

Больше правил

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

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

Правила помогают разделять белое и чёрное, избегать конфликтов и иногда упрощать жизнь. А иногда, наоборот, усложняют жизнь. Ввод любого нового правила означает снижение доверия к индивидуумам, снижение доверия означает рост неэффективности, рост неэффективности приводит к увеличению времени разработки.

Также, правила должны подвергаться пересмотру. Например, в какой-то момент времени у нас случилось несколько кастомерских проблем из-за релиза, баги в котором могли быть замечены аж на трёх этапах: Разработка (code review), Просмотр билда разработчиками, и уже QA. На всех трёх этапах можно было предотвратить ошибку. Разумеется, после этого инцидента все этапы были ужесточены. В итоге то, что раньше могло занимать до 5 дней, стало занимать до 10 дней. Со временем все ужесточения были пересмотрены. Некоторые до сих пор остались, просто был изменён процесс чтобы действие занимало меньше времени, что-то было упразднено, а что-то наоборот добавилось.

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

Ответственность на всех

В нашей команде мы стараемся играть в "трёх мушкетёров", т.е. ответственность за всё лежит на ВСЕЙ команде, никто не будет осуждать члена команды вне команды. Если кто-то один облажался и это привело к каким-то последствиям, то всё равно виноваты все, потому что:

  • Плохие вещи случаются. Нельзя запланировать и предвидеть всё.

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

  • Очень просто спихнуть всю ответственность на кого-то одного и осудить его. Если такое происходит часто, то все понимают, что рано или поздно это случится с ними и уходит доверие, что приводит к росту издержек, снижению эффективности ... ну вы поняли.

  • Обвинения не решают проблем. Вообще никаких.

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

  • Женщину, которая в полной темноте переходила дорогу в неположенном месте?

  • Водителя автомобиля с автопилотом, который вряд ли сам среагировал бы?

  • Компанию, которая разрабатывает автопилот?

  • Разработчиков, кто писал код для автопилота?

  • QA кто выпустил этот код в прод?

Субъективно, тут виноваты все, либо никто. Но, очевидно, что виновные есть, т.к. в итоге женщина скончалась. Значит виноваты все.

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

Team Building

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

Заключение

Выбрав фреймворк как Scrum, Kanban, Lean и т.д. глупо надеяться что все проблемы разрешатся, все будут мотивированы, счастливы и довольны. Внутри команды не стоит надеяться, что кто-то другой решит ваши проблемы, особенно, если вы о них не говорите.

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

Подробнее..

Брайан Фитцпатрик, Бен Коллинз-Сассмэн Team Geek идеальная IT-компания смысл и законы командной работы

10.12.2020 10:23:48 | Автор: admin


Как программистам общаться друг с другом и точно ли без этого не обойтись одна из вечных тем обсуждения в сообществе. В книге Team Geek: идеальная IT-компания Брайан Фитцпатрик и Бен Коллинз-Сассмэн, двое бывалых программистов и технических лидеров крупных команд Google, предлагают свой взгляд на этот пласт проблем.

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

Целевую аудиторию своего труда Фитцпатрик и Коллинз-Сассмэн определяют так: рядовые разработчики ПО, которые работают в составе команды, хотят создавать качественные продукты и не возражают против карьерного роста. Цели научить читателя управлять людьми они не ставили, хотя многие выкладки могу оказаться полезными и для технических лидеров.

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

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

Командный вид спорта


Авторы начинают свои рекомендации с аксиомы, которую необходимо принять, чтобы двигаться дальше:

В наши дни разработка командный вид спорта. Базовой рабочей единицей является команда программистов.

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

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

Фитцпатрик и Коллинз-Сассмэн вспоминают следующую характерную историю. В 2000-х они оба занимались хостингом проектов с открытым кодом в Google и, соответственно, получали богатую обратную связь о том, чего именно хочет от этого сервиса сообщество. Едва ли не чаще всего пользователи просили о приватности, о возможности скрыться от чужих глаз в той или иной форме:

Создайте, пожалуйста, возможность скрытия определенных ветвей кода в Subversion на Google Code.

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

Я хочу переписать весь код с нуля, не могли бы вы полностью очистить архив проекта?

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

С другой стороны, в программистах особенно громко говорит честолюбие: кому не хочется стать следующим Линусом Торвальдсом или Ричардом Столлмэном? Если не делиться идеей и трудностями в процессе, то по завершению не придётся делиться и славой.

Чтобы не позволить этим двум (по сути, понятным и естественным) побуждениям тормозить продуктивную работу, можно попытаться разобрать их рационально. Для начала, стоит напомнить себе о том, что образ одинокого гения давно уже стал мифологическим. На деле, даже достижения, которые приписываются звёздам IT, чьи имена у всех на слуху, обычно являются результатом работы целого коллектива.

Тот же Линус Торвальдс, упоминавшийся выше, не создал Linux своими руками он написал и обнародовал прототип Unix-подобного ядра. Это было огромным вкладом, но всё-таки именно вкладом в совместную деятельность сотен людей. Чаще всего гений даёт идею, первый импульс, который затем подхватывается и развивается другими талантливыми разработчиками. То, что известность из них получает только кто-то один издержки нашей индивидуалистичной культуры и глубинного стремления находить объекты для подражания. Но это меняет того факта, что программисты, которые идут путём одинокого гения, пытаются повторить схему, которая в реальности практически не встречается.

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

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

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

Три кита командной работы


Итак, основной тезис изучен и принят разработку ПО в текущих условиях целесообразнее всего вести в симбиозе с коллегами. Теперь перед нами встаёт старый как мир вопрос: как создать этот симбиоз?

По убеждению Фитцпатрик и Коллинз-Сассмэн, продуктивная и здоровая атмосфера в команде складывается при наличии трёх составляющих:

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

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



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

Дискуссии и споры

Как не должно быть: Обычно, когда сталкиваются две или больше точек зрения, быстро становится очевидно, кем считают друг друга собеседники людьми в одной лодке или конкурентами.

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

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

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

Критика

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

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

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



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

Авторы советуют придерживаться следующих правил при комментировании чужого кода:

  • Говорить строго о коде, не отвлекаясь на привычки и характер его автора;
  • Не впадать в категоричный тон предлагать и советовать вместо того, чтобы требовать;
  • Избегать оценочных, обвинительных реплик (Ты наделал ошибок в, У тебя какая-то путаница с). Вообще, вместо реплик с ты безопаснее говорить от себя или обезличенными конструкциями (Мне непонятна логика, Здесь не хватает).

Разборы полётов

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

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

Характерной чертой здорового коллектива является склонность отделять ошибку от личности её автора и помещать её в багаж своего коллективного опыта. Разбор производится не для того, чтобы определить меру вины, а для того, чтобы извлечь всю информацию, которая может пригодиться в будущем. Документирование, post mortem-ы это практики, которые показывают, что команда на верном пути.

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

Хорошо составленные результаты вскрытия должны содержать в себе следующее:

  • краткий отчет;
  • хронологию проблемы от ее обнаружения до исследования и разрешения;
  • основную причину проблемы;
  • оценку последствий и ущерба;
  • список действий, направленных на немедленное решение проблемы;
  • список действий для предотвращения повторения проблемы;
  • сделанные выводы.

Рокировки

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

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

Что можно сделать: Здесь образ действий достаточно прозрачен не отторгайте новые возможности на подходе, даже если они выглядят как серьёзный вызов. Не давайте себе коснеть на одном месте, не развиваясь, просто потому что в новых задачах вряд ли сможете сразу блестяще показать себя. Не отказывайтесь иметь дело с коллегой после первого же недопонимания постарайтесь до чего-то договориться.

Фитцпатрик вспоминает здесь о собственном опыте парного программирования с другим членом команды для разрешения некоторых проблем с конвертацией CVS-репозиториев. Коллега предпочитал погружаться в проблему неспешно и основательно, сам же автор привык думать и перебирать решения на ходу. Вопреки ожиданиям первых дней они не убили друг друга, научились смотреть на проблему под разными углами и справились с задачей.

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

Recovery mode Как поднять боевой дух команды на удаленке?

16.06.2021 10:13:29 | Автор: admin

Если коротко, то дать сотрудникам возможность отвлечься и поиграть. Мы как команда это то, что мы делаем. Поэтому нужно делать что-то интересное вместе. Удаленка не приговор и не помеха.

Эта статья от том, как я организовал Хакатон для IT компании в Малайзии в самые первые месяцы пандемии. Игра была целиком посвещена Linux администрированию, траблшутингу и хакингу. При этом она позволяла поучаствовать всем сотрудникам, от junior инженера технической поддержки до senior архитектора.

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

Дано:

  • Компания системный интегратор в Куала Лумпуре;

  • Интернациональная команда IT-специалистов;

  • 99.99% персонала внезапно ушло на удаленку.

Задачи:

  • Позволить сотрудникам отвлечься от работы и снизить уровень стресса;

  • Развить навыки, используя геймификацию;

  • Развить внутренний бренд для будущих IT игр.

В чем заключалась сложность?

  • Неравномерный уровень подготовки и квалификации.

Среди сотрудников можно найти как прожженых линуксоидов, так и совсем новичков, которых пугает командная строка. Мы хотим, чтобы поучаствовали и те, и другие. Значит, задания должны предлагаться в порядке от элементарных, до действительно сложных.

  • Сменный график работы сотрудников.

График работы у коллег из разных команд и департаментов значительно отличается. Значит, хакатон не может быть привязан к конкретному времени или дню.

  • Локальный менталитет.

К особенностям местного населения необходимо привыкнуть. Работают в компании в основном малайцы, индийцы и китайцы. Преимущественно они не задают вопросов, опасаются участвовать в чем-то новом и непонятном. Раз в неделю 80% сотрудников покидает офис на 2,5 часа по религиозным соображениям. На корпоратив добрая половина придет только если пообещать им лотерею и призы (очень популярная практика у местных компаний). Заинтересовать таких людей участием в игре было нелегко.

[Спойлер]

Мне удалось =)

А где Гарри? Шалит с новым хакатоном.А где Гарри? Шалит с новым хакатоном.
  • Неразбериха из-за пандемии.

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

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

  • Демотивированный персонал.

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

[Спойлер]

Еще как может! Риск не собрать аудиторию не оправдался.

Типичный сотрудник в самом начале пандемии.Типичный сотрудник в самом начале пандемии.

План подготовки и проведения хакатона

В моем случае выполнение всех этих действий позволило мне успешно провести мероприятие.

  • Разработка концепта игры.

Я решил, что темой хакатона будет Linux администрирование. Соответственно, задания должны были строиться вокруг базовых административных задач: проверялось умение использовать command line, браузерные тулзы, знание SQL, DNS, самые основы шифрования.

Хакатон должен был длиться несколько дней. Поэтому я придумал систему уровней и кодов. Каждый уровень представлял собой одну виртуальную машину, в которую участникам нужно было зайти по SHH и найти спрятанный код. На каждой из машин был запущен Apache c простым сайтом, где размещались подсказки. Ну или нет =)

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

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

На этом же этапе была продумана система поощрений.

  1. Top-3 самые ценные индивидуальные призы;

  2. Top-10 дополнительный специальный пак призов;

  3. Первые 50 участников гарантированные призы из дешевого ценового диапазона.

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

  • Технический дизайн.

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

В качестве хостинг площадки был выбран AWS. Игровые серверы и хост с веб формой были подняты на t2.medium EC2 инстансах. К каждому инстансу был привязан 1 бесплатный домен. В качестве базы данных использовалась Amazon DynamoDB. Форма была написана на Python и фреймворке Flask. Бэкенд формы был выполнен на основе FaaS (Function as a Service) подхода с помощью связки API Gateway + Lambda + DynamoDB.

Выбор такой технологической базы был обусловлен субъективными пожеланиеми организаторов, наличием необходимой корпоративной облачной подписки, и знаменитым правилом start where you are. Последний принцип подсказал, что можно взять подходящую web форму, используемую в продакшене, и переписать ее под нужды игры. Пользуясь случаем, Алекс и Саша, огромное спасибо за помощь с AWS деплойментом и девелопментом формы. Без вас мне бы было значительно сложнее.

  • Презентация концепта руководству и получение бюджета.

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

[Спойлер]
Как ощущаешь себя когда получаешь максимальный бюжет на проект.Как ощущаешь себя когда получаешь максимальный бюжет на проект.
  • Разработка дизайна и внешнего вида.

Сначала я определился с названием бренда для внутренних игр и выбрал цвета на свой вкус. На мое счастье в компании был дизайнер, который помог подготовить несколько вариантов логотипа. Я написал и согласовал ТЗ. Итоговый логотип в белом, черном и цветном вариантах был использован для рассылок и печати на призах. Абсолютно все материалы были выдержаны в одном стиле, распространялись под одним брендом и сопровождались одним и тем же логотипом. Недавно, когда я рассылал тизеры о новом хакатоне мне уже не задавали вопросов о том, что происходит. Инженеры точно знали, чего ожидать.

  • Выбор и заказ призов.

Про бизнес по-малазийски я мог бы написать отдельный пост. В рамках этой статьи позвольте мне упомянуть только, что на получение призов пришлось потратить 2 месяца и кучу нервов. Рассылка призов была выполнена много позднее окончания игры, а некоторым призам даже пришлось лететь в Россию и на Филиппины вслед за некоторыми победителями.

  • Рассылка тизеров до начала игры.

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

  • Сюжетное обрамление.

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

  • Релиз.

Первое письмо было отправлено на весь офис и содержало начало истории, ссылки и правила игры. Тут же посыпались вопросы: коллеги просили подсказки, пытались уточнить правильно ли они понимают задание, а также старались выудить полезную информацию любой ценой. Не то чтобы получалось. Я был кремень.

Один из финальных тизеровОдин из финальных тизеров
  • Элемент обучения.

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

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

  • Организовать постоянный follow up.

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

  • Выдать призы.

Из-за пандемии и Малазийских локдаунов мне удалось отправить призы своевременно только ТОП-3 игрокам. Остальным своих посылок пришлось ждать дольше. Несмотря на небольшую стоимость гарантированного призового пака сотрудники были воодушевлены получением заветных пакетов.

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

  • Собрать обратную связь.

Действовать следовало итеративно и с фидбеком. Поэтому всем участникам был разослан опросник. 25% заполнили его. Об ответах в описании результатов.

Весь подготовительный процесс занял 2 месяца и 68 человеко-часов главного организатора. Но результат стоил того.

Результаты:

  • Боевой дух команды вырос.

Игра подразумевала индивидуальное участие и решение задач. Однако, мне доподлинно известно, что люди объединялись в команды, устраивали созвоны и брейнштормы. Активным участникам точно было не скучно. Люди, которым в силу неопытности удалось прорваться только через несколько уровней, определенно научились чему-то новому. Цель отвлечь участников и снизить градус напряжения была достигнута.

  • Позитивный фидбек от участников.

Одним из факторов, которые говорят о безоговорочном успехе мероприятия, является факт участия тяжелых на подъем сотрудников. Хакатон имел успех и среди линейных менеджеров, которые по долгу службы не работают с Linux напрямую, и среди инженеров-ветеранов.

Три наиболее частые причины почему участники согласились играть:

  1. Возможность проверить свои скиллы;

  2. Любовь к играм и соревнованиям;

  3. Любопытство.

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

  • Карт-бланш и бюджет на проведение новых хакатонов.

Руководство осталось в восторге от результатов. Сразу были заложены сроки на следующий ивент, а совсем недавно при планировании нового хакатона бюджет на призы был выделен легко и без давления.

Личное:

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

А еще я сформулировал и взял на вооружение...

Ключевые принципы организации хакатонов.

  • Знайте свою целевую аудиторию.

Хакатоны - для всех!Хакатоны - для всех!

Хороший хакатон сделан специально для ваших сотрудников и в соответствии с нуждами компании. И да, хакатоны могут быть не только для программистов. Они могут быть вообще для всех.

  • Агитируйте правильно.

[Спойлер]
Землю - крестьянам, игры - айтишникам!Землю - крестьянам, игры - айтишникам!

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

  • Управляйте сложностью.

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

[Спойлер]
У меня есть пароль, но нет логина. Зарепортить игровой баг или поискать еще?У меня есть пароль, но нет логина. Зарепортить игровой баг или поискать еще?
  • Позвольте играть не так как задумано.

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

[Спойлер]
А Барсик один в игре ковыряется, посмотри на него!А Барсик один в игре ковыряется, посмотри на него!
  • Призы хорошо, но не главное.

[Спойлер]
А как же сектор приз?А как же сектор приз?

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

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

Спасибо, что прочли. Увидимся в будущих публикациях!

Подробнее..

Перевод Как заставить руководство проникнуться техническим долгом

18.11.2020 12:16:11 | Автор: admin

Руководство не даёт мне заняться рефакторингом legacy-кода! Знакомая ситуация? Раздражает жутко. Большинство разработчиков рано или поздно сталкивается лбами с менеджером, который совершенно не заинтересован в том, чтобы совершенствовать уже готовое. То нужно реализовать что-то новое, то срочно потушить пожар, то исправить какой-то баг В общем, причина отложить рефакторинг запущенной кодовой базы у них всегда найдётся.

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

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

Менеджеры не программисты


Решение проблемы состоит в том, чтобы донести до менеджеров, какое влияние низкое качество кода оказывает на бизнес. В конечном счёте, деятельность компании нацелена на получение денег. Прибыли. Соответственно, руководство ищет оптимальные пути урезать расходы и привлечь доходы. А значит, чтобы реабилитировать в их глазах рефакторинг, придётся говорить на их языке.

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

Пять аргументов, которые вы можете привести


1) Рефакторинг поможет снизить волатильность предельных издержек на единицу функциональности ПО

Это точная цитата из замечательного выступления Дж. Б. Рейнсберга на конференции на тему Экономика в разработке ПО. Стойте, не уходите! Всё, что здесь сказано, вам прекрасно известно, просто оно сформулировано в абстрактно-заумном духе.

Пойдём по порядку:

  • Рефакторинг поможет снизить пока что всё нормально
  • волатильность иными словами, непредсказуемость
  • предельных издержек то есть сколько ресурса потребует производство ещё одной дополнительной единицы
  • на единицу функциональности ПО она же фича, имеющая ценность для бизнеса. Ура! Ценность для бизнеса это как раз то, что нам нужно.

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

2) За последние месяц 63% ресурса разработки ушло на исправление проблем с качеством продукта

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

Вот несколько метрик, на которые вы можете обратить внимание:

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

Покажите руководству, во что именно выливается для них плохое качество кода. А ещё лучше найдите способ перевести эти цифры в денежный эквивалент.

Как-то я присутствовал на post-mortem бага, которого можно было бы избежать, если бы была проведена проверка типов данных. Код писался на JavaScript. Как раз в то время в компании велись споры о том, стоит ли переходить на TypeScript.

Разработчики, которые разбирались в случившемся, не поленились поднять данные и сумели оценить урон, который баг нанёс бизнесу. Оказалось, что за несколько месяцев своего существования баг высосал из компании миллион канадских долларов. Миллион! Одного этого с головой бы хватило, чтобы окупить стоимость перехода на TypeScript.

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

3) С технической точки зрения, чтобы быстрее выпустить продукт, мы работали в кредит. Теперь нужно выплатить часть долга, чтобы время выхода на рынок не возросло

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

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

4) Если инвестировать 10% рабочего времени в качество кода, текучесть кадров существенно снизится.

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

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

А теперь давайте зададимся вопросом: во что компании обходится замена уволившегося разработчика? Нового специалиста нужно найти, провести через процесс найма, ввести в курс дела. Это требует вложений, занимает время и затормаживает всю команду. Руководство однозначно предпочло бы не заниматься подобными перестановками каждый год. Поэтому снижение текучести может стать серьёзным аргументом. А сам факт наличия плана по устранению технического долга сразу даст всей команде +100 к мотивации.

5) Если вложить 20% ресурса в рефакторинг, FRT сократится вдвое и для производительности разработчиков ROI будет положительным

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

Здесь мы проделываем следующее:

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

В конечном счёте, решать им


С этим никто не поспорит. Я предложил пять аргументов, которыми можно убедить людей в важности устранения технического долга, но теперь, думаю, следует дать ещё один дополнительный совет, прежде чем вы пойдёте обрабатывать какого-нибудь менеджера.

Проводите рефакторинг по ходу дела

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

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

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

Перевод Как добиться того, чтобы инспектор кода воспылал к вам любовью

15.12.2020 12:20:26 | Автор: admin


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

В этой статье собраны лучшие практики для участия в инспекции кода в роли автора. По завершению чтения вы начнёте отсылать инспекторам такие безупречные наборы изменений, что они воспылают к вам любовью, не меньше.

Но я не хочу, чтобы инспекторы кода пылали ко мне любовью


А они всё равно будут. Смиритесь. Никто в истории человечества ещё не сетовал на смертном одре, что при жизни его слишком уж любили.

Зачем совершенствовать инспекцию кода?


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

  • Ускоренный процесс передачи знаний. Если как следует подготовить набор изменений, внимание инспектора будут притягивать именно те области, в которых вам нужно расти, а не скучные стилистические огрехи. А когда вы даёте понять, что цените конструктивную критику, проверяющий начинает вкладывать больше сил в обратную связь.
  • Пример для окружающих. Эффективные практики инспекции кода в вашем исполнении зададут планки для окружающих. Хорошие техники обычно перенимаются, а значит, вам будет проще, когда кто-нибудь из коллег вышлет код вам на проверку.
  • Минимум конфликтов. Инспекция кода часто вызывает напряжение в команде. Если подходить к делу ответственно и сознательно, споры будут возникать реже.

Золотое правило: цените время проверяющего


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

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

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

Техники


1. Сначала просмотрите код сами

Прежде чем отсылать код коллеге, прочитайте его. Не ограничивайтесь вылавливанием ошибок представьте, что видите этот фрагмент впервые. Что в нём может сбить с толку?

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



Какой идиот это написал?
Синхронизация Cron Jobs с лунным циклом: Я добавил логику с синхронизацией, чтобы наш пайплайн ETL оставался в гармонии с природой


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

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

2. Составьте ясное описание набора изменений

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

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

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

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

Если вы хотите глубже погрузиться в искусство составления превосходных описаний, прочитайте How to Write a Git Commit Message Криса Бимса и My favourite Git commit Дэвида Томпсона.

3. Автоматизируйте простые вещи

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



Проверишь, всё ли там в порядке с синтаксисом? Я бы к компилятору обратился, но жаль тратить его время.

Автоматические тесты должны считаться в команде частью стандартной процедуры. Инспекция начинается только тогда, когда пройдена вся серия автоматических проверок в среде непрерывной интеграции.

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

4. Позаботьтесь о том, чтобы код сам отвечал на вопросы

Что не так на этой картинке?



Мне непонятно назначение функции.
А, это на случай если при вызове передаётся Frombobulator при отсутствии имплементации frombobulate


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

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



Алло?
Когда ты шесть лет назад писал bill.py, почему у тебя t=6?
Рад, что ты позвонил! Это из-за налога на продажи в 6%.
Ну разумеется!
Отличный способ обосновать решение по реализации.


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

5. Вводите изменения дробно

Разрастание границ это дурная практика, которую часто можно наблюдать при инспекции кода. Разработчик берётся за устранение бага в логике, но по ходу дела ему на глаза попадается какой-то изъян в интерфейсе. Ну, раз уж всё равно с этим куском работаю, думает он, заодно и его исправлю. А в итоге начинается путаница. Проверяющему теперь придётся вникать, какие изменения работают на задачу А, а какие на задачу Б.

Лучшие наборы изменений делают что-то одно. Чем точечнее и проще изменение, тем легче инспектору удерживать в голове контекст. Разделяя не связанные друг с другом изменения, вы также получаете возможность организовать параллельную проверку несколькими коллегами, а значит, код вернётся к вам быстрее.

6. Отделяйте функциональные изменения от нефункциональных

Из ограничения масштабов следует другое правило функциональные и нефункциональные изменения не должны смешиваться.

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



А вы найдёте функциональное изменение?

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

Вдобавок разработчики любят несвоевременно примешивать к основным изменениям рефакторинг. Рефакторинг кода со стороны коллег я всячески одобряю, но не когда они параллельно реализуют новое поведение.



Изменение в поведении, погребённое среди рефакторинга

Если фрагмент кода нуждается и в рефакторинге, и в изменениях поведения, необходимо разбить процесс на два-три набора:

  1. Добавить тесты для текущего поведения (если их нет)
  2. Провести рефакторинг кода, ничего не меняя в тестах
  3. Изменить поведение и соответствующим образом обновить тесты

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

7. Разбивайте слишком крупные наборы изменений

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

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

Может, вместо того чтобы делать всё разом, удастся сначала поработать с зависимостями, а уже в следующем наборе реализовать новую функциональность? Реально ли сохранить код в здравом состоянии, если внедрить половину функциональности сейчас, а другую половину на следующем этапе?

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

8. Принимайте критику доброжелательно

Самый верный способ испортить всю проверку принимать замечания в штыки. Удержаться бывает трудно, ведь многие разработчики гордятся тем, что делают, и воспринимают свою работу как продолжение себя. А если инспектор отпускает бестактные комментарии или переходит на личности, то это ещё сильнее усложняет дело.

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

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



Для января и февраля 1900 года это не сработает.
Точно, хорошо подмечено!


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

9. Проявляйте терпение, если инспектор допускает ошибку

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

Однако даже при том, что проверяющий не прав, вам есть о чём задуматься. Если он что-то неверно прочёл, какова вероятность того, что в будущем и другие люди допустят ту же ошибку? Не придётся ли читателям изучать код вдоль и поперёк, только чтобы убедиться, что бага, который им мерещится, здесь всё-таки нет?



Здесь переполнение буфера, потому что не проводилась верификация, хватит ли памяти в name, чтобы вместить все символы NewNameLen.
Это в моём-то коде? Немыслимо! Конструктор вызывает PurchaseHats, а она вызывает CheckWeather, которая выдала бы ошибку, если бы длина буфера не соответствовала. Ты бы сначала прочитал 200 000 строк кода, а потом уже осмеливался допускать возможность, что я где-то ошибся.


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

10. Давайте доходчивую реакцию

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

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



Исправляю заголовки > Обновляю код в соответствии с замечаниями > Всё готово, посмотри, пожалуйста

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



Некоторые инструменты вроде Reviewable и Gerritt предлагают ставить метки на обработанные замечания

Соразмеряйте свои реакции с усилиями, которые приложил проверяющий. Если он подробно расписал какой-то момент, чтобы вы могли почерпнуть что-то новое для себя, не ограничивайтесь пометкой Сделано. Отвечайте вдумчиво, чтобы показать, что цените его труд.

11. Умело запрашивайте недостающую информацию

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

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

Как-то раз я умышленно отправил неопределённую реплику такого рода коллеге, и он обезоружил меня своим ответом:

Что изменить, чтобы стало лучше?

Эта фраза нравится мне тем, что выражает открытость к критике и отсутствие враждебности. Теперь, когда я получаю туманную обратную связь, то отвечаю какой-нибудь вариацией базового мотива Что изменить, чтобы стало лучше?.

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

12. Отдавайте преимущество проверяющему

В теннисе, если не совсем ясно попал ли мяч в аут при подаче противника, принято трактовать ситуацию в его пользу. При инспекции кода тоже следует придерживаться этого правила.

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

Если инспектор вносит предложение и аргументы в поддержку своей позиции у вас примерно равнозначны, примите его точку зрения. В конце концов, из вас двоих преимуществом свежего взгляда на код обладает именно он.

13. Сокращайте время передачи кода

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

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



Интеллектуальные затраты на инспекцию кода при коротких (слева) и долгих (справа) сроках передачи
Ось x время; ось y память инспектора; синяя штриховка восстановление контекста; голубая заливка проверка кода; серая заливка ожидание; красная штриховка дополнительные издержки


Шесть недель это, конечно, исключительный случай, однако мне часто приходится наблюдать долгие, ничем не оправданные паузы у себя в команде. Кто-нибудь отсылает набор изменений на проверку, получает обратную связь и неделю откладывает правки на потом, потому что отвлёкся на другую задачу.

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

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

В заключение


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

Запомните золотое правило: цените время проверяющего. Если вы дадите ему возможность сосредоточиться на по-настоящему интересных сторонах кода, его комментарии будут дельными. Если же вы вынудите его тратить время на мелочи или распутывать путаницу тем хуже для вас обоих.

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

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

Перевод Как произвольно установленные дедлайны вредят разработчикам

06.05.2021 10:07:53 | Автор: admin


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

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

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

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

Так или иначе, наша приблизительная оценка стала результатом двухдневных совещаний: сначала общий обзор новых функций, потом подробный разбор каждой в отдельности, потом еще более дробный анализ Наконец по каждому этапу работ прикинули количество часов, перепроверили, соотнесли с UX и UI-дизайном, всё сложили, накинули сколько-то часов сверху и вот получился срок выполнения работ.

Вы сейчас, наверное, подумали: ну, раз у них UX и UI-дизайны уже готовы, да еще и про запас часы заложены, то, наверное, всё должно пройти нормально? В большинстве случаев при установке сроков условия бывают похуже. Ну, в общем, нет. Нормально ничего не прошло.
Продолжительность работ была установлена в три-четыре недели не слишком много времени, если говорить о релизе нового продукта силами небольшой команды. Само собой, после первых двух недель мы уже стали отставать от графика. Не потому что медленно работали или мало часов тратили на проект, а потому что всё всегда идёт не по плану.

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

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

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

Спустя неделю состоялся релиз приложения. Мы порадовались, кто-то принес кексиков, чтобы отметить, и через пять минут все уже опять сидели за мониторами и делали вид, что ничего не произошло.

В обновлении не было ничего такого уж важного, что бы мотивировало необходимость релиза именно в эту дату и ни днём позже. Никто из пользователей не знал про то, что готовится новая версия, никто (ни клиенты, ни инвесторы) не строил планов с опорой на дату. Да, функции полезные, но разве кому-то стало бы хуже, если бы их выпустили на один день позже? Разве это вообще на ком-нибудь сказалось бы?

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

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

Когда мы после рабочего дня поздно вечером отрабатывали дополнительные часы под знаменем форс-мажора, общий настрой был: Так, надо это добить поскорее. Часто внедрялись всякие костыльные решения, которые сколько-то поработают, а потом потребуют рефакторинга. В некоторых случаях соответствующий рефакторинг сразу вносился в расписание, в других о нем благополучно забывали. А бывало, что разработчики и сами толком не осознавали, что делают что-то костыльное, потому что были уставшими и хотели домой.

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

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

Как нужно?


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

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

Трекинг ног и пет-паспорта no-code решение для банка задач

15.04.2021 10:21:55 | Автор: admin

Весной 2021 проходит шестой запуск проектно-образовательного интенсива От идеи к прототипу Университета 20.35. В нём студенты придумывают идеи для будущих технологических проектов самостоятельно, либо получают их от инновационных бизнес-компаний. С 2020 года в интенсивах существует Банк задач чуть больше чем за год в проект привлечено 30+ компаний, в 25% случаев заказчики предлагали студентам стажировку или работу по итогам интенсива, не менее половины команд решили задачи и показали прототипы на финале проектного трека.

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

Наташ, мы всё уронили

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

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

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

Как мы пришли к Airtable

В предыдущем запуске отраслевые партнёры предложили 13 задач, весной 2021 их стало уже вдвое больше вопрос, где разместить эти 28 кейсов, чтобы всё не превратилось в хаос. С помощью Airtable удалось разработать удобное и опрятное решение для всех пользователей: организаторов интенсивов, проектных наставников и координаторов в вузах, компаний.

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

На витрине расположены карточки со всеми задачами для студентов весеннего запуска интенсивов, каждый пользователь видит:

  • краткое описание того, что предстоит сделать,

  • тематику задачи (например, агротех, дизайн, VR или чат-боты),

  • требования к команде (если компания оставила пожелания),

  • подробную расшифровку в pdf-файле

  • бронирования от вузов кто уже взял эту задачу

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

С появлением такого no-code решения организаторы интенсивов получили возможность модерировать заявки на бронирование задач, один кейс могли взять себе три вуза. Если желающих было больше, их можно отсечь по времени заполнения формы на бронирование кто не успел, тот опоздал. К тому же в следующий раз не понадобится создавать новый документ или страницу: существующая витрина обновится с появлением свежих задач. Иными словами, файл для внутреннего пользования превратился в наглядный пример как для университетов что их студенты могут получить в качестве бизнес-кейса для проекта в интенсиве, так и для компаний что и в каком формате они могут предложить в качестве задачи.

А что сейчас?

В марте 2021 года координаторы 29 вузов выбрали 27 задач из 28 предложенных, самыми популярными по количеству запросов оказались задачи edtech, медицинско-ветеринарного профиля и агротех. Традиционно высокий спрос на решения data science и веб-разработку.

Уфимский ГАТУ вдохновился примером Банка и воспользовался готовым шаблоном на Airtable от разработчиков Университета 20.35. Так студенты этого вуза смогли асинхронно выбрать предложенные задачи с помощью витрины и наглядно записаться в интересующие их проекты.

Что даёт участие в Банке задач стартапам и компаниям:

возможность найти талантливых и заинтересованных студентов, протестировать их своей задачей и принять решение о дальнейшем найме этих студентов в качестве сотрудников;

решить не самую приоритетною задачу за счёт внешнего ресурса без лишних затрат;

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

прокачать навык менторства и получить новые идеи для решений других задач от студентов

К слову, если вы тоже хотите, чтобы студенты интенсива потрудились над задачей вашей компании, оставьте заявку: http://business.2035.university.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru