<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@sovetov</title><generator>teletype.in</generator><description><![CDATA[@sovetov]]></description><link>https://sovetov.pro/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/sovetov?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/sovetov?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 05 May 2026 11:43:24 GMT</pubDate><lastBuildDate>Tue, 05 May 2026 11:43:24 GMT</lastBuildDate><item><guid isPermaLink="true">https://sovetov.pro/unicode-is-not-an-encoding</guid><link>https://sovetov.pro/unicode-is-not-an-encoding?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/unicode-is-not-an-encoding?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Unicode не кодировка</title><pubDate>Sun, 15 Aug 2021 15:46:31 GMT</pubDate><category>Software Engineering</category><description><![CDATA[Кодировки — это UTF-8, UTF-16, UCS-2. Они определяют, как записать конкретные код-поинты (номера символов) в байты. А Unicode — это как раз набор символов и частей символов, рекомендации по их сочетаемости и отображению, по тому как работать с разными системами письма.]]></description><content:encoded><![CDATA[
  <p>Кодировки — это UTF-8, UTF-16, UCS-2. Они определяют, как записать конкретные код-поинты (номера символов) в байты. А Unicode — это как раз набор символов и частей символов, рекомендации по их сочетаемости и отображению, по тому как работать с разными системами письма.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/what-is-json</guid><link>https://sovetov.pro/what-is-json?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/what-is-json?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>JSON — это не вложенные дикты, листы и скаляры</title><pubDate>Sun, 15 Aug 2021 15:36:24 GMT</pubDate><category>Software Engineering</category><description><![CDATA[JSON — это последовательность байтов. Байты представляют из себя строку текста в  в UTF-8. В которую закодированы вложенные дикты, листы, инты, флоаты, строки и наны. Пример:]]></description><content:encoded><![CDATA[
  <p>JSON — это последовательность байтов. Байты представляют из себя строку текста в  в UTF-8. В которую закодированы вложенные дикты, листы, инты, флоаты, строки и наны. Пример:</p>
  <pre>json_encoded_data = b&#x27;{&quot;foo&quot;: {&quot;bar&quot;: [&quot;buzz&quot;, &quot;fizz&quot;], &quot;qwe&quot;: 123}}&#x27;
decoded_data = json.loads(json_encoded_data)</pre>
  <p><code>json_encoded_data</code> — вот это JSON. <code>decoded_data</code> — а это не JSON.</p>
  <p>Не надо называть большой дикт словом <code>json</code>. Это не JSON, это просто большой дикт, который может быть закодирован в XML, ASN.1, Protobuf, код на Python и кучу других форматов данных.</p>
  <p>Называйте словом <code>json</code> байты или, на худой конец, строку, которая получена путем декодирования байтов из UTF-8.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/quality-code</guid><link>https://sovetov.pro/quality-code?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/quality-code?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Хороший код</title><pubDate>Sat, 14 Aug 2021 18:11:51 GMT</pubDate><category>Software Engineering</category><description><![CDATA[Не существует хорошего кода. Либо он бестолковый и никому не нужный, но нравится автору, либо оброс кучей обременений совместимости и техническим долгом. Возможно, где-то его пишут, но уж точно не в опенсорс. ]]></description><content:encoded><![CDATA[
  <p>Не существует хорошего кода. Либо он бестолковый и никому не нужный, но нравится автору, либо оброс кучей обременений совместимости и техническим долгом. Возможно, где-то его пишут, но уж точно не в опенсорс. </p>
  <p>Обычно у авторов опенсорс-проектов потребность и запал пропадают очень быстро, и когда проект становится востребованным, автору до него нет дела. В него вяло делают пулл-реквесты разработчики со стороны, и никто не обладает достаточным желанием и знанием кодовой базы, чтобы это все отрефакторить.</p>
  <p>Что касается конкретно Питона, я вообще нигде не видел хорошего кода. (Кроме того, который пишет мой отдел, конечно.) И стандартная библиотека, и популярные библиотеки. Где-то бывает хороший интерфейс, какие-то очень хорошо помогают для очень стандартных задач, что-то очень хорошо кастомизируется. Но в целом все тухло. </p>
  <p>Да и не бывает кода, хорошего для всех. Как и не бывает человека, который всем нравится. Тимлид должен понимать, что от конкретного компонента требовать, какого уровня качества и каких характеристик. Есть разные требования бизнеса, разные аудитории пользователей, разные этапы жизни проекта, разная квалификация разработчиков. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/dont-disregard-rules</guid><link>https://sovetov.pro/dont-disregard-rules?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/dont-disregard-rules?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Правилами нельзя пренебрегать</title><pubDate>Thu, 12 Aug 2021 11:19:06 GMT</pubDate><category>team leader</category><description><![CDATA[Иногда случается такое, что следование правилу вынуждает делать лишние движения, которые в данном случае кажутся неэффективными. Даже в этом случае пренебрегать правилом нельзя. Пренебрежение правилом компрометирует правило.]]></description><content:encoded><![CDATA[
  <p>Иногда случается такое, что следование правилу вынуждает делать лишние движения, которые в данном случае кажутся неэффективными. Даже в этом случае пренебрегать правилом нельзя. Пренебрежение правилом компрометирует правило.</p>
  <p>Когда правилом пренебрегают, фактически в правило добавляется оговорка о том, что им можно пренебрегать по своему усмотрению. Иногда такую оговорку добавляют формально, то есть пишут в сам текст правила.  Конечно же, это делается в благих целях. Но у всех свое &quot;усмотрение&quot;. И цели иногда отличаются. В итоге правило оказыватся разным для каждого. Начинается хаос — то, что правила призваны избежать.</p>
  <p>Если вам кажется, что соблюдение правила заставляет вас сделать что-то лишнее, все-таки сделайте. Иначе завтра ваш коллега не последует какому-нибудь еще правилу. Он будет иметь моральное право на это, потому что сегодня вы сделали так же. Коллега сделает что-то в обход правил, по своему усмотрению. А его &quot;усмотрение&quot; может не понравиться вам.</p>
  <p>Поэтому не пренебрегайте правилами.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/write-down-what-you-know</guid><link>https://sovetov.pro/write-down-what-you-know?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/write-down-what-you-know?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Записывай все, что знаешь</title><pubDate>Thu, 29 Jul 2021 12:44:03 GMT</pubDate><category>Software Engineering</category><description><![CDATA[Как только у тебя появляются какие-то знания, которые относится к работе, зафиксируй их куда-нибудь. Это должно стать привычкой. Не оставаляй информацию в истории личных чатов и в своей голове. Пиши суть, детали и причинно-следственные связи. Пиши в нескольких местах. Пиши в комментах в коде, в коммит-месседжах, в тикетах и в вики.]]></description><content:encoded><![CDATA[
  <p>Как только у тебя появляются какие-то знания, которые относится к работе, зафиксируй их куда-нибудь. Это должно стать привычкой. Не оставаляй информацию в истории личных чатов и в своей голове. Пиши суть, детали и причинно-следственные связи. Пиши в нескольких местах. Пиши в комментах в коде, в коммит-месседжах, в тикетах и в вики.</p>
  <p>В комментариях в коде пиши, почему сейчас сделано именно так.</p>
  <p>В коммит-месседжах пиши, почему что-то поменяли.</p>
  <p>В тикетах пиши, как расследовали баг, как добавляли фичу.</p>
  <p>В вики пиши все остальное, в том числе, что не связано с конкретными изменениями в коде. Проставляй ссылки на вики отовсюду, где есть что-от близкое по теме.</p>
  <p>Добавляй ссылки на документацию в интернете, на форумы, на внутреннюю документацию, на тикеты. Но помни, что адреса меняются, что содержимое меняется, старые результаты запусков удаляются. Поэтому цитируй текст, код и сообщения об ошибках, где это возможно.</p>
  <p>Пиши суть, чтобы читающий быстро понимал, о чем это, и чтобы ты сам потом легко вспомнил. Пиши детали, чтобы они были зафиксированы, когда нужно докопаться до истины.</p>
  <p>Потом, когда буду искать концы, тебе скажут спасибо. Или ты сам себе скажешь.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/ease-review-process</guid><link>https://sovetov.pro/ease-review-process?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/ease-review-process?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Как будут ревьюить твой код</title><pubDate>Thu, 29 Jul 2021 11:52:11 GMT</pubDate><category>Software Engineering</category><description><![CDATA[Ревьюер (обычно) не несет ответственности за код. Его задача — помочь. Если помогать долго и трудно, никто это делать не будет. Посмотрят поверхностно на код-стайл и махнут рукой. Поэтому надо сделать так, чтобы ревьюер мог легко и комфортно вникнуть в суть изменения. Поэтому:]]></description><content:encoded><![CDATA[
  <p>Ревьюер (обычно) не несет ответственности за код. Его задача — помочь. Если помогать долго и трудно, никто это делать не будет. Посмотрят поверхностно на код-стайл и махнут рукой. Поэтому надо сделать так, чтобы ревьюер мог легко и комфортно вникнуть в суть изменения. Поэтому:</p>
  <ul>
    <li>Заголовок коммит-месседжа должен содержать самую суть. Он должен быть максимально конкретным, но при этом быть понятным каждому, кто активно работает с репозиторием.</li>
    <li>Тело коммит-месседжа должно отвечать на вопрос &quot;зачем&quot;. И, возможно, освещать подробности того, что именно сделано. Только в самых очевидных случаев тело коммит месседжа можно опускать.</li>
    <li>Дифф должен быть минимальным. Нелья делать изменения &quot;заодно&quot;. Разные задачи — разные изменения. Правило <s>пионера</s> скаута — это хорошо, но оставляйте после себя чистую поляну отдельным коммитом с объяснениями. Рефакторинг и изменения поведения, в том числе и фиксы, —в разных коммитах. Ревьюер должен понимать, на что ему обратить внимание: корректность, проектирование, формат кода.</li>
  </ul>
  <p>Все перечисленное выше также поможет при копании в истории системы контроля версий при расследовании багов.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/from-typing-import-dict-list</guid><link>https://sovetov.pro/from-typing-import-dict-list?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/from-typing-import-dict-list?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Какие типы возвращать и принимать</title><pubDate>Mon, 26 Jul 2021 11:09:56 GMT</pubDate><category>python</category><description><![CDATA[Испрользуйте ровно тот тип, который на самом деле имеется в виду. Код должен четко выражать ваши намерения и ожидания. Не давайте слишком много гарантий на параметры и возвращаемые значения. Много гарантий — больше проблем для вас как автора функции и больше вероятность изменения интерфейса.]]></description><content:encoded><![CDATA[
  <p>Испрользуйте ровно тот тип, который на самом деле имеется в виду. Код должен четко выражать ваши намерения и ожидания. Не давайте слишком много гарантий на параметры и возвращаемые значения. Много гарантий — больше проблем для вас как автора функции и больше вероятность изменения интерфейса.</p>
  <p>На большинствро случаев жизни есть специальные типы контейнеров и отображений (mapping). Пример из Питона. Небольшое количество элементов — <code>Collection</code>. То же, но где порядок имеет смысл и нужно уметь обращаться по индексу — <code>Sequence</code>. Что-то длинное, по чему разрешается только один раз проитерироваться — <code>Iterable</code>. Нужно по одному значению получать другое — <code>Mapping</code>. Это относится как к возвращаемым типам, так и к типам параметров. Даже если текущая реализация функции возвращает конкретно список, надо указывать <em>как к этому списку нужно относиться</em>: важен ли в нем порядок, можно ли по нему много раз пройтись. Даже если текущая реализация функции проходит по контейнеру в цикле один раз, надо в аннотации указывать то, <em>чем является параметр по сути</em> и какие гарантии вы как автор можете дать на будущее.</p>
  <p>Есть также изменяемые (mutable) типы контейнеров и отображений. Если вам на самом деле хочется менять параметр или, тем более, указывать, что можно менять возвращаемое значение, подумайте как следует, стоит ли оно того. Изменения состояния должны очень хорошо контролироваться. В идеале состояние должно быть инкапсулировано в класс, и любые изменения должны производиться через его методы. Но это тема для другой статьи.</p>
  <p>В функции параметр — <em>контравариантный</em> тип, а возвращаемое значение — <em>ковариантный</em>. Более частный тип параметра означает <strong>более общий</strong> тип функции. Если функция имеет более общий тип параметра, она подходит туда, где требуется функция с более частным типом параметра. Это и есть контравариантность. С возвращаемым типом все прямее: более частный возвращаемый тип — более частный тип функции.</p>
  <p>Нет никаких правил вроде &quot;возвращайте наиболее частный тип, а принимайте наиболее общий&quot;. Откуда это пошло? Это всего лишь вежливость разработчика библиотеки. Это способ сделать функцию наиболее универсальной для клиентского кода, дать максимум гарантий.</p>
  <p>Мало гарантий — неудобно клиентскому коду. Много гарантий — неудобно библиотеке. Гарантии надо выбирать раузмно.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/simple-rules</guid><link>https://sovetov.pro/simple-rules?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/simple-rules?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Правила должны быть простыми</title><pubDate>Thu, 22 Jul 2021 15:44:00 GMT</pubDate><category>team leader</category><description><![CDATA[Простые правила проще выполнять и контролировать. В простых правилах нет разночтений и субъективных суждений. Ради простоты можно пожертвовать точностью правила. Например, запретить чуть больше, чем нужно, если это не сильно мешает. ]]></description><content:encoded><![CDATA[
  <p>Простые правила проще выполнять и контролировать. В простых правилах нет разночтений и субъективных суждений. Ради простоты можно пожертвовать точностью правила. Например, запретить чуть больше, чем нужно, если это не сильно мешает. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/totalitarianism-and-anarchy</guid><link>https://sovetov.pro/totalitarianism-and-anarchy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/totalitarianism-and-anarchy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Правила: зачем и какие нужны</title><pubDate>Thu, 22 Jul 2021 14:47:56 GMT</pubDate><description><![CDATA[Правила нужны не только для того, чтобы код был читаемым или качественным. Читаемость, в конце концов, — субъективная характеристика. У всех свои представления о прекрасном.]]></description><content:encoded><![CDATA[
  <p>Правила нужны не только для того, чтобы код был читаемым или качественным. Читаемость, в конце концов, — субъективная характеристика. У всех свои представления о прекрасном.</p>
  <p>Представления о прекрасном должны быть общие на команду или проект. Они должны обладать более высоким приоритетом, чем представления о прекрасном каждого разработчика в отдельности.</p>
  <p>Правила нужны, чтобы не тратить время на споры о вкусах.</p>
  <p>Правила экономят мыслительные ресурсы, освобождая от лишнего выбора, который может вообще никак не влиять на корректность кода и читаемость.</p>
  <p>Но чем больше правил и чем они сложнее, тем труднее их соблюдать и проверять.</p>
  <p>Когда правил много, — это тоталитризм. Когда правил мало — это анархия.</p>
  <p>Тоталитаризм — это дисциплина и стабильность. Никаких лишних разговоров и споров. Тоталитаризм требует грамотоного управления. Иногда высокая зарегулированность может быть причиной демотивации. Новичков нужно вводить аккуратно. Есть риск, что они могут не прижиться. </p>
  <p>Анархия — свобода, самовыражение, быстрые изменения. Если задача подразумевает proof of concept, первую версию чего-либо или быстрый фикс, то разумная доля анархии может оказаться выгодной.</p>
  <p>Выбирайте нужную точку на континууме между тоталитаризмом и анархией в зависимости от команды, проекта и задачи.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://sovetov.pro/kbit</guid><link>https://sovetov.pro/kbit?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov</link><comments>https://sovetov.pro/kbit?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=sovetov#comments</comments><dc:creator>sovetov</dc:creator><title>Килобиты и килобайты</title><pubDate>Wed, 21 Jul 2021 18:13:26 GMT</pubDate><description><![CDATA[Сетевые скорости и битрейты аудио и видео измеряются в битах в секунду с десятичными приставками. 100 Мбит/с — это 100000000 бит в секунду. Низкоуровневые сетевые протоколы никак не привязаны к байтам, октетам и, тем более, степеням двойки. Оттуда все и пошло.]]></description><content:encoded><![CDATA[
  <p>Сетевые скорости и битрейты аудио и видео измеряются в битах в секунду с десятичными приставками. 100 Мбит/с — это 100000000 бит в секунду. Низкоуровневые сетевые протоколы никак не привязаны к байтам, октетам и, тем более, степеням двойки. Оттуда все и пошло.</p>
  <p>Производители дисков указывают объем в десятичных приставках.</p>
  <p>Объемы информации измеряются в байтах с двоичными приставками.</p>
  <p>Процессоры работают с байтами. В общем случае байт — это не всегда 8 бит. Поэтому придумали слово &quot;октет&quot;. Отсюда пошло <code>application/octet-stream</code>.</p>

]]></content:encoded></item></channel></rss>