<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Principal Engineering</title><link>/</link><description>Recent content on Principal Engineering</description><generator>Hugo</generator><language>ru-ru</language><copyright>© Petr Korobeinikov 2026.</copyright><lastBuildDate>Tue, 06 Aug 2024 22:08:38 +0300</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>Showcase-проекты</title><link>/posts/showcase/</link><pubDate>Tue, 06 Aug 2024 22:08:38 +0300</pubDate><guid>/posts/showcase/</guid><description>&lt;p>Вместо pet-проектов, которые у большинства из нас застывают в состоянии как на картинке&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>, я практикую создание
showcase-проектов. Этот подход хорошо зарекомендовал себя и прижился (как мне кажется) в моей команде.&lt;/p></description></item><item><title>Service Template</title><link>/posts/service-template/</link><pubDate>Mon, 08 Jan 2024 07:24:57 +0300</pubDate><guid>/posts/service-template/</guid><description>&lt;p>Даже среди сильных инженеров часто можно услышать такое мнение:&lt;/p>
&lt;blockquote>
&lt;p>Ну, микросервисы, это когда каждый сам ковыряется как хочет,
выбирает что хочет и как-то там решает проблемы.&lt;/p>&lt;/blockquote>
&lt;p>К большому сожалению, это частое заблуждение.
Давайте обсудим, какие преимущества даёт применение
паттерна &lt;code>Service Template&lt;/code>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> на уровне всей компании.&lt;/p></description></item><item><title>Инженерная зрелость</title><link>/posts/engineering-maturity/</link><pubDate>Fri, 22 Dec 2023 20:35:38 +0300</pubDate><guid>/posts/engineering-maturity/</guid><description>&lt;p>Инженерная зрелось — это показатель высокого уровня подготовки, глубины опыта и широты кругозора.&lt;/p>
&lt;p>Мои коллеги, работавшие и работающие со мной, знают, что для характеристики уровня инженерной зрелости я использую три
термина:&lt;/p>
&lt;ul>
&lt;li>Единообразие&lt;/li>
&lt;li>Системность&lt;/li>
&lt;li>Воспроизводимость&lt;/li>
&lt;/ul>
&lt;p>Давайте обсудим, какой смысл я вкладываю в каждый из них. Я приведу примеры из моей предметной области и буду рад вашим
в комментариях.&lt;/p></description></item><item><title>traefik</title><link>/posts/traefik/</link><pubDate>Mon, 18 Dec 2023 21:21:43 +0300</pubDate><guid>/posts/traefik/</guid><description>&lt;p>Данная заметка является ответом на комментарий одного из моих подписчиков, который предложил тему следующего поста:&lt;/p>
&lt;blockquote>
&lt;p>&amp;hellip; как настроить докер чтобы LB сразу в нужные контейнеры роутил&lt;/p>&lt;/blockquote>
&lt;p>Как я вижу поставленную задачу?&lt;/p></description></item><item><title>mkcert</title><link>/posts/mkcert/</link><pubDate>Thu, 14 Dec 2023 14:01:22 +0300</pubDate><guid>/posts/mkcert/</guid><description>&lt;p>При разработке в локальном окружении многие пренебрегают имитацией &lt;code>https&lt;/code> и запускают свои сервисы по &lt;code>http&lt;/code>.&lt;/p>
&lt;p>Задача состоит в следующем:&lt;/p>
&lt;ul>
&lt;li>Сервить траффик на локальной машине по &lt;code>https&lt;/code> с валидным сертификатом;&lt;/li>
&lt;li>Сделать так, чтобы это легко воспроизводилось не только у вас, но и у всех членов вашей команды.&lt;/li>
&lt;/ul></description></item><item><title>dnsmasq</title><link>/posts/dnsmasq/</link><pubDate>Tue, 14 Nov 2023 11:11:23 +0300</pubDate><guid>/posts/dnsmasq/</guid><description>&lt;p>Когда-то многие из нас занимались разработкой сайтов, и, чтобы локально разрабатывать и тестировать очередной проект,
добавляли в &lt;code>/etc/hosts&lt;/code> ещё одну запись примерно такого вида:&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-hosts" data-lang="hosts">127.0.0.1 next-project.tld
&lt;/code>&lt;/pre></description></item><item><title>http.DefaultClient</title><link>/posts/go-http-defaultclient/</link><pubDate>Sat, 21 Oct 2023 11:04:54 +0400</pubDate><guid>/posts/go-http-defaultclient/</guid><description>&lt;p>&amp;ldquo;1024 плети тому, кто использует &lt;code>http.DefaultClient&lt;/code> в своём коде&amp;rdquo; — такая &amp;ldquo;шутка&amp;rdquo; звучит на наших стендапах. Проблема
заключается в отсутствии таймаутов в настройках по умолчанию. На эту тему есть отличная статья в
блоге &lt;code>Cloudflare&lt;/code>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>.&lt;/p></description></item><item><title>uber/fx + gRPC</title><link>/posts/go-uber-fx-grpc-showcase/</link><pubDate>Fri, 13 Oct 2023 09:33:55 +0400</pubDate><guid>/posts/go-uber-fx-grpc-showcase/</guid><description>&lt;p>В своих решениях я использую &lt;code>IoC&lt;/code>-контейнер &lt;code>fx&lt;/code>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> от &lt;code>Uber&lt;/code>. Существуют разные лагери сторонников и противников
подобных решений, но мы сконцентрируемся именно на теме применения &lt;code>fx&lt;/code>.&lt;/p>
&lt;p>Если вы не знакомы с основами применения, я рекомендую выполнить официальный &lt;code>Quick Start&lt;/code>&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>. Он поможет
начать ориентироваться в решении.&lt;/p></description></item><item><title>Gitlab Subgroup + go get</title><link>/posts/gitlab-subgroup-go-get/</link><pubDate>Fri, 06 Oct 2023 20:37:55 +0400</pubDate><guid>/posts/gitlab-subgroup-go-get/</guid><description>&lt;p>Дано:&lt;/p>
&lt;ul>
&lt;li>&lt;code>gitlab&lt;/code>, скорее всего, развернутый во внутреннем контуре;&lt;/li>
&lt;li>&amp;ldquo;перфекционизм&amp;rdquo;, требующий раскладывать всё &amp;ldquo;по папочкам&amp;rdquo;, или требование свыше;&lt;/li>
&lt;li>внутренний пакет на &lt;code>Go&lt;/code>, который необходимо устанавливать как зависимость.&lt;/li>
&lt;/ul></description></item><item><title>Jetbrains Space + go get</title><link>/posts/jetbrains-space-go-get/</link><pubDate>Wed, 04 Oct 2023 20:06:21 +0400</pubDate><guid>/posts/jetbrains-space-go-get/</guid><description>&lt;p>Дано:&lt;/p>
&lt;ul>
&lt;li>Вы используете &lt;code>Jetbrains Space&lt;/code>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>.&lt;/li>
&lt;li>Вы пишите код на &lt;code>Go&lt;/code>.&lt;/li>
&lt;li>Вам необходимо создать общую библиотеку и подключать её как модуль в ваших внутренних проектах.&lt;/li>
&lt;/ul></description></item><item><title>lima, colima, M1</title><link>/posts/lima-colima-m1/</link><pubDate>Fri, 22 Sep 2023 16:44:05 +0400</pubDate><guid>/posts/lima-colima-m1/</guid><description>&lt;p>По той или иной причине вы перешли с &lt;code>Docker Desktop&lt;/code> на &lt;code>lima&lt;/code> или &lt;code>colima&lt;/code> и у вас макбук на &lt;code>M1&lt;/code>.&lt;/p>
&lt;p>По умолчанию &lt;code>lima&lt;/code> и &lt;code>colima&lt;/code> используют под капотом &lt;code>qemu&lt;/code>. Чтобы получить ускорение в 1.5-2 раза &lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>, вам
необходимо запускать машину с опциями виртуализации, заменяющими &lt;code>qemu&lt;/code> на &lt;code>Virtualization.Framework&lt;/code>&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>.&lt;/p></description></item><item><title>oasdiff</title><link>/posts/oasdiff/</link><pubDate>Thu, 21 Sep 2023 19:43:36 +0400</pubDate><guid>/posts/oasdiff/</guid><description>&lt;p>Дано:&lt;/p>
&lt;ul>
&lt;li>Две версии одного приложения: A и B.&lt;/li>
&lt;li>Обе версии предоставляют контракт, описанный с помощью &lt;code>OpenAPI&lt;/code>.&lt;/li>
&lt;li>У приложения есть пользователи, соблюдающие текущий контракт.&lt;/li>
&lt;/ul>
&lt;p>Задача:&lt;/p>
&lt;ul>
&lt;li>Выяснить, имеются ли обратно несовместимые изменения в контракте новой версии.&lt;/li>
&lt;li>Выяснить, какие дополнительные изменения произошли в контракте.&lt;/li>
&lt;/ul></description></item><item><title>Golang Test Summary</title><link>/posts/golang-test-summary/</link><pubDate>Tue, 19 Sep 2023 11:08:30 +0400</pubDate><guid>/posts/golang-test-summary/</guid><description>&lt;p>Стандартные инструменты &lt;code>Go&lt;/code> не позволяет вывести сводную информацию по тестам. Но, когда у вас большой проект, и надо
понимать общую картину, такая информация бывает полезна. Допустим, вы обновляете ваш собственный форк до состояния
апстрима, и вам необходимо оценить объем проблем, вызванных слиянием изменений.&lt;/p></description></item><item><title>APFS Case Sensitive</title><link>/posts/apfs-case-sensitive/</link><pubDate>Sun, 17 Sep 2023 19:30:55 +0400</pubDate><guid>/posts/apfs-case-sensitive/</guid><description>&lt;p>По умолчанию файловая система в &lt;code>macOS&lt;/code> регистронезависимая. Это значит, что &lt;code>file.txt&lt;/code> и &lt;code>FILE.txt&lt;/code> для неё одно и то
же. В некоторых, хоть и довольно редких ситуациях, при разработке и поддержке некоторых проектов может потребоваться
регистрозависимость. Переформатировать диск и переустанавливать ОС — долгое и неблагодарное занятие. Вот как я решил эту
проблему.&lt;/p></description></item><item><title>Postgres Table Naming</title><link>/posts/postgres-table-naming/</link><pubDate>Fri, 25 Aug 2023 22:15:55 +0400</pubDate><guid>/posts/postgres-table-naming/</guid><description>&lt;p>Почему я предпочитаю именовать таблицы в &lt;code>postgres&lt;/code> в единственном числе?&lt;/p></description></item><item><title>/usr/bin/arch</title><link>/posts/usr-bin-arch/</link><pubDate>Sat, 12 Aug 2023 21:29:04 +0400</pubDate><guid>/posts/usr-bin-arch/</guid><description>&lt;p>Многие из нас за последнее время стали обладателями маков на процессорах M1. Для поддержки приложений, написанных для
процессоров Intel есть Rosetta. В этой заметке я хочу подсветить расширенную утилиту &lt;code>arch&lt;/code>, которая на маках работает
чуть шире, чем &lt;code>uname -m&lt;/code>, и ситуации, в которых она может быть полезна.&lt;/p></description></item><item><title>Leetcode 2</title><link>/posts/leetcode-2/</link><pubDate>Tue, 08 Aug 2023 19:12:51 +0400</pubDate><guid>/posts/leetcode-2/</guid><description>&lt;p>Leetcode предлагает три уровня сложности задач: Easy, Medium и Hard. Очевидно, что за решения задач более высоких
уровней сложности дают больше баллов рейтинга. Но сейчас нас интересует не рейтинг, а отношение к вашему профилю со
стороны компании, куда вы будете проходить интервью.&lt;/p></description></item><item><title>Leetcode 1</title><link>/posts/leetcode-1/</link><pubDate>Mon, 07 Aug 2023 19:04:14 +0400</pubDate><guid>/posts/leetcode-1/</guid><description>&lt;p>Давайте обсудим цели, которые ставят перед собой разработчики, решая задачи на leetcode. Исходя из них определимся с
выбором языка программирования, на котором и будем решать эти задачи. На мой взгляд, существует, как минимум, три
варианта:&lt;/p>
&lt;ul>
&lt;li>Повысить собственный уровень алгоритмической подготовки — самый очевидный;&lt;/li>
&lt;li>Опробовать подходы к обработке данных в конкретно взятом языке программирования;&lt;/li>
&lt;li>Гордиться циферкой рядом с фото профиля — &amp;ldquo;нагриндить&amp;rdquo; рейтинг и хвастаться коллегам.&lt;/li>
&lt;/ul></description></item><item><title>Leetcode 0</title><link>/posts/leetcode-0/</link><pubDate>Sun, 06 Aug 2023 20:31:14 +0400</pubDate><guid>/posts/leetcode-0/</guid><description>&lt;p>К алгоритмическим собеседованиям у многих разработчиков очень неоднозначное отношение. Кто-то считает секцию алгоритмов
обязательной, кто-то нет. Многие компании, несмотря на то, что для реальной работы и выполнения их задач намного важнее
знание и понимание принципов чистой архитектуры, паттернов проектирования, глубокое погружение в тот или иной фреймворк,
включают в свои интервью алгоритмическую секцию, часто с нетривиальными задачами, которые довольно сложно решать в
стрессовой ситуации и в условиях ограничения по времени.&lt;/p></description></item><item><title>pre-commit</title><link>/posts/pre-commit/</link><pubDate>Fri, 16 Jun 2023 20:44:53 +0400</pubDate><guid>/posts/pre-commit/</guid><description>&lt;p>Я и моя команда столкнулись с проблемой, когда нарушения соглашений по Code Style стали выявляться достаточно поздно: в
CI или на Code Review. Общей настройки &lt;code>.editorconfig&lt;/code> нам было явно недостаточно, так как сам по себе &lt;code>editorconfig&lt;/code> не
может описать полностью все нюансы форматирования.&lt;/p></description></item><item><title>chezmoi</title><link>/posts/chezmoi/</link><pubDate>Wed, 14 Jun 2023 10:28:32 +0400</pubDate><guid>/posts/chezmoi/</guid><description>&lt;p>Многие из нас используют в работе несколько компьютеров. И, конечно, используют если не одинаковые, то пересекающиеся
наборы приложений и инструментов, которые требуют одинаковой конфигурации на всех машинах:&lt;/p>
&lt;ul>
&lt;li>&lt;code>git&lt;/code>&lt;/li>
&lt;li>&lt;code>vim/nvim&lt;/code>&lt;/li>
&lt;li>&lt;code>tmux&lt;/code>&lt;/li>
&lt;li>&lt;code>editorconfig&lt;/code>&lt;/li>
&lt;li>&lt;code>karabiner&lt;/code>&lt;/li>
&lt;li>&lt;code>zsh&lt;/code>&lt;/li>
&lt;li>и другие.&lt;/li>
&lt;/ul>
&lt;p>Обычно, конфигурационные файлы называются дотфайлами (&lt;code>dotfiles&lt;/code>) — их имена начинаются с точки (&lt;code>.&lt;/code>), что в мире
unix-подобных систем делает файл скрытым.&lt;/p></description></item><item><title>gitlab</title><link>/posts/gitlab/</link><pubDate>Sun, 11 Jun 2023 11:03:26 +0400</pubDate><guid>/posts/gitlab/</guid><description>&lt;p>Один из моих подписчиков подсветил проблему, что исходный код решений, которые мы реализуем на стримах не был доступен
публично. Признаться честно, я не думал, что он может быть кому-то полезен вне контекста стрима — мы показываем процесс
решения проблемы, трансформируя его в приемлемый результат. Оказалось, что моё мнение ошибочно, и исходники всё же
представляют интерес.&lt;/p></description></item><item><title>youtube</title><link>/posts/youtube/</link><pubDate>Sun, 04 Jun 2023 21:50:04 +0400</pubDate><guid>/posts/youtube/</guid><description>&lt;p>С недавнего времени я перестал стесняться и осуществил свою давнюю задумку — запустил канал на youtube. Мне всегда
хотелось показывать и рассказывать о подходах к разработке без кликбейтных картинок и заголовков, говорить по делу и
передавать свой опыт другим людям.&lt;/p></description></item><item><title>sdkman + kotlin</title><link>/posts/sdkman-kotlin/</link><pubDate>Sun, 21 May 2023 19:56:06 +0400</pubDate><guid>/posts/sdkman-kotlin/</guid><description>&lt;p>В скором времени мне потребуется расширить свой стек ещё одним языком программирования — &lt;code>Kotlin&lt;/code>. Меня не беспокоит
процесс погружения в синтаксис, это самое простое, что может быть. Как и всегда, во главу угла я ставлю вопрос о
простоте, скорости и воспроизводимости развёртывания, особенно локального окружения разработчика — в команде я буду
работать не один, и важно, чтобы версии компиляторов совпадали у моих коллег до миллибитов.&lt;/p></description></item><item><title>Имитация systemd в docker-контейнере и применение testinfra</title><link>/posts/docker-systemd-testinfra/</link><pubDate>Sun, 19 Mar 2023 12:25:24 +0400</pubDate><guid>/posts/docker-systemd-testinfra/</guid><description>&lt;p>Наши команды активно используют &lt;code>ansible&lt;/code> для создания шаблонов и финальной
конфигурации виртуальных машин. Поэтому перед нами встаёт вопрос обеспечения
работоспособности и корректности сценариев развёртывания.&lt;/p>
&lt;p>В этой заметке будет рассказано об имитации &lt;code>systemd&lt;/code> внутри &lt;code>docker&lt;/code>-контейнера
и валидации финального результата с помощью фреймворка &lt;code>testinfra&lt;/code>.&lt;/p></description></item><item><title>Technical Breadth</title><link>/posts/technical-breadth/</link><pubDate>Sun, 20 Nov 2022 12:40:10 +0600</pubDate><guid>/posts/technical-breadth/</guid><description>&lt;p>&lt;code>Technical Breadth&lt;/code> — определение, которое я впервые услышал в английском
варианте от архитектора Марка Ричардса (Mark Richards). Если грубо переводить
его на русский язык, оно означает &amp;ldquo;технический кругозор&amp;rdquo;. Аналогом этого
слова у дизайнеров является &amp;ldquo;насмотренность&amp;rdquo;.&lt;/p>
&lt;p>Что делать с этим понятием и как расширять свой технический кругозор?&lt;/p></description></item><item><title>Semantic Workspace</title><link>/posts/semantic-workspace/</link><pubDate>Sat, 19 Nov 2022 19:35:18 +0600</pubDate><guid>/posts/semantic-workspace/</guid><description>&lt;p>&lt;code>Semantic Workspace&lt;/code> — это просто красивое название, которое я придумал полгода
назад для ряда простых принципов организации каталога с проектами на локальной
машине.&lt;/p></description></item><item><title>direnv</title><link>/posts/direnv/</link><pubDate>Sat, 12 Nov 2022 19:47:36 +0600</pubDate><guid>/posts/direnv/</guid><description>&lt;p>Все наши сервисы полностью соответствуют 12 факторам. Но в этой заметке речь
пойдёт только об одном из них — конфигурации через переменные окружения, а
точнее про недооцененный инструмент &lt;code>direnv&lt;/code>, позволяющий автоматически
загружать переменные окружения при переходе в каталог с проектом.&lt;/p></description></item><item><title>Postgres Workqueue</title><link>/posts/postgres-workqueue/</link><pubDate>Sun, 30 Oct 2022 17:13:50 +0600</pubDate><guid>/posts/postgres-workqueue/</guid><description>&lt;p>В этом посте речь пойдёт про организацию очереди отложенных задач в базе данных.
На практике выяснилось, что очень большое количество разработчиков эту идею
принимают с большим трудом, сразу же выражают обеспокоенность искусственно
созданной нагрузкой. С одной стороны, это грамотное замечание. С другой — это
тот барьер, через который надо научиться переступать, наблюдать за вашим
приложением и грамотно настраивать базу.&lt;/p></description></item><item><title>Containerized Tooling</title><link>/posts/containerized-tooling/</link><pubDate>Thu, 27 Oct 2022 23:13:39 +0600</pubDate><guid>/posts/containerized-tooling/</guid><description>&lt;p>В своей работе мы постоянно используем различные инструменты: &lt;code>protoc&lt;/code>,
&lt;code>golangci-lint&lt;/code>, &lt;code>allure&lt;/code> и многие другие.&lt;/p>
&lt;p>Чтобы избежать ситуации, в которой версия или конфигурация инструмента у одного
разработчика отличается от того, что уже установлено у другого, или от того, что
настроено в &lt;code>CI&lt;/code>, наши инструменты &amp;ldquo;запечены&amp;rdquo; в контейнеры.&lt;/p></description></item><item><title>multipass-compose</title><link>/posts/multipass-compose/</link><pubDate>Tue, 25 Oct 2022 22:09:40 +0600</pubDate><guid>/posts/multipass-compose/</guid><description>&lt;p>В данной заметке речь пойдёт о &amp;ldquo;настоящих&amp;rdquo; виртуальных машинах, и никак не про
контейнерную виртуализацию. Поэтому мысль вида &amp;ldquo;да всё ж можно в докер
запихнуть&amp;rdquo; тут немного неуместна.&lt;/p>
&lt;p>Строя облачные сервисы, мы в своей работе постоянно используем виртуальные
машины. В продакшине — гипервизоры первого типа, которые, говоря простым языком,
ставятся на &amp;ldquo;голое железо&amp;rdquo;; на своих локальных машинах — второго типа, это
привычные нам всем &lt;code>VirtualBox&lt;/code>, &lt;code>qemu&lt;/code> и, возможно, &lt;code>Parallels Desktop&lt;/code>.&lt;/p></description></item><item><title>Makefile ToC</title><link>/posts/makefile-toc/</link><pubDate>Sun, 23 Oct 2022 21:01:40 +0600</pubDate><guid>/posts/makefile-toc/</guid><description>&lt;p>К большому сожалению, несмотря на наличие продвинутых систем сборок, нам всё ещё
приходится использовать утилиту &lt;code>make&lt;/code> и писать &lt;code>Makefile&lt;/code>-ы руками.&lt;/p>
&lt;p>Передо мной встала задача по составлению справки по целям сборки в
текущем &lt;code>Makefile&lt;/code> проекта. Из коробки древняя утилита не позволяет получить
список целей сборки и их описание, которого не предполагалось.&lt;/p></description></item><item><title>Semantic Line Breaks</title><link>/posts/sembr/</link><pubDate>Wed, 19 Oct 2022 16:01:57 +0600</pubDate><guid>/posts/sembr/</guid><description>&lt;p>Вся техническая документация наших проектов пишется в формате &lt;code>Markdown&lt;/code>.
Это простой и удобный формат, который можно читать даже в сыром виде без
постобработки.&lt;/p></description></item><item><title>Собственная локальная инсталляция Sentry</title><link>/posts/getsentry-self-hosted/</link><pubDate>Sun, 11 Sep 2022 18:38:25 +0300</pubDate><guid>/posts/getsentry-self-hosted/</guid><description>&lt;p>Мне часто приходится экспериментировать с настройками мониторинга, сбором ошибок
и метрик в различных окружениях.&lt;/p>
&lt;p>Чтобы не выделять отдельный проект в общем &lt;code>Sentry&lt;/code>, предпочитаю разворачивать
собственную локальную копию.&lt;/p>
&lt;p>Процесс развёртывания занимает некоторое время, для &amp;ldquo;старого&amp;rdquo; ноутбука,
процедура может занять минут десять.&lt;/p></description></item><item><title>adr-tools</title><link>/posts/adr-tools/</link><pubDate>Thu, 01 Sep 2022 16:57:37 +0300</pubDate><guid>/posts/adr-tools/</guid><description>&lt;p>Многие команды для обсуждения и ведения &lt;code>ADR&lt;/code> используют инструменты, подобные
Confluence и
Wiki. Все мы прекрасно понимаем, что это подход &amp;ldquo;write once, read never&amp;rdquo;.&lt;/p></description></item><item><title>ADR</title><link>/posts/adr/</link><pubDate>Mon, 15 Aug 2022 23:46:45 +0300</pubDate><guid>/posts/adr/</guid><description>&lt;p>&lt;code>ADR&lt;/code> — Architecture Decision Record.&lt;/p>
&lt;p>Часто сталкиваюсь с недооценкой использования &lt;code>ADR&lt;/code> в разных командах
разработки.&lt;/p></description></item><item><title>asdf</title><link>/posts/asdf/</link><pubDate>Sat, 13 Aug 2022 13:43:10 +0300</pubDate><guid>/posts/asdf/</guid><description>&lt;p>&lt;code>asdf&lt;/code> — менеджер версий рантаймов.&lt;/p>
&lt;p>С его помощью можно заменить &lt;code>nvm&lt;/code>, &lt;code>rbenv&lt;/code> , &lt;code>pyenv&lt;/code>, &lt;code>gvm&lt;/code> и ещё массу
менеджеров версий одним общим.&lt;/p></description></item><item><title>jo</title><link>/posts/jo/</link><pubDate>Wed, 10 Aug 2022 14:23:16 +0300</pubDate><guid>/posts/jo/</guid><description>&lt;p>&lt;code>jo&lt;/code> — конструктор &lt;code>json&lt;/code> для командной строки.&lt;/p>
&lt;p>Часто вижу, как коллеги в чатах перекидываются фрагментами запросов или
примерами вызовов &lt;code>API&lt;/code>, передавая &lt;code>json&lt;/code> в виде экранированных строк.&lt;/p></description></item></channel></rss>