HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>2 сен 2021</li>
2 <ul><li>2 сен 2021</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Сеньорские фейлы, скандалы, интриги, расследования - показать всё, что скрыто!</p>
4 </ul><p>Сеньорские фейлы, скандалы, интриги, расследования - показать всё, что скрыто!</p>
5 <p>Филолог, полиглот, IT-гик. В прошлом - преподаватель английского и литературы и рецензент Rolling Stone Russia. Ныне переводит для РБК и пишет о программировании и образовании для Skillbox.</p>
5 <p>Филолог, полиглот, IT-гик. В прошлом - преподаватель английского и литературы и рецензент Rolling Stone Russia. Ныне переводит для РБК и пишет о программировании и образовании для Skillbox.</p>
6 <p>Вы когда-нибудь замечали, как на YouTube плывёт вёрстка? А как подвисает "ВКонтакте" или даже Facebook*? Если вы давний фанат Apple, то наверняка помните проблемы с iOS 11.</p>
6 <p>Вы когда-нибудь замечали, как на YouTube плывёт вёрстка? А как подвисает "ВКонтакте" или даже Facebook*? Если вы давний фанат Apple, то наверняка помните проблемы с iOS 11.</p>
7 <p>Стереотипные шутки заставляют думать, что факапятся только джуны из бюджетных стартапов. В действительности же от них не застрахованы даже лучшие программисты Кремниевой долины. Причина простая - человеческий фактор.</p>
7 <p>Стереотипные шутки заставляют думать, что факапятся только джуны из бюджетных стартапов. В действительности же от них не застрахованы даже лучшие программисты Кремниевой долины. Причина простая - человеческий фактор.</p>
8 <p>Опытные мидлы и сеньоры поделились своими эпичными фейлами и рассказали, как можно снизить количество ошибок в коде.</p>
8 <p>Опытные мидлы и сеньоры поделились своими эпичными фейлами и рассказали, как можно снизить количество ошибок в коде.</p>
9 Скриншот: предоставлен автором<p><strong>Герой: Константин, Middle Java-разработчик в известном российском банке</strong></p>
9 Скриншот: предоставлен автором<p><strong>Герой: Константин, Middle Java-разработчик в известном российском банке</strong></p>
10 <p>Сейчас мы работаем над системой обработки платёжных транзакций. В одном из тикетов надо было поменять способ хранения суммы транзакции - сколько денег ушло и в какой валюте. Я создал новый тип<strong>Amount</strong>и добавил его везде, где требовалось.<em>So far, so good</em>.</p>
10 <p>Сейчас мы работаем над системой обработки платёжных транзакций. В одном из тикетов надо было поменять способ хранения суммы транзакции - сколько денег ушло и в какой валюте. Я создал новый тип<strong>Amount</strong>и добавил его везде, где требовалось.<em>So far, so good</em>.</p>
11 <p>Плюс я добавил новый тип и удалил старые поля в одном из объектов, которые использовались для передачи данных между нашими модулями. В итоге мы успешно прошли тесты: правда, в лабораторных условиях все модули устанавливались одновременно и только после этого тестировались. А на проде всё посыпалось.</p>
11 <p>Плюс я добавил новый тип и удалил старые поля в одном из объектов, которые использовались для передачи данных между нашими модулями. В итоге мы успешно прошли тесты: правда, в лабораторных условиях все модули устанавливались одновременно и только после этого тестировались. А на проде всё посыпалось.</p>
12 <p>Следите за руками: обновлённые клиенты отправляют объект в новом формате, с новым полем<strong>amount</strong>(и без старых полей); обрабатывали же этот запрос ещё не обновлённые сервисы, которые про новое поле не знали и поэтому не могли десериализовать полученные объекты. Пока мы откатывали обновление, на этом сервисе потерялось несколько сотен транзакций.</p>
12 <p>Следите за руками: обновлённые клиенты отправляют объект в новом формате, с новым полем<strong>amount</strong>(и без старых полей); обрабатывали же этот запрос ещё не обновлённые сервисы, которые про новое поле не знали и поэтому не могли десериализовать полученные объекты. Пока мы откатывали обновление, на этом сервисе потерялось несколько сотен транзакций.</p>
13 <p><strong>Мораль:</strong>всегда помните про обратную совместимость и не забывайте эмулировать боевые условия на тестах!</p>
13 <p><strong>Мораль:</strong>всегда помните про обратную совместимость и не забывайте эмулировать боевые условия на тестах!</p>
14 Скриншот: предоставлен автором<p><strong>Герой: Иван Пономарёв, тимлид и Senior JS-разработчик антидетект-браузера GoLogin</strong></p>
14 Скриншот: предоставлен автором<p><strong>Герой: Иван Пономарёв, тимлид и Senior JS-разработчик антидетект-браузера GoLogin</strong></p>
15 <p><strong>Первый комментарий героя.</strong>Это клиника.</p>
15 <p><strong>Первый комментарий героя.</strong>Это клиника.</p>
16 <p><strong>Второй комментарий героя.</strong>А если серьёзно, то это банальная невнимательность. Закидывая впопыхах новый код, проглядел, что остался мелкий кусок старого.</p>
16 <p><strong>Второй комментарий героя.</strong>А если серьёзно, то это банальная невнимательность. Закидывая впопыхах новый код, проглядел, что остался мелкий кусок старого.</p>
17 <p>В итоге получилось что получилось: когда формировался объект конфигурации для запуска браузера, добавлялись шрифты. Правда, сразу же после этого шрифты удалялись :) Такое иногда происходит даже с опытными программистами. Просто косяки случаются на более сложных тасках и в более напряжённых условиях - например, когда горят сроки или начинается завал с другими задачами. Ошибка получилась настолько нелепой, что мозг просто отказывался верить в её существование. Поэтому поначалу я ещё и всем яростно доказывал, что всё ок.</p>
17 <p>В итоге получилось что получилось: когда формировался объект конфигурации для запуска браузера, добавлялись шрифты. Правда, сразу же после этого шрифты удалялись :) Такое иногда происходит даже с опытными программистами. Просто косяки случаются на более сложных тасках и в более напряжённых условиях - например, когда горят сроки или начинается завал с другими задачами. Ошибка получилась настолько нелепой, что мозг просто отказывался верить в её существование. Поэтому поначалу я ещё и всем яростно доказывал, что всё ок.</p>
18 <p><strong>Мораль:</strong>ошибки из-за невнимательности или недостаточной концентрации совершают даже сеньоры и мидлы. Но это не значит, что можно расслабиться и забить на всё. Наоборот, надо быть более внимательным, чётко организовывать свою работу и дисциплинировать себя в плане сна и отдыха - только так количество глупых фейлов можно снизить до минимума.</p>
18 <p><strong>Мораль:</strong>ошибки из-за невнимательности или недостаточной концентрации совершают даже сеньоры и мидлы. Но это не значит, что можно расслабиться и забить на всё. Наоборот, надо быть более внимательным, чётко организовывать свою работу и дисциплинировать себя в плане сна и отдыха - только так количество глупых фейлов можно снизить до минимума.</p>
19 Скриншот: предоставлен автором<p><strong>Герой: Исмаил Хамитов, продуктовый аналитик (Middle) в "Яндексе"</strong></p>
19 Скриншот: предоставлен автором<p><strong>Герой: Исмаил Хамитов, продуктовый аналитик (Middle) в "Яндексе"</strong></p>
20 <p>Как-то раз меня подловили на очень глупой ошибке вопросом: "А как ты ограничил версию в этом отчёте?" Я понял, что в процессе обработки, когда нужно было оставить данные с определённой версии (например, с версии<strong>12.0</strong>и выше), я использовал просто условие version<strong>&gt;= "12.0"</strong>. Но строки сравниваются между собой лексикографически, и поэтому, например,<strong>2.0</strong>будет выше, чем<strong>12.0</strong>! При этом даты в формате ISO 8601 очень даже можно сравнивать и лексикографически - всё проходит корректно.</p>
20 <p>Как-то раз меня подловили на очень глупой ошибке вопросом: "А как ты ограничил версию в этом отчёте?" Я понял, что в процессе обработки, когда нужно было оставить данные с определённой версии (например, с версии<strong>12.0</strong>и выше), я использовал просто условие version<strong>&gt;= "12.0"</strong>. Но строки сравниваются между собой лексикографически, и поэтому, например,<strong>2.0</strong>будет выше, чем<strong>12.0</strong>! При этом даты в формате ISO 8601 очень даже можно сравнивать и лексикографически - всё проходит корректно.</p>
21 <p>А недавно, когда мы обсуждали с руководителем продукта полугодовой отчёт, мы обнаружили, что несколько чисел в отчёте неверные! Мы могли радостно показать рост в десятки процентов там, где его не было и в помине, или не увидеть реальный рост там, где он на самом деле был. И всё из-за того, что я посмотрел не на актуальный график или взял числа не по России, а интегрально по всему миру. Подобные плюхи случаются каждый раз, когда я начинаю мнить себя суперопытным и сильным специалистом.</p>
21 <p>А недавно, когда мы обсуждали с руководителем продукта полугодовой отчёт, мы обнаружили, что несколько чисел в отчёте неверные! Мы могли радостно показать рост в десятки процентов там, где его не было и в помине, или не увидеть реальный рост там, где он на самом деле был. И всё из-за того, что я посмотрел не на актуальный график или взял числа не по России, а интегрально по всему миру. Подобные плюхи случаются каждый раз, когда я начинаю мнить себя суперопытным и сильным специалистом.</p>
22 <p>Конечно, ошибок надо бояться, и это нормальное желание - свести их к минимуму. Но мне очень нравится мысль управляющего директора "Яндекса" Тиграна Худавердяна о том, что для создания крутых продуктов нужно<a>уметь переживать и иногда даже не спать ночами</a>. Потому что самые крутые ребята в индустрии не боятся ошибок - и даже регулярно ошибаются. Зато это помогает им решать ещё не решённые до них задачи. То есть каждая такая ошибка, каждое переживание за неудачи в продукте постепенно приводят их к лучшим решениям.</p>
22 <p>Конечно, ошибок надо бояться, и это нормальное желание - свести их к минимуму. Но мне очень нравится мысль управляющего директора "Яндекса" Тиграна Худавердяна о том, что для создания крутых продуктов нужно<a>уметь переживать и иногда даже не спать ночами</a>. Потому что самые крутые ребята в индустрии не боятся ошибок - и даже регулярно ошибаются. Зато это помогает им решать ещё не решённые до них задачи. То есть каждая такая ошибка, каждое переживание за неудачи в продукте постепенно приводят их к лучшим решениям.</p>
23 <p><strong>Мораль:</strong>бояться стоит не ошибок, а нерешённых задач. Старайтесь подходить к проекту максимально ответственно и работайте над ним так, словно он ваше детище.</p>
23 <p><strong>Мораль:</strong>бояться стоит не ошибок, а нерешённых задач. Старайтесь подходить к проекту максимально ответственно и работайте над ним так, словно он ваше детище.</p>
24 <p>А ещё очень полезно всегда ощущать себя джуном и растущим специалистом - излишняя самоуверенность гарантированно приводит к ошибкам и ограниченности видения.</p>
24 <p>А ещё очень полезно всегда ощущать себя джуном и растущим специалистом - излишняя самоуверенность гарантированно приводит к ошибкам и ограниченности видения.</p>
25 Скриншот: предоставлен авторомСкриншот: предоставлен автором<p><strong>Герой: Егор Волокитин, CTO антидетект-браузера GoLogin</strong></p>
25 Скриншот: предоставлен авторомСкриншот: предоставлен автором<p><strong>Герой: Егор Волокитин, CTO антидетект-браузера GoLogin</strong></p>
26 <p>В первом варианте у меня появилась квадратичная сложность из-за<strong>spread-оператора</strong>(многоточие). По сути,<strong>reduce</strong>уже и так перебирает массив, а <strong>spread-оператор</strong>в этом случае просто копирует его. Он проходит по очереди по исходному массиву и добавляет в текущий каждый элемент исходного. То есть его сложность О(n).</p>
26 <p>В первом варианте у меня появилась квадратичная сложность из-за<strong>spread-оператора</strong>(многоточие). По сути,<strong>reduce</strong>уже и так перебирает массив, а <strong>spread-оператор</strong>в этом случае просто копирует его. Он проходит по очереди по исходному массиву и добавляет в текущий каждый элемент исходного. То есть его сложность О(n).</p>
27 <p><strong>Reduce</strong>тоже проходит по исходному по очереди. И его сложность тоже O(n). Когда здесь используется<strong>spread</strong>, то заново перебирается массив. Из-за этого на каждую итерацию перебора массива на верхнем уровне совершается полный цикл перебора массива на нижнем уровне.</p>
27 <p><strong>Reduce</strong>тоже проходит по исходному по очереди. И его сложность тоже O(n). Когда здесь используется<strong>spread</strong>, то заново перебирается массив. Из-за этого на каждую итерацию перебора массива на верхнем уровне совершается полный цикл перебора массива на нижнем уровне.</p>
28 <p>То есть по массиву длиной в 10 элементов первый вариант кода пройдёт 100 раз. Кажется, что это не слишком много, но, когда массив состоит из 1000 элементов, итераций будет уже 1 млн. А это серьёзная нагрузка.</p>
28 <p>То есть по массиву длиной в 10 элементов первый вариант кода пройдёт 100 раз. Кажется, что это не слишком много, но, когда массив состоит из 1000 элементов, итераций будет уже 1 млн. А это серьёзная нагрузка.</p>
29 <p>Второй вариант кода мало кто написал бы с ходу - сейчас не так сильно пекутся о скорости работы приложения. И я бы даже не назвал это ошибкой, поэтому и обозначил просто как плохой и хороший код. Почему сразу не написал хорошо? Да просто не знал, что можно сделать лучше.</p>
29 <p>Второй вариант кода мало кто написал бы с ходу - сейчас не так сильно пекутся о скорости работы приложения. И я бы даже не назвал это ошибкой, поэтому и обозначил просто как плохой и хороший код. Почему сразу не написал хорошо? Да просто не знал, что можно сделать лучше.</p>
30 <p><strong>Мораль:</strong>постоянно прокачивайте свои навыки и старайтесь подбирать лучший код для решения задачи - иногда он сказывается не только на читаемости, но и на работе самого приложения. И не забивайте на производительность своих приложений!</p>
30 <p><strong>Мораль:</strong>постоянно прокачивайте свои навыки и старайтесь подбирать лучший код для решения задачи - иногда он сказывается не только на читаемости, но и на работе самого приложения. И не забивайте на производительность своих приложений!</p>
31 <p>Опытные программисты легко говорят о своих ошибках - не стыдятся этого, охотно делятся опытом и советами. Поэтому, если хотите быть такими же крутыми, как герои этой подборки, - не закрывайте глаза на собственные фейлы, учитесь работать с ними и извлекать из них пользу.</p>
31 <p>Опытные программисты легко говорят о своих ошибках - не стыдятся этого, охотно делятся опытом и советами. Поэтому, если хотите быть такими же крутыми, как герои этой подборки, - не закрывайте глаза на собственные фейлы, учитесь работать с ними и извлекать из них пользу.</p>
32 <p>* Решением суда запрещена "деятельность компании Meta Platforms Inc. по реализации продуктов - социальных сетей Facebook* и Instagram* на территории Российской Федерации по основаниям осуществления экстремистской деятельности".</p>
32 <p>* Решением суда запрещена "деятельность компании Meta Platforms Inc. по реализации продуктов - социальных сетей Facebook* и Instagram* на территории Российской Федерации по основаниям осуществления экстремистской деятельности".</p>
33 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
33 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>