Читать в телеге. Когда-то там были посты не только от меня.
Асинхронная коммуникация вместо встреч
Довольно неплохая статья про организацию асинхронного общения.
Базовый посыл достаточно очевидный: много встреч — это плохо, асинхронные обсуждения — это хорошо. У оффлайн обсуждений масса плюсов: каждый читает в своем темпе, можно подумать о чем-то поглубже, автоматом сохраняются обсуждения и решения для будущих поколений и т.д. Но в статье есть еще и адекватный обзор случаев, когда команды/компании недостаточно зрелые и асинхронные обсуждения не будут эффективны. Да и сам процесс стоит задокументировать. В общем, есть нюансики.
На мой взгляд, культура компании очень сильно на это влияет. У многих большие трудности с тем, чтобы сделать повестку встречи и понять, что вообще от встречи требуется. Заметки по итогам встречи (да и вообще какие-то артефакты) оставляют единицы. Готовиться ко встрече, на которую тебя пригласили? “Да ну, зачем” или “я очень занят, мне некогда”. Плюс встреча это практически набор голосовух со всеми минусами. В итоге встреча превращается в какое-то коллективное бессознательное: собрались, поговорили, а вот зачем, с каким итогом и что вообще обсуждали — пес его знает.
Даже если перевести обсуждение в асинхронный формат, то можно ждать неделю хоть какой-то реакции (я очень занят, много встреч), даже когда вопрос на 10 минут и нужен формальный аппрув. Еще кто-то может прочитать, но никак не отреагировать (и сказать потом устно). В общем, асинхронь не асинхронь, все равно получишь хтонь, если культура такая.
Безусловно, некоторые встречи можно оставить для того, чтобы работать с людьми, а не пикселями в компуктере. И встречи хороши для устранения недопонимания (подобно тому как вы делаете код-ревью: сначала комменты, потом после пары итераций можно и созвониться по-быстренькому, чтобы обсудить варианты).
Markdown в Google Docs
В гугл-доках можно включить распознавание (автозамену) Markdown. Забавно, что это в русской версии указано как “автоматически распознавать разметку”, как будто других видов разметок нет. Поддержка довольно урезанная:
- Всякие преобразования текста (жирно, курсивом, моноширинно и т.п.) поддерживаются.
- Блоки кода с
```
— только в платной версии (потому что блоки кода в принципе только в ней и доступны). Но они не очень полезны в любом случае (и там только 4 языка: C++, Java, JS и Python). - Заголовки работают.
- Ссылки
[ty](http://id.or)
не работают, так что только выделение + Ctrl+K в помощь. Картинки тоже не работают. - Цитаты
>
не работают. - Списки — вроде как да, но у меня иногда багает.
- Разделители
---
— не поддерживаются, но с другой стороны в документах они и не нужны особо. - Таблицы — мимо.
- Сраные смайлики — выпрыгивают после
:
. К счастью, можно это отключить там же, где и Markdown включается. - Подстрочный или надстрочный текст — тоже не работает (поставьте LaTeX уже наконец).
Еще можно поставлять всякой дичи при автодополнении @
, например, даты, людей, эмодзи для голосования (sic!) и т.п.
Приоритизация продуктовых задач
Интересно, есть ли где-то хоть сколько-нибудь адекватно систематизированное планирование? У меня по этому поводу в основном не очень позитивный опыт.
Чаще всего встречался подход “делаем, потому что надо” и HiPPO (Highest Paid Person Opinion). Это кстати не такой уж и плохой вариант, если ответственное лицо адекватное, да и меньше времени требует. Есть чуть более формальные вариации (например, MoSCoW, Kano model), но это примерно то же самое в итоге.
Но мы же сейчас в бигдате, надо data-driven! (И телеметрия!) Тут легко обмазаться метриками в комбинации с экспертными оценками и “предсказывать”, как эти метрики улучшатся при добавлении фичи. И из всего этого получить для каждой фичи какое-нибудь число, например, линейной комбинацией нескольких параметров (так еще некоторые студенты в дипломе делают, чтобы обосновать превосходство своего решения). Коэффициенты обычно рожаются “экспертной оценкой” и соответствуют текущей стратегии. Есть несколько стандартных шаблонов для этого — например, RICE с кучей вариаций. У такой формализации есть преимущество, что можно “поиграться” с коэффициентами при смене стратегии, и тяжелее ошибиться в раздробленных экспертных оценках, но все равно экспертность никуда не делась.
С другой стороны, упарываться data-driven тоже не стоит: если ориентироваться на прибыль, то пользователю обычно от этого только хуже. Вообще, о конечном пользователе часто забывают (хотя тут можно отрицать все по методике, предписываемой Форду) или, что еще хуже, превращают его в тупую метрику.
Возвращаемся к простым экспертным оценкам…
Структура TLS
Очень хорошая детализация протокола TLS прямо до байтов. Есть такое же для QUIC и DTLS (который используется, например, в WebRTC).
API телеграма и баны
Чтобы публиковать посты в канал, я почти сразу написал скриптик, чтобы решить проблемы с markdown (например, до сих пор в телеге markdown не поддерживает ссылки). Скрипт использовал Telethon, который подключается с использованием моего аккаунта.
Перед новым годом телеграм решил мне выдать бан — разлогинил со всех устройств и долго (больше часа) не давал попасть в аккаунт. Хотя я делал сколько, 10 запросов в неделю? К счастью, помогла переустановка клиента. Было достаточно стрессово: с некоторыми людьми прямая связь только в телеге.
Ладно, давайте попробуем сделать все “правильно”: создаем бота, добавляем его в админы канала, используем python-telegram-bot… и обнаруживаем, что в API ботов нет возможности делать отложенные сообщения -_-.
У Telethon есть аналоги — Pyrogram и MadelineProto. На беглый взгляд при их использовании будет та же проблема с банами. Один раз попал в черный список — и привет:)
Я дошел даже до того, чтобы посмотреть на альтернативные клиенты для веба — A и K. В одном та же проблема с разметкой, а вот второй вроде смог распарсить ссылку, но блоки с кодом поломал: было смещение на 1 символ. Код открыт — отлично, можно сделать PR с исправлением и делать отложки вручную! Вот только в исходниках ноль тестов на парсинг разметки… Ладно, видимо не вариант.
Попробовал пару “советов” по Telethon — перебор диалогов, sleep
понаставить, какие-то хаки с system_version
— не помогло. В итоге решил-таки попробовать pyrogram (терять особо нечего) — и все заработало :/ Парсит markdown он хуже (у него вообще своя версия), но хотя бы работает.
Вообще когда телега стартовала, казалось, что это глоток свежего воздуха и очень переспективная платформа. А сейчас смотришь — баги не фиксятся годами, вроде богатое API, но что-то просто сделать не можешь, да еще и баны на ровном месте…
Отличие конкурентности от параллелизма
Доклад от создателя Go. Несмотря на то, что докладу уже больше 11 лет, он достаточно простой и фундаментальный, чтобы не потерять актуальности.
Основное отличие — это иметь дело с несколькими вещами против делать несколько вещей. Разобран хороший и забавный пример, как одну и ту же задачу (сжигание старых стандартов в печи) можно сделать по-разному. Кроме этого, разобраны базовые структуры для композиции в Go, но их аналоги есть в других языках, например в Котлине. В конце чуть-чуть напрягло, что в примере с балансировщиком нагрузки была использована “сырая” куча, а не очередь с приоритетом.
Отдельный кек — если вы находитесь на странице Concurrency и перейдете на русский перевод, то попадете… на страницу Параллелизм. Справедливости ради, там есть раздел про различие.
Отладка GitHub Actions
Полезный инструмент, чтобы отлаживать GitHub Actions. Скачивает пол-интернета, но работает довольно шустро.
Очевидный бонус — позволяет быстрее проверить работу действий, без засорения репозитория коммитами. Чтобы триггернуть событие, достаточно всего лишь
act -j action_job
или чего-то вроде
act issue -s GITHUB_TOKEN=... -j action_job -e event.json
Еще можно отлаживать action, которое в процессе разработки (правда надо убедиться, что оно есть в каком-то коммите и “загрузить” его):
...
steps
- uses: actions/checkout@v4
- uses: ./my-action
Премии
Исследование более чем 30-летней давности про влияние премий на производительность труда и мотивацию сотрудников. Понятно, что многое могло поменяться, но все равно многое вроде применимо и сегодня.
Конечно, приятно, когда тебе премию выдали, но вот большинство премий вроде как вредят компании (и не потому, что деньги тратятся). Правильно выстроить премирование — сложная задача:
- Если премия привязана к KPI, то будет типичная проблема любого KPI;
- Премии поощряют хорошо работать в рамках текущей системы, но не улучшать ее;
- Почти все сотрудники считают себя хорошими работниками (но все премию не получат);
- Если выполнены условия для премии, то почти нет мотивации делать что-то сверх этого;
- Некоторые виды премий могут привести к внутренней конкуренции, которая обычно контр-продуктивна;
- Сложные работы делаются командой, а премии обычно выдают индивидуально — нестыковочка;
- Премии вроде как должны повышать производительность труда, но исследования показывают, что проблемы обычно в системе, а не в конкретных людях;
- Премии в основном сфокусированы на краткосрочных вещах.
В целом тяжело построить что-то объективное, не основанное на KPI/метриках, поощряющее командную работу и при этом воспринимаемое как справедливое.
Я как-то не задумывался, что, оказывается, премии тащат за собой сложные социальные вопросы и в целом современные исследования сводятся к тому, что премии скорее вредны, чем полезны (ну или все куплено капиталистами, чтобы меньше тратить денег, кек).
Имхо, еще можно посмотреть на все это с точки зрения учебы и оценок (обесценивание оценок, учеба на оценку, а не на знания и т.д.).
Mermaid
Недавно попробовал Mermaid-диаграммы. В целом ощущения похожи на markdown — прикольно делать что-то простое; хорошо, что это простой текст, который легко хранить в гите; генерируется SVG, в котором можно выделять текст.
Однако как только что-то не работает, то начинаются трудности. Например, у меня в схеме процесса образовалось много пересекающихся линий (хотя при этом граф планарный) и нет какого-то нормального способа это исправить, только случайная перестановка строк, пока не получится что надо. Другая проблема, с которой столкнулся — очень маленькое изображение из-за ограничения по ширине, а какой-то нормальной раскладки или “построчного” переноса нет. Нет и возможности увеличения по клику (из коробки). Поковырявшись почти час с разными настройками ширины на уровне CSS, графа и глобальных настроек в итоге плюнул, сменил направление с горизонтального на вертикальное и получил приемлемый результат. Ко всему этому можно добавить довольно нерегулярный синтаксис.
Однако, если отбросить перфекционизм, то вполне рабочий инструмент. Поиграться можно тут.
graph TD
*>*] --x **[/"_____"\]
** --- ***{{.}} --- _{{_}} --- .{{*}}
** --- ****{{.}} --- _ --- ..{{*}}
** --- ***{{.}} --- __{{_}} --- ...
** --- ****{{.}} --- __ --- .
%% *** --- ****
*** --- ___{{_}} --- .
**** --- ___ --- ..
*** --- _{{_}} --- ...{{*}}
*** --- __{{_}} --- ..
*** --- ___{{_}}
**** --- _ --- ....{{*}}
**** --- __ --- ....
**** --- ___ --- ....
___ --- ...
cgi-bin
Есть что-то притягательное в том, чтобы иногда делать что-то “как в старину”.
Я повелся на шальную мысль и написал cgi-скрипт. Прямо на “проде”. По SSH, редактируя в nano. Без тестов, VCS и СМС. И теперь любое посещение специальной (публичной!) ссылки будет приводить к исполнению питоновского скрипта. С URL-параметрами, передаваемыми в переменные окружения без фильтрации и экранирования. С возвратом полной копии стандартного потока вывода пользователю. “Это безопасно. Дэвид, эксперт по безопасности”.
Больше всего времени я потратил на борьбу с правами доступа (и узнал, что бит исполнения в директории влияет на то, можно ли в нее по символической ссылке переходить). Но если отбросить это, то поменять консольный скрипт на “веб-сервер” — дело на пару минут.
Такая простота искушает. На настоящей работе такого конечно в жизни уже не сделаешь (да и никто и не даст). Сама возможность запускать скрипт на сервере по запросу от пользователя без кучи прослоек сейчас звучит диковато.