<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@sovetov</title><author><name>@sovetov</name></author><id>https://teletype.in/atom/sovetov</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/sovetov?offset=0"></link><link rel="alternate" type="text/html" href="https://sovetov.pro/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/sovetov?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-05T11:42:22.906Z</updated><entry><id>sovetov:unicode-is-not-an-encoding</id><link rel="alternate" type="text/html" href="https://sovetov.pro/unicode-is-not-an-encoding?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Unicode не кодировка</title><published>2021-08-15T15:46:31.597Z</published><updated>2021-08-15T15:46:41.739Z</updated><category term="software-engineering" label="Software Engineering"></category><summary type="html">Кодировки — это UTF-8, UTF-16, UCS-2. Они определяют, как записать конкретные код-поинты (номера символов) в байты. А Unicode — это как раз набор символов и частей символов, рекомендации по их сочетаемости и отображению, по тому как работать с разными системами письма.</summary><content type="html">
  &lt;p&gt;Кодировки — это UTF-8, UTF-16, UCS-2. Они определяют, как записать конкретные код-поинты (номера символов) в байты. А Unicode — это как раз набор символов и частей символов, рекомендации по их сочетаемости и отображению, по тому как работать с разными системами письма.&lt;/p&gt;

</content></entry><entry><id>sovetov:what-is-json</id><link rel="alternate" type="text/html" href="https://sovetov.pro/what-is-json?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>JSON — это не вложенные дикты, листы и скаляры</title><published>2021-08-15T15:36:24.128Z</published><updated>2021-08-19T06:22:49.333Z</updated><category term="software-engineering" label="Software Engineering"></category><summary type="html">JSON — это последовательность байтов. Байты представляют из себя строку текста в  в UTF-8. В которую закодированы вложенные дикты, листы, инты, флоаты, строки и наны. Пример:</summary><content type="html">
  &lt;p&gt;JSON — это последовательность байтов. Байты представляют из себя строку текста в  в UTF-8. В которую закодированы вложенные дикты, листы, инты, флоаты, строки и наны. Пример:&lt;/p&gt;
  &lt;pre&gt;json_encoded_data = b&amp;#x27;{&amp;quot;foo&amp;quot;: {&amp;quot;bar&amp;quot;: [&amp;quot;buzz&amp;quot;, &amp;quot;fizz&amp;quot;], &amp;quot;qwe&amp;quot;: 123}}&amp;#x27;
decoded_data = json.loads(json_encoded_data)&lt;/pre&gt;
  &lt;p&gt;&lt;code&gt;json_encoded_data&lt;/code&gt; — вот это JSON. &lt;code&gt;decoded_data&lt;/code&gt; — а это не JSON.&lt;/p&gt;
  &lt;p&gt;Не надо называть большой дикт словом &lt;code&gt;json&lt;/code&gt;. Это не JSON, это просто большой дикт, который может быть закодирован в XML, ASN.1, Protobuf, код на Python и кучу других форматов данных.&lt;/p&gt;
  &lt;p&gt;Называйте словом &lt;code&gt;json&lt;/code&gt; байты или, на худой конец, строку, которая получена путем декодирования байтов из UTF-8.&lt;/p&gt;

</content></entry><entry><id>sovetov:quality-code</id><link rel="alternate" type="text/html" href="https://sovetov.pro/quality-code?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Хороший код</title><published>2021-08-14T18:11:51.867Z</published><updated>2021-08-15T15:47:49.383Z</updated><category term="software-engineering" label="Software Engineering"></category><summary type="html">Не существует хорошего кода. Либо он бестолковый и никому не нужный, но нравится автору, либо оброс кучей обременений совместимости и техническим долгом. Возможно, где-то его пишут, но уж точно не в опенсорс. </summary><content type="html">
  &lt;p&gt;Не существует хорошего кода. Либо он бестолковый и никому не нужный, но нравится автору, либо оброс кучей обременений совместимости и техническим долгом. Возможно, где-то его пишут, но уж точно не в опенсорс. &lt;/p&gt;
  &lt;p&gt;Обычно у авторов опенсорс-проектов потребность и запал пропадают очень быстро, и когда проект становится востребованным, автору до него нет дела. В него вяло делают пулл-реквесты разработчики со стороны, и никто не обладает достаточным желанием и знанием кодовой базы, чтобы это все отрефакторить.&lt;/p&gt;
  &lt;p&gt;Что касается конкретно Питона, я вообще нигде не видел хорошего кода. (Кроме того, который пишет мой отдел, конечно.) И стандартная библиотека, и популярные библиотеки. Где-то бывает хороший интерфейс, какие-то очень хорошо помогают для очень стандартных задач, что-то очень хорошо кастомизируется. Но в целом все тухло. &lt;/p&gt;
  &lt;p&gt;Да и не бывает кода, хорошего для всех. Как и не бывает человека, который всем нравится. Тимлид должен понимать, что от конкретного компонента требовать, какого уровня качества и каких характеристик. Есть разные требования бизнеса, разные аудитории пользователей, разные этапы жизни проекта, разная квалификация разработчиков. &lt;/p&gt;

</content></entry><entry><id>sovetov:dont-disregard-rules</id><link rel="alternate" type="text/html" href="https://sovetov.pro/dont-disregard-rules?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Правилами нельзя пренебрегать</title><published>2021-08-12T11:19:06.367Z</published><updated>2021-08-15T15:52:57.904Z</updated><category term="team-leader" label="team leader"></category><summary type="html">Иногда случается такое, что следование правилу вынуждает делать лишние движения, которые в данном случае кажутся неэффективными. Даже в этом случае пренебрегать правилом нельзя. Пренебрежение правилом компрометирует правило.</summary><content type="html">
  &lt;p&gt;Иногда случается такое, что следование правилу вынуждает делать лишние движения, которые в данном случае кажутся неэффективными. Даже в этом случае пренебрегать правилом нельзя. Пренебрежение правилом компрометирует правило.&lt;/p&gt;
  &lt;p&gt;Когда правилом пренебрегают, фактически в правило добавляется оговорка о том, что им можно пренебрегать по своему усмотрению. Иногда такую оговорку добавляют формально, то есть пишут в сам текст правила.  Конечно же, это делается в благих целях. Но у всех свое &amp;quot;усмотрение&amp;quot;. И цели иногда отличаются. В итоге правило оказыватся разным для каждого. Начинается хаос — то, что правила призваны избежать.&lt;/p&gt;
  &lt;p&gt;Если вам кажется, что соблюдение правила заставляет вас сделать что-то лишнее, все-таки сделайте. Иначе завтра ваш коллега не последует какому-нибудь еще правилу. Он будет иметь моральное право на это, потому что сегодня вы сделали так же. Коллега сделает что-то в обход правил, по своему усмотрению. А его &amp;quot;усмотрение&amp;quot; может не понравиться вам.&lt;/p&gt;
  &lt;p&gt;Поэтому не пренебрегайте правилами.&lt;/p&gt;

</content></entry><entry><id>sovetov:write-down-what-you-know</id><link rel="alternate" type="text/html" href="https://sovetov.pro/write-down-what-you-know?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Записывай все, что знаешь</title><published>2021-07-29T12:44:03.607Z</published><updated>2021-07-29T12:44:10.425Z</updated><category term="software-engineering" label="Software Engineering"></category><summary type="html">Как только у тебя появляются какие-то знания, которые относится к работе, зафиксируй их куда-нибудь. Это должно стать привычкой. Не оставаляй информацию в истории личных чатов и в своей голове. Пиши суть, детали и причинно-следственные связи. Пиши в нескольких местах. Пиши в комментах в коде, в коммит-месседжах, в тикетах и в вики.</summary><content type="html">
  &lt;p&gt;Как только у тебя появляются какие-то знания, которые относится к работе, зафиксируй их куда-нибудь. Это должно стать привычкой. Не оставаляй информацию в истории личных чатов и в своей голове. Пиши суть, детали и причинно-следственные связи. Пиши в нескольких местах. Пиши в комментах в коде, в коммит-месседжах, в тикетах и в вики.&lt;/p&gt;
  &lt;p&gt;В комментариях в коде пиши, почему сейчас сделано именно так.&lt;/p&gt;
  &lt;p&gt;В коммит-месседжах пиши, почему что-то поменяли.&lt;/p&gt;
  &lt;p&gt;В тикетах пиши, как расследовали баг, как добавляли фичу.&lt;/p&gt;
  &lt;p&gt;В вики пиши все остальное, в том числе, что не связано с конкретными изменениями в коде. Проставляй ссылки на вики отовсюду, где есть что-от близкое по теме.&lt;/p&gt;
  &lt;p&gt;Добавляй ссылки на документацию в интернете, на форумы, на внутреннюю документацию, на тикеты. Но помни, что адреса меняются, что содержимое меняется, старые результаты запусков удаляются. Поэтому цитируй текст, код и сообщения об ошибках, где это возможно.&lt;/p&gt;
  &lt;p&gt;Пиши суть, чтобы читающий быстро понимал, о чем это, и чтобы ты сам потом легко вспомнил. Пиши детали, чтобы они были зафиксированы, когда нужно докопаться до истины.&lt;/p&gt;
  &lt;p&gt;Потом, когда буду искать концы, тебе скажут спасибо. Или ты сам себе скажешь.&lt;/p&gt;

</content></entry><entry><id>sovetov:ease-review-process</id><link rel="alternate" type="text/html" href="https://sovetov.pro/ease-review-process?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Как будут ревьюить твой код</title><published>2021-07-29T11:52:11.201Z</published><updated>2021-07-29T12:01:22.386Z</updated><category term="software-engineering" label="Software Engineering"></category><summary type="html">Ревьюер (обычно) не несет ответственности за код. Его задача — помочь. Если помогать долго и трудно, никто это делать не будет. Посмотрят поверхностно на код-стайл и махнут рукой. Поэтому надо сделать так, чтобы ревьюер мог легко и комфортно вникнуть в суть изменения. Поэтому:</summary><content type="html">
  &lt;p&gt;Ревьюер (обычно) не несет ответственности за код. Его задача — помочь. Если помогать долго и трудно, никто это делать не будет. Посмотрят поверхностно на код-стайл и махнут рукой. Поэтому надо сделать так, чтобы ревьюер мог легко и комфортно вникнуть в суть изменения. Поэтому:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Заголовок коммит-месседжа должен содержать самую суть. Он должен быть максимально конкретным, но при этом быть понятным каждому, кто активно работает с репозиторием.&lt;/li&gt;
    &lt;li&gt;Тело коммит-месседжа должно отвечать на вопрос &amp;quot;зачем&amp;quot;. И, возможно, освещать подробности того, что именно сделано. Только в самых очевидных случаев тело коммит месседжа можно опускать.&lt;/li&gt;
    &lt;li&gt;Дифф должен быть минимальным. Нелья делать изменения &amp;quot;заодно&amp;quot;. Разные задачи — разные изменения. Правило &lt;s&gt;пионера&lt;/s&gt; скаута — это хорошо, но оставляйте после себя чистую поляну отдельным коммитом с объяснениями. Рефакторинг и изменения поведения, в том числе и фиксы, —в разных коммитах. Ревьюер должен понимать, на что ему обратить внимание: корректность, проектирование, формат кода.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Все перечисленное выше также поможет при копании в истории системы контроля версий при расследовании багов.&lt;/p&gt;

</content></entry><entry><id>sovetov:from-typing-import-dict-list</id><link rel="alternate" type="text/html" href="https://sovetov.pro/from-typing-import-dict-list?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Какие типы возвращать и принимать</title><published>2021-07-26T11:09:56.641Z</published><updated>2021-08-15T15:47:06.310Z</updated><category term="python" label="python"></category><summary type="html">Испрользуйте ровно тот тип, который на самом деле имеется в виду. Код должен четко выражать ваши намерения и ожидания. Не давайте слишком много гарантий на параметры и возвращаемые значения. Много гарантий — больше проблем для вас как автора функции и больше вероятность изменения интерфейса.</summary><content type="html">
  &lt;p&gt;Испрользуйте ровно тот тип, который на самом деле имеется в виду. Код должен четко выражать ваши намерения и ожидания. Не давайте слишком много гарантий на параметры и возвращаемые значения. Много гарантий — больше проблем для вас как автора функции и больше вероятность изменения интерфейса.&lt;/p&gt;
  &lt;p&gt;На большинствро случаев жизни есть специальные типы контейнеров и отображений (mapping). Пример из Питона. Небольшое количество элементов — &lt;code&gt;Collection&lt;/code&gt;. То же, но где порядок имеет смысл и нужно уметь обращаться по индексу — &lt;code&gt;Sequence&lt;/code&gt;. Что-то длинное, по чему разрешается только один раз проитерироваться — &lt;code&gt;Iterable&lt;/code&gt;. Нужно по одному значению получать другое — &lt;code&gt;Mapping&lt;/code&gt;. Это относится как к возвращаемым типам, так и к типам параметров. Даже если текущая реализация функции возвращает конкретно список, надо указывать &lt;em&gt;как к этому списку нужно относиться&lt;/em&gt;: важен ли в нем порядок, можно ли по нему много раз пройтись. Даже если текущая реализация функции проходит по контейнеру в цикле один раз, надо в аннотации указывать то, &lt;em&gt;чем является параметр по сути&lt;/em&gt; и какие гарантии вы как автор можете дать на будущее.&lt;/p&gt;
  &lt;p&gt;Есть также изменяемые (mutable) типы контейнеров и отображений. Если вам на самом деле хочется менять параметр или, тем более, указывать, что можно менять возвращаемое значение, подумайте как следует, стоит ли оно того. Изменения состояния должны очень хорошо контролироваться. В идеале состояние должно быть инкапсулировано в класс, и любые изменения должны производиться через его методы. Но это тема для другой статьи.&lt;/p&gt;
  &lt;p&gt;В функции параметр — &lt;em&gt;контравариантный&lt;/em&gt; тип, а возвращаемое значение — &lt;em&gt;ковариантный&lt;/em&gt;. Более частный тип параметра означает &lt;strong&gt;более общий&lt;/strong&gt; тип функции. Если функция имеет более общий тип параметра, она подходит туда, где требуется функция с более частным типом параметра. Это и есть контравариантность. С возвращаемым типом все прямее: более частный возвращаемый тип — более частный тип функции.&lt;/p&gt;
  &lt;p&gt;Нет никаких правил вроде &amp;quot;возвращайте наиболее частный тип, а принимайте наиболее общий&amp;quot;. Откуда это пошло? Это всего лишь вежливость разработчика библиотеки. Это способ сделать функцию наиболее универсальной для клиентского кода, дать максимум гарантий.&lt;/p&gt;
  &lt;p&gt;Мало гарантий — неудобно клиентскому коду. Много гарантий — неудобно библиотеке. Гарантии надо выбирать раузмно.&lt;/p&gt;

</content></entry><entry><id>sovetov:simple-rules</id><link rel="alternate" type="text/html" href="https://sovetov.pro/simple-rules?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Правила должны быть простыми</title><published>2021-07-22T15:44:00.539Z</published><updated>2021-07-29T12:02:31.410Z</updated><category term="team-leader" label="team leader"></category><summary type="html">Простые правила проще выполнять и контролировать. В простых правилах нет разночтений и субъективных суждений. Ради простоты можно пожертвовать точностью правила. Например, запретить чуть больше, чем нужно, если это не сильно мешает. </summary><content type="html">
  &lt;p&gt;Простые правила проще выполнять и контролировать. В простых правилах нет разночтений и субъективных суждений. Ради простоты можно пожертвовать точностью правила. Например, запретить чуть больше, чем нужно, если это не сильно мешает. &lt;/p&gt;

</content></entry><entry><id>sovetov:totalitarianism-and-anarchy</id><link rel="alternate" type="text/html" href="https://sovetov.pro/totalitarianism-and-anarchy?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Правила: зачем и какие нужны</title><published>2021-07-22T14:47:56.913Z</published><updated>2021-08-12T10:42:15.872Z</updated><summary type="html">Правила нужны не только для того, чтобы код был читаемым или качественным. Читаемость, в конце концов, — субъективная характеристика. У всех свои представления о прекрасном.</summary><content type="html">
  &lt;p&gt;Правила нужны не только для того, чтобы код был читаемым или качественным. Читаемость, в конце концов, — субъективная характеристика. У всех свои представления о прекрасном.&lt;/p&gt;
  &lt;p&gt;Представления о прекрасном должны быть общие на команду или проект. Они должны обладать более высоким приоритетом, чем представления о прекрасном каждого разработчика в отдельности.&lt;/p&gt;
  &lt;p&gt;Правила нужны, чтобы не тратить время на споры о вкусах.&lt;/p&gt;
  &lt;p&gt;Правила экономят мыслительные ресурсы, освобождая от лишнего выбора, который может вообще никак не влиять на корректность кода и читаемость.&lt;/p&gt;
  &lt;p&gt;Но чем больше правил и чем они сложнее, тем труднее их соблюдать и проверять.&lt;/p&gt;
  &lt;p&gt;Когда правил много, — это тоталитризм. Когда правил мало — это анархия.&lt;/p&gt;
  &lt;p&gt;Тоталитаризм — это дисциплина и стабильность. Никаких лишних разговоров и споров. Тоталитаризм требует грамотоного управления. Иногда высокая зарегулированность может быть причиной демотивации. Новичков нужно вводить аккуратно. Есть риск, что они могут не прижиться. &lt;/p&gt;
  &lt;p&gt;Анархия — свобода, самовыражение, быстрые изменения. Если задача подразумевает proof of concept, первую версию чего-либо или быстрый фикс, то разумная доля анархии может оказаться выгодной.&lt;/p&gt;
  &lt;p&gt;Выбирайте нужную точку на континууме между тоталитаризмом и анархией в зависимости от команды, проекта и задачи.&lt;/p&gt;

</content></entry><entry><id>sovetov:kbit</id><link rel="alternate" type="text/html" href="https://sovetov.pro/kbit?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sovetov"></link><title>Килобиты и килобайты</title><published>2021-07-21T18:13:26.957Z</published><updated>2021-08-12T10:38:20.510Z</updated><summary type="html">Сетевые скорости и битрейты аудио и видео измеряются в битах в секунду с десятичными приставками. 100 Мбит/с — это 100000000 бит в секунду. Низкоуровневые сетевые протоколы никак не привязаны к байтам, октетам и, тем более, степеням двойки. Оттуда все и пошло.</summary><content type="html">
  &lt;p&gt;Сетевые скорости и битрейты аудио и видео измеряются в битах в секунду с десятичными приставками. 100 Мбит/с — это 100000000 бит в секунду. Низкоуровневые сетевые протоколы никак не привязаны к байтам, октетам и, тем более, степеням двойки. Оттуда все и пошло.&lt;/p&gt;
  &lt;p&gt;Производители дисков указывают объем в десятичных приставках.&lt;/p&gt;
  &lt;p&gt;Объемы информации измеряются в байтах с двоичными приставками.&lt;/p&gt;
  &lt;p&gt;Процессоры работают с байтами. В общем случае байт — это не всегда 8 бит. Поэтому придумали слово &amp;quot;октет&amp;quot;. Отсюда пошло &lt;code&gt;application/octet-stream&lt;/code&gt;.&lt;/p&gt;

</content></entry></feed>