Найти тему
Экспоненциальная задержка в быту и на работе В распределенных системах разного типа довольно часто встречается подход к повтору какого-то действия с экспоненциальной выдержкой. Суть его проста - между повторениями выдерживается пауза, которая увеличивается в геометрической прогрессии, чаще со знаменателем прогрессии равным 2. Например, этот подход часто применяется в коммуникациях между клиентом и сервером: клиент делает запрос к серверу, сервер возвращает ошибку, клиент ждет одну секунду, повторяет запрос, если опять произошла ошибка - ждет 2 секунды и повторяет запрос, потом 4, потом 8, и так далее, пока запрос не завершится успехом. В сетях Ethernet такой же подход используется при коллизии пакетов. Суть подхода простая - дать возможность получить результат быстро в большинстве случаев, но и не перегружать систему в случаях паталогических. Если бы задержка не увеличивалась, то в случаях, когда количество ошибочных запросов по какой-то причине стало больше, вся пропускная способность может уйти просто на повторные ошибочные попытки. Интересно то, что этот подход вполне полезен и в жизни тоже. Например, если определенный коллега или команда начинают занимать слишком много вашего времени, то можно начать выдерживать такие экспоненциально увеличивающиеся паузы. Частый пример - какая-то переписка или чат, где идет обсуждение какой-то темы и все пишут в минуту по сообщению. Имеет смысл перед отправкой следующего сообщения подождать (с каждым разом подольше) и потратить время либо на что-то более важное, либо хотя бы на более глубокую подготовку ответа - возможно, провести какие-то эксперименты или изложить достоинства и недостатки каждого из обсуждаемых подходов и так далее. А бывают и ситуации, когда дискуссия по большому счету просто бесполезная, но завершить вежливым образом ее сложно. Здесь тоже могут пригодиться экспоненциально увеличивающиеся задержки - как говорится, и волки целы, и овцы сыты.
2 года назад
Перелистывая старые страницы Вчера умер Фредерик Брукс - инженер, известный многим специалистам по программированию по книге “Мифический человеко-месяц”. Книга эта не нова - написана она была в 1975 году по следам работы Брукса в IBM, где он, в частности, руководил разработкой мейнфреймов System/360 и операционной системы для них OS/360. Кстати, именно он ввел в обиход термин “архитектура компьютера”. Произведение вносилось в различные списки важных произведений в области разработки ПО, хотя сейчас, конечно, новаторскими идеи, изложенные там, уже не назовешь. Просто потому, что они уже глубоко проникли во многие методы управлением инженерии программ и не кажутся чем-то необычным. Тем не менее, неплохо вспомнить некоторые из них и тем самым помянуть Фредерика Брукса, по книгам которого мы учились управлять хаосом. Многие из этих идей мы все знаем и не подозреваем, что они были впервые упомянуты именно в “Мифическом человеко-месяце”. Если у вас есть некоторая программа, то нужно в три раза больше начальных усилий, чтобы превратить ее в программный продукт - написать документацию, обеспечить сопровождение и так далее. Точно так же, нужно в три раза больше усилий, чтобы сделать эту программу расширяемой и назвать ее программным комплексом - сделать понятные API, точки расширения и так далее. Если же нужно и то, и другое, то это системный программный продукт, и его создание стоит в 10 раз больше, чем написание просто программы. Если программный проект отстает от расписания, то добавление к нему людей только еще больше задержит его. Связано это с тем, что инженерное дело - работа творческая и сложная, и подключение новых людей требует их обучения, причем обучать будут те, кто уже работает над проектом. Т.е. и новые люди еще толком ничего не делают, и старые отвлекаются. Кроме того, многие задачи легко не параллелятся - цитируя книгу, “чтобы родить ребенка, надо 9 месяцев, сколько женщин к этому не подключи”. Производительность сильных и слабых инженеров с похожим опытом и зарплатой может отличаться в десять и больше раз. К этому сложно что-то добавить. Это применимо и к командам - сильные и слабые команды по выхлопу тоже могут отличаться на порядок легко. Повторю - с похожим опытом и зарплатой. Т.е. это не про сравнением сеньора и джуна. Это снова подчеркивает важность качественного найма и своевременных увольнений - без этого поддерживать высокий уровень команды сложно. “Эффект второй системы” - если вы занимаетесь разработкой новой версии системы, которую создавали раньше, то будьте осторожны и не начните впихивать в дизайн разного рода фантазии. Нередко такой “архитектор с опытом” решает, что теперь он досконально знает требования и сможет разработать отличный дизайн, который позволит эти и будущие требования удовлетворить. Часто это заканчивается тем, что этот техлид оказывается в плену своих старых взглядов и ограничений и не может адекватно оценить изменившиеся реалии, где новая версия системы должна быть другой, а не совершенной. Готовьтесь выбросить прототип / начальную реализацию системы. В этой главе Фредерик пишет, что часто команды пытаются превратить в полноценную программу самую первую ее версию, и это ошибка, потому что единственное назначение этой версии - это проверка гипотез и получение опыта. То есть, нельзя дом из говна и палок превратить в дом, который долго простоит. Его надо разрушить и построить заново. “Постоянны только изменения” - хорошая фраза из той главы. Отставание от графика всегда происходит постепенно. Никакой проект не отстает сразу на год - это происходит через “блин, сегодня не успел, но завтра точно будет” раз за разом.. Чтобы избежать этого, цели должны быть атомарными - либо сделано, либо нет. “Готово на 90%” не подходит и будет самообманом. Также этапы должны быть короткими - несколько недель, не больше. Серебряной пули нет. Никакие отдельно взятые методика или инструмент не позволят ускорить разработку ПО в десятки раз. Комплекс мер и знаний на протяжении многих лет - возможно. Спи спокойно, Фредерик. Ты нас многому научил.
2 года назад
Я к Вам пишу, чего же боле
Я к Вам пишу, чего же боле Уже много лет я веду профессиональный дневник. Иногда реже, иногда чаще. В последние годы стабильно раз в неделю. Дневник - это просто открытый для коллег и партнеров Markdown файл, куда тезисно записывается сделанное за неделю. Так как процесс этот я нахожу ценным, запишу впечатления от процесса и его становления. Почему полезно делать такие записи? Ну, например, это позволяет посмотреть на сделанное и сравнить с запланированным. Важно писать как есть - если что-то не закончено, то не надо обманывать себя и бумагу. Я, например, знаю, что когда есть какое-то важное, но...
2 года назад
Умение обходить препятствия
Умение обходить препятствия Одним из важных гибких навыков инженера является способность преодолевать препятствия при достижении цели. Движение по инженерной карьере предполагает постоянное развитие этого умения. Если в случае с джуном еще может быть нужно периодически спрашивать "ну как идут дела?", то с мидлом и выше ожидается, что работа либо продвигается, либо предпринимаются усилия по преодолению затыков, либо проблема сигнализируется для ее разрешения сообща. Редкий руководитель любит сюрпризы типа увидеть на ревью изменение, мало относящееся к текущему проекту, а в ответ на вопрос “а зачем...
2 года назад
Словари и термины
Словари и термины В любом техническом проекте есть концепции, сущности и действия, которые должны быть поименованы. Особенно их много на ранних этапах. Как известно, в компьютерных делах есть всего две сложные задачи - инвалидация кэша и выбор имен, так что горячие дискуссии на тему выбора названий неизбежны. Cоздание общего “словаря” для команды - одна из важнейших задач технического командира проекта, а подводные камни могут встретиться здесь на каждом шагу. Во-первых, велик соблазн пустить все на самотек. Типа, сами разберутся. Скорее всего, действительно разберутся, но результат вряд ли будет оптимальным...
2 года назад
Что в имени тебе моем...
Что в имени тебе моем... В любом программном проекте сегодня внедрена та или иная система отслеживания дефектов, она же баг-трекер. Bugzilla, Jira, GitLab / GitHub - популярные продукты этого типа. Увы, большинство команд до сих пор не умеют нормально именовать и переименовывать баги. Название дефекта - это строка, которая видна в большинстве списков и отчетов. Это 7-15 слов, в которых надо выразить квинтэссенцию проблемы. Каждое слово в названии бага - на вес золота. Если бы баг был Москвой, то его название было бы Рублевским шоссе. Тем не менее, названия дефектов вроде "Проблема с генерацией отчета" встречаются сплошь и рядом...
2 года назад
О делегировании. Первое правило делегирования: то, что нравится делать, скорее всего надо делегировать. Следствие: успешное делегирование - это когда делаешь только то, что не нравится. Это, конечно, шутка, но лишь частично. Рост технического лидера / руководителя подразумевает выход из зоны комфорта. Я не говорю про "не нравится" в смысле ненависти к своей работе - это, очевидно, нездоровая штука. Я про напряжение развития, как в спортзале. И в технических проектах это прежде всего про работу, которую кроме лидера вряд ли кто-то еще в команде сделает. Например, когда вся команда пишет код или что-то интересно дебажит, техлиду лучше заняться чем-то, что является более определяющим для проекта - планирование и расстановка приоритетов, изучение метрик и их трендов, обновление документации в важных местах типа API, прямое общение с пользователями, инспекция и улучшение процессов, найм и увольнение и так далее. Работа лидера - делать то, что сделает команду более эффективной, увеличит ее производительность и даст ей смысл на месяцы вперед. Все прочее можно и нужно делегировать.
2 года назад
Документируйте "зачем", а не "что".
Документируйте "зачем", а не "что". Одно из частых замечаний, которое я оставляю при рецензировании кода (code review) это вариации на тему "вижу что здесь делается, но не вижу зачем". Статистику не собирал, но чуть ли не в каждом третьем по ощущениям. Представим C++ код вроде ... // Sort the items container. std::sort(items.begin(), items.end()); ... Здесь комментарий просто описывает прозой то, что понятно и без него - да, мы действительно сортируем этот контейнер. В принципе, комментарий можно просто удалить без каких-либо отрицательных последствий для научно-технического прогресса. В то же...
2 года назад
Немного про hard skills и soft skills, они же специальные и гибкие навыки.
Немного про hard skills и soft skills, они же специальные и гибкие навыки. Специальные навыки - классическая основа процесса обучения чему-либо, то, про что мы прежде всего думаем, когда говорим, что кто-то чему-то учится. Как забить гвоздь, как писать программы, как рассчитать прочность проектируемого моста и так далее. Гибкие навыки - набор умений, важных для достижения результата при работе в команде с другими людьми. К примерам можно отнести навыки общения, критического мышления со способностью как убеждать других, так и изменения своей точки зрения, умение выступать публично и многое другое...
2 года назад