Читать в телеге. Когда-то там были посты не только от меня.
Премии
Исследование более чем 30-летней давности про влияние премий на производительность труда и мотивацию сотрудников. Понятно, что многое могло поменяться, но все равно многое вроде применимо и сегодня.
Конечно, приятно, когда тебе премию выдали, но вот большинство премий вроде как вредят компании (и не потому, что деньги тратятся). Правильно выстроить премирование — сложная задача:
- Если премия привязана к KPI, то будет типичная проблема любого KPI;
- Премии поощряют хорошо работать в рамках текущей системы, но не улучшать ее;
- Почти все сотрудники считают себя хорошими работниками (но все премию не получат);
- Если выполнены условия для премии, то почти нет мотивации делать что-то сверх этого;
- Некоторые виды премий могут привести к внутренней конкуренции, которая обычно контр-продуктивна;
- Сложные работы делаются командой, а премии обычно выдают индивидуально — нестыковочка;
- Премии вроде как должны повышать производительность труда, но исследования показывают, что проблемы обычно в системе, а не в конкретных людях;
- Премии в основном сфокусированы на краткосрочных вещах.
В целом тяжело построить что-то объективное, не основанное на KPI/метриках, поощряющее командную работу и при этом воспринимаемое как справедливое.
Я как-то не задумывался, что, оказывается, премии тащат за собой сложные социальные вопросы и в целом современные исследования сводятся к тому, что премии скорее вредны, чем полезны (ну или все куплено капиталистами, чтобы меньше тратить денег, кек).
Имхо, еще можно посмотреть на все это с точки зрения учебы и оценок (обесценивание оценок, учеба на оценку, а не на знания и т.д.).
Mermaid
Недавно попробовал Mermaid-диаграммы. В целом ощущения похожи на markdown — прикольно делать что-то простое; хорошо, что это простой текст, который легко хранить в гите; генерируется SVG, в котором можно выделять текст.
Однако как только что-то не работает, то начинаются трудности. Например, у меня в схеме процесса образовалось много пересекающихся линий (хотя при этом граф планарный) и нет какого-то нормального способа это исправить, только случайная перестановка строк, пока не получится что надо. Другая проблема, с которой столкнулся — очень маленькое изображение из-за ограничения по ширине, а какой-то нормальной раскладки или “построчного” переноса нет. Нет и возможности увеличения по клику (из коробки). Поковырявшись почти час с разными настройками ширины на уровне CSS, графа и глобальных настроек в итоге плюнул, сменил направление с горизонтального на вертикальное и получил приемлемый результат. Ко всему этому можно добавить довольно нерегулярный синтаксис.
Однако, если отбросить перфекционизм, то вполне рабочий инструмент. Поиграться можно тут.
graph TD
*>*] --x **[/"_____"\]
** --- ***{{.}} --- _{{_}} --- .{{*}}
** --- ****{{.}} --- _ --- ..{{*}}
** --- ***{{.}} --- __{{_}} --- ...
** --- ****{{.}} --- __ --- .
%% *** --- ****
*** --- ___{{_}} --- .
**** --- ___ --- ..
*** --- _{{_}} --- ...{{*}}
*** --- __{{_}} --- ..
*** --- ___{{_}}
**** --- _ --- ....{{*}}
**** --- __ --- ....
**** --- ___ --- ....
___ --- ...
cgi-bin
Есть что-то притягательное в том, чтобы иногда делать что-то “как в старину”.
Я повелся на шальную мысль и написал cgi-скрипт. Прямо на “проде”. По SSH, редактируя в nano. Без тестов, VCS и СМС. И теперь любое посещение специальной (публичной!) ссылки будет приводить к исполнению питоновского скрипта. С URL-параметрами, передаваемыми в переменные окружения без фильтрации и экранирования. С возвратом полной копии стандартного потока вывода пользователю. “Это безопасно. Дэвид, эксперт по безопасности”.
Больше всего времени я потратил на борьбу с правами доступа (и узнал, что бит исполнения в директории влияет на то, можно ли в нее по символической ссылке переходить). Но если отбросить это, то поменять консольный скрипт на “веб-сервер” — дело на пару минут.
Такая простота искушает. На настоящей работе такого конечно в жизни уже не сделаешь (да и никто и не даст). Сама возможность запускать скрипт на сервере по запросу от пользователя без кучи прослоек сейчас звучит диковато.
GUI для Python-скриптов
Прикольная штука, которая за счет магии мета-программирования добавляет GUI для скрипта на основе его argparse
структуры (увы, просто для sys.argv
не работает). Область применения конечно весьма узка (потому что вряд ли ваша бабуля будет запускать питон-скрипты), но вдруг кому пригодится. Тянет wxpython
, который ставится полгода.
Отличия Prometheus от InfluxDB
Prometheus — де-факто стандарт для всяких куберов и микросервисов. До него я работал с TICK-стеком, в частности с InfluxDB.
Я особо не вдавался в различия этих двух систем — ну метрики и метрики, че там может быть такого? Но недавний опыт с запихиванием данных в Prometheus в нестандартном сценарии и их последующим запросом показал, что можно конечно плакаться и колоться, но кактус жрать дальше как-то не очень. В итоге обсудили с коллегой, что если мы в основном пушим данные, то InfluxDB лучше подходит для наших сценариев.
Фундаментальное отличие Prometheus от InfluxDB — это разные модели работы с данными: push vs pull. При этом у Prometheus есть Push Gateway (который работает хреново), а InfluxDB — telegraf (агент, который опрашивает и пушит), и он работал без особых проблем. Киллер-фича Prometheus — это то, что он хорошо клеиться с микросервисами, для InfluxDB нужно чуть больше церемоний. Но складывается впечатление, что InfluxDB универсальнее и покрывает большинство сценариев.
Хороший разбор на эту тему можно посмотреть тут.
Простая Scala
Занятный доклад от Одерски про усилия команды разработчиков языка, чтобы Scala стала проще.
Хотя я и до этого смотрел несколько докладов Одерски, в этом меня немного удивила практичность подходов: у меня было стереотипное представление об ученом в слоновой башне с жесткими принципами функциональной чистоты. Например, он рассказывает, как энтузиаст заменил императивную реализацию расстояния Левенштейна в компиляторе на чисто функциональную с иммутабельными структурами. Оказалось, что реализация неверная, да еще и хуже читается, поэтому оставили старую. Другой пример: большинство присутствующих в зале скалистов признало, что тупой матчер на Option
лучше, чем .fold
или .map(...).getOrElse(...)
.
В конце доклада есть еще блок о Caprese и эффектах. На примере функций высшего порядка Одерски объясняет, чем capabilities лучше проверяемых исключений.
Что такое шейдер
Классная обучающая и интерактивная статья про шейдеры. Я очень далек от графики (и игор, которые ее требуют Т_Т), но прочитал с удовольствием.
Передача данных через ICMP (ping)
Классная статья, в которой хорошо разобран протокол ICMP, можно узнать как работает tracert
и как с помощью буханки и троллейбуса (питона и винды) получить туннель из огороженной сети в интернет.
Поиск TODO и FIXME в ветке
Вот вы накалякали PR, пришла стадия рефакторинга — стоит пройтись по всем мелким замечаниям и поправить их. Но по умолчанию в какой-нибудь Intellij будут показываться все TODO, а не только ваши. Конечно, ваша кодовая база хорошая, и их будет не очень много, да? Падме.жпг В итоге надо как-то отфильтровать только то, что относится к вашей ветке.
Теоретически эту проблему могут решить области поиска, однако динамические области в IntelliJ пока не поддерживаются. Есть плагин, который вроде работает, но подписка стоит аж 1 доллар в месяц — непозволительные расходы!
Попробуем сделать это через консоль. Читать документацию git
— сомнительная затея: как и пользовательский интерфейс git
, она тоже любит “тщательно выбирать друзей”. Нам нужны все изменения в ветке:
git diff --merge-base master
Эта команда выдаст патч на все закоммиченное и добавленное в git
. Но есть еще и недобавленные файлы:
git ls-files --others --exclude-standard
Объединяем это все через cat
и grep
’аем. Ну и чтобы не запоминать колбасу, добавляем функцию в ``~/.bash_aliases` (или где вы там храните своё):
function branch_todo(){
cat <(git ls-files --others --exclude-standard -z | xargs -0 cat) \
<(git diff --merge-base master) \
| grep -i -E 'TODO|FIXME|FIMXE'
}
У людей еще есть шанс в го
Многие, я думаю, слышали, как в 2016 Alpha Go победил Ли Седоля в го, после чего тот заявил о своем уходе из го.
В феврале этого года вышло исследование, в котором экспериментировали с аналогичным, более продвинутым движком и нашли в нем дырку: стратегию, которой может научиться человек и обыгрывать компьютер в 97% случаев. Стратегию эту мог бы заметить любой достаточный опытный игрок. По сути, это adversarial атака на движок.
Если шахматы “почти решены” за счет алгоритмов и вычислительных мощностей, и там все +- предсказуемо и понятно качество, то с го получается сложнее: да, ИИ обыгрывает чемпионов, но засчет кучи паттернов, которые, как оказалось, покрывают не все случаи. Причем просто поправить это, по мнению авторов исследования, не получится.
В общем, глубокие нейронки крутые, но не супер-надежные. Нужно больше GAN’ов строить для них.