Мелкие трюки в программировании
Каждый день инженерная продуктивность на удивление во многом зависит от небольших кусков знаний: осознание того, что в языке существует определённая возможность; понимание, что необъяснённая задержка TCP вероятно связана с настройкой TCP_NO_DELAY и алгоритмом Nagle; знание правильной команды git для выхода из затруднения; или трюк с sed для переписывания файла.
В одном смысле это очевидно: все полученные знания состоят из более мелких кусков информации. Конечно, эти мелкие куски имеют значение.
Но есть такие куски знаний, которые особенно ценны и не требуют большой поддерживающей инфраструктуры сознания. Не нужно ничего знать о Python, чтобы запустить python3 -m http.server и поднять простой сервер в каталоге, но это всё равно может немного облегчить работу. Вот несколько примеров:
- Вероятно, известно, что
ctrl + rпозволяет искать в истории команд терминала, но если установить fzf, можно настроить так, чтобыctrl + rвыполнял нечёткий поиск. Для большей мощности существует atuin, который заменяет историю шелла базой данных SQLite с поиском. per-directory-history позволяет переключаться между поиском команд, запущенных в определённом каталоге, и поиском всех предыдущих команд. Также можно настроить, сколько истории хранить: вопрос на stackoverflow. - Можно выполнить
SELECTбезFROM. Это полезно для тестирования того, как работает функция в базе данных, или для напоминания себе, как работаетSELECT TRUE <> NULL.1 - PostgreSQL и MySQL поддерживают
explain analyze, который действительно запустит оптимизируемый запрос и предоставит гораздо больше информации о его производительности. - В регулярных выражениях
\b, утверждение границы слова, облегчает поиск начал или концов слов. - Можно использовать логарифмы с метриками, чтобы получить представление о распределении значений интересующего поля:
const bucket = Math.floor(Math.log10(userInGroupCount)) metrics.increment("my_metric", { bucket }); - Современный JavaScript поддерживает Array.flatMap, Object.entries и Promise.withResolvers.
- В Node.js можно держать соединение открытым с внешним ресурсом, создав https.Agent и передав его в HTTP-запросы:
fetch(url, {method, agent}). Это может резко сократить задержку. git log -S pattern("git pickaxe") выдаёт все коммиты, которые добавили или удалили строку в кодовой базе. Это особенно полезно со старыми кодовыми базами! (git log -G patternработает аналогично, но также показывает, когда строка была перемещена.)- Подобно
cd -, можно использоватьgit checkout -для переключения на предыдущий HEAD. - Вероятно, не нужно
find. Множество командfindможно заменить глобами, такими как**/*.md. Большинство шеллов поддерживают это из коробки, но в bash нужно включить это с помощьюshopt -s globstar. - По аналогии, большинство захочет использовать
rg(ripgrep) вместоgrep,ackилиag. - Функции продвинутого автодополнения zsh не включены по умолчанию:
if type brew &>/dev/null; then FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}" fi autoload -Uz compinit compinit
Вполне возможно, что все эти трюки уже известны! Или же можно работать в области, где все эти небольшие трюки совершенно бесполезны. Даже если это конкретный набор трюков не пригодится, наверняка накопился собственный запас трюков за годы, которые облегчают работу.
В компании ещё больше знаний оказывается таким мелким, высокорентабельным куском:
- Для отладки $PROBLEM используй $DATA_SOURCE.
- $PERSON знает много о $AREA и рад помочь, если что-то не получится.
- Есть хорошая документация про $HARD_THING $OVER_HERE.
- Когда случается $THING, это означает, что нужно вручную масштабироваться.
- Для перезагрузки сервиса с сохранением запросов запусти $THIS_COMMAND.
- Эта $UTIL облегчает написание сценариев для $THAT_PROBLEM.
В одной компании делился трюком в Slack каждый день с инженерной командой — как техническими, так и специфичными для компании, — и людям это нравилось. Даже если знать 9 из 10 трюков, этот 10-й документ или техника могут сэкономить время! А один трюк в день — правильное количество, чтобы не перегружать людей информацией и иногда вызвать полезную дискуссию. Если быть более опытным инженером в компании, стоит рассмотреть что-то подобное.
-
Кажется, впервые этот приём встречен на блоге Julia Evans, и её писательство часто идеально воплощает идею этой статьи:
«мелкие куски знаний мощны! и забавны! и доступны!!»
↩︎