<?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>DevZone</title><author><name>DevZone</name></author><id>https://teletype.in/atom/devz</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/devz?offset=0"></link><link rel="alternate" type="text/html" href="https://devz.su/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/devz?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-03T20:28:33.016Z</updated><entry><id>devz:the-pulse-146</id><link rel="alternate" type="text/html" href="https://devz.su/the-pulse-146?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>The Pulse #146: Как искусственный интеллект меняет технические собеседования</title><published>2025-11-06T07:17:43.809Z</published><updated>2025-11-06T07:18:04.506Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/03/e0/03e054ef-28bd-4f7f-841b-a01d9f89f8a7.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/04/fc/04fcc4a3-d683-481d-bf0e-54f7aead65c1.png&quot;&gt;Крупные технологические компании задают более сложные вопросы на собеседованиях, в то время как стартапы отказываются от алгоритмических вопросов и заданий. Кроме того, набирает популярность новый тренд — разработка внутренних инструментов для разработчиков.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;PAHi&quot;&gt;Крупные технологические компании задают более сложные вопросы на собеседованиях, в то время как стартапы отказываются от алгоритмических вопросов и заданий. Кроме того, набирает популярность новый тренд — разработка внутренних инструментов для разработчиков.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;u2Fk&quot;&gt;&lt;em&gt;The Pulse - это &lt;a href=&quot;https://newsletter.pragmaticengineer.com/s/the-pulse&quot; target=&quot;_blank&quot;&gt;серия&lt;/a&gt;, освещающая события, идеи и тенденции в сфере крупных технологий и стартапов.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;4eEl&quot;&gt;Сегодня мы рассмотрим:&lt;/p&gt;
  &lt;ol id=&quot;JyDS&quot;&gt;
    &lt;li id=&quot;FpRP&quot;&gt;&lt;strong&gt;Как искусственный интеллект меняет собеседования при приёме на работу в сфере технологий.&lt;/strong&gt; Новые подробности о более сложных вопросах для кандидатов, растущих опасениях по поводу мошенничества и распространении процессов собеседования с использованием искусственного интеллекта от 63 инженеров из крупных технологических компаний и стартапов, которые проводят собеседования на платформе для имитационных собеседований &lt;a href=&quot;http://interviewing.io/&quot; target=&quot;_blank&quot;&gt;interviewing.io&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;rzX1&quot;&gt;&lt;strong&gt;Новая тенденция: разработчики создают внутренние инструменты с помощью ИИ. &lt;/strong&gt;Инженеры-программисты всё чаще используют ИИ-агентов для создания простых инструментов, на написание которых обычно уходит несколько часов или дней.&lt;/li&gt;
    &lt;li id=&quot;S0vJ&quot;&gt;&lt;strong&gt;Новости отрасли. &lt;/strong&gt;Кошмар с безопасностью в npm, Microsoft присоединяется к клубу «три дня в офисе», Klarna выходит на биржу, Meta закрывает небольшие инженерные офисы и многое другое.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;alFB&quot;&gt;1. Как искусственный интеллект меняет собеседования&lt;/h2&gt;
  &lt;p id=&quot;PxjC&quot;&gt;Команда interviewing.io провела опрос среди интервьюеров на своей платформе, представляющих крупные технологические компании и стартапы, и выяснила, как искусственный интеллект меняет процесс проведения собеседований на их рабочих местах. Они получили 63 подробных ответа, и в этом информационном бюллетене впервые публикуются результаты исследования.&lt;/p&gt;
  &lt;p id=&quot;dIFs&quot;&gt;&lt;em&gt;Особая благодарность Алин Лернер, которая поделилась со мной данными. Алин — основательница &lt;a href=&quot;http://interviewing.io/&quot; target=&quot;_blank&quot;&gt;interviewing.io&lt;/a&gt;, соавтор &lt;a href=&quot;https://www.amazon.com/dp/195570600X&quot; target=&quot;_blank&quot;&gt;Beyond Cracking the Coding Interview&lt;/a&gt; и создательница &lt;a href=&quot;https://www.youtube.com/playlist?list=PLm6XThSMgu_EPXOpebQmEucJzugYBeg7d&quot; target=&quot;_blank&quot;&gt;Whiteboard Confidential Podcast&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;h3 id=&quot;hSqg&quot;&gt;Демография&lt;/h3&gt;
  &lt;p id=&quot;ebiD&quot;&gt;Большинство респондентов работают в крупных технологических компаниях (Apple, Google, Meta, Microsoft или Netflix) или в новых крупных технологических компаниях (Uber, Stripe, DoorDash и других), а также в стартапах.&lt;/p&gt;
  &lt;figure id=&quot;1hG9&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/04/fc/04fcc4a3-d683-481d-bf0e-54f7aead65c1.png&quot; width=&quot;1446&quot; /&gt;
    &lt;figcaption&gt;Из 63 респондентов 45 работают в крупных технологических компаниях, 7 — в «новых крупных технологических компаниях», а 11 — в стартапах&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bLyo&quot;&gt;Насколько распространена практика мошенничества на удалённых собеседованиях? Согласно результатам опроса, она широко распространена:&lt;/p&gt;
  &lt;ul id=&quot;VewY&quot;&gt;
    &lt;li id=&quot;ZWXL&quot;&gt;&lt;strong&gt;81% &lt;/strong&gt;интервьюеров из крупных технологических компаний и новых крупных технологических компаний заявили, что подозревали кандидатов в использовании инструментов искусственного интеллекта для обмана во время собеседований&lt;/li&gt;
    &lt;li id=&quot;otGx&quot;&gt;&lt;strong&gt;31%&lt;/strong&gt;интервьюеров в крупных технологических компаниях и новых крупных технологических компаниях поймали кандидатов на обмане во время собеседования, то есть на использовании инструментов искусственного интеллекта для получения ответов, которые они выдают за свои&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;bVkR&quot;&gt;&lt;strong&gt;Meta — единственная крупная технологическая компания, которая проводит общекорпоративные изменения для борьбы с мошенничеством, &lt;/strong&gt;согласно этому исследованию.Из интервью с представителем Meta на сайте interviewing.io:&lt;/p&gt;
  &lt;blockquote id=&quot;EUYQ&quot;&gt;«Сейчас в Meta особое внимание уделяется предотвращению мошенничества. Теперь мы должны указывать, есть ли у нас подозрения, что кандидат жульничает, практически на всех типах/уровнях собеседований, и обосновывать это, если есть. Раньше это касалось только собеседований по программированию. Мы также требуем, чтобы кандидаты показывали весь экран и отключали все фоновые фильтры (включая размытие) на большинстве собеседований».&lt;/blockquote&gt;
  &lt;p id=&quot;VRk4&quot;&gt;Другой интервьюер из Microsoft упомянул, что их &lt;em&gt;команда&lt;/em&gt; принимает меры для выявления инструментов для мошенничества, но это не касается всей компании. Другие интервьюеры сказали, что на их рабочих местах ничего не изменилось. Один инженер из крупного технологического гиганта сказал:&lt;/p&gt;
  &lt;blockquote id=&quot;jHQb&quot;&gt;«Моя компания развивается медленно, несмотря на многочисленные случаи мошенничества и другие проблемы».&lt;/blockquote&gt;
  &lt;p id=&quot;jstL&quot;&gt;&lt;strong&gt;Итак, почему обман с помощью ИИ вызывает беспокойство у интервьюеров, но многие компании не реагируют на это? &lt;/strong&gt;Я считаю, что это связано с несколькими факторами:&lt;/p&gt;
  &lt;ul id=&quot;vENF&quot;&gt;
    &lt;li id=&quot;CXXB&quot;&gt;В крупных технологических компаниях такие процессы, как собеседование, меняются медленно. Пока не произойдёт серьёзных инцидентов, связанных с мошенничеством, вряд ли что-то изменится&lt;/li&gt;
    &lt;li id=&quot;yakN&quot;&gt;Большинство собеседований в крупных технологических компаниях проводятся одинаково уже 15 лет, поэтому реформы неизбежно идут медленно&lt;/li&gt;
    &lt;li id=&quot;QkKJ&quot;&gt;Как ни странно, возможно, будет проще вернуться к очным собеседованиям, чем внедрять политику «борьбы с мошенничеством». Google, скорее всего, готовится проводить больше очных собеседований, потому что всё больше кандидатов используют на собеседованиях инструменты искусственного интеллекта, и Google хочет убедиться, что «основы соблюдены», как сказал генеральный директор Сундар Пичаи &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/171978178/the-reality-of-interviews-at-big-tech&quot; target=&quot;_blank&quot;&gt;в июне&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;ggyO&quot;&gt;Вопросы на собеседованиях в крупных компаниях действительно сложные&lt;/h3&gt;
  &lt;p id=&quot;iMPK&quot;&gt;Тем временем интервьюеры, похоже, берут дело в свои руки и борются с читерами, использующими инструменты искусственного интеллекта, задавая более сложные вопросы. 58% интервьюеров из крупных технологических компаний заявили, что изменили формат вопросов, которые они задают, чтобы предотвратить потенциальное использование «читерских инструментов» на основе ИИ. Вот что рассказали нам респонденты из разных компаний (каждый пункт — это подход одного интервьюера):&lt;/p&gt;
  &lt;p id=&quot;CTG4&quot;&gt;&lt;strong&gt;Meta&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul id=&quot;KfCk&quot;&gt;
    &lt;li id=&quot;wQuM&quot;&gt;Больше открытых вопросов, которые побуждают к размышлениям, а не к применению известного шаблона&lt;/li&gt;
    &lt;li id=&quot;jNGp&quot;&gt;Добавляйте вариации к популярным вопросам, потому что это часто застаёт мошенников врасплох — по крайней мере, пока&lt;/li&gt;
    &lt;li id=&quot;gPTg&quot;&gt;Задавайте вопросы с более подробными описаниями и сложными инструкциями по настройке, с которыми ИИ-инструментам сложнее справиться&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;lfhD&quot;&gt;&lt;strong&gt;Microsoft:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;9FX8&quot;&gt;
    &lt;li id=&quot;giIv&quot;&gt;Использование более сложных задач по программированию, решения которых с помощью LLM часто содержат подсказки, раскрывающие их использование&lt;/li&gt;
    &lt;li id=&quot;crvh&quot;&gt;Задавайте вопросы, которые требуют от кандидатов свободного объяснения концепций, для чего недостаточно просто прочитать ответ, сгенерированный искусственным интеллектом&lt;/li&gt;
    &lt;li id=&quot;oCpx&quot;&gt;Проверка того, как кандидаты могут &lt;em&gt;расширить&lt;/em&gt; существующую логику с помощью структуры классов, вместо того чтобы переписывать всю логику. &lt;em&gt;Опять же, большие языковые модели пока не очень хороши в этом&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;63kW&quot;&gt;Больше внимания уделяйте системному пониманию и более сложным вопросам практической реализации&lt;/li&gt;
    &lt;li id=&quot;Z5aA&quot;&gt;Задаём &lt;em&gt;изменённую&lt;/em&gt; версию вопроса с LeetCode&lt;/li&gt;
    &lt;li id=&quot;TLFi&quot;&gt;Формулировка вопросов таким образом, чтобы популярные языковые модели, такие как ChatGPT, давали неправильные ответы&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;79BV&quot;&gt;&lt;strong&gt;Amazon:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;olV3&quot;&gt;
    &lt;li id=&quot;JZee&quot;&gt;Меньше вопросов, скопированных с LeetCode. Вместо этого вопросы основаны на схожих концепциях, но с другими формулировками и результатами&lt;/li&gt;
    &lt;li id=&quot;r4gd&quot;&gt;Некоторые инженеры создают варианты задач, чтобы усложнить задачу для кандидатов, которые только &lt;em&gt;запоминают&lt;/em&gt;решения&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ZqHT&quot;&gt;&lt;strong&gt;Google&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul id=&quot;6K49&quot;&gt;
    &lt;li id=&quot;SpGr&quot;&gt;Не задаём вопросы в стиле LeetCode. Вместо этого задаём вопросы, состоящие из множества частей, которые требуют &lt;em&gt;решения&lt;/em&gt;, а не &lt;em&gt;кодирования&lt;/em&gt;.&lt;/li&gt;
    &lt;li id=&quot;W9kq&quot;&gt;Постановка абстрактных задач, не предполагающих однозначного ответа. Кроме того, следует задавать вопросы, имеющие несколько решений, для поиска которых кандидатам необходимо использовать навыки логического мышления.&lt;/li&gt;
    &lt;li id=&quot;Y3rp&quot;&gt;Используйте другую терминологию и формулируйте вопросы так, чтобы инструменты ИИ не могли их распознать. Задавайте более сложные вопросы, для ответа на которые требуется 2 или более структур данных или алгоритмов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cIcc&quot;&gt;&lt;strong&gt;Apple:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;ENaP&quot;&gt;
    &lt;li id=&quot;nXeE&quot;&gt;Задавайте больше вопросов из реальной жизни и меньше алгоритмических вопросов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8Tdz&quot;&gt;&lt;strong&gt;Netflix&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul id=&quot;PGXm&quot;&gt;
    &lt;li id=&quot;Nn4T&quot;&gt;Вопросы не изменились.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;c7jE&quot;&gt;Как уже упоминалось выше, из-за инструментов для списывания, основанных на искусственном интеллекте, вопросы становятся всё сложнее, а интервьюеры усложняют работу невидимых ИИ-помощников, делая следующее:&lt;/p&gt;
  &lt;ul id=&quot;Do7z&quot;&gt;
    &lt;li id=&quot;Bbaw&quot;&gt;Задаем вариации общедоступных вопросов с LeetCode&lt;/li&gt;
    &lt;li id=&quot;YNvd&quot;&gt;Задавайте более практичные или более сложные вопросы&lt;/li&gt;
    &lt;li id=&quot;rokm&quot;&gt;Задавая более абстрактные вопросы&lt;/li&gt;
    &lt;li id=&quot;6dXD&quot;&gt;Больше внимания решению задач, а не написанию кода&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Mwdo&quot;&gt;&lt;strong&gt;Интервьюеры также меняют свой подход. &lt;/strong&gt;Интервьюеры из крупных технологических компаний и новых крупных технологических компаний сообщают, что они адаптируются, чтобы бороться с мошенничеством с использованием ИИ, следующим образом:&lt;/p&gt;
  &lt;ul id=&quot;e5Bv&quot;&gt;
    &lt;li id=&quot;DKq6&quot;&gt;&lt;strong&gt;Ищем «шаблоны ИИ». &lt;/strong&gt;В ответах, предоставляемых ИИ, есть заметные шаблоны. Когда интервьюер замечает, что кандидат использует шаблон, он обращает на это внимание.&lt;/li&gt;
    &lt;li id=&quot;qYB5&quot;&gt;&lt;strong&gt;Сосредоточьтесь на вопросе «почему». &lt;/strong&gt;Спросите, почему кандидат сделал тот или иной выбор, и попросите его подробно объяснить.&lt;/li&gt;
    &lt;li id=&quot;RV8N&quot;&gt;&lt;strong&gt;Дополнительные вопросы. &lt;/strong&gt;Побуждаем кандидатов объяснять ход своих мыслей, с чем LLM справляется с трудом.&lt;/li&gt;
    &lt;li id=&quot;IjMV&quot;&gt;&lt;strong&gt;Более подробные вопросы. &lt;/strong&gt;«Что делает эта строка кода, что произойдёт, если мы её удалим, как можно сделать то же самое по-другому?»&lt;/li&gt;
    &lt;li id=&quot;tIku&quot;&gt;&lt;strong&gt;Задайте вопрос ещё раз. &lt;/strong&gt;Задайте тот же вопрос ещё раз, позже. Кандидат, не использующий ИИ, даст тот же ответ, в то время как кандидат, полагающийся на ИИ, скорее всего, ответит иначе, поскольку ИИ недетерминирован.&lt;/li&gt;
    &lt;li id=&quot;PYNO&quot;&gt;&lt;strong&gt;«Стремительные» вопросы.&lt;/strong&gt; Ускорение темпа вопросов, чтобы не оставалось времени на их ввод в качестве подсказок, и сокращение возможностей для считывания ответов ИИ с экрана.&lt;/li&gt;
    &lt;li id=&quot;58qI&quot;&gt;&lt;strong&gt;Кандидаты объясняют ход своих мыслей.&lt;/strong&gt; Одного хорошего ответа уже недостаточно; интервьюеры просят кандидатов подробно объяснить ход своих мыслей и рассуждений.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;jnUE&quot;&gt;Крупные технологические компании: алгоритмические собеседования никуда не денутся&lt;/h3&gt;
  &lt;p id=&quot;mCgK&quot;&gt;Среди 53 респондентов из крупных технологических компаний и новых крупных технологических компаний НИ ОДИН не сказал, что его компания отказалась от алгоритмических вопросов.&lt;/p&gt;
  &lt;p id=&quot;IZcp&quot;&gt;Однако более половины респондентов заявили, что через 2–5 лет алгоритмические собеседования будут менее популярны, чем сейчас. Напротив, около 20% респондентов убеждены, что алгоритмические собеседования никогда не исчезнут.&lt;/p&gt;
  &lt;p id=&quot;enEK&quot;&gt;&lt;em&gt;Мы подробно рассматриваем эту тему в статье &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-to-get-unstuck-during-coding-interviews&quot; target=&quot;_blank&quot;&gt;Как опытные инженеры справляются с собеседованиями по программированию&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;h3 id=&quot;0fvN&quot;&gt;Стартапы внедряют собеседования с использованием ИИ&lt;/h3&gt;
  &lt;p id=&quot;RxNg&quot;&gt;Забавный факт: крупные технологические компании не сильно меняют процесс собеседования, в отличие от стартапов.&lt;/p&gt;
  &lt;p id=&quot;fhs2&quot;&gt;Наиболее распространённые изменения в стартапах:&lt;/p&gt;
  &lt;ul id=&quot;MGUu&quot;&gt;
    &lt;li id=&quot;n6SE&quot;&gt;&lt;strong&gt;Больше никаких алгоритмических вопросов. &lt;/strong&gt;Многие стартапы отказываются от них, поскольку инструменты ИИ легко справляются с ними и они не имитируют повседневную работу.&lt;/li&gt;
    &lt;li id=&quot;wK6Y&quot;&gt;&lt;strong&gt;Больше никаких домашних заданий. &lt;/strong&gt;Инструменты на основе ИИ очень хорошо справляются с домашними заданиями, и кандидаты всё чаще просто вводят свои ответы в такие инструменты, как Claude Code. Раньше стартапы часто задавали домашние задания, но инструменты на основе ИИ означают, что в наши дни они практически бесполезны, и от них отказываются.&lt;/li&gt;
    &lt;li id=&quot;nsND&quot;&gt;&lt;strong&gt;Собеседования с использованием ИИ заменяют алгоритмические собеседования и собеседования на дому. &lt;/strong&gt;Все больше стартапов добавляют в свой основной цикл собеседования этап, на котором кандидаты &lt;em&gt;должны&lt;/em&gt; использовать инструменты ИИ, демонстрируя свой экран. Они решают более сложные задачи, а также имитируют повседневную работу, поскольку почти каждый инженер в стартапах использует инструменты для написания кода на основе ИИ!&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;0fIW&quot;&gt;Компания Shopify начала проводить собеседования с использованием искусственного интеллекта. Вот что сказал об этом технический директор компании Фархан Тавар (смотрите полное интервью &lt;a href=&quot;https://youtu.be/u-3IILWQPRM?si=oBs27DkXoYCRoRjl&amp;t=2519&quot; target=&quot;_blank&quot;&gt;в этой записи&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/u-3IILWQPRM?si=oBs27DkXoYCRoRjl&amp;t=2519&quot; target=&quot;_blank&quot;&gt;с 41:49&lt;/a&gt;):&lt;/p&gt;
  &lt;blockquote id=&quot;CmFb&quot;&gt;Гергели: «Подождите. То есть вы используете ИИ во время собеседований?»&lt;br /&gt;&lt;br /&gt;Фархан: «Да».&lt;/blockquote&gt;
  &lt;blockquote id=&quot;Yqdt&quot;&gt;Гергели: «Ты от этого не убежишь».&lt;/blockquote&gt;
  &lt;blockquote id=&quot;R0DP&quot;&gt;Фархан: «Мы принимаем это».&lt;/blockquote&gt;
  &lt;blockquote id=&quot;9VBK&quot;&gt;Гергели: «Как это работает? Расскажи мне».&lt;/blockquote&gt;
  &lt;blockquote id=&quot;2mpq&quot;&gt;Фархан: «Мне это нравится. Потому что сейчас ИИ иногда генерирует полный бред.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;XLBY&quot;&gt;Мы позволяем кандидатам использовать всё, что они хотят. Вот что я скажу:&lt;/blockquote&gt;
  &lt;blockquote id=&quot;EzU8&quot;&gt;Если они не используют автопилот, то обычно проигрывают тем, кто его использует. Так что у них не будет другого выбора, кроме как использовать автопилот.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;6ac0&quot;&gt;Когда кандидат использует автодополнение, мне нравится смотреть на сгенерированный код. Я спрашиваю: что вы думаете? Хороший ли это код? Плохой ли это код? Есть ли в нём проблемы?&lt;/blockquote&gt;
  &lt;blockquote id=&quot;XMnf&quot;&gt;Я видел, как инженеры, например, не исправляли то, что было очень легко исправить. Они пытались &lt;em&gt;подсказать&lt;/em&gt;, как это исправить. И я говорю: «Ты &lt;em&gt;правда&lt;/em&gt; инженер? Я понимаю, что можно просто подсказывать, подсказывать и подсказывать. Но иногда решение &lt;em&gt;прямо перед тобой&lt;/em&gt;, а они продолжают подсказывать. Я думаю: «Просто измените этот один символ — но они его не изменят!»&lt;/blockquote&gt;
  &lt;blockquote id=&quot;Wxi1&quot;&gt;&lt;strong&gt;И я думаю, что не хочу, чтобы вы использовали ИИ на 100%. Я хочу, чтобы вы использовали его на 90–95%. &lt;/strong&gt;Я хочу, чтобы вы могли зайти, посмотреть на код и сказать: «Да, здесь есть ошибка».&lt;/blockquote&gt;
  &lt;p id=&quot;eFVf&quot;&gt;Вы можете &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-ai-is-changing-software-engineering&quot; target=&quot;_blank&quot;&gt;прослушать полное интервью здесь.&lt;/a&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Jyvl&quot;&gt;Крупные технологические компании: вернутся ли очные собеседования?&lt;/h3&gt;
  &lt;p id=&quot;deSB&quot;&gt;Вот процент респондентов, которые ожидают, что личные собеседования вернутся в формат очных:&lt;/p&gt;
  &lt;figure id=&quot;XlpA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5d/94/5d942425-c264-498d-bbd6-33b7f1e48d7b.png&quot; width=&quot;1322&quot; /&gt;
    &lt;figcaption&gt;Интервьюеры из Apple, Microsoft и Google ожидают, что очные собеседования вернутся. В других компаниях ситуация неоднозначная&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;JMbF&quot;&gt;Предостережение: все эти данные получены от инженеров, а не от лиц, принимающих решения. Привлечение кандидатов на месте сопряжено с расходами (например, на перелеты и отели) и логистическими трудностями (необходимо освободить переговорные комнаты для проведения собеседований). Проведение собеседований в удаленном режиме позволяет сэкономить деньги и не требует решения проблемы поиска помещений для проведения собеседований. По таким логистическим причинам даже компании, которые предпочитают проводить больше собеседований лично, скорее всего, будут проводить отборочные собеседования в удаленном режиме.&lt;/p&gt;
  &lt;h3 id=&quot;bo6L&quot;&gt;Эл меняет интервью&lt;/h3&gt;
  &lt;p id=&quot;aIoZ&quot;&gt;Мне кажется, что мы переживаем самую масштабную трансформацию технических собеседований за последние 15 лет. С 2010 года собеседования в крупных технологических компаниях и «топовых» стартапах были довольно предсказуемыми: алгоритмические собеседования, собеседования по системному проектированию и поведенческие собеседования. Но сегодня собеседования, похоже, меняются в разных направлениях:&lt;/p&gt;
  &lt;ul id=&quot;nXXP&quot;&gt;
    &lt;li id=&quot;G7QP&quot;&gt;&lt;strong&gt;Крупные технологические компании: всё как обычно, но вопросы изменены с учётом ИИ. &lt;/strong&gt;Интервьюеры задают более сложные алгоритмические вопросы и меняют свои стратегии, чтобы выявлять мошенников, использующих ИИ, во время дистанционных собеседований.&lt;/li&gt;
    &lt;li id=&quot;qa7s&quot;&gt;&lt;strong&gt;Гибридные и офлайн-компании: возвращение личных собеседований? &lt;/strong&gt;Для компаний, где инженеры должны проводить в офисе 2–3 дня в неделю, возвращение личных собеседований не является большой проблемой. Кроме того, если новый коллега будет работать в офисе, почему бы кандидатам не прийти и не познакомиться со своими потенциальными коллегами? Пока неясно, какие крупные компании вернут личные собеседования, но есть ощущение, что это могут сделать Apple, Microsoft и Google.&lt;/li&gt;
    &lt;li id=&quot;J3h7&quot;&gt;&lt;strong&gt;Стартапы и полностью удалённые компании: проведение собеседований с использованием ИИ.&lt;/strong&gt; Стартапы всё чаще используют Copilot, Cursor и другие инструменты для написания кода в процессе собеседований и предлагают более сложные задачи, для решения которых требуются инструменты для написания кода с помощью ИИ. Это делает собеседования более похожими на повседневную работу, и более крупные полностью удалённые компании, такие как Shopify и Canva, также внедряют этот подход.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;SYZN&quot;&gt;Единственная группа стартапов, способ проведения собеседований в которых не изменился, - это те, кто использует пробные дни или недели. &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/86186964/the-trial-week&quot; target=&quot;_blank&quot;&gt;Линейный &lt;/a&gt;оплачивает кандидатам несколько дней их рабочего времени для непосредственной работы с командой над завершением реального проекта. В этой настройке использование инструментов искусственного интеллекта является особенностью, а не ошибкой. Очевидным недостатком являются временные затраты: кандидатам нужно отдыхать несколько дней, а компании необходимо потратить почти неделю на оценку только одного кандидата! Это большая просьба с обеих сторон.&lt;/p&gt;
  &lt;p id=&quot;5CGX&quot;&gt;&lt;em&gt;Надеюсь, вам понравился этот обзор о том, как меняется процесс найма технических специалистов. Большое спасибо команде &lt;a href=&quot;http://interviewing.io/&quot; target=&quot;_blank&quot;&gt;interviewing.io&lt;/a&gt; за их работу. Вы можете прочитать более подробный анализ тех же данных &lt;a href=&quot;https://interviewing.io/blog/how-is-ai-changing-interview-processes-not-much-and-a-whole-lot&quot; target=&quot;_blank&quot;&gt;проведенный командой interviewing.io.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;h2 id=&quot;JzF4&quot;&gt;2. Новый тренд: разработчики создают внутренние инструменты&lt;/h2&gt;
  &lt;p id=&quot;fvz4&quot;&gt;Один из самых популярных вариантов использования vibe coding - для создания прототипов. Но есть и другой удивительно популярный&lt;em&gt; – &lt;/em&gt;о чем я больше всего слышу от профессиональных разработчиков – это об использовании vibe coding для создания внутренних инструментов! (В контексте я использую “vibe coding” для обозначения передачи полного контроля агенту искусственного интеллекта и “разрешения ему копировать” генерацию кода для разработчиков, который они затем проверяют.&lt;/p&gt;
  &lt;p id=&quot;L8Gh&quot;&gt;Инженеры рассказали мне о своём опыте в этой области, в том числе в следующих сферах:&lt;/p&gt;
  &lt;ul id=&quot;8N3m&quot;&gt;
    &lt;li id=&quot;c8Ff&quot;&gt;&lt;strong&gt;Визуализация данных:&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;tqRY&quot;&gt;
      &lt;li id=&quot;faoH&quot;&gt;Визуализация трудночитаемых журналов, получение дополнительных данных для контекста и все это в удобном интерфейсе. Создано бэкенд-разработчиком для самопомощи во время разработки.&lt;/li&gt;
      &lt;li id=&quot;ja2n&quot;&gt;Извлеките истории из JIRA и создайте диаграмму Ганта. Просто попросите агента сделать это, и он всё сделает.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;ZQ6P&quot;&gt;&lt;strong&gt;Дашборды. &lt;/strong&gt;Инженер создал дашборд по экологическим, социальным и управленческим вопросам (ESG), чтобы поделиться им с несколькими сотрудниками. Они подключили источники данных для этого дашборда и попросили агента самостоятельно создать дашборд, несколько раз подсказав ему, как сделать это правильно.&lt;/li&gt;
    &lt;li id=&quot;2U94&quot;&gt;&lt;strong&gt;Анализ данных. &lt;/strong&gt;Подсказка: создайте небольшие инструменты для анализа источника данных, формирования отчетов и создания визуализаций на их основе.&lt;/li&gt;
    &lt;li id=&quot;22qX&quot;&gt;&lt;strong&gt;Пользовательские, «экзотические» инструменты. &lt;/strong&gt;Инженер создал плагин Figma для поддержки пользовательских аннотаций на основе &lt;a href=&quot;https://en.wikipedia.org/wiki/Swagger_%28software%29&quot; target=&quot;_blank&quot;&gt;Swagger&lt;/a&gt; файлов (Swagger используется для создания API).&lt;/li&gt;
    &lt;li id=&quot;mPXm&quot;&gt;&lt;strong&gt;Инструменты с пользовательским интерфейсом.&lt;/strong&gt; Указание агенту на необходимость добавить пользовательский интерфейс поверх специального инструмента, например инструмента для импорта или экспорта, созданного для разовой операции импорта или экспорта.&lt;/li&gt;
    &lt;li id=&quot;9Hbk&quot;&gt;&lt;strong&gt;Инструменты для автоматизированного тестирования. &lt;/strong&gt;Предложение агенту создать инструменты для интеграционного или сквозного тестирования, которые потребовали бы больших усилий при ручном тестировании.&lt;/li&gt;
    &lt;li id=&quot;3Ihq&quot;&gt;&lt;strong&gt;«Микро»-инструменты. &lt;/strong&gt;Небольшие, но полезные инструменты для разработки или отладки, например, запрос к агенту о создании bash-скрипта с &lt;a href=&quot;https://linuxconfig.org/how-to-use-ncurses-widgets-in-shell-scripts-on-linux&quot; target=&quot;_blank&quot;&gt;виджетами ncurses&lt;/a&gt; (с использованием таких виджетов, как поле ввода, контрольный список, кнопка или другие графические элементы) или запуск скрипта с пользовательской цветовой схемой. Вручную это занимает много времени, но с агентом всё просто.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;avNq&quot;&gt;Эти сценарии объединяет то, что на их создание вручную ушло бы до суток, и они используются лишь небольшим количеством коллег. Но потратить даже пару часов на создание &lt;em&gt;одноразового&lt;/em&gt; &lt;em&gt;инструмента&lt;/em&gt; — это уже слишком, потому что это значительная часть рабочего дня. С помощью агентов вам не придётся тратить столько времени: просто дайте команду, а затем несколько раз исправьте результат, и всё готово!&lt;/p&gt;
  &lt;p id=&quot;Zn4A&quot;&gt;Эти небольшие инструменты предназначены только для внутреннего использования, то есть:&lt;/p&gt;
  &lt;ul id=&quot;DfTs&quot;&gt;
    &lt;li id=&quot;Eymn&quot;&gt;Качество кода не имеет значения&lt;/li&gt;
    &lt;li id=&quot;AFze&quot;&gt;Правильность работы инструмента легко проверить&lt;/li&gt;
    &lt;li id=&quot;YCCW&quot;&gt;Производительность и большинство других нефункциональных характеристик не имеют особого значения&lt;/li&gt;
    &lt;li id=&quot;sG3S&quot;&gt;Вопросы безопасности становятся менее актуальными, если соблюдать базовые правила безопасности, например не использовать жёстко заданные пароли в инструменте, который будет проверяться системой контроля версий, и т. д.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;kL1b&quot;&gt;Похоже, эта практика быстро распространяется, и её внедрение ускорилось с мая, когда Claude Code стал намного функциональнее. С тех пор другие агенты, такие как OpenAI Codex, Gemini CLI и другие, последовали этому примеру.&lt;/p&gt;
  &lt;p id=&quot;OpYe&quot;&gt;Если у вас есть мысли по поводу этой тенденции или личный опыт, пожалуйста, оставьте комментарий.&lt;/p&gt;
  &lt;h2 id=&quot;Il4S&quot;&gt;3. Пульс отрасли&lt;/h2&gt;
  &lt;h3 id=&quot;DwPu&quot;&gt;npm: кошмар безопасности?&lt;/h3&gt;
  &lt;p id=&quot;3N6t&quot;&gt;Последние две недели были неудачными для &lt;a href=&quot;https://www.npmjs.com/&quot; target=&quot;_blank&quot;&gt;npm&lt;/a&gt;, менеджера пакетов по умолчанию для популярной платформы Node.js. Произошло несколько атак на цепочку поставок, когда вредоносный код внедряется в популярные пакеты npm.&lt;/p&gt;
  &lt;p id=&quot;Uc8Z&quot;&gt;&lt;strong&gt;Атака на цепочку поставок № 1: попытка кражи криптовалюты. &lt;/strong&gt;8 сентября был взломан аккаунт разработчика, публиковавшего несколько популярных пакетов npm. Пакеты были повторно опубликованы с вредоносным кодом (разработчиком был &lt;a href=&quot;https://github.com/Qix-&quot; target=&quot;_blank&quot;&gt;Qix-&lt;/a&gt;.) Среди скомпрометированных пакетов были &lt;a href=&quot;https://github.com/Qix-?tab=repositories&quot; target=&quot;_blank&quot;&gt;chalk&lt;/a&gt;, &lt;a href=&quot;https://github.com/chalk/strip-ansi&quot; target=&quot;_blank&quot;&gt;strip-ansi&lt;/a&gt; и &lt;a href=&quot;https://github.com/Qix-/color-convert&quot; target=&quot;_blank&quot;&gt;color-convert&lt;/a&gt;. Тысячи других пакетов npm используют эти зависимости, и, по &lt;a href=&quot;https://jdstaerk.substack.com/p/we-just-found-malicious-code-in-the&quot; target=&quot;_blank&quot;&gt;оценкам&lt;/a&gt;, вредоносный код был загружен более 1 миллиарда раз(!)&lt;/p&gt;
  &lt;p id=&quot;pzE1&quot;&gt;Вредоносный код представлял собой криптоклиппер, который пытался украсть средства, подменяя адреса кошельков в сетевых запросах и напрямую перехватывая криптовалютные транзакции.&lt;/p&gt;
  &lt;p id=&quot;tvoG&quot;&gt;&lt;strong&gt;Атака на цепочку поставок № 2: попытка кражи учётных данных. &lt;/strong&gt;Начиная с воскресенья, 14 сентября, более 500 пакетов npm &lt;a href=&quot;https://socket.dev/blog/ongoing-supply-chain-attack-targets-crowdstrike-npm-packages&quot; target=&quot;_blank&quot;&gt;были скомпрометированы&lt;/a&gt;. Что делал вредоносный код:&lt;/p&gt;
  &lt;ul id=&quot;timH&quot;&gt;
    &lt;li id=&quot;3jT6&quot;&gt;Скачал и запустил TruffleHog, легальный сканер секретов&lt;/li&gt;
    &lt;li id=&quot;aAtW&quot;&gt;Выполнен поиск в системах хостинга токенов и облачных учётных данных&lt;/li&gt;
    &lt;li id=&quot;82ea&quot;&gt;Проверенные учётные данные разработчика и CI&lt;/li&gt;
    &lt;li id=&quot;v3Bm&quot;&gt;Созданы неавторизованные рабочие процессы GitHub Actions в репозиториях&lt;/li&gt;
    &lt;li id=&quot;LA0V&quot;&gt;Конфиденциальные данные были переданы на жестко запрограммированную конечную точку вебхука&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Rtd7&quot;&gt;Несколько скомпрометированных пакетов npm поддерживались компанией CrowdStrike, специализирующейся на повышении уровня безопасности, что довольно иронично. &lt;a href=&quot;https://socket.dev/blog/ongoing-supply-chain-attack-targets-crowdstrike-npm-packages&quot; target=&quot;_blank&quot;&gt;Узнайте больше об этой атаке.&lt;/a&gt;&lt;em&gt; Если название CrowdStrike вам знакомо, то это потому, что компания &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/the-biggest-ever-global-outage-lessons&quot; target=&quot;_blank&quot;&gt;стала&lt;/a&gt; причиной крупнейшего в мире сбоя в 2024 году, когда её обновление &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/the-biggest-ever-global-outage-lessons&quot; target=&quot;_blank&quot;&gt;вывело из строя 8,5 млн компьютеров с Windows&lt;/a&gt;, отключив аэропорты, банки и супермаркеты по всему миру.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;Bh0a&quot;&gt;&lt;strong&gt;При использовании Node в его нынешнем виде нет очевидного способа защититься от этой атаки. &lt;/strong&gt;Экосистема Node очень зависима от сторонних пакетов, и большинство из них устанавливаются неявно. Таким образом, если вы используете &lt;em&gt;один&lt;/em&gt; пакет, вы неявно получаете все зависимости этого пакета. А в экосистеме Node использование сторонних пакетов очень распространено, поэтому добавление одной зависимости npm может привести к добавлению сотен неявных зависимостей пакетов!&lt;/p&gt;
  &lt;p id=&quot;gGKe&quot;&gt;У Node так много зависимостей, потому что у JavaScript как языка программирования нет мощной стандартной библиотеки. Таким образом, чтобы избежать атак на цепочку поставок через пакеты, нужно использовать язык с гораздо более мощной стандартной библиотекой, то есть можно создавать программное обеспечение с гораздо меньшим количеством зависимостей.&lt;/p&gt;
  &lt;p id=&quot;dl5D&quot;&gt;Атаки на цепочки поставок с использованием скомпрометированных пакетов характерны не только для Node или npm, но Node — это экосистема с наибольшим количеством зависимостей, поэтому она является идеальной мишенью для злоумышленников.&lt;/p&gt;
  &lt;p id=&quot;uAcf&quot;&gt;Один из инженеров-основателей нового стартапа рассказал мне, что они выбирали между использованием TypeScript/Node и Go на бэкенде. Они выбрали Go, чтобы избежать «ада зависимостей npm» и сопутствующего ему кошмара с безопасностью. У Go более мощная стандартная библиотека; на самом деле это одно из главных преимуществ языка, и у программ на Go почти всегда гораздо меньше зависимостей, чем у программ на Node.&lt;/p&gt;
  &lt;h3 id=&quot;q46S&quot;&gt;Microsoft присоединяется к клубу RTO «3 дня в неделю»&lt;/h3&gt;
  &lt;p id=&quot;g7YR&quot;&gt;Microsoft была одной из последних компаний, которая не устанавливала жёстких требований к количеству дней, которые сотрудники должны проводить в офисе, и оставляла это на усмотрение команд. На прошлой неделе ситуация изменилась: 9 сентября всем сотрудникам было &lt;a href=&quot;https://www.businessinsider.com/?international=true&amp;r=US&amp;IR=T&quot; target=&quot;_blank&quot;&gt;разослано письмо&lt;/a&gt;, в котором сообщалось, что с февраля 2026 года они должны проводить в офисе не менее трёх дней. Внедрение будет осуществляться в зависимости от местоположения в три этапа:&lt;/p&gt;
  &lt;ol id=&quot;2UYf&quot;&gt;
    &lt;li id=&quot;jbX9&quot;&gt;Район Сиэтла: сотрудники, проживающие в радиусе 50 миль от офиса в Сиэтле, начиная с февраля 2026 года&lt;/li&gt;
    &lt;li id=&quot;uWAs&quot;&gt;Другие населенные пункты в США&lt;/li&gt;
    &lt;li id=&quot;GPGy&quot;&gt;Все остальные страны, кроме США&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;WaFQ&quot;&gt;Если говорить начистоту, Microsoft предоставляет щедрый срок уведомления — не менее 6 месяцев. Также можно запросить исключение. Если бы мне пришлось гадать, я бы предположил, что опытные инженеры с большим стажем, которые переехали в другой город и пользуются уважением в своей организации, могут быть освобождены от этого требования. И даже если запрос на исключение будет отклонён, у вас будет достаточно времени, чтобы решить, искать ли новую работу в следующем году или переехать.&lt;/p&gt;
  &lt;p id=&quot;L5xo&quot;&gt;Все крупные технологические компании уже давно настаивают на гибридном формате работы, но после заявления Microsoft все они — Apple, Google, Meta и Microsoft — теперь требуют проводить в офисе 3 дня в неделю, а Amazon — 5 дней.&lt;/p&gt;
  &lt;p id=&quot;mUn5&quot;&gt;Недавно мы сообщали, что количество &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/172584839/remote-jobs&quot; target=&quot;_blank&quot;&gt;полностью удалённых рабочих мест продолжает сокращаться&lt;/a&gt;. Решение Microsoft сократить количество полностью удалённых рабочих мест соответствует общеотраслевой тенденции.&lt;/p&gt;
  &lt;h3 id=&quot;qBy6&quot;&gt;Klarna выходит на публику&lt;/h3&gt;
  &lt;p id=&quot;hAKk&quot;&gt;Компания Klarna, предоставляющая услугу «Купи сейчас, заплати потом», долгое время готовилась к выходу на биржу, и 10 сентября IPO наконец состоялось. На момент написания статьи Klarna оценивается в 17 миллиардов долларов: это ниже пиковой оценки в 45 миллиардов долларов в 2021 году, но более чем в 2 раза выше оценки 2022 года в &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/62989066/klarnas-historic-down-round&quot; target=&quot;_blank&quot;&gt;6,5 миллиарда долларов&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;VyFE&quot;&gt;&lt;strong&gt;Политика компании Klarna в отношении акций обернулась против сотрудников.&lt;/strong&gt; Некоторые сотрудники потеряют деньги на IPO: те, кто присоединился к компании в период с 2021 по 2022 год, получили RSU при оценке в 45 миллиардов долларов и должны были заплатить налог с этой суммы в Швеции, потому что &lt;a href=&quot;https://www.schalast.com/en/news/news/2022/09/12/the-klarna-case-and-employee-shares-in-the-german-startup-strategy.php&quot; target=&quot;_blank&quot;&gt;налог нужно было заплатить, когда RSU перешли в собственность&lt;/a&gt;, хотя тогда их нельзя было продать. Но сейчас их акции стоят примерно треть от той суммы, с которой они заплатили налог! Так что, если стоимость компании не вырастет, они понесут убытки.&lt;/p&gt;
  &lt;p id=&quot;F90w&quot;&gt;А с 2020 года все повышения и бонусы включали в себя обязательную составляющую в виде RSU — и налог, который взимался при передаче RSU. Как мы писали в 2022 году в подробном материале &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/layoffs-at-klarna&quot; target=&quot;_blank&quot;&gt;«Увольнения в Klarna»&lt;/a&gt;:&lt;/p&gt;
  &lt;blockquote id=&quot;5pUw&quot;&gt;«В 2020 году сотрудники не получали денежных премий. С 2021 года премии и повышение зарплаты выплачивались как в виде RSU, так и в денежном эквиваленте. Руководство сообщило об этом, так как хотело, чтобы каждый владел частью компании. Разница в том, что большинство частных стартапов выплачивают сотрудникам денежные премии и акции в качестве бонусов.В 2020 году повышения и бонусы выплачивались только в виде RSU, а не наличными. Начиная с 2021 года система стала более сложной. Бонусы по-прежнему выплачиваются в виде RSU. Что касается повышений, то для каждого уровня была установлена целевая сумма RSU. Пока эта сумма не была достигнута, повышение делилось поровну между наличными и RSU.Например, возьмём сотрудника, которому повысили зарплату на 8%, а его целевая доля составляет 5%. Он получит 4% в виде RSU и 4% наличными. Сотрудник, которому повысили зарплату на 11%, получит 5% в виде RSU (достигнув лимита) и 6% наличными.&lt;/blockquote&gt;
  &lt;p id=&quot;kzDd&quot;&gt;&lt;em&gt;Это напоминание о том, что выпуск акций не гарантирует автоматического дохода, даже в случае IPO!&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;9dJc&quot;&gt;Тем не менее для всех, кто присоединился к компании до 2021 года или после 2022 года, IPO означает, что их акции будут чего-то стоить и их можно будет продать после окончания периода блокировки, который обычно длится 6 месяцев после листинга. &lt;em&gt;Поздравляем всех сотрудников Klarna, особенно тех, кто получит выгоду от своих акций!&lt;/em&gt;&lt;/p&gt;
  &lt;h3 id=&quot;5fBT&quot;&gt;Meta закрывает небольшие инженерные офисы в Европе?&lt;/h3&gt;
  &lt;p id=&quot;u9ZE&quot;&gt;Я слышал от инженеров Meta, что коллегам из небольших офисов по всей Европе предлагают переехать в лондонский офис (Великобритания) или в офис в США (Менло-Парк, Нью-Йорк, Сиэтл). Инженерам, которые предпочли бы не переезжать, в конечном счёте придётся уйти из компании. Один из таких городов — Амстердам, где инженерам нужно либо перевестись в другой отдел, либо найти работу в другом месте.&lt;/p&gt;
  &lt;p id=&quot;ZRzG&quot;&gt;До 2020 года у Meta были инженерные офисы только в нескольких центрах. В 2020–2022 годах компания активно нанимала сотрудников за пределами этих центров, в том числе полностью удалённых инженеров в Европе. Похоже, что последнее изменение в политике — это возврат к условиям, существовавшим до 2020 года, когда инженерные ресурсы были ограничены крупными инженерными центрами.&lt;/p&gt;
  &lt;p id=&quot;ddCe&quot;&gt;Я наблюдал за тем, как другие компании закрывали небольшие инженерные офисы в Европе, и Uber — хороший тому пример. Гигант в сфере совместных поездок закрыл свои офисы в Литве (Вильнюс) и Болгарии (София) и предложил инженерам переехать в Амстердам, где находится европейская инженерная штаб-квартира Uber.&lt;/p&gt;
  &lt;p id=&quot;3A5d&quot;&gt;Интересно, не начнут ли другие крупные технологические компании централизовать инженерное дело в меньшем количестве офисов. Более холодный рынок труда и гибридный формат работы, предполагающий 3 дня в неделю в офисе, говорят о том, что это может произойти. Как мы заметили в &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/172584839/growing-importance-of-location&quot; target=&quot;_blank&quot;&gt;Обзоре рынка труда в сфере разработки программного обеспечения в 2025 году&lt;/a&gt;, местоположение становится всё более важным фактором для карьерного роста и возможностей в сфере разработки.&lt;/p&gt;
  &lt;h3 id=&quot;Xm6K&quot;&gt;VS Code предпочитает Claude Sonnet ChatGPT&lt;/h3&gt;
  &lt;p id=&quot;9Ppw&quot;&gt;Microsoft является крупным инвестором в OpenAI и исторически предпочитала ChatGPT в качестве своей модели программирования. Сейчас это также меняется, The Verge &lt;a href=&quot;https://www.theverge.com/report/778641/microsoft-visual-studio-code-anthropic-claude-4&quot; target=&quot;_blank&quot;&gt;Сообщает&lt;/a&gt;:&lt;/p&gt;
  &lt;blockquote id=&quot;sTqF&quot;&gt;«Согласно внутренним тестам, Claude Sonnet 4 является рекомендуемой моделью для GitHub Copilot», — сообщила Джулия Льюсон, глава подразделения разработчиков Microsoft, во внутреннем электронном письме в июне.&lt;/blockquote&gt;
  &lt;p id=&quot;v4Zq&quot;&gt;Для Microsoft имеет смысл использовать лучшую модель искусственного интеллекта: год назад компания не решалась добавить поддержку Sonnet в GitHub Copilot, и именно тогда популярность Cursor резко возросла, отчасти благодаря Sonnet.&lt;/p&gt;
  &lt;p id=&quot;VHPH&quot;&gt;Microsoft предлагает &lt;em&gt;объективно лучшую&lt;/em&gt; модель вместо той, в которую она &lt;em&gt;инвестирует&lt;/em&gt; напоминает мне о решении компании выпустить Microsoft Office для iPad в 2014 году — после того, как выпуск был отложен на несколько лет из-за опасений, что он отнимет долю рынка у собственного планшета Microsoft Surface, который в то время работал на Windows 8. Это была большая победа для Office (и iPad) и небольшое поражение для Windows 8 и Surface. Таким образом, последняя разработка — это большая победа для VS Code и Claude и небольшая потеря для OpenAI. Тем временем создатель Sonnet, компания Anthropic, продолжает укреплять свои позиции в качестве лаборатории ИИ, ориентированной на разработчиков.&lt;/p&gt;
  &lt;h3 id=&quot;apMj&quot;&gt;Bending Spoons покупает Vimeo&lt;/h3&gt;
  &lt;p id=&quot;jzRm&quot;&gt;Bending Spoons — довольно известная итальянская технологическая компания с необычной бизнес-моделью. Они покупают известные компании Кремниевой долины, испытывающие трудности, и пытаются сделать их прибыльными. Компания владеет Evernote, Meetup и StreamYard, а с прошлой недели к этому списку можно добавить и Vimeo, после того как Bending Spoons &lt;a href=&quot;https://techcrunch.com/2025/09/10/vimeo-to-be-acquired-by-bending-spoons-in-1-38b-all-cash-deal/&quot; target=&quot;_blank&quot;&gt;заплатила&lt;/a&gt; $1,38 млрд за публичную компанию, занимающуюся видеохостингом.&lt;/p&gt;
  &lt;p id=&quot;W5Rj&quot;&gt;Компания Bending Spoons известна тем, что увольняет большинство сотрудников приобретаемых компаний и переводит разработку программного обеспечения на собственные силы. Кроме того, они не стесняются повышать цены.&lt;/p&gt;
  &lt;p id=&quot;Oay8&quot;&gt;Но если присмотреться, становится интересно. Я &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/twisting-the-rules-of-building-software&quot; target=&quot;_blank&quot;&gt;поговорил с командой Bending Spoons&lt;/a&gt; в подкасте Pragmatic Engineer и узнал, что после покупки Evernote они провели масштабную миграцию инфраструктуры, потому что существующее приложение работало &lt;a href=&quot;https://youtu.be/6WM_q193Kls?si=-BdjtweKpmE4Onwq&amp;t=1624&quot; target=&quot;_blank&quot;&gt;очень неэффективно&lt;/a&gt; и не было оптимизировано во многих аспектах:&lt;/p&gt;
  &lt;blockquote id=&quot;G5bj&quot;&gt;«Первое, что мы заметили, когда приобрели Evernote, — это то, что основной причиной всех остальных проблем, которые мы выявили, была очень старая кодовая база с многолетним техническим долгом.Одной из особенностей было то, что он был перенесён с физических серверов в облако. И этот перенос, конечно же, был осуществлён при поддержке поставщика облачных услуг. Перенос осуществлялся в индивидуальном порядке, то есть переноса &lt;em&gt;на самом деле&lt;/em&gt; не было. Evernote не перестраивал свою инфраструктуру, чтобы сделать её облачной. В результате мы получили огромный монолит на Java 11.&lt;strong&gt;Evernote работал на 750 виртуальных машинах в Google Cloud, но все они были настроены вручную. &lt;/strong&gt;Данные пользователей распределялись между всеми этими машинами. Но это распределение не было результатом тщательного анализа, а значит, на некоторые машины приходилась более высокая нагрузка, чем на другие. Это также требовало большого количества ручных операций по обслуживанию».&lt;/blockquote&gt;
  &lt;p id=&quot;F3rN&quot;&gt;Bending Spoons привели в порядок инфраструктуру:&lt;/p&gt;
  &lt;blockquote id=&quot;04jJ&quot;&gt;«Первым делом мы перенесли все данные из сегментов виртуальных машин в управляемую структуру базы данных. Это позволило нам свободно работать с логикой приложения наилучшим образом.После некоторого анализа мы пришли к выводу, что лучше всего перейти от монолитной архитектуры к архитектуре микросервисов.Некоторые сервисы, в которых предыдущая команда Evernote придерживалась принципов архитектуры микросервисов, уже существовали, но они были второстепенными. Поэтому нам нужно было разработать план, который, скажем так, учитывал бы, как перенести всю основную логику работы с заметками, не нарушая пользовательские сценарии.&lt;/blockquote&gt;
  &lt;p id=&quot;m3fp&quot;&gt;Компания Bending Spoons перешла на архитектуру микросервисов, а также отказалась от опроса серверов клиентами Evernote — довольно расточительного подхода — в пользу коммуникации на основе событий.&lt;/p&gt;
  &lt;p id=&quot;5qZi&quot;&gt;Если миграция Evernote хоть как-то намекает на то, что может произойти с Vimeo, то, по моим прогнозам, команда разработчиков Bending Spoons тщательно проанализирует предыдущие решения в области инфраструктуры.&lt;/p&gt;
  &lt;p id=&quot;1d3g&quot;&gt;Перевод: &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/the-pulse-146&quot; target=&quot;_blank&quot;&gt;https://newsletter.pragmaticengineer.com/p/the-pulse-146&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:theory-of-constraints</id><link rel="alternate" type="text/html" href="https://devz.su/theory-of-constraints?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>Теория ограничений (ТО) Элияху Голдратта</title><published>2025-11-03T07:54:42.470Z</published><updated>2025-11-03T07:54:42.470Z</updated><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/f2/c2/f2c2fff9-8073-4602-8907-49d05ec70fbf.png&quot;&gt;Теория ограничений - это методология улучшения процессов, которая подчеркивает важность выявления &quot;системного ограничения&quot; или узкого места.</summary><content type="html">
  &lt;p id=&quot;Ihia&quot;&gt;&lt;strong&gt;Теория ограничений &lt;/strong&gt;- это методология улучшения процессов, которая подчеркивает важность выявления &amp;quot;&lt;a href=&quot;https://www.tocinstitute.org/constraint-definition.html&quot; target=&quot;_blank&quot;&gt;системного ограничения&lt;/a&gt;&amp;quot; или узкого места.&lt;/p&gt;
  &lt;p id=&quot;Hds2&quot;&gt;Используя это ограничение, организации могут достигать своих финансовых целей, обеспечивая при этом своевременную доставку в полном объеме (OTIF) клиентам, избегая перебоев в цепочке поставок, сокращая время выполнения заказа и т.д.&lt;/p&gt;
  &lt;p id=&quot;y7Va&quot;&gt;К другим распространённым преимуществам внедрения теории ограничений относятся более эффективный контроль над операциями, сокращение складских запасов, уменьшение количества конфликтов между членами команды и значительное &lt;strong&gt;сокращение времени, затрачиваемого на устранение неполадок&lt;/strong&gt;. Часто дополнительные мощности появляются без дополнительных капиталовложений или найма новых сотрудников.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Vb0k&quot;&gt;&lt;strong&gt;Основная идея &lt;/strong&gt;— у каждой системы есть ограничивающий фактор или условие. Сосредоточьте усилия по улучшению на том, чтобы эффективнее использовать это условие. Обычно это самый быстрый и эффективный способ повысить рентабельность.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;5wMd&quot;&gt;Ограничения — аналогия с цепью&lt;/h2&gt;
  &lt;p id=&quot;SRbm&quot;&gt;Ни одна цепь не может быть прочнее своего самого слабого звена. Точно так же каждая система должна иметь &lt;strong&gt;&lt;a href=&quot;https://www.tocinstitute.org/constraint-definition.html&quot; target=&quot;_blank&quot;&gt;ограничение&lt;/a&gt;&lt;/strong&gt;, которое ограничивает её производительность. Мы знаем это, потому что ни одна система не может производить бесконечно много... например, вы никогда не найдёте компанию с бесконечными продажами или прибылью!&lt;/p&gt;
  &lt;figure id=&quot;jLod&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f2/c2/f2c2fff9-8073-4602-8907-49d05ec70fbf.png&quot; width=&quot;1375&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;3jej&quot;&gt;Обратите внимание, что в любой цепи есть ОДНО (и только одно) самое слабое звено. Укрепление других звеньев никогда не повысит общую прочность цепи, потому что они не являются самыми слабыми. На самом деле укрепление не самого слабого звена, скорее всего, ПОНИЗИТ общую прочность цепи из-за дополнительного веса.&lt;/p&gt;
  &lt;figure id=&quot;jYLD&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a5/41/a541649b-ef94-4797-b98c-d9a58da6a0aa.png&quot; width=&quot;1375&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Qa7m&quot;&gt;Аналогичным образом, попытки оптимизировать каждый отдельный процесс и функцию, как правило, игнорируют влияние на ограничение, что приводит к возникновению множества непредвиденных проблем, снижающих общую производительность и эффективность организации. Например, если ограничением являются заказы на продажу, оптимизация производственных мощностей может привести к перепроизводству. Такое большое количество избыточных запасов готовой продукции, в свою очередь, повлечёт за собой значительные расходы на хранение и стоимость капитала. В результате может возникнуть нехватка денежных средств, что приведёт к задержкам платежей поставщикам и, как следствие, к проблемам с поставками, задержкам заказов, ухудшению репутации среди клиентов и снижению будущих продаж.&lt;/p&gt;
  &lt;p id=&quot;BFRT&quot;&gt;Что, если мы приложим усилия, чтобы более полно использовать самое слабое звено? Мы могли бы задействовать его в большей степени, сократив время простоя цепи или подчинив ей всё остальное, избегая резких рывков, которые создают дополнительную нагрузку при полной загрузке. Как только мы научимся эффективно использовать цепь, мы сможем начать искать способы укрепить само слабое звено. Даже небольшое увеличение прочности самого слабого звена может существенно повлиять на общую прочность цепи.&lt;/p&gt;
  &lt;figure id=&quot;sOyq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/57/5e/575e1f90-1ae0-44ba-94d2-061ef1822aa7.png&quot; width=&quot;1375&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mM8q&quot;&gt;Ограничение ограничивает производительность любой системы, независимо от того, признаём мы это или нет. При правильном выявлении и управлении &lt;strong&gt;ограничения позволяют быстрее всего добиться значительных улучшений&lt;/strong&gt; и служат основой для непрерывного роста. Если игнорировать ограничение, оно может простаивать, впустую расходуя ресурсы системы. Вышедшее из-под контроля ограничение также может нарушить график поставок и привести к непредсказуемым задержкам. Поэтому любому руководителю крайне важно максимально эффективно использовать ограничения и научиться хорошо ими управлять.&lt;/p&gt;
  &lt;p id=&quot;hrkI&quot;&gt;TOC смещает фокус управления с оптимизации отдельных активов, функций и ресурсов на увеличение пропускной способности всей системы. Ключевые процессы TOC направлены на устранение барьеров, которые мешают каждой части системы работать как единое целое.&lt;/p&gt;
  &lt;h2 id=&quot;v7aH&quot;&gt;Проверка знаний&lt;/h2&gt;
  &lt;p id=&quot;jgpO&quot;&gt;Многие люди переоценивают свои знания в области теории ограничений. Уделите немного времени тому, чтобы проверить, насколько хорошо вы её понимаете.&lt;/p&gt;
  &lt;p id=&quot;3fB3&quot;&gt;Представьте, что вы отвечаете за управление описанным ниже процессом. Каждая буква обозначает отдельный подпроцесс, например продажи, проектирование, этап 1 производства, этап 2 производства, выставление счетов клиентам, сбор платежей и т.д. На минутку представьте себе простой последовательный процесс, с которым вы знакомы, например в сфере производства или услуг, или даже государственный процесс, например выдачу водительских прав.&lt;/p&gt;
  &lt;figure id=&quot;col2&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/45/36/4536d628-4e4b-47bf-8b2b-f2b39a9d2e1c.png&quot; width=&quot;1252&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kNfO&quot;&gt;Вам предоставлен приведённый выше отчёт с подробным описанием общей эффективности каждого подпроцесса.&lt;/p&gt;
  &lt;p id=&quot;Fg6B&quot;&gt;&lt;/p&gt;
  &lt;ol id=&quot;mVbw&quot;&gt;
    &lt;li id=&quot;w8Nz&quot;&gt;На чём вы СОСРЕДОТОЧИТЕ большую часть своего внимания?&lt;/li&gt;
    &lt;li id=&quot;Uwsj&quot;&gt;Чему вообще не уделите НИКАКОГО внимания?&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;SSh6&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ApUG&quot;&gt;Какой подпроцесс вы выбрали...?&lt;/p&gt;
  &lt;p id=&quot;u4Ss&quot;&gt;&lt;br /&gt;Были ли у вас какие-либо вопросы или информация, которой, по вашему мнению, не хватало?&lt;/p&gt;
  &lt;p id=&quot;4Quq&quot;&gt;Сразу после того, как вы решите, на чём сосредоточить внимание, вы получите отчёт, в котором будет указана максимальная производительность каждого подпроцесса.&lt;/p&gt;
  &lt;figure id=&quot;f3V4&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e2/b4/e2b47683-1bb0-4468-ba28-84cca436bf76.png&quot; width=&quot;1253&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qK1q&quot;&gt;Замените на любое значение производительности, подходящее для выбранного вами процесса.&lt;/p&gt;
  &lt;p id=&quot;sJZk&quot;&gt;Например, тонны в час.​&lt;/p&gt;
  &lt;ol id=&quot;4aCE&quot;&gt;
    &lt;li id=&quot;P26z&quot;&gt;Вы сосредоточились на том, что нужно? Большинство людей сосредотачиваются на процессе B, хотя на самом деле ограничением является процесс D&lt;/li&gt;
    &lt;li id=&quot;sy8G&quot;&gt;Каковы будут необходимые последствия, если вы сосредоточитесь в первую очередь на оптимизации процесса B?&lt;/li&gt;
    &lt;li id=&quot;keBn&quot;&gt;Отчет об эффективности остается таким же точным как до, так и после получения отчета о производительности. Что изменилось?&lt;/li&gt;
    &lt;li id=&quot;on0h&quot;&gt;Какой, по вашему мнению, должна быть максимально возможная производительность такой системы?&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;Q1e8&quot;&gt;Что такое теория ограничений?&lt;/h2&gt;
  &lt;p id=&quot;Kwvx&quot;&gt;&lt;strong&gt;Теория ограничений (ТО)&lt;/strong&gt; в том виде, в котором она была разработана доктором &lt;a href=&quot;https://www.tocinstitute.org/eliyahu-goldratt.html&quot; target=&quot;_blank&quot;&gt;Элияху Голдраттом&lt;/a&gt;, была представлена в его знаменитой книге «&lt;a href=&quot;https://www.tocinstitute.org/the-goal-summary.html&quot; target=&quot;_blank&quot;&gt;Цель.&lt;/a&gt;» С годами ТО стала включать в себя множество различных концепций:&lt;/p&gt;
  &lt;ul id=&quot;ptrI&quot;&gt;
    &lt;li id=&quot;NTuo&quot;&gt;&lt;strong&gt;Пять шагов к концентрации &lt;/strong&gt;— первоначальное выражение TOC, которое будет подробно объяснено в этой статье&lt;/li&gt;
    &lt;li id=&quot;CVIM&quot;&gt;&lt;strong&gt;Сквозной учёт&lt;/strong&gt; – надёжный метод измерения операций, который устраняет некоторые проблемные искажения в практике финансового учёта, позволяя точно оценивать прогресс в достижении цели и принимать более эффективные решения&lt;/li&gt;
    &lt;li id=&quot;yyzP&quot;&gt;&lt;strong&gt;TOC «Мыслительные процессы и философия»&lt;/strong&gt; — набор инструментов для решения проблем и предположений, которые помогают совершать прорывы в самых разных ситуациях и условиях. Они помогают принимать решения:&lt;/li&gt;
    &lt;ol id=&quot;nkXs&quot;&gt;
      &lt;li id=&quot;z2Nk&quot;&gt;&lt;em&gt;Что изменить?&lt;/em&gt;&lt;/li&gt;
      &lt;li id=&quot;kWaw&quot;&gt;&lt;em&gt;На что поменять?&lt;/em&gt;&lt;/li&gt;
      &lt;li id=&quot;jQm3&quot;&gt;&lt;em&gt;Как вызвать изменения?&lt;/em&gt;&lt;/li&gt;
    &lt;/ol&gt;
    &lt;li id=&quot;xI4J&quot;&gt;&lt;strong&gt;Приложения TOC&lt;/strong&gt; — это усовершенствованные стратегии и тактики, применимые в конкретных отраслях или средах, таких как S-DBR для дискретного производства на заказ, управление больницами, быстрое пополнение запасов для дистрибуции и розничной торговли, а также критическая цепь для проектов. Эти методологии, разработанные с использованием процессов мышления TOC, выходят за рамки данной статьи, но в соответствующих местах будут приведены ссылки, чтобы вы могли узнать больше.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Kcpb&quot;&gt;Несмотря на своё название, «теория ограничений» чрезвычайно практична, поскольку &lt;strong&gt;помогает находить простые эффективные решения&lt;/strong&gt; реальных проблем.&lt;/p&gt;
  &lt;h2 id=&quot;9YMW&quot;&gt;Обеспечение исключительного повышения производительности&lt;/h2&gt;
  &lt;p id=&quot;vYN4&quot;&gt;Внедрение теории ограничений принесло выдающиеся результаты компаниям по всему миру, &lt;a href=&quot;https://www.tocinstitute.org/uploads/1/2/7/9/12796657/toc_impact_study.pdf&quot; target=&quot;_blank&quot;&gt;независимое исследование&lt;/a&gt; показало, что компании добились следующих результатов (в среднем):&lt;/p&gt;
  &lt;figure id=&quot;CspB&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/45/c14557e2-e67d-4e7b-84d9-f5365b36cdc4.png&quot; width=&quot;449&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7A9f&quot;&gt;Эти результаты были получены в разных регионах и отраслях. Во многих случаях они представляют собой частичную реализацию инструментов TOC, и нам остаётся только гадать, какого эффекта можно было бы добиться при использовании полного набора приложений.&lt;/p&gt;
  &lt;h2 id=&quot;aaZG&quot;&gt;Теория ограничений работает и в сфере услуг&lt;/h2&gt;
  &lt;p id=&quot;bGXQ&quot;&gt;Невероятная популярность бизнес-романа доктора Голдратта «Гоал» (действие которого происходит в производственной компании) заставила некоторых поверить в то, что теория ограничений применима в первую очередь к производственной среде.&lt;/p&gt;
  &lt;p id=&quot;6IDC&quot;&gt;Несмотря на то, что TOC изначально разрабатывался для решения конкретных проблем в этом секторе, были созданы и другие приложения TOC для самых разных отраслей, использующие &lt;a href=&quot;https://www.tocinstitute.org/toc-thinking-processes.html&quot; target=&quot;_blank&quot;&gt;процессы мышления TOC&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;SzZL&quot;&gt;Они успешно применяются в таких отраслях, как производство тяжёлого капитального оборудования, розничная торговля, банковское дело, производство товаров повседневного спроса, логистика, трудоустройство, горнодобывающая промышленность, здравоохранение и т.д.&lt;/p&gt;
  &lt;p id=&quot;7fhX&quot;&gt;TOC также применяется в некоммерческих организациях, включая начальное образование, религиозные организации, вооружённые силы, судебную систему и другие, с не менее впечатляющими результатами.&lt;/p&gt;
  &lt;h2 id=&quot;uY3j&quot;&gt;Обзор приложений TOC&lt;/h2&gt;
  &lt;p id=&quot;nKBA&quot;&gt;Эли Голдратт разработал специальные приложения и инструменты для решения конкретных отраслевых задач:&lt;/p&gt;
  &lt;ul id=&quot;u5th&quot;&gt;
    &lt;li id=&quot;jsWh&quot;&gt;&lt;strong&gt;Доступность в сфере поставок и дистрибуции:&lt;/strong&gt; надёжное и быстрое пополнение запасов&lt;/li&gt;
    &lt;li id=&quot;CVGn&quot;&gt;&lt;strong&gt;Наличие на складе готовой продукции: &lt;/strong&gt;упрощённая барабанно-буферная канатная система (S-DBR) для производства на склад или на заказ&lt;/li&gt;
    &lt;li id=&quot;l1sL&quot;&gt;&lt;strong&gt;Производство в срок: &lt;/strong&gt;упрощённая барабанно-буферно-канатная система (S-DBR) для изготовления на заказ&lt;/li&gt;
    &lt;li id=&quot;OwSl&quot;&gt;&lt;strong&gt;Своевременная сборка:&lt;/strong&gt; Полный комплект&lt;/li&gt;
    &lt;li id=&quot;snI8&quot;&gt;&lt;strong&gt;Проекты, завершённые в срок: &lt;/strong&gt;управление проектами по методу критической цепи&lt;/li&gt;
    &lt;li id=&quot;oRV0&quot;&gt;&lt;strong&gt;Перепрофилирование инфекционных отделений: &lt;/strong&gt;нехватка денежных средств&lt;/li&gt;
    &lt;li id=&quot;Vclc&quot;&gt;&lt;strong&gt;Растущий спрос со стороны клиентов: &lt;/strong&gt;Нежелательный эффект, «мафиозное предложение», от которого невозможно отказаться&lt;/li&gt;
    &lt;li id=&quot;tcGR&quot;&gt;&lt;strong&gt;Снижение рисков, связанных со спросом: &lt;/strong&gt;сегментация клиентов&lt;/li&gt;
    &lt;li id=&quot;i237&quot;&gt;&lt;strong&gt;Вызывающее изменение:&lt;/strong&gt; 6 уровней сопротивления/вовлечённости&lt;/li&gt;
    &lt;li id=&quot;ajQU&quot;&gt;&lt;strong&gt;Принятие обоснованных финансовых решений: &lt;/strong&gt;операционные показатели T/I/OE&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;1aOE&quot;&gt;Нажмите здесь, чтобы узнать больше о &lt;a href=&quot;https://www.tocinstitute.org/toc-applications.html&quot; target=&quot;_blank&quot;&gt;приложениях TOC&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;xgay&quot;&gt;Узнать больше&lt;/h2&gt;
  &lt;p id=&quot;Tj0q&quot;&gt;Бизнес-роман доктора Голдратта &lt;strong&gt;&lt;a href=&quot;https://www.tocinstitute.org/the-goal-summary.html&quot; target=&quot;_blank&quot;&gt;«Цель»&lt;/a&gt;&lt;/strong&gt; — это оригинальная классика, с которой началось движение TOC. Она станет хорошей отправной точкой для всех, кто хочет изучить эту область, особенно для тех, кто работает в традиционном производственном секторе.&lt;/p&gt;
  &lt;p id=&quot;htH6&quot;&gt;Ниже приведён тщательно отобранный список ресурсов, которые помогут вам найти лучшие способы узнать больше по каждой из перечисленных тем.&lt;/p&gt;
  &lt;p id=&quot;106K&quot;&gt;Перевод: &lt;a href=&quot;https://www.tocinstitute.org/theory-of-constraints.html&quot; target=&quot;_blank&quot;&gt;https://www.tocinstitute.org/theory-of-constraints.html&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:microservices</id><link rel="alternate" type="text/html" href="https://devz.su/microservices?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>Микросервисы</title><published>2025-11-03T07:14:16.052Z</published><updated>2025-11-03T07:14:16.052Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/0b/41/0b41c445-174d-4e4b-aa8d-840f76e30b7a.png"></media:thumbnail><category term="software-architecture" label="Архитектура ПО"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/9b/7e/9b7e7fa0-e37c-429b-af28-856f23b5ae9e.png&quot;&gt;Термин «микросервисная архитектура» появился в последние несколько лет для описания особого подхода к разработке программных приложений в виде наборов независимо развертываемых сервисов. Хотя у этого архитектурного стиля нет четкого определения, ему присущи определенные общие характеристики, такие как организация вокруг бизнес-возможностей, автоматическое развертывание, интеллектуальные конечные точки и децентрализованное управление языками и данными.</summary><content type="html">
  &lt;p id=&quot;ZdXR&quot;&gt;&lt;em&gt;Термин «микросервисная архитектура» появился в последние несколько лет для описания особого подхода к разработке программных приложений в виде наборов независимо развертываемых сервисов. Хотя у этого архитектурного стиля нет четкого определения, ему присущи определенные общие характеристики, такие как организация вокруг бизнес-возможностей, автоматическое развертывание, интеллектуальные конечные точки и децентрализованное управление языками и данными.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;FnER&quot;&gt;Авторы: James Lewis, Martin Fowler&lt;/p&gt;
  &lt;p id=&quot;IuTS&quot;&gt;«Микросервисы» — ещё один новый термин на оживлённых улицах архитектуры программного обеспечения. Хотя нам свойственно презрительно относиться к таким вещам, эта терминология описывает стиль разработки программных систем, который становится всё более привлекательным. За последние несколько лет мы видели множество проектов, использующих этот стиль, и результаты были настолько положительными, что для многих наших коллег этот стиль стал стандартом для разработки корпоративных приложений. К сожалению, информации о том, что такое микросервисный стиль и как его реализовать, не так много.&lt;/p&gt;
  &lt;p id=&quot;BYu8&quot;&gt;Вкратце, микросервисная архитектура 1 — это подход к разработке единого приложения в виде набора небольших сервисов, каждый из которых работает в отдельном процессе и взаимодействует с другими с помощью облегчённых механизмов, часто через API HTTP-ресурсов. Эти сервисы создаются на основе бизнес-возможностей и могут быть развёрнуты независимо друг от друга с помощью полностью автоматизированных механизмов развёртывания. Централизованное управление этими сервисами сведено к минимуму. Они могут быть написаны на разных языках программирования и использовать разные технологии хранения данных.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;J0F5&quot;&gt;В моём &lt;a href=&quot;https://martinfowler.com/microservices&quot; target=&quot;_blank&quot;&gt;Руководстве по ресурсам для микросервисов&lt;/a&gt; вы найдёте ссылки на лучшие статьи, видео, книги и подкасты о микросервисах.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Kr52&quot;&gt;Чтобы объяснить, что такое микросервисный стиль, полезно сравнить его с монолитным стилем: монолитное приложение представляет собой единое целое.&lt;/p&gt;
  &lt;p id=&quot;9Oge&quot;&gt;Корпоративные приложения часто состоят из трёх основных частей: клиентского пользовательского интерфейса (состоящего из HTML-страниц и JavaScript-кода, выполняемого в браузере на компьютере пользователя), базы данных (состоящей из множества таблиц, введённых в общую, как правило, реляционную систему управления базами данных) и серверного приложения.&lt;/p&gt;
  &lt;p id=&quot;WWEN&quot;&gt;Серверное приложение будет обрабатывать HTTP-запросы, выполнять бизнес-логику, получать и обновлять данные из базы данных, а также выбирать и заполнять HTML-шаблоны для отправки в браузер. Это серверное приложение является &lt;em&gt;монолитом&lt;/em&gt; — единым логическим исполняемым файлом. Любые изменения в системе требуют создания и развертывания новой версии серверного приложения.&lt;/p&gt;
  &lt;p id=&quot;b5dj&quot;&gt;Такой монолитный сервер — естественный подход к созданию подобной системы.&lt;/p&gt;
  &lt;p id=&quot;uYzZ&quot;&gt;Вся логика обработки запросов выполняется в рамках одного процесса, что позволяет использовать базовые возможности языка для разделения приложения на классы, функции и пространства имён.&lt;/p&gt;
  &lt;p id=&quot;qgrX&quot;&gt;При должном подходе вы можете запускать и тестировать приложение на ноутбуке разработчика, а также использовать конвейер развёртывания, чтобы обеспечить надлежащее тестирование изменений и их развёртывание в рабочей среде.&lt;/p&gt;
  &lt;p id=&quot;off8&quot;&gt;Вы можете горизонтально масштабировать монолит, запустив множество экземпляров за балансировщиком нагрузки.&lt;/p&gt;
  &lt;p id=&quot;8jIc&quot;&gt;Монолитные приложения могут быть успешными, но люди всё чаще разочаровываются в них, особенно по мере того, как всё больше приложений переносится в облако.&lt;/p&gt;
  &lt;p id=&quot;63gb&quot;&gt;Циклы изменений взаимосвязаны: изменение, внесённое в небольшую часть приложения, требует перестройки и развёртывания всего монолита.&lt;/p&gt;
  &lt;p id=&quot;I7Zn&quot;&gt;Со временем становится всё сложнее поддерживать хорошую модульную структуру, а значит, и вносить изменения, которые должны затрагивать только один модуль.&lt;/p&gt;
  &lt;p id=&quot;6cJP&quot;&gt;Масштабирование требует масштабирования всего приложения, а не его частей, которым требуется больше ресурсов.&lt;/p&gt;
  &lt;figure id=&quot;Es4b&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9b/7e/9b7e7fa0-e37c-429b-af28-856f23b5ae9e.png&quot; width=&quot;850&quot; /&gt;
    &lt;figcaption&gt;Рис. 1. Монолиты и микросервисы&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fvHV&quot;&gt;Эти проблемы привели к появлению микросервисной архитектуры: приложения стали создаваться в виде наборов сервисов. Помимо того, что сервисы можно развертывать и масштабировать независимо друг от друга, каждый из них представляет собой отдельный модуль, что позволяет писать разные сервисы на разных языках программирования. Кроме того, ими могут управлять разные команды.&lt;/p&gt;
  &lt;p id=&quot;iRa2&quot;&gt;Мы не утверждаем, что микросервисный стиль является чем-то новым или инновационным. Его корни уходят как минимум в принципы разработки Unix.&lt;/p&gt;
  &lt;p id=&quot;hVzg&quot;&gt;Но мы считаем, что недостаточно людей задумываются о микросервисной архитектуре и что многие разработки программного обеспечения были бы более успешными, если бы в них использовалась эта архитектура.&lt;/p&gt;
  &lt;h2 id=&quot;b8Vk&quot;&gt;Особенности микросервисной архитектуры&lt;/h2&gt;
  &lt;p id=&quot;gZxO&quot;&gt;Мы не можем сказать, что существует формальное определение архитектурного стиля микросервисов, но мы можем попытаться описать то, что, по нашему мнению, является общими характеристиками архитектур, которые можно отнести к этому стилю. Как и в случае с любым определением, в котором описываются общие характеристики, не все архитектуры микросервисов обладают всеми этими характеристиками, но мы ожидаем, что большинство архитектур микросервисов будут обладать большинством этих характеристик. Хотя мы, авторы, являемся активными участниками этого довольно разрозненного сообщества, мы хотим попытаться описать то, что мы видим в нашей собственной работе и в аналогичных проектах известных нам команд. В частности, мы не предлагаем какого-либо определения, которому нужно следовать.&lt;/p&gt;
  &lt;h3 id=&quot;EusI&quot;&gt;Компонентизация с помощью Сервисов&lt;/h3&gt;
  &lt;p id=&quot;cboU&quot;&gt;С тех пор как мы начали работать в сфере программного обеспечения, у нас появилось желание создавать системы, соединяя компоненты друг с другом, подобно тому, как мы видим, что происходит в физическом мире. За последние пару десятилетий мы стали свидетелями значительного прогресса в создании больших наборов общих библиотек, которые являются частью большинства языковых платформ.&lt;/p&gt;
  &lt;p id=&quot;YtxA&quot;&gt;Говоря о компонентах, мы сталкиваемся с проблемой определения того, что такое компонент. &lt;a href=&quot;https://martinfowler.com/bliki/SoftwareComponent.html&quot; target=&quot;_blank&quot;&gt;Наше определение&lt;/a&gt; гласит, что &lt;strong&gt;компонент&lt;/strong&gt; — это единица программного обеспечения, которую можно независимо заменять и обновлять.&lt;/p&gt;
  &lt;p id=&quot;pjpf&quot;&gt;В микросервисных архитектурах используются библиотеки, но основной способ компоновки собственного программного обеспечения заключается в разделении на сервисы. Мы определяем &lt;strong&gt;библиотеки&lt;/strong&gt; как компоненты, которые подключаются к программе и вызываются с помощью вызовов функций в памяти, в то время как &lt;strong&gt;сервисы&lt;/strong&gt; — это внешние компоненты, которые взаимодействуют с помощью таких механизмов, как запрос веб-сервиса или удалённый вызов процедуры. (Это понятие отличается от понятия сервисного объекта во многих объектно-ориентированных программах)&lt;/p&gt;
  &lt;p id=&quot;pzSf&quot;&gt;Одна из основных причин использования сервисов в качестве компонентов (а не библиотек) заключается в том, что сервисы можно развертывать независимо друг от друга. Если у вас есть приложение 4, состоящее из нескольких библиотек в одном процессе, то при изменении любого компонента придется заново развертывать все приложение. Но если это приложение разделено на несколько сервисов, то при изменении одного сервиса потребуется заново развернуть только его. Это не абсолютное правило, некоторые изменения затрагивают интерфейсы сервисов, что требует определённой координации, но цель хорошей микросервисной архитектуры — свести эти изменения к минимуму за счёт согласованных границ сервисов и механизмов развития в контрактах на обслуживание.&lt;/p&gt;
  &lt;p id=&quot;Hlyc&quot;&gt;Ещё одним следствием использования сервисов в качестве компонентов является более явный интерфейс компонентов. В большинстве языков нет хорошего механизма для определения явного &lt;a href=&quot;https://martinfowler.com/bliki/PublishedInterface.html&quot; target=&quot;_blank&quot;&gt;опубликованного интерфейса&lt;/a&gt;. Часто только документация и дисциплина не позволяют клиентам нарушить инкапсуляцию компонента, что приводит к слишком тесной связи между компонентами. Сервисыупрощают эту задачу за счёт использования явных механизмов удалённого вызова.&lt;/p&gt;
  &lt;p id=&quot;EcFA&quot;&gt;У использования подобных сервисов есть свои недостатки. Удалённые вызовы обходятся дороже, чем вызовы внутри процесса, поэтому удалённые API должны быть более грубыми, что часто затрудняет их использование. Если вам нужно изменить распределение обязанностей между компонентами, сделать это будет сложнее, если вы пересекаете границы процессов.&lt;/p&gt;
  &lt;p id=&quot;LWrH&quot;&gt;В первом приближении можно заметить, что сервисы сопоставляются с процессами среды выполнения, но это лишь первое приближение.&lt;/p&gt;
  &lt;p id=&quot;o2CX&quot;&gt;Сервис может состоять из нескольких процессов, которые всегда разрабатываются и развертываются вместе, например процесс приложения и база данных, которая используется только этим сервисом.&lt;/p&gt;
  &lt;h3 id=&quot;5kdN&quot;&gt;Организация на основе бизнес-возможностей&lt;/h3&gt;
  &lt;p id=&quot;CIN0&quot;&gt;При разделении крупного приложения на части руководство часто фокусируется на технологическом уровне, в результате чего появляются команды, занимающиеся пользовательским интерфейсом, серверной логикой и базами данных.&lt;/p&gt;
  &lt;p id=&quot;6Fqa&quot;&gt;Когда команды разделены по такому принципу, даже простые изменения могут привести к тому, что проект будет затрагивать несколько команд, а его реализация потребует времени и утверждения бюджета.&lt;/p&gt;
  &lt;p id=&quot;8fiS&quot;&gt;Умная команда оптимизирует этот процесс и выберет меньшее из двух зол — просто перенесёт логику в то приложение, к которому у неё есть доступ.&lt;/p&gt;
  &lt;p id=&quot;zork&quot;&gt;Другими словами, логика повсюду. Это пример &lt;a href=&quot;https://martinfowler.com/bliki/ConwaysLaw.html&quot; target=&quot;_blank&quot;&gt;закона Конвея&lt;/a&gt; в действии.&lt;/p&gt;
  &lt;blockquote id=&quot;b2Kj&quot;&gt;Любая организация, разрабатывающая систему (в широком смысле), создаст проект, структура которого будет копией коммуникационной структуры организации.&lt;br /&gt;&lt;br /&gt;— Мелвин Конвей, 1968&lt;/blockquote&gt;
  &lt;figure id=&quot;5rvx&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5d/24/5d24d2d8-6760-4b61-a9b3-d4e8b27346bd.png&quot; width=&quot;560&quot; /&gt;
    &lt;figcaption&gt;Рис. 2. Закон Конвея в действии&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jQTy&quot;&gt;Микросервисный подход к разделению отличается тем, что сервисы организуются вокруг &lt;strong&gt;бизнес-возможностей&lt;/strong&gt;. Такие сервисы представляют собой комплексное программное обеспечение для соответствующей бизнес-области, включая пользовательский интерфейс, постоянное хранилище и любое внешнее взаимодействие. Следовательно, команды являются межфункциональными и обладают всем спектром навыков, необходимых для разработки: пользовательский интерфейс, базы данных и управление проектами.&lt;/p&gt;
  &lt;figure id=&quot;rBZ9&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a4/17/a41720f2-b100-4255-8d56-44c1d3baa9b1.png&quot; width=&quot;748&quot; /&gt;
    &lt;figcaption&gt;Рис. 3. Границы сервисов, усиленные границами команд&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7zSj&quot;&gt;Одна из компаний, организованных таким образом, — это &lt;a href=&quot;http://www.comparethemarket.com/&quot; target=&quot;_blank&quot;&gt;www.comparethemarket.com&lt;/a&gt;. Межфункциональные команды отвечают за создание и поддержку каждого продукта, а каждый продукт разделён на несколько отдельных сервисов, взаимодействующих через шину сообщений.&lt;/p&gt;
  &lt;p id=&quot;qI1x&quot;&gt;Большие монолитные приложения также всегда можно модульизировать с учетом бизнес-возможностей, хотя это не обычный случай. Certaкроме того, мы бы настоятельно призвали большую команду, создающую монолитное приложение, разделиться по бизнес-направлениям. Впроблема, которую мы видели здесь, заключается в том, что они, как правило, организованы вокруг &lt;em&gt;слишком многих&lt;/em&gt; контекстов. Если чеe monolith охватывает многие из этих модульных границ, и отдельным членам команды может быть трудно поместить их в свою кратковременную память. Кроме того, мы видим, что модульные линии требуют строгой дисциплины. Неизбежно более чёткое разделение, требуемое для сервисных компонентов, упрощает соблюдение границ команды.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;1kjA&quot;&gt;&lt;strong&gt;Насколько велик микросервис?&lt;/strong&gt;&lt;/p&gt;
    &lt;p id=&quot;wzBR&quot;&gt;Хотя «микросервис» стал популярным названием для этого архитектурного стиля, оно приводит к нежелательному акценту на размере сервиса и спорам о том, что считать «микро». В беседах с разработчиками микросервисов мы видим, что сервисы бывают разных размеров. Самые крупные сервисы соответствуют понятию Amazon о &lt;a href=&quot;https://martinfowler.com/bliki/TwoPizzaTeam.html&quot; target=&quot;_blank&quot;&gt;команде из двух пицц&lt;/a&gt; (т. е. вся команда может прокормиться двумя пиццами), то есть не более чем о дюжине человек. В меньших масштабах мы видели системы, в которых команда из полудюжины человек поддерживала полдюжины сервисов.&lt;/p&gt;
    &lt;p id=&quot;ELCg&quot;&gt;Это подводит нас к вопросу о том, достаточно ли велики различия в этом диапазоне размеров, чтобы не объединять сервисы, рассчитанные на дюжину человек, и сервисы, рассчитанные на одного человека, под одним ярлыком «микросервисы». На данный момент мы считаем, что их лучше объединить, но, конечно, мы можем изменить своё мнение по мере дальнейшего изучения этого стиля&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;8xnj&quot;&gt;Продукты, а не Проекты&lt;/h3&gt;
  &lt;p id=&quot;YSYy&quot;&gt;В большинстве случаев разработки приложений, с которыми мы сталкиваемся, используется проектная модель: цель состоит в том, чтобы создать программное обеспечение, которое затем считается завершённым. После завершения работы программное обеспечение передаётся организации, занимающейся его обслуживанием, а проектная команда, которая его создала, распускается.&lt;/p&gt;
  &lt;p id=&quot;C6Vx&quot;&gt;Сторонники микросервисов, как правило, избегают этой модели, предпочитая вместо этого идею о том, что команда должна владеть продуктом на протяжении всего его жизненного цикла. Источником вдохновения для этого подхода послужила идея Amazon о том, что &lt;a href=&quot;https://queue.acm.org/detail.cfm?id=1142065&quot; target=&quot;_blank&quot;&gt;«вы создаёте, вы и управляете»&lt;/a&gt;, где команда разработчиков берёт на себя полную ответственность за программное обеспечение в рабочей среде. Это позволяет разработчикам ежедневно наблюдать за тем, как их программное обеспечение работает в рабочей среде, и чаще взаимодействовать с пользователями, поскольку им приходится брать на себя хотя бы часть обязанностей по поддержке.&lt;/p&gt;
  &lt;p id=&quot;O6rn&quot;&gt;Продуктовый менталитет связан с бизнес-возможностями. Вместо того чтобы рассматривать программное обеспечение как набор функций, которые нужно реализовать, мы выстраиваем долгосрочные отношения, в которых вопрос заключается в том, как программное обеспечение может помочь пользователям расширить бизнес-возможности.&lt;/p&gt;
  &lt;p id=&quot;nFnM&quot;&gt;Нет никаких причин, по которым нельзя было бы использовать тот же подход в монолитных приложениях, но меньшая степень детализации сервисов может упростить установление личных отношений между разработчиками сервисов и их пользователями.&lt;/p&gt;
  &lt;h3 id=&quot;MsyW&quot;&gt;Умные конечные точки и тупые каналы&lt;/h3&gt;
  &lt;p id=&quot;eJ52&quot;&gt;При создании коммуникационных структур между различными процессами мы сталкивались со многими продуктами и подходами, в которых особое внимание уделялось интеллектуальным возможностям самого механизма коммуникации. Хорошим примером этого является корпоративная сервисная шина (ESB), продукты которой часто включают в себя сложные средства для маршрутизации сообщений, организации процессов, преобразования и применения бизнес-правил.&lt;/p&gt;
  &lt;p id=&quot;khzF&quot;&gt;Сообщество разработчиков микросервисов предпочитает альтернативный подход: &lt;em&gt;умные конечные точки и «глупые» каналы&lt;/em&gt;. Приложения, созданные на основе микросервисов, должны быть максимально независимыми и согласованными. Они содержат собственную логику предметной области и действуют скорее как фильтры в классическом понимании Unix: получают запрос, применяют соответствующую логику и выдают ответ. Они управляются с помощью простых протоколов REST, а не сложных протоколов, таких как WS-Choreography, BPEL или оркестрация с помощью центрального инструмента.&lt;/p&gt;
  &lt;p id=&quot;v8bx&quot;&gt;Чаще всего используются два протокола: HTTP-запросы с ответами и API ресурсов, а также облегчённый обмен сообщениями. Без первого не обойтись.&lt;/p&gt;
  &lt;blockquote id=&quot;bLBy&quot;&gt;Будь в сети, а не за её пределами&lt;br /&gt;&lt;br /&gt;— Иэн Робинсон&lt;/blockquote&gt;
  &lt;p id=&quot;3xPy&quot;&gt;Команды, работающие с микросервисами, используют принципы и протоколы, на которых построена всемирная паутина (и в значительной степени Unix). Часто используемые ресурсы можно кэшировать без особых усилий со стороны разработчиков или администраторов.&lt;/p&gt;
  &lt;p id=&quot;b9GW&quot;&gt;Второй распространённый подход — обмен сообщениями через облегчённую шину сообщений. Выбранная инфраструктура, как правило, «глупая» (в том смысле, что она выступает только в роли маршрутизатора сообщений). Простые реализации, такие как RabbitMQ или ZeroMQ, не делают ничего, кроме обеспечения надёжной асинхронной структуры. Вся «умность» сосредоточена в конечных точках, которые создают и получают сообщения, то есть в сервисах.&lt;/p&gt;
  &lt;p id=&quot;FHfB&quot;&gt;В монолитной системе компоненты выполняются в рамках одного процесса, а взаимодействие между ними осуществляется либо с помощью вызова метода, либо с помощью вызова функции. Самая большая проблема при преобразовании монолитной системы в микросервисную заключается в изменении модели взаимодействия. Наивное преобразование вызовов методов в оперативной памяти в RPC приводит к неэффективному обмену данными. Вместо этогонеобходимо заменить детализированное взаимодействие более общим подходом.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;wSEC&quot;&gt;&lt;strong&gt;Микросервисы и SOA&lt;/strong&gt;&lt;/p&gt;
    &lt;p id=&quot;fuuG&quot;&gt;Когда мы говорим о микросервисах, часто возникает вопрос, не является ли это просто сервис-ориентированной архитектурой (SOA), которую мы видели десять лет назад. В этом есть доля правды, потому что стиль микросервисов очень похож на то, за что выступали некоторые сторонники SOA. Проблема, однако, в том, что SOA означает &lt;a href=&quot;https://martinfowler.com/bliki/ServiceOrientedAmbiguity.html&quot; target=&quot;_blank&quot;&gt;слишком много разных вещей&lt;/a&gt;, и в большинстве случаев то, что мы называем «SOA», существенно отличается от стиля, который мы здесь описываем, обычно из-за того, что основное внимание уделяется ESB, используемым для интеграции монолитных приложений.&lt;/p&gt;
    &lt;p id=&quot;PJTo&quot;&gt;В частности, мы видели множество неудачных попыток внедрить сервисную ориентацию — от стремления скрыть сложность в ESB 5 до провальных многолетних инициатив, которые стоили миллионы и не принесли никакой пользы, а также централизованных моделей управления, которые активно препятствовали изменениям. Из-за этих проблем иногда трудно увидеть что-то за их пределами.&lt;/p&gt;
    &lt;p id=&quot;EUV4&quot;&gt;Безусловно, многие методы, используемые в сообществе микросервисов, выросли из опыта разработчиков, интегрирующих сервисы в крупных организациях. Примером этого является шаблон &lt;a href=&quot;https://martinfowler.com/bliki/TolerantReader.html&quot; target=&quot;_blank&quot;&gt;Tolerant Reader&lt;/a&gt;. Использование веб-технологий и простых протоколов — ещё один подход, основанный на этом опыте, — реакция на центральные стандарты, которые достигли такой сложности, что, &lt;a href=&quot;http://wiki.apache.org/ws/WebServiceSpecifications&quot; target=&quot;_blank&quot;&gt;откровенно говоря, дух захватывает&lt;/a&gt;. (Всякий раз, когда вам нужна онтология для управления вашими онтологиями, вы понимаете, что у вас серьёзные проблемы.)&lt;/p&gt;
    &lt;p id=&quot;eN21&quot;&gt;Это распространенное проявление SOA привело к тому, что некоторые сторонники микросервисов полностью отвергли ярлык SOA, хотя другие считают микросервисы одной из форм SOA 6, возможно &lt;em&gt;ориентация на обслуживание выполнена правильно&lt;/em&gt;. В любом случае, тот факт, что SOA означает такие разные вещи, означает, что важно иметь термин, который более четко определяет этот архитектурный стиль.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;EtTC&quot;&gt;Децентрализованное Управление&lt;/h3&gt;
  &lt;p id=&quot;Frks&quot;&gt;Одним из последствий централизованного управления является тенденция к стандартизации на основе единых технологических платформ. Опыт показывает, что такой подход ограничивает возможности: не каждая проблема — это гвоздь, а не каждое решение — молоток. Мы предпочитаем использовать подходящий инструмент для конкретной задачи, и хотя монолитные приложения могут в определённой степени использовать преимущества разных языков, это не так распространено.&lt;/p&gt;
  &lt;p id=&quot;PLSO&quot;&gt;Разделяя компоненты монолита на сервисы, мы получаем выбор при создании каждого из них. Выхотите использовать Node. js для создания простой страницы с отчетами? Делайте это. C++ дляособо сложного компонента, работающего в режиме, близком к реальному времени? Отлично. Выхотите заменить базу данных на другой тип, который лучше подходит для чтения данных одним из компонентов? У нас естьтехнология для его пересоздания.&lt;/p&gt;
  &lt;p id=&quot;hkCD&quot;&gt;Конечно, если вы &lt;em&gt;можете&lt;/em&gt; что-то сделать, это не значит, что вы &lt;em&gt;должны&lt;/em&gt; это делать, но разделение системы таким образом означает, что у вас есть такая возможность.&lt;/p&gt;
  &lt;p id=&quot;F4GF&quot;&gt;Команды, создающие микросервисы, тоже предпочитают другой подход к стандартам. Вместо того чтобы использовать набор определённых стандартов, записанных где-то на бумаге, они предпочитают создавать полезные инструменты, которые другие разработчики могут использовать для решения проблем, схожих с теми, с которыми сталкиваются они. Эти инструменты обычно извлекаются из реализаций и становятся доступными для более широкой группы, иногда, но не исключительно, с использованием внутренней модели с открытым исходным кодом. Теперь, когда git и github стали де-факто предпочтительной системой контроля версий, практики с открытым исходным кодом становятся всё более распространёнными внутри компаний.&lt;/p&gt;
  &lt;p id=&quot;xFrS&quot;&gt;Netflix — хороший пример организации, которая следует этой философии. Публикация полезного и, прежде всего, проверенного в бою кода в виде библиотек побуждает других разработчиков решать похожие проблемы схожими способами, но при этом оставляет возможность выбрать другой подход, если это необходимо. Общие библиотеки, как правило, ориентированы на решение распространённых проблем, связанных с хранением данных, межпроцессным взаимодействием и, как мы обсудим ниже, автоматизацией инфраструктуры.&lt;/p&gt;
  &lt;p id=&quot;1yx7&quot;&gt;Для сообщества разработчиков микросервисов накладные расходы особенно нежелательны. Это не значит, что сообщество не ценит контракты на обслуживание. Совсем наоборот, их, как правило, гораздо больше. Просто они ищут другие способы управления этими контрактами. Такие шаблоны, как &lt;a href=&quot;https://martinfowler.com/bliki/TolerantReader.html&quot; target=&quot;_blank&quot;&gt;Tolerant Reader&lt;/a&gt; и &lt;a href=&quot;https://martinfowler.com/articles/consumerDrivenContracts.html&quot; target=&quot;_blank&quot;&gt;контракты, ориентированные на потребителя&lt;/a&gt;, часто применяются в микросервисах. Это помогает сервуконтракты ice развиваться независимо. Выполнение минусовконтракты, основанные на umer, как часть вашей сборки повышают доверие и обеспечивают быструю обратную связь о том, функционируют ли ваши службы. Действительно, мы знаем из команды в Австралии, которая занимается созданием новых сервисов с помощью контрактов, ориентированных на потребителя. Они используют простые инструменты, которые позволяют им определять контракт на услугу. Это становится part автоматизированной сборки еще до того, как будет написан код для нового сервиса. Сервис затем разрабатывается только до той степени, в которой он соответствует контракту. Это элегантный подход, позволяющий избежать дилеммы «YAGNI»9 при разработке нового программного обеспечения. Эти методы и инструменты, которые развиваются вокруг них, снижают потребность в централизованном управлении контрактами за счёт уменьшения временной связи между сервисами.&lt;/p&gt;
  &lt;p id=&quot;XZeO&quot;&gt;Возможно, апогеем децентрализованного управления является принцип «создай и запусти», популяризированный Amazon. Команды отвечают за все аспекты создаваемого ими программного обеспечения, включая его круглосуточную эксплуатацию. Передача такого уровня ответственности определённо не является нормой, но мы видим, что всё больше компаний перекладывают ответственность на команды разработчиков. Netflix — ещё одна организация, которая приняла этот принцип10. Когда вас будят в 3 часа ночи с помощью пейджера, это, безусловно, мощный стимул сосредоточиться на качестве кода. Эти идеи настолько далеки от традиционной модели централизованного управления, насколько это вообще возможно.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;oAb6&quot;&gt;&lt;strong&gt;Много языков, много вариантов&lt;/strong&gt;&lt;/p&gt;
    &lt;p id=&quot;nJq0&quot;&gt;Развитие JVM как платформы — это лишь последний пример смешения языков в рамках общей платформы. На протяжении десятилетий было принято использовать оболочки для языков более высокого уровня, чтобы воспользоваться преимуществами абстракций более высокого уровня. То есть опускаться до базового уровня и писать код, чувствительный к производительности, на языке более низкого уровня. Однаково многих монолитах нет необходимости в таком уровне оптимизации производительности, а также в DSL и абстракциях более высокого уровня (к нашему разочарованию). Вместо этого монолиты обычно написаны на одном языке, и тенденция такова, что количество используемых технологий.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;KZzc&quot;&gt;Децентрализованное управление данными&lt;/h3&gt;
  &lt;p id=&quot;QgIF&quot;&gt;Децентрализация управления данными проявляется по-разному.На самом абстрактном уровне это означает, что концептуальная модель мира в разных системах будет отличаться. Это распространённая проблема при интеграции в рамках крупного предприятия: представление о клиенте в отделе продаж будет отличаться от представления в отделе поддержки. Некоторые объекты, которые в отделе продаж называются клиентами, могут вообще не отображаться в отделе поддержки. Те, что отображаются, могут иметь разные атрибуты и (что ещё хуже) общие атрибуты с немного отличающейся семантикой.&lt;/p&gt;
  &lt;p id=&quot;zqQI&quot;&gt;Эта проблема характерна для приложений, но может возникать и &lt;em&gt;внутри&lt;/em&gt; приложений, особенно когда приложение разделено на отдельные компоненты. Полезно рассматривать это с точки зрения концепции &lt;a href=&quot;https://martinfowler.com/bliki/BoundedContext.html&quot; target=&quot;_blank&quot;&gt;ограниченного контекста&lt;/a&gt; в предметно-ориентированном проектировании. DDD делит сложную предметную область на несколько ограниченных контекстов и определяет связи между ними. Этот процесс полезен как для монолитных, так и для микросервисных архитектур, но существует естественная взаимосвязь между границами сервисов и контекстов, которая помогает прояснить ситуацию и, как мы описываем в разделе о бизнес-возможностях, усилить разделение.&lt;/p&gt;
  &lt;p id=&quot;eHzv&quot;&gt;Помимо децентрализации решений, касающихся концептуальных моделей, микросервисы также децентрализуют решения, связанные с хранением данных. &lt;br /&gt;В то время как монолитные приложения предпочитают использовать единую логическую базу данных для хранения постоянных данных, предприятия часто предпочитают использовать единую базу данных для целого ряда приложений. Многие из этих решений обусловлены коммерческими моделями поставщиков в отношении лицензирования. Микросервисы предпочитают, чтобы каждый сервис управлял собственной базой данных, будь то разные экземпляры одной и той же технологии баз данных или совершенно разные системы баз данных. Такой подход называется &lt;a href=&quot;https://martinfowler.com/bliki/PolyglotPersistence.html&quot; target=&quot;_blank&quot;&gt;Polyglot Persistence&lt;/a&gt;. Вы можете использовать многоязычную персистентность в монолитной архитектуре, но чаще она встречается в микросервисах.&lt;/p&gt;
  &lt;figure id=&quot;aDSm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/55/34/5534f033-95a7-4ca7-a76a-54ebd371d191.png&quot; width=&quot;758&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;vxCo&quot;&gt;Децентрализация ответственности за данные между микросервисами влияет на управление обновлениями. Обычно для управления обновлениями используются транзакции, гарантирующие согласованность при обновлении нескольких ресурсов. Этот подход часто используется в монолитных системах.&lt;/p&gt;
  &lt;p id=&quot;16bG&quot;&gt;Использование подобных транзакций помогает обеспечить согласованность, но накладывает значительные ограничения по времени, что проблематично при работе с несколькими сервисами. Распределённые транзакции, как известно, сложно реализовать, и, как следствие, в микросервисных архитектурах &lt;a href=&quot;http://www.eaipatterns.com/ramblings/18_starbucks.html&quot; target=&quot;_blank&quot;&gt;делается акцент на бестранзакционной координации между сервисами&lt;/a&gt;с явным признанием того, что согласованность может быть лишь потенциальной, а проблемы решаются с помощью компенсирующих операций.&lt;/p&gt;
  &lt;p id=&quot;z5Ju&quot;&gt;Такой подход к устранению несоответствий является новым вызовом для многих команд разработчиков, но он часто соответствует бизнес-практике. Часто компании допускают некоторую степень несогласованности, чтобы быстро реагировать на спрос, и при этом имеют возможность исправить ошибки. Такой компромисс оправдан, если затраты на исправление ошибок меньше, чем потери бизнеса из-за недостаточной согласованности.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;hL7D&quot;&gt;&lt;strong&gt;Проверенные в боях стандарты и обязательные стандарты&lt;/strong&gt;&lt;/p&gt;
    &lt;p id=&quot;8ilA&quot;&gt;Парадоксально, но команды, работающие с микросервисами, как правило, избегают жёстких стандартов, установленных группами по корпоративной архитектуре, но с радостью используют и даже пропагандируют открытые стандарты, такие как HTTP, ATOM и другие микроформаты.&lt;/p&gt;
    &lt;p id=&quot;p1wh&quot;&gt;Ключевое различие заключается в том, как разрабатываются стандарты и как они применяются. Стандарты, разрабатываемые такими группами, как IETF, становятся &lt;em&gt;стандартами &lt;/em&gt;только тогда, когда в мире существует несколько их реализаций, которые часто появляются в результате успешных проектов с открытым исходным кодом.&lt;/p&gt;
    &lt;p id=&quot;gYYH&quot;&gt;Эти стандарты сильно отличаются от многих корпоративных стандартов, которые часто разрабатываются группами, не имеющими достаточного опыта в программировании или находящимися под чрезмерным влиянием поставщиков.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;8jjO&quot;&gt;Автоматизация инфраструктуры&lt;/h3&gt;
  &lt;p id=&quot;M0mO&quot;&gt;За последние несколько лет методы автоматизации инфраструктуры претерпели значительные изменения. Развитие облачных технологий и, в частности, AWS снизило операционную сложность создания, развертывания и эксплуатации микросервисов.&lt;/p&gt;
  &lt;p id=&quot;z622&quot;&gt;Многие продукты или системы, создаваемые с помощью микросервисов, разрабатываются командами, имеющими большой опыт в &lt;a href=&quot;https://martinfowler.com/bliki/ContinuousDelivery.html&quot; target=&quot;_blank&quot;&gt;непрерывной поставке&lt;/a&gt; и ее предшественнице, &lt;a href=&quot;https://martinfowler.com/articles/continuousIntegration.html&quot; target=&quot;_blank&quot;&gt;непрерывной интеграции&lt;/a&gt;. Команды, создающие программное обеспечение таким образом, широко используют методы автоматизации инфраструктуры. Это проиллюстрировано на схеме конвейера сборки, показанной ниже.&lt;/p&gt;
  &lt;figure id=&quot;Q3Ta&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://martinfowler.com/articles/microservices/images/basic-pipeline.png&quot; /&gt;
    &lt;figcaption&gt;Рис. 5. Базовый конвейер сборки&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Xtku&quot;&gt;Поскольку это не статья о непрерывной поставке, мы обратим внимание лишь на пару ключевых особенностей. Нам нужно быть максимально уверенными в том, что наше программное обеспечение работает, поэтому мы проводим множество &lt;strong&gt;автоматизированных тестов&lt;/strong&gt;. Продвижение работающего программного обеспечения по конвейеру означает, что мы &lt;strong&gt;автоматизируем развертывание&lt;/strong&gt; в каждой новой среде.&lt;/p&gt;
  &lt;p id=&quot;MZIk&quot;&gt;Монолитное приложение будет создано, протестировано и запущено в этих средах без особых проблем. Оказывается, если вы вложили средства в автоматизацию процесса запуска монолита в производство, то развертывание &lt;em&gt;других &lt;/em&gt;приложений уже не кажется таким пугающим. Помните, что одна из целей непрерывной доставки — сделать развертывание скучным, поэтому не имеет значения, одно это приложение или три, если оно все равно скучное.&lt;/p&gt;
  &lt;p id=&quot;EOWH&quot;&gt;Еще одна область, в которой, по нашему наблюдению, команды используют обширную автоматизацию инфраструктуры, — это управление микросервисами в рабочей среде. В отличие от нашего утверждения о том, что, пока развертывание не вызывает затруднений, особой разницы между монолитами и микросервисами нет, операционная среда для каждого из них может кардинально отличаться.&lt;/p&gt;
  &lt;figure id=&quot;gNa4&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e6/e0/e6e05f01-b5d6-48ce-bdca-78ab930fe222.png&quot; width=&quot;778&quot; /&gt;
    &lt;figcaption&gt;Рис. 6. Развертывание модулей часто отличается&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;eD6A&quot;&gt;&lt;strong&gt;Сделайте так, чтобы поступать правильно было легко&lt;/strong&gt;&lt;/p&gt;
    &lt;p id=&quot;XRKm&quot;&gt;Одним из побочных эффектов повышения уровня автоматизации в результате непрерывной доставки и развертывания стало создание полезных инструментов, помогающих разработчикам и операционным специалистам. Инструменты для создания артефактов, управления кодовыми базами, запуска простых сервисов или добавления стандартного мониторинга и ведения журналов сейчас довольно распространены. Лучшим примером в интернете, вероятно, является &lt;a href=&quot;http://netflix.github.io/&quot; target=&quot;_blank&quot;&gt;набор инструментов с открытым исходным кодом от Netflix&lt;/a&gt;, но есть и другие, в том числе &lt;a href=&quot;http://dropwizard.codahale.com/&quot; target=&quot;_blank&quot;&gt;Dropwizard&lt;/a&gt;, который мы активно используем.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;fMhz&quot;&gt;Конструкция на случай отказа&lt;/h3&gt;
  &lt;p id=&quot;SPkF&quot;&gt;Следствием использования сервисов в качестве компонентов является то, что приложения должны быть спроектированы таким образом, чтобы они могли работать в случае сбоя сервисов. Любой вызов сервиса может завершиться неудачей из-за недоступности поставщика, и клиент должен отреагировать на это как можно более корректно. Это недостаток по сравнению с монолитной архитектурой, так как он усложняет работу с сервисом. В результате команды, работающие с микросервисами, постоянно анализируют, как сбои сервисов влияют на пользовательский опыт. &lt;a href=&quot;https://github.com/Netflix/SimianArmy&quot; target=&quot;_blank&quot;&gt;Обезьянья армия Netflix&lt;/a&gt; намеренно вызывает сбои в работе сервисов и даже центров обработки данных в течение рабочего дня, чтобы проверить устойчивость приложения и эффективность мониторинга.&lt;/p&gt;
  &lt;p id=&quot;AosC&quot;&gt;Такого рода автоматизированное тестирование в производственной среде было бы достаточно, чтобы у большинства операционных групп по спине побежали мурашки, как это обычно бывает перед недельным отпуском. Это не значит, что монолитные архитектурные стили не подходят для сложных систем мониторинга — просто, по нашему опыту, они встречаются реже.&lt;/p&gt;
  &lt;p id=&quot;95xH&quot;&gt;Поскольку сервисы могут выйти из строя в любой момент, важно иметь возможность быстро обнаруживать сбои и, по возможности, автоматически восстанавливать работу сервиса. Микросервисные приложения уделяют большое внимание мониторингу приложения в режиме реального времени, проверяя как архитектурные элементы (например, сколько запросов в секунду получает база данных), так и важные для бизнеса показатели (например, сколько заказов в минуту поступает). Семантический мониторинг может обеспечить систему раннего оповещения о сбоях, которая побуждает команды разработчиков к дальнейшим действиям и расследованию.&lt;/p&gt;
  &lt;p id=&quot;W3oG&quot;&gt;Это особенно важно для архитектуры микросервисов, поскольку предпочтение, отдаваемое микросервисами хореографии и &lt;a href=&quot;https://martinfowler.com/eaaDev/EventCollaboration.html&quot; target=&quot;_blank&quot;&gt;совместной работе над событиями&lt;/a&gt;, приводит к эмерджентному поведению. Хотя многие эксперты высоко оценивают ценность эмерджентного поведения, правда в том, что иногда оно может быть нежелательным. Мониторинг необходим для быстрого выявления нежелательного эмерджентного поведения, чтобы его можно было исправить.&lt;/p&gt;
  &lt;p id=&quot;Fx71&quot;&gt;Монолиты могут быть такими же прозрачными, как микросервисы, — на самом деле они должны быть такими. Разница в том, что вам обязательно нужно знать, когда сервисы, работающие в разных процессах, отключаются. В случае с библиотеками, работающими в рамках одного процесса, такая прозрачность вряд ли будет полезна.&lt;/p&gt;
  &lt;p id=&quot;5eaM&quot;&gt;Команды, работающие с микросервисами, ожидают увидеть сложные системы мониторинга и ведения журналов для каждого отдельного сервиса, например информационные панели, отображающие состояние «онлайн»/«офлайн» и различные операционные и бизнес-метрики. Подробная информация о состоянии автоматического выключателя, текущей пропускной способности и задержке — это другие примеры, с которыми мы часто сталкиваемся.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;m3kl&quot;&gt;&lt;strong&gt;Синхронные вызовы считаются вредными&lt;/strong&gt;&lt;/p&gt;
    &lt;p id=&quot;R1HO&quot;&gt;Каждый раз, когда у вас происходит несколько синхронных вызовов между сервисами, вы сталкиваетесь с мультипликативным эффектом простоев. Проще говоря, это когда простой вашей системы становится результатом простоев отдельных компонентов. Вам предстоит сделать выбор: сделать вызовы асинхронными или управлять простоями. На сайте www.guardian.co.uk на новой платформе действует простое правило: один синхронный вызов на запрос пользователя, а в Netflix при редизайне API платформы асинхронность была встроена в структуру API.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;FCz6&quot;&gt;Эволюционный Дизайн&lt;/h3&gt;
  &lt;p id=&quot;pz0S&quot;&gt;Специалисты по микросервисам, как правило, имеют опыт эволюционного проектирования и рассматривают декомпозицию сервисов как дополнительный инструмент, позволяющий разработчикам приложений контролировать изменения в своих приложениях без замедления процесса. Контроль изменений не обязательно означает сокращение количества изменений — при правильном подходе и использовании нужных инструментов можно вносить частые, быстрые и хорошо контролируемые изменения в программное обеспечение.&lt;/p&gt;
  &lt;p id=&quot;mRh6&quot;&gt;Всякий раз, когда вы пытаетесь разбить программную систему на компоненты, вы сталкиваетесь с необходимостью решить, как разделить её на части. По каким принципам мы решаем разделить наше приложение? Ключевым свойством компонента является возможность независимой замены и обновления. Это означает, что мы ищем точки, в которых можно представить себе переписывание компонента без ущерба для его взаимодействующих элементов. Индейские группы разработчиков микросервисов идут ещё дальше и открыто заявляют, что многие сервисы будут упразднены, а не усовершенствованы в долгосрочной перспективе.&lt;/p&gt;
  &lt;p id=&quot;Rg1B&quot;&gt;Веб-сайт The Guardian — хороший пример приложения, которое было спроектировано и создано как монолитное, но развивается в направлении микросервисов. Монолит по-прежнему является основой веб-сайта, но разработчики предпочитают добавлять новые функции, создавая микросервисы, которые используют API монолита. Такой подход особенно удобен для функций, которые по своей сути являются временными, например для специализированных страниц, посвященных спортивным событиям. Такую часть веб-сайта можно быстро создать с помощью языков быстрой разработки и удалить после завершения мероприятия. Мы видели подобные подходы в финансовом учреждении, где новые услуги добавляются для удовлетворения потребностей рынка, а через несколько месяцев или даже недель от них отказываются.&lt;/p&gt;
  &lt;p id=&quot;AdNr&quot;&gt;Этот акцент на взаимозаменяемости является частным случаем более общего принципа модульного проектирования, который заключается в том, чтобы обеспечивать модульность за счёт шаблона изменений 13. Вы хотите, чтобы элементы, которые меняются одновременно, находились в одном модуле. Части системы, которые меняются редко, должны находиться в разных сервисах, чем те, которые в настоящее время претерпевают значительные изменения. Если вы постоянно меняете два сервиса одновременно, это признак того, что их следует объединить.&lt;/p&gt;
  &lt;p id=&quot;T9rp&quot;&gt;Включение компонентов в сервисы предоставляет возможность для более детального планирования выпуска. При использовании monolith любые изменения требуют полной сборки и развертывания всего приложения. Однако в случае с микросервисами вам нужно повторно развернуть только измененные вами службы. Это может упростить и ускорить процесс выпуска. Недостатком является то, что вам приходится беспокоиться о том, что изменения в одной услуге нанесут ущерб ее потребителям. Традиционный подход к интеграции заключается в том, чтобы попытаться решить эту проблему с помощью управления версиями, но в мире микросервисов предпочитают &lt;a href=&quot;https://martinfowler.com/articles/enterpriseREST.html#versioning&quot; target=&quot;_blank&quot;&gt;использовать управление версиями только в крайнем случае&lt;/a&gt;. Мы можем избежать большого количества операций по управлению версиями, если будем проектировать сервисы так, чтобы они были максимально устойчивы к изменениям у поставщиков.&lt;/p&gt;
  &lt;h2 id=&quot;Ayta&quot;&gt;За микросервисами будущее?&lt;/h2&gt;
  &lt;p id=&quot;PKng&quot;&gt;Наша главная цель при написании этой статьи — объяснить основные идеи и принципы микросервисов. Мы потратили время на написание этой статьи, потому что считаем, что архитектурный стиль микросервисов — это важная идея, заслуживающая серьёзного рассмотрения при создании корпоративных приложений. Недавно мы создали несколько систем в этом стиле и знаем других разработчиков, которые используют и предпочитают этот подход. Среди тех, кто, насколько нам известно, в той или иной степени является первопроходцем в области архитектурного стиля, — Amazon, Netflix, &lt;a href=&quot;http://www.theguardian.com/&quot; target=&quot;_blank&quot;&gt;The Guardian&lt;/a&gt;, &lt;a href=&quot;https://gds.blog.gov.uk/&quot; target=&quot;_blank&quot;&gt;Цифровая служба правительства Великобритании&lt;/a&gt;, &lt;a href=&quot;https://martinfowler.com/articles/realestate.com.au&quot; target=&quot;_blank&quot;&gt;realestate.com.au&lt;/a&gt;, Forward и &lt;a href=&quot;http://www.comparethemarket.com/&quot; target=&quot;_blank&quot;&gt;comparethemarket.com&lt;/a&gt;. На конференциях в 2013 году было много примеров компаний, которые переходили на микросервисную архитектуру, включая Travis CI. Кроме того, существует множество организаций, которые уже давно используют то, что мы называем микросервисами, но никогда не используют это название. (Часто это называют сервис-ориентированной архитектурой, хотя, как мы уже говорили, сервис-ориентированная архитектура имеет множество противоречивых форм.&lt;/p&gt;
  &lt;p id=&quot;r8o7&quot;&gt;Однако, несмотря на этот положительный опыт, мы не утверждаем, что микросервисы — это будущее архитектуры программного обеспечения. Хотя наш опыт работы с микросервисами по сравнению с монолитными приложениями положителен, мы понимаем, что прошло недостаточно времени, чтобы делать окончательные выводы.&lt;/p&gt;
  &lt;p id=&quot;CK3r&quot;&gt;Часто истинные последствия ваших архитектурных решений становятся очевидными лишь спустя несколько лет после того, как вы их приняли. Мы видели проекты, в которых хорошая команда, стремящаяся к модульности, создавала монолитную архитектуру, которая с годами приходила в упадок. Многие считают, что с микросервисами такое происходит реже, поскольку границы сервисов чётко определены и их трудно обойти. Однако, пока мы не увидим достаточное количество систем с большим сроком эксплуатации, мы не сможем по-настоящему оценить, как развиваются микросервисные архитектуры.&lt;/p&gt;
  &lt;p id=&quot;89pg&quot;&gt;Безусловно, есть причины, по которым можно ожидать, что микросервисы будут развиваться медленно. Успех любых усилий по компонентизации зависит от того, насколько хорошо программное обеспечение вписывается в компоненты. Трудно точно выяснить, где границы компонента должна лежать. Эволюции. словарь конструкция признает трудности в получении границы права и, следовательно, важность ее легко оптимизировать их. Но если ваши компоненты представляют собой сервисы с удаленной связью, то рефакторинг намного сложнее, чем с библиотеками внутри процесса. При перемещении кода через границы сервисов возникают сложности, любые изменения интерфейса требуют согласования между участниками, необходимо добавлять уровни обратной совместимости, что усложняет тестирование.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;mt9P&quot;&gt;&lt;a href=&quot;https://martinfowler.com/articles/microservice-trade-offs.html&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Недостатки микросервисов&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;JXc0&quot;&gt;Многие команды разработчиков считают, что микросервисная архитектура превосходит монолитную. Но другие команды считают, что она снижает производительность. Как и любой архитектурный стиль, микросервисная архитектура имеет свои преимущества и недостатки. Чтобы сделать правильный выбор, нужно понимать их и учитывать особенности вашего контекста.&lt;br /&gt;&lt;br /&gt;Мартин Фаулер&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;ZiDJ&quot;&gt;Другая проблема заключается в том, что если компоненты не взаимодействуют друг с другом должным образом, то всё, что вы делаете, — это переносите сложность из одного компонента в другие. Это не просто перемещение сложности, а перенос её в менее очевидное и более сложное для контроля место. Легко подумать, что всё в порядке, когда смотришь на внутреннюю часть небольшого простого компонента, не замечая беспорядочных связей между сервисами.&lt;/p&gt;
  &lt;p id=&quot;Wexr&quot;&gt;Наконец, есть такой фактор, как квалификация команды. Более квалифицированные команды, как правило, осваивают новые методы. Но метод, который более эффективен для квалифицированной команды, не обязательно будет работать для менее квалифицированной. Мы видели множество случаев, когда менее квалифицированные команды создавали беспорядочные монолитные архитектуры, но нужно время, чтобы понять, к чему приводит такой беспорядок в случае с микросервисами. Плохой чай всегда создаст плохую систему — очень сложно сказать, уменьшают ли микросервисы беспорядок в этом случае или усугубляют его.&lt;/p&gt;
  &lt;p id=&quot;0e11&quot;&gt;Один из разумных аргументов, который мы слышали, заключается в том, что не стоит начинать с архитектуры микросервисов. Вместо этого &lt;a href=&quot;https://martinfowler.com/bliki/MonolithFirst.html&quot; target=&quot;_blank&quot;&gt;начните с монолита&lt;/a&gt;, сделайте его модульным и разделите на микросервисы, когда монолит станет проблемой. (Хотя &lt;a href=&quot;https://devz.su/dont-start-monolith&quot; target=&quot;_blank&quot;&gt;этот совет не идеален&lt;/a&gt;, поскольку хороший интерфейс внутри процесса обычно не является хорошим интерфейсом сервиса.)&lt;/p&gt;
  &lt;p id=&quot;PQLn&quot;&gt;Поэтому мы пишем это с осторожным оптимизмом. На данный момент мы достаточно узнали о микросервисном стиле, чтобы понять, что он может быть &lt;a href=&quot;https://martinfowler.com/microservices/&quot; target=&quot;_blank&quot;&gt;перспективным направлением&lt;/a&gt;. Мы не можем сказать наверняка, к чему это приведет, но одна из проблем разработки программного обеспечения заключается в том, что вы можете принимать решения только на основе той неполной информации, которая у вас есть на данный момент.&lt;/p&gt;
  &lt;p id=&quot;TipQ&quot;&gt;Перевод: &lt;a href=&quot;https://martinfowler.com/articles/microservices.html&quot; target=&quot;_blank&quot;&gt;https://martinfowler.com/articles/microservices.html&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:how-rpc-works</id><link rel="alternate" type="text/html" href="https://devz.su/how-rpc-works?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>Как на самом деле работает RPC</title><published>2025-10-31T08:12:39.580Z</published><updated>2025-10-31T08:12:39.580Z</updated><category term="grpc" label="gRPC"></category><summary type="html">Что такое RPC? Разбираемся в удалённых вызовах процедур для микросервисов.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;mt6j&quot;&gt;Что такое RPC? Разбираемся в удалённых вызовах процедур для микросервисов.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Dphg&quot;&gt;Как сотни внутренних сервисов таких компаний, как Netflix или Google, взаимодействуют друг с другом? И как это происходит миллионы раз в минуту?&lt;/p&gt;
  &lt;p id=&quot;0PlZ&quot;&gt;Стандартный REST API отлично подходит для публичного использования, но часто создаёт слишком много накладных расходов для внутренней высокоскоростной передачи данных. Это связано с тем, что обычно используются текстовые форматы, такие как JSON. Хотя они легко читаются, они неэффективны для сервисов, которым приходится обрабатывать миллионы запросов в день.&lt;/p&gt;
  &lt;p id=&quot;hTpK&quot;&gt;Вместо этого эти сервисы должны использовать язык, который невероятно компактен и быстр в обработке для компьютеров. Кроме того, им нужен заранее согласованный набор правил, своего рода общий план, который гарантирует, что обе стороны точно знают, как взаимодействовать друг с другом без ошибок.&lt;/p&gt;
  &lt;p id=&quot;mSSC&quot;&gt;И самое главное, он должен обеспечивать удобство для разработчиков без ущерба для производительности.&lt;/p&gt;
  &lt;p id=&quot;2NR5&quot;&gt;Современные приложения используют множество распределённых сервисов. Однако это создаёт серьёзную проблему:&lt;/p&gt;
  &lt;p id=&quot;faF6&quot;&gt;Как добиться максимальной эффективности взаимодействия между машинами? Вызов функции через сеть должен быть таким же простым, как и локальный вызов.&lt;/p&gt;
  &lt;p id=&quot;VZHH&quot;&gt;Ответ: удалённый вызов процедуры&lt;strong&gt; (RPC&lt;/strong&gt;). Это протокол, разработанный для высокопроизводительной внутренней коммуникации.&lt;/p&gt;
  &lt;p id=&quot;Is4h&quot;&gt;Вперед.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;lPR5&quot;&gt;Я хочу представить &lt;a href=&quot;https://x.com/asmah2107&quot; target=&quot;_blank&quot;&gt;Ашутоша&lt;/a&gt; в качестве приглашённого автора.&lt;/p&gt;
  &lt;figure id=&quot;Wh16&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!0L4q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe57d1a9-d1c6-471d-a558-15c78a1deb63_1200x630.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yLtU&quot;&gt;Он работает инженером-программистом в YouTube, ранее работал в Google Search и Microsoft Azure.&lt;/p&gt;
  &lt;h2 id=&quot;oqEt&quot;&gt;Что такое удалённый вызов процедуры&lt;/h2&gt;
  &lt;p id=&quot;GflY&quot;&gt;Давайте приступим!&lt;/p&gt;
  &lt;p id=&quot;pTb8&quot;&gt;RPC — это протокол, который позволяет вызывать функции из адресного пространства одной программы в адресном пространстве другой. Это освобождает разработчика от необходимости вручную управлять точками подключения к сети (&lt;strong&gt;сокетами&lt;/strong&gt;) или преобразовывать данные в формат, пригодный для отправки (&lt;strong&gt;сериализацию&lt;/strong&gt;).&lt;/p&gt;
  &lt;p id=&quot;S10S&quot;&gt;Когда ваш код вызывает такую функцию, как &lt;code&gt;math.sqrt(9)&lt;/code&gt;, вас не волнует сложный алгоритм, работающий внутри математической библиотеки. Вы просто доверяете её общедоступному API и знаете сигнатуру функции.&lt;/p&gt;
  &lt;p id=&quot;F5di&quot;&gt;RPC распространяет эту концепцию на всю сеть.&lt;/p&gt;
  &lt;p id=&quot;AScF&quot;&gt;Клиентское приложение получает объект-заглушку — локальный прокси-сервер, который отражает API удалённого сервиса. Но его методы содержат только логику для переадресации вызова по сети. Когда вы вызываете функцию на этом объекте-заглушке, он выполняет всю сложную сетевую коммуникацию в фоновом режиме, чтобы код выполнялся на сервере.&lt;/p&gt;
  &lt;figure id=&quot;97i5&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!MJ8U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf829ce3-62f6-44b9-acae-909601a5c8d3_1986x362.png&quot; width=&quot;1456&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;byfh&quot;&gt;Таким образом, вызов, подобный &lt;code&gt;result = paymentService.charge(userId, amount)&lt;/code&gt;, не обращается напрямую к платежному механизму. Вместо этого он вызывает локальный прокси-метод, который затем выполняет удаленную операцию. Благодаря этому удаленный вызов выглядит как простой вызов локальной библиотеки.&lt;/p&gt;
  &lt;p id=&quot;Fq3U&quot;&gt;Прежде чем двигаться дальше, давайте разберемся в следующем:&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;MzRM&quot;&gt;Как работает Удаленный вызов процедуры&lt;/h2&gt;
  &lt;h4 id=&quot;pYAj&quot;&gt;1. Клиентская заглушка (местный представитель)&lt;/h4&gt;
  &lt;p id=&quot;UfFB&quot;&gt;Ваш код не обращается напрямую к удалённому сервису. Вместо этого он взаимодействует с &lt;em&gt;заглушкой&lt;/em&gt; — локальным представителем, единственная задача которого — замещать удалённый сервис.&lt;/p&gt;
  &lt;p id=&quot;HhnT&quot;&gt;У него есть те же методы, которые вы хотите использовать, например, «&lt;code&gt;.charge()”&lt;/code&gt;. Но его настоящая цель — запустить процесс удалённой связи.&lt;/p&gt;
  &lt;h4 id=&quot;F90P&quot;&gt;2. Маршалинг (упаковка сообщения)&lt;/h4&gt;
  &lt;p id=&quot;zedS&quot;&gt;Заглушка принимает указанные вами параметры, например &lt;code&gt;userId&lt;/code&gt;, &lt;code&gt;amount&lt;/code&gt;, и упорядочивает их.&lt;/p&gt;
  &lt;p id=&quot;Ro25&quot;&gt;Маршалинг — это красивое слово, обозначающее сериализацию. Оно означает преобразование данных из формата языка программирования в стандартизированный формат, чтобы их можно было отправить по сети.&lt;/p&gt;
  &lt;p id=&quot;BmHe&quot;&gt;Представьте, что вы аккуратно упаковываете свои инструкции в универсальный контейнер для доставки, который может открыть любой сервер в мире. Этот формат часто представляет собой JSON или более компактный и быстрый формат, например &lt;a href=&quot;https://protobuf.dev/overview/&quot; target=&quot;_blank&quot;&gt;буферы протокола&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;i6eA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!p_gz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b4e832a-7b45-4578-9386-1f554e365273_1535x1028.png&quot; width=&quot;1456&quot; /&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;WwT3&quot;&gt;3. Сетевое путешествие&lt;/h4&gt;
  &lt;p id=&quot;i7ON&quot;&gt;Затем клиент отправляет это упакованное сообщение по сети на сервер, используя эффективные протоколы, такие как &lt;a href=&quot;https://en.wikipedia.org/wiki/HTTP/2&quot; target=&quot;_blank&quot;&gt;HTTP/2&lt;/a&gt;. Это «удаленная» часть вызова.&lt;/p&gt;
  &lt;h4 id=&quot;3Otr&quot;&gt;4. Скелет сервера&lt;/h4&gt;
  &lt;p id=&quot;P92A&quot;&gt;На сервере прослушивается «скелет». Это аналог клиентской заглушки.&lt;/p&gt;
  &lt;p id=&quot;U0WP&quot;&gt;Его задача — получить входящее сообщение и распаковать (или десериализовать) его. Представьте, что вы распаковываете транспортировочный контейнер и возвращаете данные в формат, понятный серверу.&lt;/p&gt;
  &lt;p id=&quot;2axD&quot;&gt;Затем скелет вызывает фактический метод сервиса с этими распакованными данными.&lt;/p&gt;
  &lt;h4 id=&quot;F1Qw&quot;&gt;5. Обратный путь&lt;/h4&gt;
  &lt;p id=&quot;aofz&quot;&gt;После того как сервер завершает свою работу, весь процесс повторяется в обратном порядке.&lt;/p&gt;
  &lt;p id=&quot;rlQg&quot;&gt;Скелет маршалирует возвращаемое значение, например, &lt;code&gt;{success: true}&lt;/code&gt;. Затем отправляет его обратно по сети, а клиентская заглушка демаршалирует его.&lt;/p&gt;
  &lt;p id=&quot;5ZSf&quot;&gt;После этого строка кода, в которой был выполнен исходный вызов, получает результат.&lt;/p&gt;
  &lt;p id=&quot;5tr1&quot;&gt;Далее я расскажу вам о различных сценариях сбоев RPC и способах их устранения.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Piwj&quot;&gt;Обработка ошибок при вызове удалённых процедур&lt;/h2&gt;
  &lt;p id=&quot;bQCe&quot;&gt;В распределённой системе сеть может быть ненадёжной.&lt;/p&gt;
  &lt;p id=&quot;6SyT&quot;&gt;Соединения обрываются. Службы работают медленно. Происходят сбои.&lt;/p&gt;
  &lt;p id=&quot;nYAu&quot;&gt;Надежная реализация RPC подразумевает не только успешные вызовы, но и корректную обработку ошибок. Вот несколько стратегий:&lt;/p&gt;
  &lt;h4 id=&quot;uLrQ&quot;&gt;1. Тайм-ауты (не ждите вечно)&lt;/h4&gt;
  &lt;p id=&quot;jWGS&quot;&gt;Тайм-аут — это простой срок ожидания.&lt;/p&gt;
  &lt;p id=&quot;CIdZ&quot;&gt;Каждый раз, когда клиент отправляет запрос, запускается таймер. Если клиент не получает ответ до истечения времени, отведённого на выполнение запроса, он прекращает попытку.&lt;/p&gt;
  &lt;figure id=&quot;nXXW&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!ddgN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08d4b562-e645-40e5-9e8c-4a1192c2d374_1627x489.png&quot; width=&quot;1456&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gJRZ&quot;&gt;&lt;em&gt;Почему это важно&lt;/em&gt;: без тайм-аутов ваше приложение может бесконечно ждать ответа от медленного или недоступного сервиса. Это приведет к нехватке ресурсов, таких как потоки или память, и в конечном итоге может привести к зависанию всего приложения. Тайм-ауты — это первая линия защиты клиента.&lt;/p&gt;
  &lt;h4 id=&quot;6NpO&quot;&gt;2. Повторные попытки (если первый вызов не увенчался успехом)&lt;/h4&gt;
  &lt;p id=&quot;upxq&quot;&gt;Многие сетевые ошибки носят временный характер: это сбой, который быстро устраняется.&lt;/p&gt;
  &lt;p id=&quot;bNze&quot;&gt;Иногда сервер может отвечать слишком долго или сетевой пакет может потеряться при передаче. В таких случаях имеет смысл автоматически повторить неудачный запрос.&lt;/p&gt;
  &lt;figure id=&quot;Fv01&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!xPl7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6cebb5e-ce3a-4376-a1c3-55a6b9b8ac6f_1627x484.png&quot; width=&quot;1456&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;r85H&quot;&gt;&lt;em&gt;Важное предостережение (идемпотентность)&lt;/em&gt;: повторные попытки могут быть опасны, если один и тот же запрос вызывает побочные эффекты при каждом выполнении. Операция является идемпотентной, если её многократное выполнение даёт тот же результат, что и однократное.&lt;/p&gt;
  &lt;p id=&quot;QBhj&quot;&gt;Например,&lt;/p&gt;
  &lt;ul id=&quot;EWDy&quot;&gt;
    &lt;li id=&quot;ODog&quot;&gt;Безопасно повторять (идемпотентно): получение баланса аккаунта пользователя. Повторное выполнение не изменит состояние системы.&lt;/li&gt;
    &lt;li id=&quot;gx2J&quot;&gt;Повторное выполнение (не идемпотентное) может привести к списанию средств с кредитной карты пользователя. Повторное выполнение может привести к дублированию платежей.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;nhTt&quot;&gt;Поэтому разработчики должны проектировать свои системы с учётом идемпотентности, например с использованием уникальных идентификаторов транзакций, чтобы можно было безопасно повторять попытки.&lt;/p&gt;
  &lt;h4 id=&quot;hqfB&quot;&gt;3. Автоматические выключатели (защита системы)&lt;/h4&gt;
  &lt;p id=&quot;JO7t&quot;&gt;Если сервис не работает или работает медленно, отправка дополнительных запросов только усугубит ситуацию.&lt;/p&gt;
  &lt;p id=&quot;cGwt&quot;&gt;Автоматический выключатель — это интеллектуальное устройство, которое предотвращает подобные ситуации.&lt;/p&gt;
  &lt;p id=&quot;TNto&quot;&gt;Если клиент замечает, что многие обращения к сервису завершаются неудачей, автоматический выключатель «срабатывает» и на короткое время прекращает отправку запросов к этому сервису. В этот период любые новые обращения завершаются мгновенным сбоем, а не отправляются по сети.&lt;/p&gt;
  &lt;figure id=&quot;k1i3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!8k96!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6a7f337-7a66-4520-aa51-c3fdc7c080df_1627x484.png&quot; width=&quot;1456&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Yzq4&quot;&gt;&lt;em&gt;Почему это важно:&lt;/em&gt; Автоматические выключатели предотвращают каскадные сбои. Они дают сбойной службе время на восстановление. И не позволяют клиенту тратить время и ресурсы на вызовы, которые, скорее всего, завершатся неудачей.&lt;/p&gt;
  &lt;h4 id=&quot;1505&quot;&gt;4. Продление сроков (не начинайте работу, которую не сможете закончить)&lt;/h4&gt;
  &lt;p id=&quot;buxL&quot;&gt;Один пользовательский запрос часто запускает цепочку вызовов между несколькими сервисами. Например, сервис A вызывает сервис B, а сервис B вызывает сервис C.&lt;/p&gt;
  &lt;p id=&quot;86hI&quot;&gt;Если общий тайм-аут исходного запроса составляет 500 мс, а служба A уже использует 300 мс. Тогда службе C нет смысла запускать задачу, которая займёт ещё 400 мс, потому что клиент уже перестанет ждать.&lt;/p&gt;
  &lt;figure id=&quot;n7rN&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!wsxM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46262b81-f56a-4f1a-807b-eee21d6fd5a8_1627x464.png&quot; width=&quot;1456&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;YxSK&quot;&gt;&lt;em&gt;Распространение крайнего срока&lt;/em&gt;исправляет эту проблему, передавая оставшийся срок выполнения при каждом вызове. Таким образом, каждый сервис знает, сколько времени у него осталось, и может решить, успеет ли он выполнить свою часть работы до истечения срока.&lt;/p&gt;
  &lt;p id=&quot;SaFH&quot;&gt;&lt;em&gt;Почему это важно: &lt;/em&gt;Такой подход позволяет избежать лишней работы и обеспечивает быстродействие и отзывчивость системы. Сервисы могут «быстро завершать работу» вместо того, чтобы выполнять длительные операции для запроса, который уже не имеет значения.&lt;/p&gt;
  &lt;p id=&quot;J918&quot;&gt;Как и любая технология, RPC не идеальна. У неё есть свои сильные стороны, но есть и недостатки, на которые следует обратить внимание. Продолжим!&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;myDj&quot;&gt;RPC: хорошее, плохое и ужасное&lt;/h2&gt;
  &lt;h4 id=&quot;FEb0&quot;&gt;Преимущества&lt;/h4&gt;
  &lt;ul id=&quot;xDvF&quot;&gt;
    &lt;li id=&quot;oeVn&quot;&gt;Простая модель программирования: вы можете вызывать удалённые функции так же, как и локальные, что делает ваш код чище и проще.&lt;/li&gt;
    &lt;li id=&quot;ca22&quot;&gt;Высокая производительность: RPC использует компактные двоичные форматы, которые быстро обрабатываются компьютерами.&lt;/li&gt;
    &lt;li id=&quot;dfvH&quot;&gt;Строгая типизация: поскольку обе стороны соблюдают строгие правила, ошибки часто выявляются на ранней стадии, до того как они приведут к проблемам.&lt;/li&gt;
    &lt;li id=&quot;8o80&quot;&gt;Языковая совместимость: клиент и сервер могут использовать разные языки программирования и при этом беспрепятственно взаимодействовать.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;tQzN&quot;&gt;Недостатки&lt;/h4&gt;
  &lt;ul id=&quot;MXW6&quot;&gt;
    &lt;li id=&quot;S1LX&quot;&gt;Тесная связь: при изменении API сервера обычно требуется обновление и клиента, что может замедлить процесс разработки.&lt;/li&gt;
    &lt;li id=&quot;jKyY&quot;&gt;Менее доступны для обнаружения, чем REST: Вы не сможете легко протестировать или просмотреть RPC API без специальных файлов контрактов.&lt;/li&gt;
    &lt;li id=&quot;Wnv8&quot;&gt;Требуется специализированное оборудование: для генерации кода для клиента и сервера нужны специальные инструменты.&lt;/li&gt;
    &lt;li id=&quot;YDlq&quot;&gt;Абстракция скрывает сетевые реалии. Поскольку удалённые вызовы выглядят как локальные, разработчики могут забыть, что имеют дело с сетью, и не обработать должным образом тайм-ауты или ошибки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;jWkf&quot;&gt;Теперь давайте рассмотрим, как на самом деле работает RPC в реальных системах и с какими трудностями можно столкнуться при его масштабировании.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;2sSm&quot;&gt;RPC в реальном мире&lt;/h2&gt;
  &lt;p id=&quot;xzmA&quot;&gt;Использование RPC в реальных системах сопряжено с рядом практических трудностей. Вот четыре наиболее распространённые из них, с которыми приходится сталкиваться разработчикам:&lt;/p&gt;
  &lt;h4 id=&quot;bGVN&quot;&gt;&lt;strong&gt;1. Обнаружение сервисов (как сервисы находят друг друга?)&lt;/strong&gt;&lt;/h4&gt;
  &lt;p id=&quot;hNg4&quot;&gt;В современных системах серверы постоянно меняются: их добавляют, удаляют или перезапускают, часто присваивая им новые IP-адреса.&lt;/p&gt;
  &lt;p id=&quot;iO3j&quot;&gt;Но вы не можете просто указать местоположение сервера в своём коде. Так как же клиент узнаёт, куда отправлять запрос?&lt;/p&gt;
  &lt;p id=&quot;FfHp&quot;&gt;Вот тут-то и вступает в игру &lt;em&gt;обнаружение сервисов&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;VlwK&quot;&gt;&lt;em&gt;Аналогия: &lt;/em&gt;Представьте, что это живой, самообновляющийся список контактов. Вам не нужно запоминать точный домашний адрес вашего друга. Вместо этого вы просто ищете его имя в списке контактов, чтобы узнать его последний адрес.&lt;/p&gt;
  &lt;p id=&quot;vc2b&quot;&gt;&lt;em&gt;Как это работает: &lt;/em&gt;Центральный реестр (например, &lt;a href=&quot;https://developer.hashicorp.com/consul&quot; target=&quot;_blank&quot;&gt;Consul&lt;/a&gt; или &lt;a href=&quot;https://zookeeper.apache.org/&quot; target=&quot;_blank&quot;&gt;Zookeeper&lt;/a&gt;) отслеживает все работоспособные сервисы и их местоположение. Поэтому, когда клиент хочет связаться с платёжным сервисом, он спрашивает у реестра: «Где я могу его найти?»&lt;/p&gt;
  &lt;p id=&quot;U7la&quot;&gt;Затем реестр возвращает список работоспособных серверов, и клиент выбирает один из них для отправки RPC-вызова.&lt;/p&gt;
  &lt;h4 id=&quot;92Hr&quot;&gt;&lt;strong&gt;2. Эволюция API (как обновлять сервисы, не нарушая работу всего остального?)&lt;/strong&gt;&lt;/h4&gt;
  &lt;p id=&quot;sl4c&quot;&gt;Когда сервис добавляет новую функцию, может потребоваться изменить параметры функции. Если клиенты не обновят систему сразу, это может привести к сбоям из-за тесной связи.&lt;/p&gt;
  &lt;p id=&quot;cmcf&quot;&gt;Решение заключается в &lt;em&gt;обратной совместимости&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;ZTvn&quot;&gt;&lt;em&gt;Аналогия: &lt;/em&gt;Представьте, что вы разослали форму для опроса. Вы можете спокойно добавить новый необязательный вопрос; старые формы по-прежнему будут работать. Но если вы удалите вопрос или сделаете новый вопрос обязательным, все старые формы станут недействительными.&lt;/p&gt;
  &lt;p id=&quot;aS8p&quot;&gt;&lt;em&gt;Как это работает: &lt;/em&gt;RPCфреймворки, такие как &lt;a href=&quot;https://grpc.io/&quot; target=&quot;_blank&quot;&gt;gRPC&lt;/a&gt;, следуют строгим правилам обновления API. Например, вы можете спокойно добавлять необязательные поля, но не должны удалять или изменять существующие. Это позволяет новым версиям сервиса работать без сбоев, а старым клиентам — продолжать работать.&lt;/p&gt;
  &lt;h4 id=&quot;qGHF&quot;&gt;&lt;strong&gt;3. Потоковая передача (больше, чем просто запрос и ответ)&lt;/strong&gt;&lt;/h4&gt;
  &lt;p id=&quot;eGZC&quot;&gt;RPC не ограничивается моделью «один запрос — один ответ».&lt;/p&gt;
  &lt;p id=&quot;bNRa&quot;&gt;Современные фреймворки, такие как gRPC, поддерживают &lt;em&gt;потоковую передачу&lt;/em&gt;, при которой данные непрерывно передаются между клиентом и сервером.&lt;/p&gt;
  &lt;p id=&quot;496U&quot;&gt;&lt;em&gt;Аналогия: &lt;/em&gt;Обычный RPC-вызов похож на отправку текстового сообщения и получение одного ответа. Потоковый RPC-вызов похож на телефонный звонок или видеопоток: обе стороны могут обмениваться информацией в режиме реального времени.&lt;/p&gt;
  &lt;p id=&quot;rzXS&quot;&gt;&lt;em&gt;Как это работает:&lt;/em&gt;&lt;/p&gt;
  &lt;ul id=&quot;kpdR&quot;&gt;
    &lt;li id=&quot;Y7vW&quot;&gt;Потоковая передача с сервера: клиент отправляет один запрос и получает в ответ поток данных (например, при подписке на обновления в реальном времени).&lt;/li&gt;
    &lt;li id=&quot;Cl9X&quot;&gt;Клиентская потоковая передача: клиент отправляет поток сообщений и получает один ответ (например, при загрузке большого файла).&lt;/li&gt;
    &lt;li id=&quot;0yOe&quot;&gt;Двунаправленная потоковая передача: и клиент, и сервер могут отправлять сообщения в любое время (например, в чате в реальном времени).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;xksU&quot;&gt;&lt;strong&gt;4. Обработка ошибок и коды состояния (сообщение о том, что пошло не так)&lt;/strong&gt;&lt;/h4&gt;
  &lt;p id=&quot;uYTs&quot;&gt;Когда что-то идёт не так, клиенту нужно больше информации, чем просто сообщение «что-то пошло не так». Тогда он сможет предпринять необходимые шаги.&lt;/p&gt;
  &lt;p id=&quot;UceX&quot;&gt;Вот тут-то и появляются &lt;em&gt;коды состояния&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;BoDm&quot;&gt;Как и в случае с кодами состояния HTTP (404 Not Found, 403 Forbidden, 500 Internal Server Error), в RPC-фреймворках есть свои стандартизированные коды:&lt;/p&gt;
  &lt;ul id=&quot;1as6&quot;&gt;
    &lt;li id=&quot;dB7n&quot;&gt;&lt;code&gt;NOT_FOUND&lt;/code&gt;,&lt;/li&gt;
    &lt;li id=&quot;clFa&quot;&gt;&lt;code&gt;PERMISSION_DENIED&lt;/code&gt;,&lt;/li&gt;
    &lt;li id=&quot;S1j9&quot;&gt;&lt;code&gt;INVALID_ARGUMENT&lt;/code&gt;,&lt;/li&gt;
    &lt;li id=&quot;dPOJ&quot;&gt;&lt;code&gt;UNAVAILABLE&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;CgZL&quot;&gt;&lt;em&gt;Как это работает: &lt;/em&gt;Возвращая определённый код ошибки, сервер сообщает клиенту, что делать дальше.&lt;/p&gt;
  &lt;ul id=&quot;LNmJ&quot;&gt;
    &lt;li id=&quot;Z4xb&quot;&gt;Повторите попытку, если услуга была временно недоступна.&lt;/li&gt;
    &lt;li id=&quot;V2yM&quot;&gt;Сообщите об ошибке ввода данных пользователем, если аргумент был недопустимым.&lt;/li&gt;
    &lt;li id=&quot;pFjg&quot;&gt;Или прекратите попытки, если проблему невозможно решить автоматически.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;r1FU&quot;&gt;Теперь, когда мы увидели, как работает RPC в реальных системах, давайте сравним его с другими моделями взаимодействия.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;858D&quot;&gt;Выбор правильного шаблона общения&lt;/h3&gt;
  &lt;ul id=&quot;gFki&quot;&gt;
    &lt;li id=&quot;mbhw&quot;&gt;RPC (&lt;a href=&quot;https://grpc.io/&quot; target=&quot;_blank&quot;&gt;gRPC&lt;/a&gt;, &lt;a href=&quot;https://thrift.apache.org/&quot; target=&quot;_blank&quot;&gt;Thrift&lt;/a&gt;): лучше всего подходит для высокопроизводительных внутренних микросервисов.&lt;/li&gt;
    &lt;li id=&quot;0Zam&quot;&gt;REST: идеально подходит для общедоступных API и операций, ориентированных на ресурсы.&lt;/li&gt;
    &lt;li id=&quot;LXom&quot;&gt;&lt;a href=&quot;https://graphql.org/&quot; target=&quot;_blank&quot;&gt;GraphQL&lt;/a&gt;: отлично подходит для получения данных, специфичных для конкретного клиента.&lt;/li&gt;
    &lt;li id=&quot;94wr&quot;&gt;Очереди сообщений: идеально подходят для асинхронных, автономных рабочих процессов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;bK9S&quot;&gt;Итог&lt;/h3&gt;
  &lt;p id=&quot;Em9j&quot;&gt;RPC скрывает большую часть сетевых деталей, но не устраняет их полностью. Вам всё равно нужно предусмотреть возможность сбоев.&lt;/p&gt;
  &lt;p id=&quot;gGZy&quot;&gt;В то же время gRPC с буферами протокола стал новым стандартом для быстрой и надёжной связи между внутренними сервисами.&lt;/p&gt;
  &lt;p id=&quot;J0I4&quot;&gt;Помните, что успешная настройка RPC зависит от поддерживающих систем. Поэтому для бесперебойной работы необходимы обнаружение сервисов, трассировка и мониторинг.&lt;/p&gt;
  &lt;p id=&quot;KOpQ&quot;&gt;Перевод: &lt;a href=&quot;https://newsletter.systemdesign.one/p/how-rpc-works&quot; target=&quot;_blank&quot;&gt;https://newsletter.systemdesign.one/p/how-rpc-works&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:mcp</id><link rel="alternate" type="text/html" href="https://devz.su/mcp?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>MCP Protocol: новый строительный блок для инструментов разработки ИИ</title><published>2025-10-31T06:26:27.189Z</published><updated>2025-10-31T06:26:27.189Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/06/55/06557080-2a4b-4108-a2f8-64848140cb01.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!zlEj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18bd886d-1226-4d59-ba48-c44494e525ba_1600x1187.png&quot;&gt;Одной из актуальных тем на стыке инструментов для написания кода на основе ИИ и инструментов для разработчиков стал протокол MCP (Model Context Protocol), представленный в ноябре 2024 года компанией Anthropic. Он стремительно набирает популярность, а модели ИИ и инструменты для разработчиков стремятся добавить его поддержку.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;azww&quot;&gt;Протокол Model Context, расширяющий возможности искусственного интеллекта в IDE, стремительно набирает популярность. Почему так происходит и почему нам, разработчикам, стоит обратить на это внимание?&lt;/h3&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Wat7&quot;&gt;Одной из актуальных тем на стыке инструментов для написания кода на основе ИИ и инструментов для разработчиков стал протокол MCP (Model Context Protocol), &lt;a href=&quot;https://www.anthropic.com/news/model-context-protocol&quot; target=&quot;_blank&quot;&gt;представленный&lt;/a&gt; в ноябре 2024 года компанией Anthropic. Он стремительно набирает популярность, а модели ИИ и инструменты для разработчиков стремятся добавить его поддержку.&lt;/p&gt;
  &lt;p id=&quot;7tpP&quot;&gt;Аналогия с MCP заключается в том, что это «порт USB-C для приложений ИИ», поскольку он создаёт универсальную точку расширения для подключения LLM и инструментов разработки друг к другу, а также к базам данных, системам обработки заявок и т. д. Эта концепция становится популярной и в других областях, но изначально MCP создавался как способ расширить возможности таких IDE для разработчиков, как Claude Desktop, Claude Code, VS Code, Cursor, Windsurf и других. Сегодня мы сосредоточимся на этой области и рассмотрим:&lt;/p&gt;
  &lt;ol id=&quot;xoa6&quot;&gt;
    &lt;li id=&quot;xnvR&quot;&gt;&lt;strong&gt;Что такое MCP? Практический пример&lt;/strong&gt;. Раньше я использовал отдельный инструмент для запросов к базе данных в рабочем приложении. Но с помощью MCP я могу «общаться» с базой данных прямо из IDE, и это меняет всё!&lt;/li&gt;
    &lt;li id=&quot;OdQz&quot;&gt;&lt;strong&gt;Происхождение MCP.&lt;/strong&gt; Два инженера из Anthropic — Дэвид Сориа Парра и Джастин Спар-Саммерс — решили улучшить работу Claude Desktop с помощью инструментов для разработчиков.&lt;/li&gt;
    &lt;li id=&quot;lrqt&quot;&gt;&lt;strong&gt;Чтобы понять MCP, нужно разобраться в протоколе Language Server Protocol (LSP).&lt;/strong&gt; Многие ключевые идеи MCP основаны на подходе Microsoft, направленном на упрощение добавления поддержки языков программирования в IDE.&lt;/li&gt;
    &lt;li id=&quot;CqVd&quot;&gt;&lt;strong&gt;Архитектура MCP.&lt;/strong&gt; Клиенты и серверы, где серверы часто представляют собой локальные процессы.&lt;/li&gt;
    &lt;li id=&quot;FA2T&quot;&gt;&lt;strong&gt;Исходный код MCP-сервера.&lt;/strong&gt; Как простой локальный MCP-сервер помогает нам понять, как он работает.&lt;/li&gt;
    &lt;li id=&quot;a8oO&quot;&gt;&lt;strong&gt;Угрозы безопасности. &lt;/strong&gt;При текущей реализации MCP защита выглядит удручающе слабой, и злоумышленники, скорее всего, воспользуются возможностью получить SSH-ключи и другие личные учётные данные, к которым локальные серверы MCP могут легко получить несанкционированный доступ. Эту проблему нужно решать, и быстро.&lt;/li&gt;
    &lt;li id=&quot;4ZAT&quot;&gt;&lt;strong&gt;Сценарии использования в будущем.&lt;/strong&gt; Подключение Figma к VS Code, 3D-моделирование с помощью Cursor и управление 3D-принтером из Windsurf — всё это возможно с помощью MCP. Кроме того, MCP набирает популярность за пределами IDE.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;sttB&quot;&gt;&lt;em&gt;Для этой статьи я побеседовал с одним из создателей MCP, &lt;a href=&quot;https://x.com/dsp_&quot; target=&quot;_blank&quot;&gt;Дэвидом Сорией Паррой&lt;/a&gt;, инженером-программистом в Anthropic. Спасибо за информацию!&lt;/em&gt;&lt;/p&gt;
  &lt;h2 id=&quot;eZGA&quot;&gt;1. Что такое MCP? Практический пример&lt;/h2&gt;
  &lt;p id=&quot;5Rf9&quot;&gt;У меня есть API, который обеспечивает работу &lt;a href=&quot;https://api.pragmaticengineer.com/kagi_and_perplexity&quot; target=&quot;_blank&quot;&gt;этого микросайта&lt;/a&gt;, где участники с годовой подпиской могут запросить промокод на 12 месяцев бесплатного доступа к Perplexity и 3 месяца бесплатного доступа к Kagi. Сайт работает на Node. js с использованием TypeScript и PostgreSQL в качестве базы данных.&lt;/p&gt;
  &lt;p id=&quot;Tnvo&quot;&gt;Всякий раз, когда я вношу изменения в бэкенд или фронтенд и редактирую данные, я делаю две вещи:&lt;/p&gt;
  &lt;ol id=&quot;KKwO&quot;&gt;
    &lt;li id=&quot;dTDn&quot;&gt;Моя IDE с самим кодом и встроенным терминалом&lt;/li&gt;
    &lt;li id=&quot;UqUH&quot;&gt;Интерфейс администратора базы данных для запроса таблиц или изменения схем, если это необходимо. Я использую PgAdmin.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;hysw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!zlEj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18bd886d-1226-4d59-ba48-c44494e525ba_1600x1187.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;В моей системе открыт pgAdmin (административный интерфейс PostgreSQL)&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;EwGr&quot;&gt;IDE становятся все умнее благодаря функциональности LLM; Windsurf и Cursor обладают агентскими возможностями, поэтому могут предлагать изменения для нескольких файлов одновременно. Однако они не могут подключиться к моей базе данных PostgreSQL для запроса данных. Но с MCP они могут – и я тоже.&lt;/p&gt;
  &lt;p id=&quot;UfYF&quot;&gt;MCP расшифровывается как Model Context Protocol и является связующим звеном, позволяющим инструментам LLM, таким как IDE с улучшенным искусственным интеллектом, таким как Cursor, Windsurf и другим, получать доступ к дополнительным инструментам.&lt;/p&gt;
  &lt;p id=&quot;elp9&quot;&gt;Вот как я использую подсказки LLM, чтобы сделать свою базу данных доступной в IDE. В этом примере я использовал Windsurf, но то же самое можно сделать в Cursor, Zed и VS Code.&lt;/p&gt;
  &lt;h4 id=&quot;hZ20&quot;&gt;Добавление MCP-сервера PostgreSQL в мою IDE&lt;/h4&gt;
  &lt;p id=&quot;LEUY&quot;&gt;Для начала в разделе «Настройки» в подразделе «Cascade» (агентские возможности Windsurf) я выбираю «Добавить сервер MCP». Здесь отображается раскрывающийся список с готовыми серверами:&lt;/p&gt;
  &lt;figure id=&quot;Ntbm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!82hT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F034c5bb8-b1cc-40a8-9e92-6033145be539_1178x1352.png&quot; width=&quot;1178&quot; /&gt;
    &lt;figcaption&gt;Windsurf поддерживает несколько MCP-серверов. Я выбрал MCP-сервер на базе PostgreSQL&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pC0k&quot;&gt;Добавление означает настройку строки подключения к вашей базе данных, которая может быть локальной базой данных Postgres, работающей на вашем компьютере, или удалённой. Я использовал строку удалённого подключения для подключения к базе данных на моём сервере. После добавления подключённая база данных отображается как сервер MCP, готовый к использованию:&lt;/p&gt;
  &lt;figure id=&quot;jo8A&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!hbxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ce41fe5-6691-4167-b660-1914e041aa38_1240x424.png&quot; width=&quot;1240&quot; /&gt;
    &lt;figcaption&gt;Добавлен сервер Postgres, и наша IDE стала ещё функциональнее&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;EZNf&quot;&gt;В дальнейшем при вводе любой команды в интерфейсе Cascade LLM может принять решение использовать этот сервер. Позвольте мне начать с вопроса о промокодах:&lt;/p&gt;
  &lt;blockquote id=&quot;Kkic&quot;&gt;«Сколько пользователей воспользовались промокодами kagi за последние 10 дней?»&lt;/blockquote&gt;
  &lt;p id=&quot;rib1&quot;&gt;Языковая модель пытается сгенерировать SQL-сервер для получения ответа, но выдаёт имя несуществующей таблицы (что довольно типично для языковых моделей):&lt;/p&gt;
  &lt;figure id=&quot;P3ND&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!cSpn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F595b9587-088c-4f06-b7c0-51b5beb4cb45_1600x536.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;LLM попытался использовать мою базу данных Postgres, но неправильно назвал таблицу&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;QghZ&quot;&gt;&lt;strong&gt;Однако именно здесь начинается «волшебство», благодаря тому, что LLM выполняет дополнительные итерации, используя этот новый инструмент базы данных. &lt;/strong&gt;LLM обращается к моему экземпляру PostgreSQL, чтобы найти правильное имя таблицы:&lt;/p&gt;
  &lt;figure id=&quot;x6dy&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!X4fx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24913b96-1fa3-45f0-90b9-30d40cf17588_1600x707.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;LLM начинает «правильно» использовать сервер PostgreSQL MCP и определяет, к каким таблицам у него есть доступ&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nUBn&quot;&gt;Затем он отправляет ещё один запрос:&lt;/p&gt;
  &lt;figure id=&quot;0sFG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!IcoG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F63f5fce6-296e-4b77-8d41-8ab4bfc175ca_1600x490.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;Ещё одна попытка, на этот раз с правильным названием&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mOqh&quot;&gt;Чёрт! — названия столбцов снова неверны! Но программа запрашивает определение таблицы и быстро исправляет его:&lt;/p&gt;
  &lt;figure id=&quot;fCD0&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!2tnh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78997e2a-d09a-4165-8dcf-7fdc3961f904_1600x803.png&quot; width=&quot;728&quot; /&gt;
    &lt;figcaption&gt;LLM использует сервер PostgreSQL MCP для самокоррекции&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;OIXE&quot;&gt;Наконец-то всё стало правильно:&lt;/p&gt;
  &lt;figure id=&quot;6wPV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!-6bD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f1e143-c5ab-479f-af70-e600095384ae_1600x669.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;Правильный ответ!&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PWS4&quot;&gt;Что действительно впечатляет, так это то, что процесс занял всего несколько секунд, и мне не пришлось ничего вводить. Языковая модель «вычислила» правильные названия таблиц и столбцов, имея доступ к базе данных.&lt;/p&gt;
  &lt;h4 id=&quot;a23M&quot;&gt;Уровень LLM над PostgreSQL&lt;/h4&gt;
  &lt;p id=&quot;dDpJ&quot;&gt;Теперь, когда я добавил свою базу данных в качестве сервера MCP, я могу «общаться» со своими данными на естественном языке, а LLM преобразует их в SQL-запрос, а затем обратно в мой вопрос. Это касается не только простых вопросов с простым SQL-запросом, но и более неоднозначных.&lt;/p&gt;
  &lt;p id=&quot;fHwj&quot;&gt;Другие вопросы, которые я задавал:&lt;/p&gt;
  &lt;ul id=&quot;juS7&quot;&gt;
    &lt;li id=&quot;CtxN&quot;&gt;«Наблюдался ли необычный всплеск регистраций за последние два месяца?»&lt;/li&gt;
    &lt;li id=&quot;wTWe&quot;&gt;«Какие подозрительные адреса электронной почты были зарегистрированы недавно? Есть какие-то закономерности?»&lt;/li&gt;
    &lt;li id=&quot;6gCH&quot;&gt;«В каких доменах больше всего регистраций?»&lt;/li&gt;
    &lt;li id=&quot;1taJ&quot;&gt;«Сколько осталось невостребованных промокодов?»&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;QS59&quot;&gt;&lt;strong&gt;Возможность взаимодействовать с инструментами разработчика через мою IDE кажется «будущим». &lt;/strong&gt;Не то чтобы я не мог найти ответы на вышеперечисленные вопросы без этого; я &lt;em&gt;мог бы&lt;/em&gt; написать SQL-команды, или их серию, или небольшую программу для циклического выполнения команд и их обобщения. Однако я, скорее всего, не стал бы этого делать, потому что на ввод SQL-кода уходит время. Но поскольку я могу легко вводить вопросы, я это и сделал!&lt;/p&gt;
  &lt;p id=&quot;9yPT&quot;&gt;Подумайте о том, что произойдёт, если вы сможете «общаться» со своими инструментами разработчика через IDE. Например, использовать естественный язык для взаимодействия с:&lt;/p&gt;
  &lt;ul id=&quot;8Dvs&quot;&gt;
    &lt;li id=&quot;3d4e&quot;&gt;Система контроля версий («Можете ли вы создать пул-реквест со всеми изменениями, кроме одного в index.ts?»)&lt;/li&gt;
    &lt;li id=&quot;hLXu&quot;&gt;Базы данных («Можете ли вы создать новую таблицу для регистрации пользователей? Используйте инкрементный счетчик в качестве первичного ключа и сохраняйте временную метку для каждого журнала регистрации»)&lt;/li&gt;
    &lt;li id=&quot;72sk&quot;&gt;Система отслеживания заявок/ошибок («Были ли зарегистрированы ошибки, связанные с этой функцией?»)&lt;/li&gt;
    &lt;li id=&quot;dBWF&quot;&gt;Поставщик услуг мониторинга («Были ли за последнюю неделю всплески активности, связанные с ошибками при входе в систему или выходе из неё?»)&lt;/li&gt;
    &lt;li id=&quot;4JvT&quot;&gt;Система флагов функций / экспериментов («Какие флаги были полностью внедрены как минимум за неделю? Можете ли вы помочь определить их и создать PR-запрос для их удаления?»)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8d70&quot;&gt;Использование этих инструментов из IDE упрощает работу. Кроме того, если мы можем их использовать, то и ИИ-агенты смогут, а значит, они смогут выполнять более сложные задачи.&lt;/p&gt;
  &lt;p id=&quot;x85B&quot;&gt;&lt;strong&gt;Мне кажется, что концепция MCP может стать ещё одним шагом вперёд в повышении продуктивности разработчиков.&lt;/strong&gt; Вероятно, это также расширит возможности ИИ-агентов, поскольку у них появятся дополнительные инструменты для решения более сложных задач. Трудно представить, что коммерческие поставщики &lt;em&gt;не&lt;/em&gt; будут стремиться добавить серверы MCP, которые позволят клиентам проще использовать инструменты из IDE.&lt;/p&gt;
  &lt;p id=&quot;fBtu&quot;&gt;Как разработчики, мы сможем экспериментировать с инструментами, которые повысят нашу продуктивность. &lt;em&gt;Следует отметить, что MCP всё ещё находится на ранней стадии развития и не имеет проверенных торговых площадок, поддержка MCP в IDE появилась всего несколько месяцев назад, а в реализациях MCP есть много тревожных уязвимостей, о которых мы расскажем в разделе «Угрозы безопасности» ниже.&lt;/em&gt;&lt;/p&gt;
  &lt;h2 id=&quot;HpaQ&quot;&gt;2. Происхождение MCP&lt;/h2&gt;
  &lt;p id=&quot;6xyI&quot;&gt;Протокол MCP был разработан двумя инженерами-программистами из Anthropic, &lt;a href=&quot;https://www.linkedin.com/in/david-soria-parra-4a78b3a/&quot; target=&quot;_blank&quot;&gt;Дэвидом Сорией Паррой&lt;/a&gt; и &lt;a href=&quot;https://www.linkedin.com/in/jspahrsummers/&quot; target=&quot;_blank&quot;&gt;Джастином Спаром-Саммерсом&lt;/a&gt;. Дэвид рассказал историю создания в &lt;a href=&quot;https://www.latent.space/p/mcp&quot; target=&quot;_blank&quot;&gt;выпуске подкаста Latent Space&lt;/a&gt;.&lt;/p&gt;
  &lt;blockquote id=&quot;KgZm&quot;&gt;«В июле 2024 года я работал над внутренними инструментами для разработчиков. Мы стремились дать больше возможностей сотрудникам Anthropic для глубокой интеграции с нашими моделями и максимально эффективного обучения наших моделей.Имея опыт работы с инструментами для разработки, я быстро оценил все преимущества Claude Desktop, в том числе такие функции, как Artifacts, но был разочарован ограниченным набором функций и отсутствием возможности его расширения. В то же время я выполняю свою повседневную работу в IDE. В IDE есть доступ к таким вещам, как локальная файловая система, но нет такого инструмента, как Artifacts, или чего-то подобного.Я постоянно копировал данные между Claude Desktop и IDE, и это меня раздражало. Я думал, что знаю, как создавать все интеграции, но что мне нужно сделать, чтобы эти IDE могли создавать интеграции?Если присмотреться, то можно увидеть, что проблема «интеграции ИИ» — это проблема MxN. У вас есть M приложений (например, IDE) и N интеграций.Размышляя над этой проблемой, я работал над &lt;a href=&quot;http://g/&quot; target=&quot;_blank&quot;&gt;протоколом Language Server Protocol&lt;/a&gt; (LSP) внутри компании, но этот проект ни к чему не привёл. Но если объединить эти идеи: LSP и недовольство интеграцией с IDE, — и дать им настояться несколько недель, то появится идея «давайте создадим какой-нибудь протокол для решения этой проблемы».&lt;/blockquote&gt;
  &lt;p id=&quot;Jf85&quot;&gt;Подробнее об истории протокола MCP можно узнать из &lt;a href=&quot;https://www.latent.space/p/mcp&quot; target=&quot;_blank&quot;&gt;этого выпуска подкаста Latent Space&lt;/a&gt;.&lt;/p&gt;
  &lt;h4 id=&quot;pz8S&quot;&gt;Открытый исходный код протокола MCP&lt;/h4&gt;
  &lt;p id=&quot;c7RR&quot;&gt;Дэвид объединился с коллегой-инженером Джастином, и они создали первые прототипы, продолжили работу над ними и через шесть недель получили первую работающую интеграцию MCP для Claude Desktop.&lt;/p&gt;
  &lt;p id=&quot;jYlc&quot;&gt;Они поделились прототипом внутри компании, и коллеги-разработчики из Anthropic были в восторге. Готовясь к публикации протокола в открытом доступе, участники внутреннего хакатона Anthropic создали множество интересных приложений, в том числе сервер MCP, управляющий 3D-принтером. Это подтвердило догадку Дэвида и Джастина о том, что MCP может быть очень полезен в реальном мире.&lt;/p&gt;
  &lt;p id=&quot;8ix6&quot;&gt;Они провели дополнительную доработку и &lt;a href=&quot;https://www.anthropic.com/news/model-context-protocol&quot; target=&quot;_blank&quot;&gt;объявили&lt;/a&gt; об открытом доступе к протоколу MCP 25 ноября прошлого года. На тот момент протокол MCP был таким:&lt;/p&gt;
  &lt;ul id=&quot;zjfZ&quot;&gt;
    &lt;li id=&quot;PCVw&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/introduction&quot; target=&quot;_blank&quot;&gt;Веб-сайт&lt;/a&gt;, на котором описан протокол, способы реализации сервера MCP и руководства для клиентов (например, по интеграции протокола в IDE)&lt;/li&gt;
    &lt;li id=&quot;6mGF&quot;&gt;&lt;a href=&quot;https://spec.modelcontextprotocol.io/&quot; target=&quot;_blank&quot;&gt;Спецификация&lt;/a&gt; самого протокола&lt;/li&gt;
    &lt;li id=&quot;zfnP&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/introduction&quot; target=&quot;_blank&quot;&gt;SDK&lt;/a&gt;для Python, TypeScript, Java, Kotlin и C#&lt;/li&gt;
    &lt;li id=&quot;dqGR&quot;&gt;&lt;a href=&quot;https://modelcontextprotocol.io/examples&quot; target=&quot;_blank&quot;&gt;Примеры&lt;/a&gt;серверных и клиентских реализаций для справки&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;MYxn&quot;&gt;Быстрое внедрение в отрасль&lt;/h4&gt;
  &lt;p id=&quot;Ivox&quot;&gt;Всего за четыре месяца MCP превратился из простого протокола, который использовал Claude Desktop с открытым исходным кодом, во все основные IDE, а инструменты искусственного интеллекта добавили поддержку MCP, включая OpenAI:&lt;/p&gt;
  &lt;ul id=&quot;JhDV&quot;&gt;
    &lt;li id=&quot;3Ecl&quot;&gt;Июль 2024 года: в Anthropic начинается разработка MCP&lt;/li&gt;
    &lt;li id=&quot;rWRM&quot;&gt;Август:&lt;/li&gt;
    &lt;ul id=&quot;PuC6&quot;&gt;
      &lt;li id=&quot;PgLt&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://zed.dev/&quot; target=&quot;_blank&quot;&gt;Zed&lt;/a&gt;&lt;/strong&gt; редактор &lt;a href=&quot;https://github.com/zed-industries/zed/commit/02ea6ac8456baa4260c7883eaec79157be597150&quot; target=&quot;_blank&quot;&gt;добавляет&lt;/a&gt; поддержку сервера MCP. Забавный факт: Дэвид и Джастин использовали Zed на работе и встроили клиент MCP в Zed!&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;nWmp&quot;&gt;Январь 2025 года:&lt;/li&gt;
    &lt;ul id=&quot;SkWZ&quot;&gt;
      &lt;li id=&quot;VEQN&quot;&gt;&lt;strong&gt;Зед&lt;/strong&gt; редактор &lt;a href=&quot;https://zed.dev/docs/assistant/model-context-protocol&quot; target=&quot;_blank&quot;&gt;объявляет&lt;/a&gt; о поддержке MCP&lt;/li&gt;
      &lt;li id=&quot;KfPZ&quot;&gt;&lt;strong&gt;Cline&lt;/strong&gt; &lt;a href=&quot;https://docs.cline.bot/mcp-servers/mcp&quot; target=&quot;_blank&quot;&gt;добавляет&lt;/a&gt; поддержку MCP&lt;/li&gt;
      &lt;li id=&quot;92Av&quot;&gt;&lt;strong&gt;Курсор&lt;/strong&gt; &lt;a href=&quot;https://www.cursor.com/changelog&quot; target=&quot;_blank&quot;&gt;добавляет&lt;/a&gt; поддержку MCP&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;TdNQ&quot;&gt;Февраль:&lt;/li&gt;
    &lt;ul id=&quot;3qcL&quot;&gt;
      &lt;li id=&quot;uiUq&quot;&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; — это &lt;a href=&quot;https://www.anthropic.com/news/claude-3-7-sonnet&quot; target=&quot;_blank&quot;&gt;запущенный&lt;/a&gt; Anthropic — агентный инструмент командной строки с поддержкой MCP&lt;/li&gt;
      &lt;li id=&quot;nzdh&quot;&gt;&lt;strong&gt;Виндсерфинг&lt;/strong&gt; &lt;a href=&quot;https://windsurf.com/changelog/windsurf-next&quot; target=&quot;_blank&quot;&gt;добавляет&lt;/a&gt;добавляет поддержку MCP&lt;/li&gt;
      &lt;li id=&quot;psZJ&quot;&gt;&lt;strong&gt;Neovim&lt;/strong&gt; &lt;a href=&quot;https://github.com/ravitemer/mcphub.nvim&quot; target=&quot;_blank&quot;&gt;получает&lt;/a&gt;поддержку MCP через плагин&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;NiKN&quot;&gt;Марш:&lt;/li&gt;
    &lt;ul id=&quot;OPil&quot;&gt;
      &lt;li id=&quot;1wAz&quot;&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt; &lt;a href=&quot;https://developers.cloudflare.com/agents/model-context-protocol/&quot; target=&quot;_blank&quot;&gt;выпускает&lt;/a&gt;руководство по развертыванию готового к работе удаленного сервера MCP.&lt;/li&gt;
      &lt;li id=&quot;L9Hr&quot;&gt;&lt;strong&gt;Sentry&lt;/strong&gt; &lt;a href=&quot;https://github.com/MCP-100/mcp-sentry&quot; target=&quot;_blank&quot;&gt;запускает&lt;/a&gt; свой сервер MCP, став первым крупным поставщиком, добавившим готовый к использованию &lt;em&gt;удаленный&lt;/em&gt; сервер. &lt;em&gt;Реализация Sentry была основана на руководстве, предоставленном Cloudflare.&lt;/em&gt;&lt;/li&gt;
      &lt;li id=&quot;SXn9&quot;&gt;&lt;strong&gt;OpenAI&lt;/strong&gt; &lt;a href=&quot;https://openai.github.io/openai-agents-python/mcp/&quot; target=&quot;_blank&quot;&gt;добавляет&lt;/a&gt;поддержку MCP в свой Agents SDK&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;bsdF&quot;&gt;Апрель:&lt;/li&gt;
    &lt;ul id=&quot;UIU4&quot;&gt;
      &lt;li id=&quot;SC59&quot;&gt;&lt;strong&gt;VS Code&lt;/strong&gt; &lt;a href=&quot;https://code.visualstudio.com/docs/copilot/chat/mcp-servers&quot; target=&quot;_blank&quot;&gt;добавляет&lt;/a&gt;поддержку MCP&lt;/li&gt;
      &lt;li id=&quot;bXiB&quot;&gt;&lt;strong&gt;GitHub&lt;/strong&gt; запускает свой &lt;a href=&quot;https://github.blog/changelog/2025-04-04-github-mcp-server-public-preview/&quot; target=&quot;_blank&quot;&gt;официальный сервер MCP&lt;/a&gt; (в режиме публичного предварительного просмотра)&lt;/li&gt;
      &lt;li id=&quot;9XTm&quot;&gt;&lt;strong&gt;Zapier&lt;/strong&gt; &lt;a href=&quot;https://zapier.com/blog/mcp/&quot; target=&quot;_blank&quot;&gt;запускает&lt;/a&gt;список серверов MCP&lt;/li&gt;
      &lt;li id=&quot;MESw&quot;&gt;&lt;strong&gt;Сервисы CI/CD, такие как &lt;a href=&quot;https://bitrise.io/blog/post/chat-with-your-builds-ci-and-more-introducing-the-bitrise-mcp-server&quot; target=&quot;_blank&quot;&gt;Bitrise&lt;/a&gt; &lt;/strong&gt;и &lt;strong&gt;&lt;a href=&quot;https://github.com/CircleCI-Public/mcp-server-circleci&quot; target=&quot;_blank&quot;&gt;CircleCI&lt;/a&gt; &lt;/strong&gt;(CI/CD), запускают свои серверы MCP&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ihPq&quot;&gt;Единственная заметная IDE, в которой на данный момент отсутствует поддержка MCP, — это JetBrains IDEs, которая &lt;a href=&quot;https://www.reddit.com/r/Jetbrains/comments/1jqjqnw/someone_please_create_a_mcp_client_plugin/&quot; target=&quot;_blank&quot;&gt;должна добавить&lt;/a&gt; поддержку MCP в следующем выпуске IDE, который ожидается в ближайшее время. Редко можно увидеть такое быстрое внедрение во всех основных IDE. Очевидно, что MCP даёт большие преимущества разработчикам, использующим инструменты искусственного интеллекта, поэтому IDE хотят добавить эту функцию. &lt;em&gt;Так совпало, что лучшие IDE, которые инженеры чаще всего называли &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/ide-that-software-engineers-love&quot; target=&quot;_blank&quot;&gt;любимыми IDE с функциями искусственного интеллекта&lt;/a&gt; — Cursor, VS Code, Windsurf, Zed, Neovim и Cline — одними из первых получили поддержку MCP!&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;FVFk&quot;&gt;Но как они работают?&lt;/p&gt;
  &lt;h2 id=&quot;lJXV&quot;&gt;3. Разберитесь в LSP, чтобы понять MCP&lt;/h2&gt;
  &lt;p id=&quot;zJvL&quot;&gt;Давайте заглянем в мир протоколов языковых серверов, потому что именно это решение вдохновило разработчиков MCP.&lt;/p&gt;
  &lt;p id=&quot;wr0w&quot;&gt;Общая проблема, с которой IDE сталкивались десятилетиями, заключалась в том, что они хотели добавить поддержку как можно большего числа языков программирования, что также означало добавление поддержки таких вещей, как:&lt;/p&gt;
  &lt;ul id=&quot;qX7V&quot;&gt;
    &lt;li id=&quot;nvir&quot;&gt;Подсветка синтаксиса&lt;/li&gt;
    &lt;li id=&quot;rL0z&quot;&gt;Завершение кода (автозаполнение)&lt;/li&gt;
    &lt;li id=&quot;HrYb&quot;&gt;Пометка предупреждений / ошибок в строке&lt;/li&gt;
    &lt;li id=&quot;bk2T&quot;&gt;Выполнение простых операций по рефакторингу&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;R0Ct&quot;&gt;Предполагая, что существует M IDE и N языков программирования, это проблема MxN. Наивное решение состояло в том, чтобы для каждой M IDE создать ручную поддержку для каждого N языков, насколько это возможно. Для поставщиков IDE это была большая работа, которую необходимо повторять всякий раз, когда начинает распространяться новый язык программирования:&lt;/p&gt;
  &lt;figure id=&quot;2VwP&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!-nmz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71d77eb8-ab5f-42d3-8360-03a4d9349b5d_1227x1600.png&quot; width=&quot;1227&quot; /&gt;
    &lt;figcaption&gt;Статус-кво сохранялся примерно до 2016 года: каждая IDE реализовывала языковые функции для каждого поддерживаемого языка&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pSjk&quot;&gt;Для нас, разработчиков, это означало, что IDEs хорошо поддерживает лишь ограниченное количество языков. Например, удачи в попытках кодирования с использованием C # в Android Studio!&lt;/p&gt;
  &lt;p id=&quot;13mH&quot;&gt;&lt;strong&gt;Расширения / плагины&lt;/strong&gt; — это обходной путь, позволяющий IDE выполнять сложную работу: в IDE, поддерживающих фреймворки расширений / плагинов, сторонние разработчики могут создавать плагины, например для подсветки синтаксиса на определённом языке. Это лучше, чем ничего, но требует от разработчиков больших усилий. Кроме того, многие IDE не предоставляют возможности расширения, которые обеспечивали бы удобство для разработчиков при использовании таких функций, как автодополнение и подсветка синтаксиса.&lt;/p&gt;
  &lt;p id=&quot;iXQ0&quot;&gt;В 2016 году Microsoft выпустила &lt;strong&gt;протокол Language Server Protocol (LSP)&lt;/strong&gt;, изначально разработанный для Visual Studio Code. Идея заключается в том, что для каждого языка реализация LSP-сервера может предоставлять языковые функции. Теперь редакторы могут использовать LSP-сервер — существующую реализацию, часто с открытым исходным кодом, — вместо того чтобы создавать собственную:&lt;/p&gt;
  &lt;figure id=&quot;RZU1&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!Q9dj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48d32a00-00fe-47e8-99a7-b55f22b85cdd_1600x1189.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;Идея LSP заключается в том, чтобы создать серверы LSP для каждого соответствующего языка&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6j8y&quot;&gt;Это повлияло на количество разрабатываемых IDE:&lt;/p&gt;
  &lt;ul id=&quot;PQ7O&quot;&gt;
    &lt;li id=&quot;bETi&quot;&gt;Новые и уже существующие интегрированные среды разработки могут легко добавлять поддержку новых языков благодаря простому в использовании протоколу (LSP)&lt;/li&gt;
    &lt;li id=&quot;MRsj&quot;&gt;Для большинства языков существует официальная реализация LSP, предоставляемая разработчиками языка (например, &lt;a href=&quot;https://github.com/golang/tools/tree/master/gopls&quot; target=&quot;_blank&quot;&gt;gopls&lt;/a&gt; для Go), и часто разработчики или поставщики IDE могут выбирать из нескольких реализаций LSP. Например, для C# популярными LSP являются &lt;a href=&quot;https://github.com/OmniSharp/omnisharp-roslyn&quot; target=&quot;_blank&quot;&gt;OmniSharp&lt;/a&gt; и &lt;a href=&quot;https://github.com/razzmatazz/csharp-language-server&quot; target=&quot;_blank&quot;&gt;csharp-ls&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;wWDN&quot;&gt;Сегодня LSP поддерживают следующие IDE:&lt;/p&gt;
  &lt;ul id=&quot;bniZ&quot;&gt;
    &lt;li id=&quot;9R51&quot;&gt;&lt;strong&gt;VS Код&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;41sD&quot;&gt;
      &lt;li id=&quot;FlTM&quot;&gt;Благодаря этому все пользователи VS Code любят &lt;strong&gt;Курсор&lt;/strong&gt;, &lt;strong&gt;Виндсерфинг&lt;/strong&gt; и т. д.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;r4jv&quot;&gt;&lt;strong&gt;Зед&lt;/strong&gt; Редактор&lt;/li&gt;
    &lt;li id=&quot;t8Rx&quot;&gt;&lt;strong&gt;IntelliJ&lt;/strong&gt; интегрированные среды&lt;/li&gt;
    &lt;li id=&quot;hvHA&quot;&gt;&lt;strong&gt;Eclipse, Neovim, Emacs&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;tMOw&quot;&gt;Многие другие небольшие редакторы, такие как Atom, &lt;a href=&quot;https://helix-editor.com/&quot; target=&quot;_blank&quot;&gt;Helix Editor&lt;/a&gt;, &lt;a href=&quot;https://kate-editor.org/en-gb/&quot; target=&quot;_blank&quot;&gt;Kate&lt;/a&gt; и другие&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Jnz5&quot;&gt;Известные отсутствующие включают:&lt;/p&gt;
  &lt;ul id=&quot;WUwA&quot;&gt;
    &lt;li id=&quot;JcXe&quot;&gt;Visual Studio — флагманская интегрированная среда разработки Microsoft (не путать с VS Code). Использует собственные языковые инструменты для поддержки языков&lt;/li&gt;
    &lt;li id=&quot;HcKA&quot;&gt;XCode — существует официальный сервер Swift LSP, но XCode использует собственную систему анализа кода&lt;/li&gt;
    &lt;li id=&quot;FHIU&quot;&gt;Android Studio: отсутствует поддержка LSP, поскольку IDE основана на IntelliJ Community Edition и поддерживает более ограниченный набор языков программирования, чем полноценные IDE IntelliJ&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;4x34&quot;&gt;4. Архитектура MCP&lt;/h2&gt;
  &lt;p id=&quot;rWoa&quot;&gt;Успех LSP убедил Дэвида и Джастина в том, что протокол позволяет:&lt;/p&gt;
  &lt;ul id=&quot;P8po&quot;&gt;
    &lt;li id=&quot;lBrE&quot;&gt;Разработчикам IDE следует уделять больше внимания созданию других отличительных функций IDE, а не языковых функций LSP&lt;/li&gt;
    &lt;li id=&quot;u5At&quot;&gt;Разработчики языковых серверов сосредоточились на создании надёжных реализаций&lt;/li&gt;
    &lt;li id=&quot;SwUa&quot;&gt;... в результате улучшилась вся экосистема&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;9UQe&quot;&gt;Основная идея MCP схожа с идеей LSP: вместо того чтобы каждая IDE или другой инструмент на основе ИИ создавали поддержку для множества функций, можно определить серверы MCP, которые добавят поддержку нужной функции. Серверы MCP могут использоваться несколькими IDE, и они сами решают, какие функции интегрировать или создавать.&lt;/p&gt;
  &lt;figure id=&quot;zJdZ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!k2vS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8196e150-5e52-4f73-a019-ecca1e7b19cd_2032x1496.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;Обзор архитектуры MCP&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7Pxx&quot;&gt;&lt;strong&gt;MCP сделала несколько других выборов в отличие от LSP. &lt;/strong&gt;Дэвид говорит, что они тщательно изучили распространённую критику в адрес LSP и приняли несколько других проектных решений:&lt;/p&gt;
  &lt;ul id=&quot;vSQH&quot;&gt;
    &lt;li id=&quot;MBhY&quot;&gt;Инициализация серверов: разработчики хотели сделать этот процесс максимально простым с точки зрения реализации. Недостаток LSP в том, что инициализация серверов — довольно сложный процесс&lt;/li&gt;
    &lt;li id=&quot;zChw&quot;&gt;Заголовки: в протоколе LCP используется &lt;a href=&quot;https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/&quot; target=&quot;_blank&quot;&gt;довольно уникальный подход&lt;/a&gt; к JSON-RPC, который предполагает отправку HTTP-заголовков на входе и выходе. Команда Anthropic выбрала более стандартный подход на основе JSON&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;KL3J&quot;&gt;Одним из содержательных постов, повлиявших на мнение команды, была статья &lt;a href=&quot;https://www.michaelpj.com/blog/2024/09/03/lsp-good-bad-ugly.html&quot; target=&quot;_blank&quot;&gt;LSP: хорошее, плохое и ужасное&lt;/a&gt; Майкла Пейтона Джонса.&lt;/p&gt;
  &lt;p id=&quot;M9xy&quot;&gt;Примеры MCP-серверов из &lt;a href=&quot;https://github.com/modelcontextprotocol/servers&quot; target=&quot;_blank&quot;&gt;эталонных серверов&lt;/a&gt;:&lt;/p&gt;
  &lt;ul id=&quot;DVLm&quot;&gt;
    &lt;li id=&quot;e0Wc&quot;&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;: доступ к базе данных только для чтения с проверкой схемы.&lt;/li&gt;
    &lt;li id=&quot;oqIK&quot;&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: управляйте своим репозиторием, выполняйте операции с файлами git и получайте доступ к GitHub API&lt;/li&gt;
    &lt;li id=&quot;KEN5&quot;&gt;&lt;strong&gt;Файловая система&lt;/strong&gt;: выполняет безопасные операции с файлами в вашей локальной файловой системе&lt;/li&gt;
    &lt;li id=&quot;60Qp&quot;&gt;&lt;strong&gt;Google Диск&lt;/strong&gt;: поиск файлов и доступ к ним на подключенном Google Диске&lt;/li&gt;
    &lt;li id=&quot;K6Tm&quot;&gt;&lt;strong&gt;Puppeteer&lt;/strong&gt;: автоматизация браузеров и выполнение операций по веб-скрапингу&lt;/li&gt;
    &lt;li id=&quot;S4KG&quot;&gt;&lt;strong&gt;Sentry&lt;/strong&gt;: извлекает логи и анализирует их из подключенной учетной записи Sentry.io&lt;/li&gt;
    &lt;li id=&quot;uVfR&quot;&gt;&lt;strong&gt;Redis&lt;/strong&gt;: взаимодействие с подключенными хранилищами данных Redis типа «ключ-значение»&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;E6jV&quot;&gt;Серверы могут быть локальными или удалёнными:&lt;/p&gt;
  &lt;ul id=&quot;5G0G&quot;&gt;
    &lt;li id=&quot;KTzU&quot;&gt;&lt;strong&gt;Локальный сервер MCP:&lt;/strong&gt;интегрированная среда разработки подключается к локально запущенному процессу&lt;em&gt;, &lt;/em&gt;который может выполнять любые действия: от взаимодействия с удалённым сервером до доступа к локальной файловой системе. Слово «локальный» указывает на место, где запущен процесс. Например, сервер MCP PostgreSQL — это локальный процесс, запущенный в Node, который подключается к локальной или удалённой базе данных PostgreSQL.&lt;/li&gt;
    &lt;li id=&quot;VfoD&quot;&gt;&lt;strong&gt;Удаленный сервер MCP: &lt;/strong&gt;интегрированная среда разработки подключается к удаленному серверу, а не к локальному процессу, например к серверу MCP компании Sentry, где IDE подключается к серверу Sentry, проходит аутентификацию с использованием учетных данных, а затем может отправлять запросы о данных, доступных клиенту Sentry.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;LQVs&quot;&gt;Разновидности MCP-серверов&lt;/h4&gt;
  &lt;p id=&quot;wpkl&quot;&gt;Я наблюдаю за несколькими условными группами серверов MCP в зависимости от того, кто их создаёт:&lt;/p&gt;
  &lt;ul id=&quot;JgWK&quot;&gt;
    &lt;li id=&quot;B1t4&quot;&gt;&lt;strong&gt;Официальные удалённые серверы MCP&lt;/strong&gt;: в случае с GitHub, поддерживающим различные действия, связанные с GitHub, через MCP, они могут создать сервер. На данный момент лишь у немногих поставщиков есть официальный удалённый сервер, но ситуация может измениться.&lt;/li&gt;
    &lt;li id=&quot;cUnU&quot;&gt;&lt;strong&gt;Проверенные локальные серверы MCP: &lt;/strong&gt;локальные оболочки для доступа к таким ресурсам, как файловая система, различные базы данных, например Postgres или Redis, или сервисы, такие как GitLab или Slack. На данный момент я видел только те, которые не предоставляются официальными поставщиками, но они проверены, так как созданы доверенной стороной. &lt;em&gt;Подробнее об этом в разделе о безопасности ниже.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;brYm&quot;&gt;&lt;strong&gt;Серверы с открытым исходным кодом:&lt;/strong&gt; многие серверы MCP имеют открытый исходный код, поэтому вы можете изучить их код. Если лицензия позволяет, создайте форк и свой собственный сервер.&lt;/li&gt;
    &lt;li id=&quot;ujJL&quot;&gt;&lt;strong&gt;Закрытый исходный код / приватность: &lt;/strong&gt;любой может создать приватный сервер MCP с закрытым исходным кодом, который будет доступен только ему или его коллегам, как в примере выше, где сервер MCP написан на одном файле Python и запускается локально или даже распространяется внутри команды.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;jLJh&quot;&gt;Однако пока не существует удобного сервиса для поиска проверенных серверов. Кроме того, в текущем, раннем поколении инструментов MCP есть проблемы с безопасностью.&lt;/p&gt;
  &lt;h2 id=&quot;zGTq&quot;&gt;5. Исходный код сервера MCP&lt;/h2&gt;
  &lt;p id=&quot;ekGf&quot;&gt;Итак, как выглядит сервер MCP? Это зависит от того, локальный он или удалённый.&lt;/p&gt;
  &lt;p id=&quot;qbDH&quot;&gt;Серверы могут быть написаны на любом языке. Давайте рассмотрим простой сервер, написанный на Python, который получает данные о погоде с помощью API Национальной метеорологической службы США. Это пример &lt;a href=&quot;https://modelcontextprotocol.io/quickstart/server&quot; target=&quot;_blank&quot;&gt;из документации MCP&lt;/a&gt;. &lt;em&gt;Этот пример показателен: мы могли бы легко создать серверы, которые вместо получения данных о погоде выполняли бы локальные операции или отправляли другие удалённые запросы.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;oqA8&quot;&gt;Мы создаём файл weather.py и начинаем с инициализации сервера MCP. Вот как это выглядит:&lt;/p&gt;
  &lt;figure id=&quot;coRl&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!hTaX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9076900-396f-4776-8b61-2dcf0cde2e78_1068x386.png&quot; width=&quot;1068&quot; /&gt;
    &lt;figcaption&gt;Инициализация сервера MCP&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;GVfS&quot;&gt;Класс &lt;a href=&quot;https://github.com/modelcontextprotocol/python-sdk&quot; target=&quot;_blank&quot;&gt;FastMCP&lt;/a&gt; — это оболочка, которая автоматически генерирует определения инструментов, упрощая создание инструментов MCP.&lt;/p&gt;
  &lt;p id=&quot;NjUo&quot;&gt;В файле weather.py мы определяем вспомогательный метод make_nws_request для получения данных о погоде:&lt;/p&gt;
  &lt;figure id=&quot;gQ5E&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!5vfX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7411f164-0a2b-4f74-b51a-585f7c011654_1164x512.png&quot; width=&quot;1164&quot; /&gt;
    &lt;figcaption&gt;Вспомогательная функция make_nws_request&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ytot&quot;&gt;Теперь давайте добавим основную функцию этого инструмента: получение прогноза погоды. Мы определяем метод get_forecast и помечаем его как «инструментальный» метод для MCP Server с помощью атрибута &lt;em&gt;@mcp.tool()&lt;/em&gt;.&lt;/p&gt;
  &lt;figure id=&quot;S937&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!qu7t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb5a0f0-cc7e-4353-a704-9426fbb8dc23_1076x1302.png&quot; width=&quot;1076&quot; /&gt;
    &lt;figcaption&gt;Получение прогноза с помощью веб-запроса и возврат проанализированных результатов&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;c3KX&quot;&gt;&lt;strong&gt;Обратите внимание на важность четких описаний!&lt;/strong&gt; Мы добавили четкие описания для функции («Получить прогноз погоды для определенного места») и аргументов («Широта/долгота места»). Это важно, потому что языковая модель будет пытаться заполнить параметры на основе описаний. С таким описанием, если мы спросим у LLM: «Какой прогноз погоды в Нью-Йорке?», LLM сможет определить, что этот сервер MCP подходит для использования и что сначала нужно получить долготу и широту Нью-Йорка — данные, которые более крупная модель, такая как Anthropic Sonnet 3.7, может сгенерировать достаточно точно.&lt;/p&gt;
  &lt;p id=&quot;xZSg&quot;&gt;Мы почти закончили, осталось только инициализировать и запустить сервер. Добавляем это в weather.py:&lt;/p&gt;
  &lt;figure id=&quot;7IUF&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!_p6U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1f31bd7-da5c-4b81-a9c3-679b4b207cac_950x160.png&quot; width=&quot;950&quot; /&gt;
    &lt;figcaption&gt;Настройка нашего сервера MCP&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;I76N&quot;&gt;&lt;strong&gt;Тестирование MCP-сервера:&lt;/strong&gt; для базового тестирования мы можем запустить MCP-сервер из командной строки с помощью:&lt;/p&gt;
  &lt;pre id=&quot;D2by&quot;&gt;uv run weather.py&lt;/pre&gt;
  &lt;p id=&quot;MI7Y&quot;&gt;В качестве контекста &lt;a href=&quot;https://docs.astral.sh/uv/&quot; target=&quot;_blank&quot;&gt;uv&lt;/a&gt; — это менеджер пакетов Python, аналогичный Node в мире Node.js. Эта команда запускает наш файл weather.py, и мы можем вызвать&lt;/p&gt;
  &lt;p id=&quot;KUZP&quot;&gt;Мы можем проверить, правильно ли работает MCP-сервер, запустив его из Claude Desktop (или любой другой IDE, поддерживающей MCP-серверы). В Claude Desktop нам нужно добавить MCP-сервер в файл конфигурации claude_desktop_config.json. Мы просто указываем на наш локальный файл weather.py:&lt;/p&gt;
  &lt;figure id=&quot;6qGP&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!fr-1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d439c09-67d6-4374-853f-6508b459f591_890x484.png&quot; width=&quot;890&quot; /&gt;
    &lt;figcaption&gt;Нам нужно сообщить нашему MCP-клиенту (в данном случае: Claude Desktop), где найти файл (ы) для нашего локального MCP-сервера и как запустить сервер&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h4 id=&quot;cGwB&quot;&gt;Как это работает во время выполнения&lt;/h4&gt;
  &lt;p id=&quot;Lj7h&quot;&gt;&lt;strong&gt;Подключение серверов MCP при инициализации:&lt;/strong&gt; после добавления в конфигурацию IDE или инструмент (в данном случае Claude Desktop) подключает сервер MCP при перезапуске:&lt;/p&gt;
  &lt;figure id=&quot;TU1r&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!3Kt5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cb8f65-bc63-49e7-85b5-05e90efe8610_1388x328.png&quot; width=&quot;1388&quot; /&gt;
    &lt;figcaption&gt;Claude Desktop сообщает, что найден новый инструмент MCP&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;DTsW&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!l__K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff31324f2-eef2-421d-b4ef-627c282a2e31_1100x514.png&quot; width=&quot;1100&quot; /&gt;
    &lt;figcaption&gt;Этот инструмент — погодный инструмент, а метаданные берутся из нашего описания в файле weather.py&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nTJq&quot;&gt;А теперь давайте спросим: «Какая погода в Нью-Йорке?»&lt;/p&gt;
  &lt;p id=&quot;LvUD&quot;&gt;&lt;strong&gt;Принятие решения об использовании MCP-сервера:&lt;/strong&gt; после нашего вопроса наша языковая модель решает, что, вероятно, следует использовать погодный MCP-инструмент. Она преобразует «Нью-Йорк» в широту и долготу и хочет вызвать наш MCP-сервер. Прежде чем сделать это в первый раз, Claude выводит полезное предупреждение о том, что MCP может быть вредоносным.&lt;/p&gt;
  &lt;figure id=&quot;gExf&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!g6xg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8bbdc9f-a060-4e15-bd8d-a2e66599f71e_1472x888.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Перед первым запуском нам нужно подтвердить сервер MCP&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;dKO8&quot;&gt;&lt;strong&gt;Разбор ответа. &lt;/strong&gt;Клод обращается к нашему серверу MCP и получает этот ответ. Затем LLM анализирует этот ответ и генерирует выходные токены (наш ответ):&lt;/p&gt;
  &lt;figure id=&quot;YjOU&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!SuL0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd940464-1c08-4240-9275-4391c1a436dd_1508x1120.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Ответ, полученный с помощью MCP&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;BoqR&quot;&gt;Вот и всё! Мы создали сервер MCP и сделали его доступным для нашего клиента MCP (интегрированной среды разработки или такого инструмента, как Claude Desktop).&lt;/p&gt;
  &lt;h2 id=&quot;F7K0&quot;&gt;6. Угрозы безопасности&lt;/h2&gt;
  &lt;p id=&quot;2TSn&quot;&gt;MCP — это мощный протокол, который позволяет подключать множество полезных источников данных. Однако при подключении таких объектов, как базы данных или сервисы, вам часто приходится передавать секретные данные на сервер MCP, а также предоставлять серверу доступ к вашей файловой системе. Это означает, что злоумышленники могут получить доступ к конфиденциальным данным и нанести серьёзный ущерб. С точки зрения безопасности, существующие инструменты MCP несовершенны и полны уязвимостей.&lt;/p&gt;
  &lt;p id=&quot;AY4t&quot;&gt;&lt;strong&gt;Атаки на цепочки поставок &lt;/strong&gt;не являются чем-то новым, и локальный сервер MCP представляет собой скрытый вектор атаки. При обновлении до последней версии и запуске сервера существует риск кражи конфиденциальных данных, таких как SSH-ключи. Защита от атак на цепочки поставок аналогична защите от атак на пакеты npm. Например, используйте локальный реестр, в котором хранятся только проверенные пакеты, не обновляйте пакеты вслепую и &lt;a href=&quot;https://github.blog/security/supply-chain-security/avoiding-npm-substitution-attacks/&quot; target=&quot;_blank&quot;&gt;используйте области видимости&lt;/a&gt;, чтобы все запросы к пакетам отправлялись в реестр по умолчанию.&lt;/p&gt;
  &lt;p id=&quot;60I1&quot;&gt;Атаки на цепочку поставок для &lt;em&gt;локальных&lt;/em&gt; MCP-серверов представляют такую же угрозу, как и для LSP. В случае с LSP речь идёт об установке расширения, которое может быть вредоносным, и IDE должна защищаться от этого. Новый вектор атак для MCP связан с поддержкой &lt;em&gt;удаленных&lt;/em&gt; MCP-серверов, о которых LSP не имеет ни малейшего представления.&lt;/p&gt;
  &lt;p id=&quot;y4yK&quot;&gt;Имейте в виду, что в пространстве MCP существуют новые типы атак, о которых рассказал стартап в области искусственного интеллекта &lt;a href=&quot;https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks&quot; target=&quot;_blank&quot;&gt;Invatiant Labs&lt;/a&gt;:&lt;/p&gt;
  &lt;p id=&quot;08U3&quot;&gt;&lt;strong&gt;Атака с использованием инструмента-отравителя: &lt;/strong&gt;атака, которой особенно уязвимы инструменты LLM, в том числе MCP. На первый взгляд безобидный инструмент содержит скрытые вредоносные инструкции, которые не видны пользователю, одобряющему инструмент, и которые заставляют LLM выполнять вредоносные действия. Ниже приведён пример сервера MCP, используемого для простой задачи сложения. Пользователь вводит запрос, который запускает этот инструмент, и инструмент затем раскрывает файл конфигурации mcp.json, который может содержать конфиденциальные данные, например строку подключения к базе данных или сохранённые SSH-ключи:&lt;/p&gt;
  &lt;figure id=&quot;BVU9&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!EczT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62f5694e-c6cf-49ca-ba32-852693e25905_1282x1017.png&quot; width=&quot;1282&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Отравление инструмента: на первый взгляд безобидный MCP-сервер выполняет вредоносные действия, которые пользователь может легко не заметить, например считывает и, вероятно, передает конфиденциальный файл mcp.json. Источник: &lt;a href=&quot;https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks&quot; target=&quot;_blank&quot;&gt;Invariant Labs&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rS3R&quot;&gt;&lt;strong&gt;Обман MCP: &lt;/strong&gt;злоумышленник на сервере меняет описание инструмента после того, как клиент его одобрил. Уязвимость, позволяющая проводить атаки с подменой инструментов, заключается в том, что клиенты MCP, такие как Cursor, Windsurf или Claude Desktop, позволяют серверу MCP менять описание после того, как пользователь его одобрил. Очевидно, что эти инструменты не сообщают об этом пользователю. Злоумышленник на сервере MCP вводит в заблуждение, а затем, после одобрения и нескольких использований, незаметно меняет область применения, чтобы можно было проводить вредоносные манипуляции.&lt;/p&gt;
  &lt;figure id=&quot;GTMT&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!71jp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd286ac6e-2750-4f3f-8262-2f70ff202706_691x543.png&quot; width=&quot;691&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Атака MCP с использованием спуфинга. Источник изображения: &lt;a href=&quot;https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks&quot; target=&quot;_blank&quot;&gt;Invariant Labs&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;aWVW&quot;&gt;&lt;strong&gt;Перехват аутентификации из другого сервиса: &lt;/strong&gt;когда к одному клиенту подключено несколько MCP-серверов, вредоносный MCP-сервер может использовать описание своего инструмента для получения учетных данных с других MCP-серверов и их утечки. Например, если вы подключите вредоносный сервер-подражатель и почтовый MCP-сервер для отправки и получения электронных писем, то вредоносный сервер сможет получить доступ к учетным данным вашего почтового сервера, получить полный доступ к вашему почтовому ящику, просматривать все ваши сообщения и отправлять электронные письма от вашего имени. &lt;a href=&quot;https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks&quot; target=&quot;_blank&quot;&gt;Подробнее об этой атаке.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;gNRQ&quot;&gt;&lt;strong&gt;«Спящая угроза»: сервер MCP WhatsApp тайно крадёт сообщения WhatsApp. &lt;/strong&gt;Чтобы продемонстрировать эти уязвимости, компания Invariant Labs создала на первый взгляд безобидный сервер MCP, который позволяет взаимодействовать с WhatsApp для отправки и получения сообщений. В настоящее время WhatsApp не предлагает сервер MCP, поэтому все серверы MCP, позволяющие большим языковым моделям использовать WhatsApp, являются сторонними. Атака происходит следующим образом:&lt;/p&gt;
  &lt;ul id=&quot;rGHM&quot;&gt;
    &lt;li id=&quot;lwfM&quot;&gt;Пользователь устанавливает на первый взгляд безобидный сервер WhatsApp MCP, который позволяет отправлять и получать сообщения WhatsApp&lt;/li&gt;
    &lt;li id=&quot;wdQV&quot;&gt;После установки плагин выполняет атаку с отравлением инструмента, имитируя кражу MCP: он незаметно меняет описание инструмента, чтобы все сообщения перенаправлялись на другой номер, неизвестный пользователю&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;kQxw&quot;&gt;Полное описание &lt;a href=&quot;https://invariantlabs.ai/blog/whatsapp-mcp-exploited&quot; target=&quot;_blank&quot;&gt;атаки см. здесь&lt;/a&gt;. Эта атака может быть направлена на любой сервис; она может привести к раскрытию строк подключения к базе данных, утечке учетных данных GitHub, а также любой другой конфиденциальной информации, которую вы используете!&lt;/p&gt;
  &lt;p id=&quot;ZgZx&quot;&gt;&lt;strong&gt;Для того чтобы MCP можно было использовать повсеместно, необходимо решить проблемы с безопасностью. &lt;/strong&gt;Эти проблемы нужно будет решать на стороне клиента, то есть в IDE, которые запускают серверы MCP. На данном этапе вполне понятно, что IDE, интегрирующие MCP, сосредоточены на выпуске работающего продукта.&lt;/p&gt;
  &lt;p id=&quot;dT0m&quot;&gt;Сейчас я бы действовал с особой осторожностью при использовании ненадёжных MCP-серверов, потому что безопасность MCP-серверов во всех IDE оставляет желать лучшего.Новые векторы атак наверняка будут вскоре устранены IDE или, по крайней мере, их будет сложнее реализовать, но пока я бы посоветовал следующее:&lt;/p&gt;
  &lt;ul id=&quot;TwUI&quot;&gt;
    &lt;li id=&quot;UWO0&quot;&gt;Для &lt;em&gt;локальных&lt;/em&gt; MCP-серверов: используйте только те, которые вы проверили и которым доверяете. Используйте проверенную торговую площадку, например ту, что есть в вашей IDE, или создайте список проверенных пакетов, в котором вы фиксируете версии и избегаете автоматических обновлений, или запускайте только те пакеты, которые вы собрали самостоятельно.&lt;/li&gt;
    &lt;li id=&quot;CjcD&quot;&gt;Для &lt;em&gt;удаленных&lt;/em&gt; MCP-серверов: используйте только те, которые поставляются поставщиками.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;DkoU&quot;&gt;7. Сценарии использования в будущем&lt;/h2&gt;
  &lt;p id=&quot;DH5F&quot;&gt;Протокол MCP предоставляет языковым моделям инструменты для взаимодействия с любыми другими приложениями, открывая такие инновационные возможности, как:&lt;/p&gt;
  &lt;p id=&quot;qkKF&quot;&gt;&lt;strong&gt;Подключите свой код к проектам Figma. &lt;/strong&gt;Figma создала плагин MCP, который может взаимодействовать с IDE, поэтому вы можете дать LLM команду реализовать проект Figma или создать проекты Figma для вас.&lt;/p&gt;
  &lt;figure id=&quot;Rh7L&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!PtCW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0017979-520e-4722-ac44-bb88e829afa1_1600x940.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Даём LLM задание: «разработайте современный дизайн экрана для мобильного устройства». Это делается с помощью Figma и Figma MCP Server. Источник: &lt;a href=&quot;https://x.com/Saboo_Shubham_/status/1902185004240924984&quot; target=&quot;_blank&quot;&gt;Шубхан Сабу в X&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;BJw0&quot;&gt;&lt;strong&gt;Создавайте музыку, общаясь с языковой моделью. &lt;/strong&gt;Дизайнер и разработчик Сиддхарт Ахуджа создал сервер MCP для прямого взаимодействия с программой для создания музыки Abelton. Подключив этот MCP, языковая модель может создавать музыку на основе запроса. &lt;a href=&quot;https://x.com/sidahuj/status/1902719460278198658&quot; target=&quot;_blank&quot;&gt;Послушайте здесь.&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;zKma&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!3NAk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffec6e20f-b306-4d22-aa04-b06efea47183_1600x895.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Клод создал мелодию после нескольких попыток в музыкальном редакторе Ableton. &lt;a href=&quot;https://x.com/sidahuj/status/1902719460278198658&quot; target=&quot;_blank&quot;&gt;Послушайте здесь&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;uo2x&quot;&gt;&lt;strong&gt;Создавайте 3D-модели с помощью подсказок. &lt;/strong&gt;В 3D-играх, очевидно, используются 3D-модели, которые часто создаются с помощью программы Blender. Теперь Claude Desktop может взять изображение и создать 3D-модель в Blender. Подсказка:&lt;/p&gt;
  &lt;figure id=&quot;6CS5&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!GOCd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6117fa4e-c1c8-4be9-8b29-81295cbb92cd_1600x680.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Источник: &lt;a href=&quot;https://x.com/bilawalsidhu/status/1900240156826939560&quot; target=&quot;_blank&quot;&gt;Билавал Сидху в X&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;t2IS&quot;&gt;Результат работы LLM в Blender:&lt;/p&gt;
  &lt;figure id=&quot;uSS9&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!_QAq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ed89810-38ca-4667-afb5-47e81ce5d072_1600x984.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Источник: &lt;a href=&quot;https://x.com/bilawalsidhu/status/1900240156826939560&quot; target=&quot;_blank&quot;&gt;Билавал Сидху в X&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;334m&quot;&gt;&lt;strong&gt;Создайте карту, подключив геопространственное программное обеспечение. &lt;/strong&gt;Подключив программное обеспечение для пространственной визуализации &lt;a href=&quot;https://qgis.org/&quot; target=&quot;_blank&quot;&gt;QGIS&lt;/a&gt;, вы можете создать векторную карту на основе реальной карты с учетом ваших предпочтений, например в отношении цветовой гаммы:&lt;/p&gt;
  &lt;figure id=&quot;h5Us&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!kWnt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe17fd4e7-c961-4e17-946f-47dd8e2d3c5b_1600x855.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Создание векторной карты определенного региона с помощью Claude Desktop и QGIS. Источник: &lt;a href=&quot;https://x.com/bilawalsidhu/status/1900632591516008599&quot; target=&quot;_blank&quot;&gt;Билавал Сидху в X&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;lqs5&quot;&gt;Для этих целей вам не нужно использовать LLM из вашей IDE! В большинстве приведённых выше примеров используется Claude Desktop, но другие LLM могут легко добавить поддержку протокола MCP в свои приложения. Трудно представить, почему ChatGPT и Google Gemini не последуют этому примеру, а когда они это сделают, люди, не связанные с разработкой, скорее всего, начнут использовать MCP ещё чаще. Поставщики LLM вынуждены добавлять эту функцию, иначе они рискуют потерять долю рынка в пользу Claude Desktop из-за постоянно растущего числа поставщиков медицинских услуг, которые уже работают с Claude.&lt;/p&gt;
  &lt;p id=&quot;piqe&quot;&gt;&lt;strong&gt;LLM, подключенный к &lt;em&gt;любому&lt;/em&gt; программному обеспечению, открывает множество новых возможностей, &lt;/strong&gt;в том числе:&lt;/p&gt;
  &lt;ul id=&quot;1bvj&quot;&gt;
    &lt;li id=&quot;pJJZ&quot;&gt;Управляйте аппаратным обеспечением с помощью LLM! Команда Anthropic добавила поддержку MCP в 3D-принтер и теперь может давать ему команды. Мы можем представить себе множество других типов аппаратного обеспечения, которые можно добавить. Один из инженеров-программистов наверняка подключит &lt;a href=&quot;http://www.billporter.info/2017/01/07/the-engineers-guide-to-diy-computer-controlled-holiday-lights/&quot; target=&quot;_blank&quot;&gt;самодельные праздничные гирлянды с компьютерным управлением&lt;/a&gt; к своей IDE к началу праздников.&lt;/li&gt;
    &lt;li id=&quot;MWTJ&quot;&gt;Люди могут “разговаривать” с программным обеспечением. Например, спросите магистра права: “Создайте векторное изображение в Photoshop на основе этой фотографии, но с этими отличиями”.&lt;/li&gt;
    &lt;li id=&quot;mZRW&quot;&gt;Агенты с искусственным интеллектом получают больше инструментов для работы. С каждым новым созданным программным обеспечением агенты с искусственным интеллектом могут начать использовать их для выполнения более сложных задач. Например, подключив к IDE такие инструменты, как Linear, Slack, Figma и инструмент для создания скриншотов, разработчик может дать команду: «Возьми задачу по улучшению дизайна экрана входа в систему, возьми прикреплённый дизайн Figma, выполни первую реализацию, сделай скриншот результата реализации и опубликуй его в канале Slack команды после завершения».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;mcQc&quot;&gt;Это возможности, которые потенциально могут изменить то, как выполняется работа, и то, какой объем работы может выполнить один инженер-программист. Это еще одно подтверждение того, что LLM являются крупнейшим прорывом в разработке программного обеспечения за последние десятилетия.&lt;/p&gt;
  &lt;h2 id=&quot;jKzi&quot;&gt;Блюда на вынос&lt;/h2&gt;
  &lt;p id=&quot;acMd&quot;&gt;MCP обладает огромным потенциалом для повышения продуктивности инженеров, а значит, этот подход, скорее всего, будет быстро распространяться.&lt;/p&gt;
  &lt;ul id=&quot;HHsr&quot;&gt;
    &lt;li id=&quot;NjaS&quot;&gt;Поставщики инструментов для разработчиков ухватились за возможность создавать MCP-серверы и ещё больше «привязывать» разработчиков к использованию своих инструментов — теперь через IDE!&lt;/li&gt;
    &lt;li id=&quot;CMc6&quot;&gt;IDEs, скорее всего, сосредоточатся на устранении уязвимостей в системе безопасности MCP. &lt;em&gt;Это новая область, поэтому поиск подходящих решений для поставщиков атак может занять больше времени&lt;/em&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Oe7R&quot;&gt;&lt;strong&gt;Показательно, что именно стремление инженеров-программистов решить эту проблему привело к изобретению универсального коммуникационного моста между большими языковыми моделями и программным обеспечением. &lt;/strong&gt;Были и другие попытки определить протоколы, которые позволили бы большим языковым моделям выполнять универсальные задачи и быть расширяемыми:&lt;/p&gt;
  &lt;ul id=&quot;BG3y&quot;&gt;
    &lt;li id=&quot;Vav7&quot;&gt;&lt;a href=&quot;https://platform.openai.com/docs/guides/agents&quot; target=&quot;_blank&quot;&gt;Агенты OpenAI:&lt;/a&gt;SDK для создания автономных агентов&lt;/li&gt;
    &lt;li id=&quot;4UM2&quot;&gt;&lt;a href=&quot;https://langbase.com/docs/pipe/quickstart&quot; target=&quot;_blank&quot;&gt;Langbase Pipes&lt;/a&gt;: ИИ-агент, представляющий собой бессерверный API&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;EvMb&quot;&gt;В обоих случаях разработчики сосредоточились на &lt;em&gt;агентах&lt;/em&gt;, а не на инструментах для разработчиков. Но кто создаёт агентов? Конечно же, разработчики!&lt;/p&gt;
  &lt;p id=&quot;vV5f&quot;&gt;Команда Anthropic, создававшая MCP, не стремилась решить глобальную проблему. Они просто хотели улучшить инструменты для разработчиков. Поэтому они решили проблему MxN, связанную с тем, что M инструментов для разработчиков (интегрированных сред разработки) должны поддерживать N различных плагинов/инструментов для разработчиков.&lt;/p&gt;
  &lt;p id=&quot;plzu&quot;&gt;Решив эту проблему с помощью универсального коммуникационного уровня для инструментов разработки, они добились быстрого внедрения в IDE. Теперь все IDE поддерживают этот универсальный коммуникационный уровень под названием MCP. Возможно, мы сможем использовать тот же уровень для &lt;em&gt;общего&lt;/em&gt; развития ИИ, не ограничиваясь инструментами для разработчиков?&lt;/p&gt;
  &lt;p id=&quot;RaSP&quot;&gt;&lt;strong&gt;Открытые подходы, как правило, распространяются на рынке разработчиков быстрее, чем закрытые. &lt;/strong&gt;Одна из причин, по которой MCP так быстро распространился, заключается в том, что он &lt;em&gt;открытый&lt;/em&gt;. Его создала компания Anthropic, но лицензия у него разрешительная, как у MIT, и мы приветствуем вклад разработчиков. &lt;a href=&quot;https://github.com/modelcontextprotocol&quot; target=&quot;_blank&quot;&gt;Проект на GitHub&lt;/a&gt; не зависит от Anthropic, и легко заметить, что этот проект со временем может стать независимым, даже если для его развития потребуется поддержка компании.&lt;/p&gt;
  &lt;p id=&quot;6j2s&quot;&gt;Внедрение разрешительного протокола с открытым исходным кодом сопряжено с относительно низким риском для разработчиков, и, возможно, именно поэтому многие IDE поспешили добавить поддержку. Сравните это с ситуацией, когда протокол не является открытым или его реализация привязана к компании: разработчики IDE не спешили бы внедрять его, и он, скорее всего, не стал бы отраслевым стандартом.&lt;/p&gt;
  &lt;p id=&quot;i2lK&quot;&gt;&lt;strong&gt;Опытные инженеры-программисты станут ещё более востребованными. &lt;/strong&gt;За два с половиной года никто не изобрёл протокол связи между LLM и программным обеспечением, который пользовался бы большой популярностью. Так как же двум инженерам из Anthropic, которые не являются специалистами по искусственному интеллекту, удалось это сделать?&lt;/p&gt;
  &lt;p id=&quot;8Wgw&quot;&gt;Ранее Дэвид почти 10 лет проработал в Meta, занимаясь инфраструктурой для разработчиков, а Джастин был инженером-программистом в GitHub, а затем в Meta, где создавал программные системы, работавшие в огромных масштабах.&lt;/p&gt;
  &lt;p id=&quot;oRG4&quot;&gt;Одна из причин популярности протокола MCP заключается в том, что он хорошо продуман и прост в интеграции. Как будто разработчики, создавшие его, уже прошли этот путь и знают, что нужно для создания чего-то, что практически &lt;em&gt;напрашивается&lt;/em&gt; на внедрение. Здесь важен опыт: время, которое Дэвид потратил на работу над протоколами Language Server, было очень полезным, как и опыт Джастина в масштабировании систем. Эта пара разработала протокол MCP, чтобы обеспечить его максимальную эффективность в долгосрочной перспективе, и их опыт помог им достичь этой цели. Они даже изучили самые слабые места LSP от Microsoft и разработали протокол с учётом этих недостатков, чтобы MCP не сталкивался с прогнозируемыми проблемами.&lt;/p&gt;
  &lt;p id=&quot;w1nD&quot;&gt;&lt;strong&gt;Если вы разработчик, изучите серверы MCP; &lt;/strong&gt;они могут повысить продуктивность вашего рабочего процесса и показать, насколько полезными могут быть большие языковые модели в повседневной работе. Я советую осторожно поэкспериментировать с некоторыми из них и всегда помнить об их уязвимостях в плане безопасности.&lt;/p&gt;
  &lt;p id=&quot;nIbn&quot;&gt;Если вы работаете в компании, которая продает продукты разработчикам, рассмотрите возможность &lt;a href=&quot;https://modelcontextprotocol.io/quickstart/server&quot; target=&quot;_blank&quot;&gt;создания локальных или удаленных MCP-серверов&lt;/a&gt; для клиентов. &lt;a href=&quot;https://developers.cloudflare.com/agents/guides/remote-mcp-server/&quot; target=&quot;_blank&quot;&gt;У Cloudflare есть хорошее руководство&lt;/a&gt; по созданию удаленных серверов. Если вы работаете над инструментами для разработчиков, которые считаются MCP-клиентами, то поддержка MCP вскоре, скорее всего, станет базовым требованием для клиентов, поэтому вы можете &lt;a href=&quot;https://modelcontextprotocol.io/quickstart/client&quot; target=&quot;_blank&quot;&gt;рассмотреть возможность добавления поддержки MCP&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;ZNNN&quot;&gt;Каков ваш опыт использования MCP? Если вы его используете, не стесняйтесь оставлять комментарии.&lt;/p&gt;
  &lt;p id=&quot;5B8L&quot;&gt;Перевод: &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/mcp&quot; target=&quot;_blank&quot;&gt;https://newsletter.pragmaticengineer.com/p/mcp&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:google-part-2</id><link rel="alternate" type="text/html" href="https://devz.su/google-part-2?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>Инженерная культура Google: стек технологий (часть 2)</title><published>2025-10-31T06:17:34.807Z</published><updated>2025-10-31T06:20:53.643Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e4/b0/e4b0d2b4-be17-4357-bdd3-21c89a0bbd18.png"></media:thumbnail><summary type="html">«Каково это на самом деле — работать в Google?» — вот вопрос, который рассматривается в этом мини-сериале. Чтобы узнать подробности, мы поговорили с 25 нынешними и бывшими инженерами-программистами и руководителями инженерных отделов с 4-го по 8-й уровень. Кроме того, мы потратили последний год на исследования: изучали статьи и книги, в которых обсуждаются эти системы. В процессе мы собрали много информации и интересных фактов, которые объединены в этой статье (и мини-сериале). Мы надеемся, что это обеспечит беспрецедентную детализацию по сравнению с тем, что сейчас доступно в интернете.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;pi7l&quot;&gt;Узнайте, как работает Google, с точки зрения технических специалистов этого технологического гиганта: инфраструктура планетарного масштаба, стек технологий, внутренние инструменты и многое другое&lt;/h3&gt;
  &lt;/section&gt;
  &lt;p id=&quot;T71b&quot;&gt;«Каково это &lt;em&gt;на самом деле&lt;/em&gt; — работать в Google?» — вот вопрос, который рассматривается в этом мини-сериале. Чтобы узнать подробности, мы поговорили с 25 нынешними и бывшими инженерами-программистами и руководителями инженерных отделов с 4-го по 8-й уровень. Кроме того, мы потратили последний год на исследования: изучали статьи и книги, в которых обсуждаются эти системы. В процессе мы собрали много информации и интересных фактов, которые объединены в этой статье (и мини-сериале). Мы надеемся, что это обеспечит беспрецедентную детализацию по сравнению с тем, что сейчас доступно в интернете.&lt;/p&gt;
  &lt;p id=&quot;b0kT&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://devz.su/google&quot; target=&quot;_blank&quot;&gt;В первой части&lt;/a&gt;&lt;/strong&gt; мы уже рассмотрели:&lt;/p&gt;
  &lt;ul id=&quot;154O&quot;&gt;
    &lt;li id=&quot;7PGA&quot;&gt;Обзор Google&lt;/li&gt;
    &lt;li id=&quot;NWPw&quot;&gt;Что делает Google особенным?&lt;/li&gt;
    &lt;li id=&quot;EqrE&quot;&gt;Уровни и роли&lt;/li&gt;
    &lt;li id=&quot;Flmb&quot;&gt;Компенсация&lt;/li&gt;
    &lt;li id=&quot;zXdI&quot;&gt;Наем&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;VdeF&quot;&gt;Сегодня мы рассмотрим стек технологий, поскольку одним из элементов, который, несомненно, выделяет компанию на фоне других, является то, что Google — это технологический остров со своим собственным инженерным стеком.&lt;/p&gt;
  &lt;p id=&quot;a05r&quot;&gt;Мы покрываем:&lt;/p&gt;
  &lt;ol id=&quot;nWQD&quot;&gt;
    &lt;li id=&quot;FkfB&quot;&gt;&lt;strong&gt;Инфраструктура планетарного масштаба&lt;/strong&gt;. Внутренняя инфраструктура Google по умолчанию рассчитана на «планетарный масштаб», но Google Cloud не поддерживает его «из коробки»; поэтому большинство инженерных команд используют стек Google PROD, а не GCP.&lt;/li&gt;
    &lt;li id=&quot;d10v&quot;&gt;&lt;strong&gt;Монорепозиторий&lt;/strong&gt;. Также известный как «Google3», он на 95 % состоит из кода Google, хранящегося в одном гигантском репозитории с миллиардами строк. Разработка на основе магистрали является нормой. Кроме того, монорепозиторий не означает, что у Google монолитная кодовая база.&lt;/li&gt;
    &lt;li id=&quot;gprD&quot;&gt;&lt;strong&gt;Технологический стек. &lt;/strong&gt;Официально поддерживаются C++, Kotlin, Java, Python, Go и TypeScript с активным использованием Protobuf и Stubby. У Google есть руководства по языковому стилю для большинства языков, которые почти всегда соблюдаются.&lt;/li&gt;
    &lt;li id=&quot;hK48&quot;&gt;&lt;strong&gt;Инструменты для разработки. &lt;/strong&gt;Набор инструментов для разработки отличается от любого другого рабочего места. Прощайте, GitHub, Jenkins, VS Code и другие известные инструменты: здравствуйте, Piper, Fig, Critique, Blaze, Cider, Tricorder, Rosie и другие.&lt;/li&gt;
    &lt;li id=&quot;FCV8&quot;&gt;&lt;strong&gt;Вычисления и хранение данных. &lt;/strong&gt;Borg, Omega, Kubernetes, BNS, Borgmon, Monarch, Viceroy, Analog, Sigma, BigQuery, Bigtable, Spanner, Vitess, Dremel, F1, Mesa, GTape и многие другие пользовательские системы, на которых работает Google. Этот стек инфраструктуры не похож ни на один другой.&lt;/li&gt;
    &lt;li id=&quot;8OyO&quot;&gt;&lt;strong&gt;ИИ. &lt;/strong&gt;Gemini интегрирован в инструменты для разработчиков и большинство внутренних инструментов, и Google всячески поощряет команды к созданию ИИ, когда это возможно. Команды могут запрашивать ресурсы графического процессора для тонкой настройки моделей, и существует множество внутренних проектов GenAI.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;hFT1&quot;&gt;1. Инфраструктура планетарного масштаба&lt;/h2&gt;
  &lt;p id=&quot;RY8I&quot;&gt;Инфраструктура Google отличается от инфраструктуры любой другой технологической компании тем, что она &lt;em&gt;полностью&lt;/em&gt; создана на заказ: не только инфраструктура, но и инструменты для разработчиков. Google &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/173188305/tech-island&quot; target=&quot;_blank&quot;&gt;это технологический остров&lt;/a&gt;, и инженеры, присоединяющиеся к этому технологическому гиганту, могут забыть об инструментах, к которым они привыкли: GitHub, VS Code, Kubernetes и т. д. Вместо этого им приходится использовать собственную версию инструмента Google, даже если есть аналог.&lt;/p&gt;
  &lt;h3 id=&quot;OPTn&quot;&gt;Планетарный масштаб против GCP&lt;/h3&gt;
  &lt;p id=&quot;Nuh2&quot;&gt;Инженеры Google используют термин «планетарный масштаб» для обозначения способности компании обслуживать каждого человека на Земле. Все инструменты компании работают в глобальном масштабе. Это резко контрастирует с Google Cloud Platform (GCP), где нет встроенных возможностей для развертывания в «планетарном масштабе». Можно создавать приложения, которые могут масштабироваться до таких размеров, но это потребует &lt;em&gt;большого &lt;/em&gt;количества дополнительной работы. Крупными клиентами GCP, которым удалось масштабировать инфраструктуру GCP до планетарных масштабов, являются Snap, использующая &lt;a href=&quot;https://eng.snap.com/monolith-to-multicloud-microservices-snap-service-mesh&quot; target=&quot;_blank&quot;&gt;GCP и AWS&lt;/a&gt; в качестве облачного бэкенда, и Uber, использующая &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/uber-move-to-cloud&quot; target=&quot;_blank&quot;&gt;GCP и Oracle&lt;/a&gt;, как подробно описано в &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/uber-move-to-cloud&quot; target=&quot;_blank&quot;&gt;«Переход Uber в облако»&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;Pt9L&quot;&gt;Google использует инфраструктуру планетарного масштаба не только для «крупных проектов», таких как поиск и YouTube. На этом стеке под названием PROD создается и развертывается множество новых проектов.&lt;/p&gt;
  &lt;p id=&quot;3DeL&quot;&gt;Кстати, корни базы данных &lt;strong&gt;&lt;a href=&quot;https://planetscale.com/&quot; target=&quot;_blank&quot;&gt;Planetscale&lt;/a&gt; &lt;/strong&gt;(база данных Cursor &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/165641889/from-aws-aurora-limitless-to-planetscale&quot; target=&quot;_blank&quot;&gt;в настоящее время работает на&lt;/a&gt;) уходят в Google и его системы «планетарного масштаба». До того как стать соучредителем Planetscale, &lt;a href=&quot;https://www.linkedin.com/in/sougou/&quot; target=&quot;_blank&quot;&gt;Сугу Сугумаране&lt;/a&gt; работал в Google на YouTube, где он создал Vitess — базу данных с открытым исходным кодом для масштабирования MySQL. Сейчас Сугу работает над &lt;a href=&quot;https://multigres.com/&quot; target=&quot;_blank&quot;&gt;Multigres&lt;/a&gt;, адаптацией Vitess для Postgres. Я спросил, откуда взялось название Planetscale. Он ответил:&lt;/p&gt;
  &lt;blockquote id=&quot;blcw&quot;&gt;«Впервые я услышал термин «планетарный масштаб» в Google. Я немного посмеялся, когда услышал его, потому что &lt;em&gt;не&lt;/em&gt;возможно создать глобально распределённую &lt;a href=&quot;https://en.wikipedia.org/wiki/Acid&quot; target=&quot;_blank&quot;&gt;ACID&lt;/a&gt;базу данных без компромиссов. Но тогда Vitess уже работал в «планетарном масштабе» на YouTube, с центрами обработки данных во всех уголках мира.Итак, когда мы решили назвать проект PlanetScale, это было смелое заявление, но мы знали, что Vitess сможет его поддержать.&lt;/blockquote&gt;
  &lt;p id=&quot;AqQu&quot;&gt;Изначально Planetscale был запущен с использованием облачного экземпляра Vitess и завоевал популярность благодаря своей способности поддерживать крупномасштабные базы данных. Интересно, что амбиции Google в отношении «планетарного масштаба» воплотились в стартапе по созданию баз данных, соучредителем которого стал выпускник Google!&lt;/p&gt;
  &lt;h3 id=&quot;yC4e&quot;&gt;PROD Стек&lt;/h3&gt;
  &lt;p id=&quot;Qv0r&quot;&gt;«PROD» — это название внутреннего технологического стека Google, и по умолчанию все проекты, как новые, так и уже существующие, создаются на базе PROD. Есть несколько исключений для проектов, созданных на GCP, но использование PROD является нормой.&lt;/p&gt;
  &lt;p id=&quot;bqV0&quot;&gt;&lt;strong&gt;Некоторые сотрудники Google считают, что PROD не должен &lt;em&gt;не должен&lt;/em&gt; использоваться по умолчанию,&lt;/strong&gt; по мнениюодного из штатных инженеров-программистов. Они сказали нам:&lt;/p&gt;
  &lt;blockquote id=&quot;Rxm3&quot;&gt;«Многие сотрудники Google часто жалуются — и я с ними согласен, — что лишь немногие сервисы действительно должны быть «планетарными» с первого дня! Но сложность создания планетарного сервиса даже на базе PROD на самом деле снижает производительность и время выхода на рынок для новых проектов.Запуск нового сервиса занимает несколько дней, если не недель. Если бы мы использовали более простой стек, настройка заняла бы несколько секунд, и именно столько времени должно уходить на запуск новых проектов, которым, возможно, никогда не понадобится масштабирование! Как только проект наберет обороты, у вас будет достаточно времени, чтобы добавить поддержку в планетарном масштабе или перейти на инфраструктуру, которая это поддерживает.&lt;/blockquote&gt;
  &lt;p id=&quot;bMlA&quot;&gt;&lt;strong&gt;Создание продуктов для внутреннего использования на базе GCP может быть сопряжено с трудностями. &lt;/strong&gt;Инженер-программист привел нам такой пример:&lt;/p&gt;
  &lt;blockquote id=&quot;dM1N&quot;&gt;«Есть несколько примеров внутренних версий продуктов, созданных на базе GCP, которые &lt;em&gt;действительно&lt;/em&gt; обладали совершенно другими функциями или возможностями».Например, внутренняя версия &lt;a href=&quot;https://cloud.google.com/pubsub/docs/overview&quot; target=&quot;_blank&quot;&gt;GCP Pub/Sub&lt;/a&gt; называется &lt;strong&gt;GOOPS&lt;/strong&gt; (Google Pub/Sub). Для настройки GOOPS нельзя было использовать удобный интерфейс GCP: нужно было использовать файл конфигурации. По сути, у внешних пользователей GCP Pub/Sub гораздо больше возможностей для разработки, чем у внутренних пользователей.”&lt;/blockquote&gt;
  &lt;p id=&quot;hNtB&quot;&gt;&lt;strong&gt;Нет смысла использовать общедоступный сервис GCP, если уже есть один в PROD. &lt;/strong&gt;Другой инженер Google сказал нам, что внутреннюю версию &lt;a href=&quot;https://cloud.google.com/spanner&quot; target=&quot;_blank&quot;&gt;Spanner&lt;/a&gt; (распределённой базы данных) гораздо проще настроить и контролировать. Внутренний инструмент для управления Spanner называется &lt;strong&gt;Spanbob&lt;/strong&gt;, а также существует внутренняя расширенная версия &lt;strong&gt;SpanQSL&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;gSsW&quot;&gt;Google выпустила Spanner на GCP как общедоступный сервис. Но если какая-либо внутренняя команда Google использовала Spanner на GCP, она не могла использовать Spanbob — и ей приходилось проделывать гораздо больше работы только для того, чтобы настроить сервис! — и не могла использовать внутренний расширенный SpannerSQL. Поэтому неудивительно, что практически все команды Google выбирают инструменты из стека PROD, а не из стека GCP.&lt;/p&gt;
  &lt;h3 id=&quot;TPwx&quot;&gt;Единственная крупная технологическая компания, которая не использует собственное облако для новых продуктов&lt;/h3&gt;
  &lt;p id=&quot;sMzo&quot;&gt;Google находится в ситуации, когда ни один из её «основных» продуктов не использует инфраструктуру GCP: ни Поиск, ни YouTube, ни Gmail, ни Google Docs, ни Календарь Google. Новые проекты по умолчанию создаются на PROD, а не на GCP.&lt;/p&gt;
  &lt;p id=&quot;fH4c&quot;&gt;Сравните это с Amazon и Microsoft, которые поступают наоборот:&lt;/p&gt;
  &lt;ul id=&quot;vJG6&quot;&gt;
    &lt;li id=&quot;fZTs&quot;&gt;&lt;strong&gt;Amazon: почти полностью на AWS, и все новое создается на этой платформе. &lt;/strong&gt;Почти все сервисы перешли на AWS. «Современный стек» — это NAWS (Native AWS), и все новые проекты используют его. Остальная часть стека — это MAWS (Move to AWS); устаревшие системы еще не переведены на AWS.&lt;/li&gt;
    &lt;li id=&quot;LSf3&quot;&gt;&lt;strong&gt;Microsoft: активное использование Azure, на основе которого строится всё новое. &lt;/strong&gt;Microsoft 365, Microsoft Teams, Xbox Live, GitHub Actions и Copilot работают на базе Azure. Такие приобретения, как LinkedIn и GitHub, постепенно переходят на Azure, на основе которого по умолчанию строится каждый новый проект.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;VXvB&quot;&gt;Почему технические специалисты Google сопротивляются внедрению GCP?&lt;/p&gt;
  &lt;ul id=&quot;m3NE&quot;&gt;
    &lt;li id=&quot;mzZh&quot;&gt;&lt;strong&gt;Поддержка в «планетарном масштабе» не предусмотрена.&lt;/strong&gt; Обычно PROD выбирают потому, что в случае резкого роста популярности продукта или услуги инфраструктура может расширяться бесконечно без миграции.&lt;/li&gt;
    &lt;li id=&quot;2uuH&quot;&gt;&lt;strong&gt;Превосходный опыт разработки с помощью PROD.&lt;/strong&gt; Spanner — очевидный пример; в целом инструменты, созданные на основе PROD, гораздо удобнее и проще в работе для разработчиков Google.&lt;/li&gt;
    &lt;li id=&quot;jCcT&quot;&gt;&lt;strong&gt;Историческое отторжение GCP.&lt;/strong&gt; 5–10 лет назад было сложно представить, что на GCP можно что-то создать. Тогда в ней отсутствовали некоторые внутренние системы, необходимые для внутренних проектов, такие как аудит и контроль доступа с использованием внутренних систем. Сейчас ситуация изменилась, но отторжение GCP осталось прежним.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;HSx0&quot;&gt;Один из нынешних инженеров-программистов Google подытожил:&lt;/p&gt;
  &lt;blockquote id=&quot;JSLD&quot;&gt;“&lt;strong&gt;Внутренняя инфраструктура соответствует мировым стандартам и, вероятно, является лучшей в отрасли. &lt;/strong&gt;Я думаю, что многие инженеры Google хотели бы использовать GCP, но внутренняя инфраструктура создавалась специально для них, в то время как GCP более универсальна и ориентирована на более широкую аудиторию”.&lt;/blockquote&gt;
  &lt;p id=&quot;yspd&quot;&gt;Другой инженер-программист из этой компании сказал:&lt;/p&gt;
  &lt;blockquote id=&quot;prh9&quot;&gt;“В конце концов, PROD просто &lt;em&gt;настолько хорош,&lt;/em&gt; что GCP по сравнению с ним - ступенька вниз. Это относится к:Безопасность — это то, что есть по умолчанию. GCP требует дополнительных размышлений и работыПроизводительность — добиться хорошей производительности внутреннего стека несложноПростота — внутренняя интеграция не требует особых усилий, в отличие от GCP, где работы гораздо большеОсновная причина использования GCP — это оптимизация для дога, но у этого подхода много недостатков, поэтому команды, которые ищут лучший инструмент, просто используют PROD».&lt;/blockquote&gt;
  &lt;p id=&quot;TQow&quot;&gt;&lt;strong&gt;Отсутствие директивы сверху, скорее всего, является ещё одной причиной. &lt;/strong&gt;Переход с собственной инфраструктуры на облачные сервисы компании — сложная задача! Когда я работал в Skype в составе Microsoft в 2012 году, нам сверху дали указание полностью перевести Skype на Azure. Этой работой занималась команда Skype Data, которая работала со мной в одном отделе. Это был изнурительный и сложный процесс, потому что в то время Azure не могла похвастаться достаточной поддержкой и надёжностью. Но поскольку это был приказ сверху, в конечном счёте всё получилось! Команда Azure уделила первостепенное внимание потребностям Skype и внесла необходимые улучшения, а команда Skype пошла на компромиссы. Без давления сверху этот переход никогда бы не состоялся, поскольку у Skype был целый список причин, по которым Azure была не лучшим выбором в качестве инфраструктуры по сравнению с текущим положением дел.&lt;/p&gt;
  &lt;p id=&quot;4gQM&quot;&gt;Google действительно уникальная компания с внутренней инфраструктурой, которую инженеры считают гораздо более совершенной, чем общедоступное облако GCP. Возможно, такой подход также объясняет, почему GCP занимает третье место среди поставщиков облачных услуг и не демонстрирует особых признаков того, что может догнать AWS и Azure. В конце концов, Google не пользуется доверием к своему облаку — не говоря уже о том, чтобы внедрять его по принципу «сверху вниз»! — как это сделали Amazon и Microsoft со своими облаками.&lt;/p&gt;
  &lt;h2 id=&quot;hjJK&quot;&gt;2. Монорепозиторий&lt;/h2&gt;
  &lt;p id=&quot;KunE&quot;&gt;Google хранит весь код в одном репозитории под названием monorepo, который также называют «Google3». Размер репозитория поражает — вот &lt;a href=&quot;https://cacm.acm.org/research/why-google-stores-billions-of-lines-of-code-in-a-single-repository/&quot; target=&quot;_blank&quot;&gt;статистика за 2016 год&lt;/a&gt;:&lt;/p&gt;
  &lt;ul id=&quot;1bAP&quot;&gt;
    &lt;li id=&quot;EWOy&quot;&gt;&lt;strong&gt;2+ миллиарда&lt;/strong&gt; строк кода&lt;/li&gt;
    &lt;ul id=&quot;KlM8&quot;&gt;
      &lt;li id=&quot;fxwW&quot;&gt;1 миллион файлов&lt;/li&gt;
      &lt;li id=&quot;mHmB&quot;&gt;9 миллионов исходных файлов&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;T4Gs&quot;&gt;&lt;strong&gt;45 000&lt;/strong&gt; коммитов в день&lt;/li&gt;
    &lt;ul id=&quot;yg3Z&quot;&gt;
      &lt;li id=&quot;X1CM&quot;&gt;15 000 от инженеров-программистов&lt;/li&gt;
      &lt;li id=&quot;h4Am&quot;&gt;30 000 с помощью автоматизированных систем&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;JYgB&quot;&gt;&lt;strong&gt;95%&lt;/strong&gt;инженеров Google используют монорепозиторий&lt;/li&gt;
    &lt;li id=&quot;adCg&quot;&gt;&lt;strong&gt;800 000 QPS&lt;/strong&gt;: количество запросов на чтение в репозитории в пиковые моменты, в среднем 500 000 запросов в секунду в каждый рабочий день. Большая часть трафика поступает не от инженеров, а от автоматизированных систем сборки и тестирования Google.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;HM4S&quot;&gt;Сегодня масштабы монорепозитория Google, несомненно, увеличились в несколько раз.&lt;/p&gt;
  &lt;p id=&quot;q3tJ&quot;&gt;В монорепозитории хранится большая часть исходного кода.Заметными исключениями являются проекты с открытым исходным кодом:&lt;/p&gt;
  &lt;ul id=&quot;DMtT&quot;&gt;
    &lt;li id=&quot;yn9L&quot;&gt;&lt;a href=&quot;https://source.android.com/&quot; target=&quot;_blank&quot;&gt;Android&lt;/a&gt;: операционная система для смартфонов от Google&lt;/li&gt;
    &lt;li id=&quot;GOTo&quot;&gt;&lt;a href=&quot;https://github.com/chromium/chromium&quot; target=&quot;_blank&quot;&gt;Chromium&lt;/a&gt;: веб-браузер с открытым исходным кодом от Google. Google Chrome, Microsoft Edge, Opera, Brave, браузер DuckDuckGo и многие другие созданы на основе Chromium.&lt;/li&gt;
    &lt;li id=&quot;a4AZ&quot;&gt;&lt;a href=&quot;https://github.com/golang/go&quot; target=&quot;_blank&quot;&gt;Go&lt;/a&gt;: серверный язык программирования, созданный Google&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;GV4u&quot;&gt;Интересный факт: эти проекты с открытым исходным кодом долгое время размещались на внутреннем Git-хостинге под названием «&lt;em&gt;git-on-borg&lt;/em&gt;» для удобства внутреннего доступа (подробнее о Borg мы расскажем в разделе «Вычисления и хранение данных».) Затем это внутреннее репозиторий было зеркалировано на внешнем сервере.&lt;/p&gt;
  &lt;p id=&quot;V8Gt&quot;&gt;&lt;strong&gt;Разработка на основе магистральной ветки является нормой. &lt;/strong&gt;Все разработчики работают в одной основной ветке, которая является источником достоверной информации («магистральной веткой»). Разработчики создают краткосрочные ветки для внесения изменений, а затем объединяют их с магистральной веткой. Команда разработчиков Google обнаружила, что использование долгосрочных веток разработки снижает продуктивность. В книге &lt;em&gt;«Разработка программного обеспечения в Google»&lt;/em&gt; &lt;a href=&quot;https://abseil.io/resources/swe-book/html/ch16.html#branch_management&quot; target=&quot;_blank&quot;&gt;объясняется&lt;/a&gt;:&lt;/p&gt;
  &lt;blockquote id=&quot;sVbA&quot;&gt;«Если мы представим незавершённую работу как аналог ветки разработки, это ещё больше укрепит нас во мнении, что работа должна выполняться небольшими порциями и регулярно фиксироваться».&lt;/blockquote&gt;
  &lt;p id=&quot;Aeln&quot;&gt;В 2016 году в монорепозитории Google работало более 1000 инженерных команд, и лишь немногие из них использовали долгосрочные ветки разработки. Во всех случаях использование долгосрочной ветки было связано с необычными требованиями, а распространённой причиной была поддержка нескольких версий API.&lt;/p&gt;
  &lt;p id=&quot;x6OD&quot;&gt;Подход Google к разработке на основе магистрального кода интересен тем, что это, вероятно, крупнейшая инженерная организация в мире, и важно, что в ней есть большие команды разработчиков платформ, которые поддерживают инструменты для монорепозиториев и системы сборки, позволяющие разрабатывать на основе магистрального кода. Во внешнем мире разработка на основе магистрального кода стала нормой для большинства стартапов и крупных компаний: &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/stacked-diffs&quot; target=&quot;_blank&quot;&gt;инструменты, поддерживающие многоуровневые сравнения&lt;/a&gt; очень помогают.&lt;/p&gt;
  &lt;p id=&quot;Wsos&quot;&gt;&lt;strong&gt;Документация часто хранится в монорепозитории, и это может создавать проблемы. &lt;/strong&gt;Вся общедоступная документация по API для Android и Google Cloud хранится в монорепозитории, а это значит, что к файлам документации применяются те же правила читабельности, что и к коду Google. Google предъявляет строгие требования к читабельности всех файлов с исходным кодом (см. ниже). Однако в случае с внешним кодом примеры обычно не соответствуют внутренним рекомендациям по читабельности намеренно!&lt;/p&gt;
  &lt;p id=&quot;zBBX&quot;&gt;По этой причине рекомендуется хранить примеры кода за пределами монорепозитория, в отдельном репозитории GitHub, чтобы избежать проблем с читабельностью (например, если файл с примером называется quickstart.java.txt).&lt;/p&gt;
  &lt;p id=&quot;qxUz&quot;&gt;Например, вот &lt;a href=&quot;https://developers.google.com/workspace/drive/api/quickstart/js&quot; target=&quot;_blank&quot;&gt;старый пример документации&lt;/a&gt;, где исходный код находится в отдельном файле репозитория GitHub, чтобы избежать проверки читабельности Google. В новых примерах &lt;a href=&quot;https://ai.google.dev/gemini-api/docs/text-generation&quot; target=&quot;_blank&quot;&gt;таких как этот&lt;/a&gt; код записывается непосредственно в файл документации, который настроен таким образом, чтобы не вызывать проверку читабельности.&lt;/p&gt;
  &lt;p id=&quot;cABt&quot;&gt;&lt;strong&gt;Не весь монорепозиторий доступен каждому инженеру. &lt;/strong&gt;Доступна большая часть кодовой базы, но некоторые разделы ограничены:&lt;/p&gt;
  &lt;ul id=&quot;IOZF&quot;&gt;
    &lt;li id=&quot;Ni4u&quot;&gt;Файл &lt;strong&gt;OWNERS&lt;/strong&gt;: этот файл содержит список владельцев кода. Чтобы что-то объединить, вам нужно получить одобрение хотя бы от одного разработчика из этого списка. Модель «OWNERS» применяется в проектах с открытым исходным кодом, таких как Android или Chromium.&lt;/li&gt;
    &lt;li id=&quot;YLME&quot;&gt;Хранилища для конфиденциальных данных: доступ на чтение к конфиденциальным проектам или их частям ограничен. Например, некоторые подсказки в проекте Gemini доступны для чтения только инженерам, работающим над ним.&lt;/li&gt;
    &lt;li id=&quot;b9Sd&quot;&gt;Инфраструктурные решения для конфиденциальных проектов: командам, занимающимся инфраструктурой, нужен доступ даже к конфиденциальным проектам, чтобы они могли настроить такие инструменты, как codemod (для автоматического преобразования инструментов). Команды, занимающиеся инфраструктурой, обычно назначают одного или двух специалистов по инфраструктуре, которых добавляют в глобальный список разрешённых пользователей, чтобы они могли видеть эти конфиденциальные проекты и помогать разработчикам с настройкой инструментов и решением проблем.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;qBJJ&quot;&gt;Архитектура и проектирование систем&lt;/h3&gt;
  &lt;p id=&quot;Cxk7&quot;&gt;В 2016 году менеджер по разработке Google Рэйчел Потвин &lt;a href=&quot;https://dl.acm.org/doi/pdf/10.1145/2854146&quot; target=&quot;_blank&quot;&gt;объяснила&lt;/a&gt;, что, несмотря на монорепозиторий, кодовая база Google не является монолитной. Мы спросили у нынешних инженеров, так ли это до сих пор, и нам ответили, что ничего не изменилось:&lt;/p&gt;
  &lt;blockquote id=&quot;YOJ4&quot;&gt;«Честно говоря, я не вижу особой разницы с организациями, которые используют отдельные репозитории, например AWS. В любом случае у нас есть инструменты для поиска по всему коду, на который у вас есть права». — Инженер-программист 6-го уровня в Google.“Процесс разработки программного обеспечения распределен, а не централизован. Система сборки похожа на Bazel (внутренне она называется Blaze). У отдельных команд могут быть свои собственные цели сборки, которые проходят через отдельный CI / CD ”. – Благодарность сотрудников L6 в Google.&lt;/blockquote&gt;
  &lt;p id=&quot;l0dh&quot;&gt;Еще одна крупная технологическая компания, которая с самого начала использовала монорепозиторий &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/55330545/the-monorepo&quot; target=&quot;_blank&quot;&gt;— это Meta&lt;/a&gt;. &lt;em&gt;Подробнее о ее монорепозитории можно прочитать в &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/55330545/the-monorepo&quot; target=&quot;_blank&quot;&gt;Статье о культуре разработки в Meta.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;GFFE&quot;&gt;&lt;strong&gt;Каждая команда в Google выбирает свой подход к проектированию систем, &lt;/strong&gt;что означает, что продукты часто имеют разный дизайн! Сходство заключается в инфраструктуреи инструментах разработки, которые используют все системы, а также в низкоуровневых компонентах, таких как Protobuf и Stubby, внутренний gRPC. Ниже приведены несколько общих тем, которые обсуждались с более чем 20 сотрудниками Google:&lt;/p&gt;
  &lt;ul id=&quot;VrUO&quot;&gt;
    &lt;li id=&quot;y0se&quot;&gt;&lt;strong&gt;Сервисы распространены повсеместно. &lt;/strong&gt;Google не считает их «микросервисами», поскольку многие из них большие и сложные. Но команды редко ориентируются на монолитную архитектуру. Когда сервис становится слишком большим, его обычно разбивают на более мелкие сервисы, в основном из соображений масштабирования, а не модульности.&lt;/li&gt;
    &lt;li id=&quot;i2es&quot;&gt;&lt;strong&gt;Stubby используется для обмена данными между сервисами.&lt;/strong&gt; Это стандартный способ взаимодействия сервисов друг с другом; gRPC используется редко и обычно только для внешних сервисов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;wotA&quot;&gt;Один из нынешних инженеров Google описал это место с архитектурной точки зрения:&lt;/p&gt;
  &lt;blockquote id=&quot;ow8E&quot;&gt;«Google похож на множество маленьких соборов, собранных на одном большом базаре».&lt;/blockquote&gt;
  &lt;figure id=&quot;3FCb&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!84z6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65980c94-1c8d-4cee-9e4e-af105feb7bb2_1024x1024.png&quot; width=&quot;1024&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Хаотичный базар с аккуратно построенными соборами. Изображение от Gemini&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9ErD&quot;&gt;Эта метафора взята из книги &lt;em&gt;«Собор и базар»&lt;/em&gt;, где собор — это разработка с закрытым исходным кодом (организованная, нисходящая), а базар — разработка с открытым исходным кодом (менее организованная, восходящая).&lt;/p&gt;
  &lt;p id=&quot;2Iwo&quot;&gt;Несколько интересных фактов о крупных сервисах Google:&lt;/p&gt;
  &lt;ul id=&quot;lP0i&quot;&gt;
    &lt;li id=&quot;NDx0&quot;&gt;&lt;strong&gt;YouTube&lt;/strong&gt; раньше был монолитом на Python, но позже был переписан на C++ и Java. Много лет назад каждый релиз &lt;a href=&quot;https://abseil.io/resources/swe-book/html/ch24.html#:~:text=There%20is%20also%20a%2050%2Dhour%20manual%20regression%20testing%20cycle%20run%20by%20a%20remote%20QA%20team%20on%20every%20release&quot; target=&quot;_blank&quot;&gt;проходил&lt;/a&gt; 50-часовой цикл ручного тестирования, проводимого удалённой командой контроля качества.&lt;/li&gt;
    &lt;li id=&quot;JtG2&quot;&gt;&lt;strong&gt;Поиск Google&lt;/strong&gt; — это самая большая и монолитная кодовая база. Наличие монолитных кодовых баз — это исключение, а не правило.&lt;/li&gt;
    &lt;li id=&quot;qgZn&quot;&gt;&lt;strong&gt;Реклама и облачные сервисы&lt;/strong&gt; используют всё больше (микро)сервисов.&lt;/li&gt;
    &lt;li id=&quot;kkzs&quot;&gt;&lt;strong&gt;Переработка сервисов в микросервисы&lt;/strong&gt; — это подход, который Google использует в некоторых случаях. Переработка приложения с нуля в микросервисную архитектуру (для обеспечения нужного уровня модульности) &lt;a href=&quot;https://abseil.io/resources/swe-book/html/ch24.html#:~:text=The%20investment%20with,the%20new%20architecture.&quot; target=&quot;_blank&quot;&gt;требует меньше усилий&lt;/a&gt;, чем разделение монолита на части.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;mcum&quot;&gt;3. Технологический стек&lt;/h2&gt;
  &lt;h3 id=&quot;Ulfs&quot;&gt;Официально поддерживаемые языки программирования&lt;/h3&gt;
  &lt;p id=&quot;o7g8&quot;&gt;Внутри компании Google официально поддерживает следующие языки программирования. Это означает, что для них существуют специальные инструменты и платформы:&lt;/p&gt;
  &lt;ul id=&quot;jgDl&quot;&gt;
    &lt;li id=&quot;7WXc&quot;&gt;C++&lt;/li&gt;
    &lt;li id=&quot;IyZA&quot;&gt;Котлин и Ява&lt;/li&gt;
    &lt;li id=&quot;6irF&quot;&gt;Питон&lt;/li&gt;
    &lt;li id=&quot;lAR1&quot;&gt;Вперед&lt;/li&gt;
    &lt;li id=&quot;sCtg&quot;&gt;TypeScript и JavaScript&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;XdZB&quot;&gt;Инженеры могут использовать другие языки, но они не получат специальной поддержки от команд разработчиков платформы.&lt;/p&gt;
  &lt;p id=&quot;VydW&quot;&gt;&lt;strong&gt;TypeScript заменяет JavaScript в Google,&lt;/strong&gt;рассказали нам несколько инженеров. Компания больше не позволяет добавлять новые файлы JavaScript, но существующие файлы можно изменять.&lt;/p&gt;
  &lt;p id=&quot;9zoK&quot;&gt;&lt;strong&gt;Kotlin&lt;/strong&gt; становится очень популярным не только в мобильной разработке, но и в серверной. Новые сервисы пишутся почти исключительно на Kotlin или Go, а Java кажется «устаревшей». Переход с Java на Kotlin происходит по инициативе разработчиков, большинство из которых считают Kotlin более удобным в работе.&lt;/p&gt;
  &lt;p id=&quot;TVUG&quot;&gt;&lt;strong&gt;Для мобильных устройств&lt;/strong&gt;используются следующие языки:&lt;/p&gt;
  &lt;ul id=&quot;bg0J&quot;&gt;
    &lt;li id=&quot;zYpz&quot;&gt;Objective C и Swift для iOS&lt;/li&gt;
    &lt;li id=&quot;I2oY&quot;&gt;Kotlin для Android (и Java для устаревших приложений). Кроме того, для Android регулярно используется Rust.&lt;/li&gt;
    &lt;li id=&quot;XAgr&quot;&gt;Dart для Flutter (для кроссплатформенных приложений)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;0ASd&quot;&gt;&lt;strong&gt;Руководства по языковому стилю&lt;/strong&gt; существуют в Google, и для каждого языка есть своё руководство. Вот несколько примеров:&lt;/p&gt;
  &lt;ul id=&quot;h13p&quot;&gt;
    &lt;li id=&quot;4SiO&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/javaguide.html&quot; target=&quot;_blank&quot;&gt;Стиль Google Java&lt;/a&gt; — &lt;a href=&quot;https://github.com/google/google-java-format&quot; target=&quot;_blank&quot;&gt;Инструмент форматирования Google Java&lt;/a&gt; форматирует код в соответствии с этим стилем&lt;/li&gt;
    &lt;li id=&quot;UGsz&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/tsguide.html&quot; target=&quot;_blank&quot;&gt;Стиль Google TypeScript&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;qNpO&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/pyguide.html&quot; target=&quot;_blank&quot;&gt;Стиль Google Python&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;pPC3&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/go/&quot; target=&quot;_blank&quot;&gt;Стиль Google Go&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;TzEk&quot;&gt;См. &lt;a href=&quot;https://google.github.io/styleguide/&quot; target=&quot;_blank&quot;&gt;все руководства по языковому стилю Google&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;t1bM&quot;&gt;Функциональная совместимость и удалённый вызов процедур&lt;/h3&gt;
  &lt;p id=&quot;5MwE&quot;&gt;&lt;strong&gt;Protobuf&lt;/strong&gt; — это подход Google к обеспечению совместимости, &lt;a href=&quot;https://en.wikipedia.org/wiki/Interoperability&quot; target=&quot;_blank&quot;&gt;который&lt;/a&gt; заключается в работе с разными языками программирования. &lt;a href=&quot;https://protobuf.dev/&quot; target=&quot;_blank&quot;&gt;Protobuf&lt;/a&gt; — это сокращение от «буферов протокола»: языково-независимый способ сериализации структурированных данных. Вот пример определения protobuf:&lt;/p&gt;
  &lt;blockquote id=&quot;Dvme&quot;&gt;издание = «2024»;лицо , Передающее сообщение {строка name = 1;int32 id = 2;строка email = 3;}&lt;/blockquote&gt;
  &lt;p id=&quot;iOQu&quot;&gt;Это можно использовать для передачи &lt;em&gt;объекта Person&lt;/em&gt; между разными языками программирования; например, между приложением на Kotlin и приложением на C++.&lt;/p&gt;
  &lt;p id=&quot;i2Ej&quot;&gt;Интересная особенность собственных API Google, будь то GRPC, Stubby, REST и т. д., заключается в том, что они &lt;em&gt;все&lt;/em&gt; определены с помощью protobuf. На основе этого определения создаются клиенты API для всех языков. Таким образом, внутри компании легко использовать этих клиентов и вызывать API, не беспокоясь о базовом протоколе.&lt;/p&gt;
  &lt;p id=&quot;JVqF&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://grpc.io/&quot; target=&quot;_blank&quot;&gt;gRPC&lt;/a&gt; &lt;/strong&gt;— это современная высокопроизводительная платформа с открытым исходным кодом для удаленных процедурных вызовов (RPC) между сервисами. Компания Google открыла исходный код и популяризировала этот протокол связи, который теперь является популярной альтернативой &lt;a href=&quot;https://en.wikipedia.org/wiki/REST&quot; target=&quot;_blank&quot;&gt;REST&lt;/a&gt;. Самое большое различие между REST и gRPC заключается в том, что REST использует HTTP для удобочитаемого форматирования, в то время как gRPC — это двоичный формат, который превосходит REST за счет меньшего размера полезной нагрузки и меньших затрат на сериализацию и десериализацию. Внутри компании сервисы Google, как правило, взаимодействуют с помощью «внутренней реализации gRPC от Google» под названием Stubby и не используют REST.&lt;/p&gt;
  &lt;p id=&quot;HniW&quot;&gt;&lt;strong&gt;Stubby&lt;/strong&gt; — это внутренняя версия gRPC и её предшественник. Почти все взаимодействия между сервисами осуществляются через Stubby. По сути, у каждого сервиса Google есть API Stubby для доступа к нему. gRPC используется только для внешних взаимодействий, например для внешних вызовов gRPC.&lt;/p&gt;
  &lt;p id=&quot;zSqg&quot;&gt;Название «stubby» происходит от того, что в протобуферах может быть определено обслуживание, а &lt;em&gt;заглушки&lt;/em&gt; могут быть сгенерированы из этих функций на каждом языке. А от «заглушки» происходит «stubby».&lt;/p&gt;
  &lt;h2 id=&quot;2XOJ&quot;&gt;4. Инструменты Dev&lt;/h2&gt;
  &lt;p id=&quot;egS0&quot;&gt;В некотором смысле повседневные инструменты Google для разработчиков наиболее наглядно демонстрируют, насколько эта компания отличается от других.&lt;/p&gt;
  &lt;figure id=&quot;56Az&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!QIQc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff87deaa8-72cf-4b38-b291-ec5fe718bdff_1390x1054.png&quot; width=&quot;1390&quot; /&gt;
    &lt;figcaption&gt;Инструменты разработчика в большинстве компаний, кроме Google&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;oGVd&quot;&gt;Давайте рассмотрим эти инструменты и то, как они работают в технологическом гиганте:&lt;/p&gt;
  &lt;h4 id=&quot;XoGx&quot;&gt;Контроль версий&lt;/h4&gt;
  &lt;p id=&quot;vwyW&quot;&gt;&lt;strong&gt;Piper&lt;/strong&gt; — это основное решение Google для контроля версий. В 2020 году оно обрабатывало 60–70 000 коммитов в день и хранило более 80 ТБ метаданных и контента (!). Раньше Piper был построен на Bigtable, а теперь &lt;a href=&quot;https://cacm.acm.org/research/why-google-stores-billions-of-lines-of-code-in-a-single-repository/&quot; target=&quot;_blank&quot;&gt;использует&lt;/a&gt; Spanner. Он распределён по более чем 10 центрам обработки данных и использует &lt;a href=&quot;https://en.wikipedia.org/wiki/Paxos_(computer_science)&quot; target=&quot;_blank&quot;&gt;алгоритм Паксоса&lt;/a&gt; (который также используется в сервисе распределённых блокировок Chubby) для обеспечения согласованности между репликами.&lt;/p&gt;
  &lt;p id=&quot;arZX&quot;&gt;В первые годы своего существования Google использовала &lt;a href=&quot;https://www.perforce.com/products/helix-core&quot; target=&quot;_blank&quot;&gt;Perforce&lt;/a&gt; для контроля версий, но столкнулась с проблемами масштабирования и &lt;a href=&quot;https://youtu.be/W71BTkUbdqE?feature=shared&amp;t=444&quot; target=&quot;_blank&quot;&gt;перешла&lt;/a&gt; на другой инструмент в 2012 году. Это показывает, насколько масштабнее деятельность Google по сравнению с другими компаниями: Perforce — это предпочтительное в отрасли решение для контроля версий в крупных кодовых базах. Такие компании, как Nintendo, Ubisoft, Electronic Arts и другие, используют его, потому что Git не поддерживает кодовые базы с большим количеством ресурсов, например игр.&lt;/p&gt;
  &lt;p id=&quot;RHb3&quot;&gt;&lt;strong&gt;Fig&lt;/strong&gt; — это новая внутренняя система контроля версий, основанная на &lt;a href=&quot;https://www.mercurial-scm.org/&quot; target=&quot;_blank&quot;&gt;Mercurial&lt;/a&gt;, по словам нынешних инженеров Google. Многие новые проекты используют Fig, но поддерживаются и Piper, и Fig.&lt;/p&gt;
  &lt;p id=&quot;4AsG&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://www.gerritcodereview.com/index.html&quot; target=&quot;_blank&quot;&gt;Gerrit&lt;/a&gt;&lt;/strong&gt; — это «интерфейс управления версиями», созданный на основе Git и схожий с системами GitHub и GitLab. Он был открыт компанией Google и использовался в таких проектах, как Chromium и Android. Он поддерживает такие рабочие процессы, как работа со списками изменений (CL) вместо веток.&lt;/p&gt;
  &lt;h4 id=&quot;mfDO&quot;&gt;Проверка кода&lt;/h4&gt;
  &lt;p id=&quot;HKMI&quot;&gt;&lt;strong&gt;Критика &lt;/strong&gt;— это инструмент для проверки кода от Google. Он работает в веб-браузере и на первый взгляд предлагает те же функции, что и GitHub:&lt;/p&gt;
  &lt;figure id=&quot;5Dlc&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!LNwv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8004c48-a9d7-4ceb-bf57-a7f49a31f45d_1440x966.png&quot; width=&quot;1440&quot; /&gt;
    &lt;figcaption&gt;Критический анализ&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ogPG&quot;&gt;Для многих сотрудников Google любимым инструментом, вероятно, является Critique. Согласно внутренним опросам, уровень удовлетворённости пользователей составляет целых 97 % (!!)&lt;/p&gt;
  &lt;p id=&quot;lViE&quot;&gt;В Critique есть удобные интеграции:&lt;/p&gt;
  &lt;ul id=&quot;8SE2&quot;&gt;
    &lt;li id=&quot;Yz9N&quot;&gt;Если кто-то добавляет комментарий, а вы открываете это рабочее пространство в своей IDE в Cider, вы видите комментарии прямо в IDE и можете ответить на них. Не нужно возвращаться в Critique&lt;/li&gt;
    &lt;li id=&quot;UzVw&quot;&gt;Встроенный поиск и редактор кода&lt;/li&gt;
    &lt;li id=&quot;9yKJ&quot;&gt;Поддерживает просмотр файлов по одному&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Ro7X&quot;&gt;&lt;strong&gt;LGTM&lt;/strong&gt; — это сокращение от «на мой взгляд, выглядит неплохо», и именно так в Critique одобряется CL (запрос на изменение). Это ещё один пример культуры «гуглости»: вместо формального глагола «одобрить» разработчики просто используют LGTM.&lt;/p&gt;
  &lt;h4 id=&quot;jAw7&quot;&gt;Рабочий процесс CL&lt;/h4&gt;
  &lt;p id=&quot;0rPw&quot;&gt;CL расшифровывается как «список изменений» и является аналогом запросов на вытягивание (pull requests, PR). Несмотря на то, что эти два инструмента &lt;em&gt;похожи&lt;/em&gt;, CL отличаются от PR. Вот чем:&lt;/p&gt;
  &lt;figure id=&quot;F5ii&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!kvs7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bbc2cf2-b963-4265-8577-77731ae96e70_1544x1058.png&quot; width=&quot;1456&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SZaf&quot;&gt;По сути, рабочий процесс CL гораздо более регламентирован, чем рабочий процесс PR. В нем приоритет отдается предоставлению полных, а не частичных комментариев, отслеживанию того, кто выполняет следующее действие, а также строгим проверкам качества, которые должны быть завершены до того, как CL будет отправлен на слияние.&lt;/p&gt;
  &lt;p id=&quot;uVA9&quot;&gt;Более подробную информацию о рабочем процессе CL можно найти в &lt;a href=&quot;https://abseil.io/resources/swe-book/html/ch19.html#stage_one_creating_a_change:~:text=Stage%201%3A%20Create%20a%20Change&quot; target=&quot;_blank&quot;&gt;этом разделе&lt;/a&gt;книги&lt;em&gt;«Разработка программного обеспечения в Google»&lt;/em&gt;.&lt;/p&gt;
  &lt;h4 id=&quot;b8kh&quot;&gt;Поиск кода&lt;/h4&gt;
  &lt;p id=&quot;SDbs&quot;&gt;Поиск кода эволюционировал от &lt;a href=&quot;https://en.wikipedia.org/wiki/Grep&quot; target=&quot;_blank&quot;&gt;grep&lt;/a&gt;-подобного инструмента, который использовался в Google на ранних этапах, когда он мог найти любое использование слова или фразы, до сегодняшнего дня, когда он может ответить на такие вопросы, как:&lt;/p&gt;
  &lt;ul id=&quot;FqLa&quot;&gt;
    &lt;li id=&quot;lrdD&quot;&gt;«Где определена эта функция?»&lt;/li&gt;
    &lt;li id=&quot;lWFJ&quot;&gt;«Как мне использовать этот класс?»&lt;/li&gt;
    &lt;li id=&quot;a6kI&quot;&gt;«Когда эта переменная была добавлена в кодовую базу?»&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;YJrh&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://kythe.io/&quot; target=&quot;_blank&quot;&gt;Kythe&lt;/a&gt; &lt;/strong&gt;— это инструмент семантического индексирования, который лежит в основе поиска кода. Это инструмент, который позволяет задавать такие вопросы, как «кто вызывает эту функцию?» и «какие классы наследуются от этого класса?»&lt;/p&gt;
  &lt;p id=&quot;3tU2&quot;&gt;Поиск кода оптимизирован для &lt;em&gt;чтения&lt;/em&gt; кода, а также для понимания и изучения кодовой базы в больших масштабах. Он в значительной степени опирается на облачный сервер для поиска контента и разрешения перекрестных ссылок.&lt;/p&gt;
  &lt;p id=&quot;xlwl&quot;&gt;Функция поиска кода позволяет осуществлять поиск кода в проектах с открытым исходным кодом, таких как &lt;a href=&quot;https://cs.android.com/&quot; target=&quot;_blank&quot;&gt;поиск кода для Android&lt;/a&gt; и других проектах. Внутренняя функция поиска кода имеет гораздо больше интеграций, чем доступные извне, например поиск кода для Android.&lt;/p&gt;
  &lt;p id=&quot;EIfs&quot;&gt;&lt;strong&gt;Вместе с Critique Code Search является одним из самых популярных внутренних инструментов Google.&lt;/strong&gt; Вот как его описали два нынешних и бывших сотрудника Google:&lt;/p&gt;
  &lt;blockquote id=&quot;GStF&quot;&gt;«Инструмент для поиска кода настолько хорош, что для меня он был чем-то вроде LLM-lite: я использовал его как систему поиска кода».&lt;/blockquote&gt;
  &lt;p id=&quot;Uj4W&quot;&gt;&lt;strong&gt;Sourcegraph&lt;/strong&gt; — это инструмент для поиска кода, созданный на основе Code Search и предоставляющий возможности «поиска кода» для многих компаний. По словам нескольких инженеров Google, которые используют оба инструмента, в наши дни Sourcegraph по функциональности не уступает Code Search. &lt;em&gt;Мы подробно изучили &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/inside-sourcegraphs-engineering-culture&quot; target=&quot;_blank&quot;&gt;инженерную культуру Sourcegraph&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;YFBH&quot;&gt;Инструменты для поиска кода на базе искусственного интеллекта также упростили воспроизведение «волшебства поиска кода» от Google. Один из сотрудников Google так охарактеризовал поиск кода:&lt;/p&gt;
  &lt;blockquote id=&quot;hmFj&quot;&gt;«Мне кажется, что Sourcegraph и другие компании догнали нас в этой области — на самом деле они даже немного превзошли возможности Code Search. Это связано с тем, что в команде Code Search меньше сотрудников, а также с тем, что Code Search в настоящее время не использует поиск кода на основе искусственного интеллекта».&lt;/blockquote&gt;
  &lt;h4 id=&quot;RHii&quot;&gt;Система сборки&lt;/h4&gt;
  &lt;p id=&quot;WGRM&quot;&gt;&lt;strong&gt;Blaze&lt;/strong&gt; — это декларативная и распределённая система сборки от Google, созданная специально для монорепозитория. Таким образом, она предназначена для работы в планетарном масштабе. Она использует файлы BUILD для декларативного описания сборок, а также распределена и кэширована на нескольких компьютерах. Шаги сборки «герметичны», то есть зависят только от заявленных входных данных. Они также детерминированы, что означает надёжность системы сборки в целом.&lt;/p&gt;
  &lt;p id=&quot;A8zu&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://bazel.build/&quot; target=&quot;_blank&quot;&gt;Bazel&lt;/a&gt;&lt;/strong&gt; — это внешняя версия Blaze с открытым исходным кодом, и надёжность является её важной характеристикой, как &lt;em&gt;разработчики программного обеспечения в Google &lt;/em&gt;обсуждают&lt;em&gt;:&lt;/em&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;mdG6&quot;&gt;«Многие старые системы сборки пытаются найти компромисс между скоростью и корректностью, прибегая к упрощениям, которые могут привести к сбоям в сборке. Основная цель Bazel — избежать необходимости выбирать между скоростью и корректностью, предоставляя систему сборки, которая гарантирует эффективную и стабильную сборку кода».&lt;/blockquote&gt;
  &lt;p id=&quot;cnZC&quot;&gt;Подробнее о системах сборки в Google и Bazel читайте в главе &lt;a href=&quot;https://abseil.io/resources/swe-book/html/ch18.html&quot; target=&quot;_blank&quot;&gt;Системы сборки и философия сборки&lt;/a&gt; в вышеупомянутой книге.&lt;/p&gt;
  &lt;p id=&quot;OivM&quot;&gt;В нескольких проектах Google используются разные системы сборки:&lt;/p&gt;
  &lt;ul id=&quot;fwEI&quot;&gt;
    &lt;li id=&quot;ikW5&quot;&gt;&lt;strong&gt;Soong&lt;/strong&gt;: система сборки &lt;a href=&quot;https://source.android.com/docs/setup/build&quot; target=&quot;_blank&quot;&gt;используется в&lt;/a&gt; Android&lt;/li&gt;
    &lt;li id=&quot;t8vi&quot;&gt;&lt;strong&gt;GN&lt;/strong&gt;: &lt;a href=&quot;https://www.chromium.org/developers/gn-build-configuration/&quot; target=&quot;_blank&quot;&gt;используется в&lt;/a&gt; Chromium&lt;/li&gt;
    &lt;li id=&quot;qFuO&quot;&gt;&lt;strong&gt;Gradle&lt;/strong&gt;: &lt;a href=&quot;https://developer.android.com/jetpack/androidx&quot; target=&quot;_blank&quot;&gt;используется в&lt;/a&gt; AndroidX (набор библиотек с открытым исходным кодом, созданных для Android)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;00Zz&quot;&gt;Облачные среды разработки&lt;/h4&gt;
  &lt;p id=&quot;rcPf&quot;&gt;&lt;strong&gt;CitC&lt;/strong&gt; (Clients in the Cloud) — это инструмент, который позволяет создавать виртуальные рабочие пространства без необходимости извлекать код или хранить его на компьютерах разработчиков, как и в других облачных средах разработки. &lt;em&gt;Подробнее об этом в &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/cloud-development-environments&quot; target=&quot;_blank&quot;&gt;подробном обзоре облачных сред разработки&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;owyN&quot;&gt;&lt;strong&gt;Fig&lt;/strong&gt; — это преемник CitC, который большинство разработчиков используют для виртуальных рабочих пространств.&lt;/p&gt;
  &lt;h4 id=&quot;3rp4&quot;&gt;IDE&lt;/h4&gt;
  &lt;p id=&quot;VSUi&quot;&gt;&lt;strong&gt;Cider&lt;/strong&gt; — это интегрированная среда разработки от Google, которой пользуется большинство разработчиков. Она основана на VS Code и выглядит так же, за исключением того, что она хорошо интегрирована с внутренними системами Google, такими как:&lt;/p&gt;
  &lt;ul id=&quot;1y4Q&quot;&gt;
    &lt;li id=&quot;qXaI&quot;&gt;Критика (проверка кода)&lt;/li&gt;
    &lt;li id=&quot;0BFz&quot;&gt;Blaze (инструмент для сборки)&lt;/li&gt;
    &lt;li id=&quot;0Dyr&quot;&gt;Гитара (сквозное тестирование с использованием реальных систем)&lt;/li&gt;
    &lt;li id=&quot;ui5A&quot;&gt;TAP (платформа автоматизации тестирования, непрерывная сборка от Google)&lt;/li&gt;
    &lt;li id=&quot;0C1R&quot;&gt;Tricorder (статический анализ)&lt;/li&gt;
    &lt;li id=&quot;FlM8&quot;&gt;CodeSearch (инструмент для поиска кода)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;5vjd&quot;&gt;Инженер Google привёл нам пример того, насколько всё там взаимосвязано:&lt;/p&gt;
  &lt;blockquote id=&quot;cZrr&quot;&gt;«Очень легко получить ссылку на CodeSearch, которая ведёт на строку, открытую в Cider. Затем вы можете поделиться этой ссылкой, и она откроет Cider на той же строке для всех остальных. Так что это отличный инструмент для обмена вопросами или кодом, который вы просматриваете».&lt;/blockquote&gt;
  &lt;p id=&quot;gvjq&quot;&gt;Несколько лет назад Cider был веб-версией IDE с гораздо меньшим количеством возможностей и меньшим объёмом внутреннего использования. После перехода на форк VS Code объём внутреннего использования значительно увеличился.&lt;/p&gt;
  &lt;h4 id=&quot;00vc&quot;&gt;Масштабный рефакторинг&lt;/h4&gt;
  &lt;p id=&quot;MjRL&quot;&gt;&lt;strong&gt;Rosie&lt;/strong&gt; — это инструмент для крупномасштабного рефакторинга, который очень полезен, учитывая строгие правила проверки кода в Google. Он может разбивать крупные изменения в коде на более мелкие части. Эти более мелкие части можно тестировать, проверять и отправлять на доработку независимо друг от друга. При разбиении учитывается авторство кода. Инженер L4 объяснил нам, почему они любят Rosie:&lt;/p&gt;
  &lt;blockquote id=&quot;usOl&quot;&gt;«Как разработчику инфраструктуры, вам часто приходится вносить масштабные изменения (кодовые моды) во всё репозиторий. Из-за файла OWNERS внесение таких изменений в виде одного большого коммита вызывает раздражение из-за большого количества необходимых согласований.Рози возьмёт ваш огромный CL с сотнями или тысячами изменённых файлов и разделит его на более мелкие части, которые будут отправлены отдельным командам.&lt;/blockquote&gt;
  &lt;h4 id=&quot;KvLo&quot;&gt;Статический анализ&lt;/h4&gt;
  &lt;p id=&quot;q8H3&quot;&gt;&lt;strong&gt;Tricorder&lt;/strong&gt; — это инструмент статического анализа от Google. Инженер, работавший над ним, объясняет:&lt;/p&gt;
  &lt;blockquote id=&quot;Do9g&quot;&gt;«Tricorder — это инструмент для статического и программного анализа, который запускает линтеры и анализаторы, тесно интегрированные с любой другой системой разработки:Запуск при проверке кодаПри развертыванииПри каждом коммите (так называемом «снимке»).Это платформа по принципу «подключи и работай», на которой команды могут создавать собственные анализаторы кода и определять предварительные условия для их запуска.&lt;/blockquote&gt;
  &lt;p id=&quot;rK9e&quot;&gt;Команда попыталась открыть исходный код версии Tricorder под названием &lt;a href=&quot;https://github.com/google/shipshape&quot; target=&quot;_blank&quot;&gt;ShipShape&lt;/a&gt;, но этот проект сейчас заархивирован. Один из инженеров рассказал нам, что из-за разнообразия систем сборки во внешнем мире сделать Tricorder таким же полезным для других компаний, как для Google, гораздо сложнее.&lt;/p&gt;
  &lt;p id=&quot;VwpE&quot;&gt;Более подробную информацию о Tricorder можно найти в &lt;a href=&quot;https://research.google/pubs/tricorder-building-a-program-analysis-ecosystem/&quot; target=&quot;_blank&quot;&gt;этой статье&lt;/a&gt;.&lt;/p&gt;
  &lt;h4 id=&quot;hMdC&quot;&gt;Перейти по ссылкам&lt;/h4&gt;
  &lt;p id=&quot;o1KN&quot;&gt;В Google просто введите «go/что угодно», чтобы перейти по быстрой ссылке. Это полезная функция, и многие другие компании создали аналогичную функцию быстрых ссылок, например Stripe со своим инструментом &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/140970283/go&quot; target=&quot;_blank&quot;&gt;go&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;woFY&quot;&gt;Теперь есть даже сервис под названием &lt;a href=&quot;https://golinks.github.io/golinks/&quot; target=&quot;_blank&quot;&gt;GoLinks&lt;/a&gt;, который реализует эту простую, но полезную идею!&lt;/p&gt;
  &lt;h2 id=&quot;XjlH&quot;&gt;5. Вычисления и хранение данных&lt;/h2&gt;
  &lt;p id=&quot;WP2J&quot;&gt;Google расширила свою инфраструктуру до глобального масштаба раньше, чем любая другая технологическая компания. В конце 1990-х — начале 2000-х годов большинство технологических компаний приобретали дорогие и большие мейнфреймы для масштабирования своего парка серверов. В отличие от них, Google создавала вычислительные системы и хранилища на базе стандартного оборудования. Для этого им нужно было создать новые типы программного обеспечения для управления парком стандартного оборудования в невиданных ранее масштабах. Поэтому неудивительно, что у Google уникальная, специализированная программная инфраструктура.&lt;/p&gt;
  &lt;h3 id=&quot;48RW&quot;&gt;Borg и связанные с ним системы&lt;/h3&gt;
  &lt;p id=&quot;5mN2&quot;&gt;&lt;strong&gt;Borg&lt;/strong&gt; — это система, которая управляет физической инфраструктурой Google. Borg управляет кластерами из десятков тысяч машин и выполняет на них сотни тысяч заданий. Вот как &lt;a href=&quot;https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43438.pdf&quot; target=&quot;_blank&quot;&gt;в статье 2015 года кратко описывается&lt;/a&gt; высокоуровневая структура Borg:&lt;/p&gt;
  &lt;figure id=&quot;3n5J&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!jCs4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c203b17-838c-483f-a5c9-e4ee3256fdcd_760x626.png&quot; width=&quot;760&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Архитектура Borg. Источник: &lt;a href=&quot;https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43438.pdf&quot; target=&quot;_blank&quot;&gt;Управление крупномасштабными кластерами в Google с помощью Borg&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jHDu&quot;&gt;Borg обеспечивает работу всех крупных приложений Google планетарного масштаба, таких как Поиск, Gmail и Реклама. Но и небольшие приложения часто начинают работу с Borg. Например, он используется даже для запуска простых блокнотов на Python. Borg является частью технологического стека PROD, поэтому начать работу с ним внутри компании довольно просто.&lt;/p&gt;
  &lt;p id=&quot;AMP9&quot;&gt;&lt;strong&gt;Омега &lt;/strong&gt;был исследовательским прототипом, созданным на основе знаний о Борге с целью его усовершенствования. По сравнению с Боргом он был более гибким и ориентированным на транзакции. В итоге система не получила широкого распространения внутри компании.&lt;/p&gt;
  &lt;p id=&quot;AWlr&quot;&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; был создан компанией Google как проект с открытым исходным кодом на основе разработок Borg и Omega. По сей день Google использует Borg, но Kubernetes стал ведущим в отрасли решением для управления контейнерами. &lt;em&gt;Подробнее об истории Kubernetes мы рассказываем в выпуске подкаста The Pragmatic Engineer, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-kubernetes-is-built-with-kat&quot; target=&quot;_blank&quot;&gt;Как устроен Kubernetes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;QvHE&quot;&gt;&lt;strong&gt;BNS — это «внутренний DNS» Google&lt;/strong&gt;. Это сокращение от «Borg Naming Service». BNS использует уровень абстракции над IP-адресами, а Borg использует эту абстракцию для распределения задач между машинами. Вот как в книге Google SRE &lt;a href=&quot;https://sre.google/sre-book/production-environment/#:~:text=Rather%20than%20using,port%3E.&quot; target=&quot;_blank&quot;&gt;объясняется&lt;/a&gt; как работает BNS:&lt;/p&gt;
  &lt;blockquote id=&quot;HLGo&quot;&gt;«Вместо использования IP-адреса и номера порта другие процессы подключаются к задачам Borg через имя BNS, которое преобразуется в IP-адрес и номер порта с помощью BNS. Например, путь BNS может выглядеть так: /bns/&lt;strong&gt;&amp;lt;кластер&amp;gt;/&amp;lt;пользователь&amp;gt;/&amp;lt;название задания&amp;gt;/&amp;lt;номер задачи&amp;gt;&lt;/strong&gt;, что соответствует &lt;strong&gt;&amp;lt;IP-адрес&amp;gt;:&amp;lt;номер порта&amp;gt;&lt;/strong&gt;».&lt;/blockquote&gt;
  &lt;p id=&quot;QR5d&quot;&gt;Один из нынешних инженеров Google объяснил необходимость BNS:&lt;/p&gt;
  &lt;blockquote id=&quot;lAKf&quot;&gt;«DNS считается ненадёжным и неспособным обновляться так быстро, как того требуют внутренние сервисы Google. Поэтому для привязки сервисов к сетевым протоколам и конечным точкам используется совершенно отдельная система».&lt;/blockquote&gt;
  &lt;p id=&quot;wyOW&quot;&gt;&lt;strong&gt;Боргмон &lt;/strong&gt;сокращение от «Борг Мониторинг». Он предназначен для отслеживания работоспособности запущенных сервисов и существует с первых дней существования Google.&lt;/p&gt;
  &lt;p id=&quot;G7w0&quot;&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; — это, по сути, «Боргмон для другой работы». &lt;a href=&quot;https://prometheus.io/&quot; target=&quot;_blank&quot;&gt;Это&lt;/a&gt; решение для мониторинга с открытым исходным кодом, разработанное компанией SoundCloud в 2012 году по мотивам Borgmon. Prometheus часто используется вместе с Grafana с открытым исходным кодом для создания платформ мониторинга. Именно эту комбинацию использовала компания Shopify, отказавшись от Datadog в пользу собственной платформы мониторинга.&lt;/p&gt;
  &lt;figure id=&quot;WSjw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!IG4o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe78ae831-5a67-477b-9867-36dc77e65290_1366x768.png&quot; width=&quot;1366&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Использование Prometheus с Grafana для мониторинга работоспособности узлов. Это похоже на Borgmon в Google. Источник: &lt;a href=&quot;https://blog.balena.io/monitoring-the-edge-with-prometheus-pt-1/&quot; target=&quot;_blank&quot;&gt;Balena&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FOHe&quot;&gt;&lt;strong&gt;Monarch &lt;/strong&gt;— это усовершенствованная версия Borgmon, которая заменила Borgmon для мониторинга многих крупномасштабных рабочих нагрузок в Google. Вот несколько интересных фактов о Monarch:&lt;/p&gt;
  &lt;ul id=&quot;mktD&quot;&gt;
    &lt;li id=&quot;O0iM&quot;&gt;Поставляется с базой данных временных рядов планетарного масштаба &lt;em&gt;в памяти&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;yCbV&quot;&gt;Используется для мониторинга показателей во всей инфраструктуре Google&lt;/li&gt;
    &lt;li id=&quot;MFc8&quot;&gt;Горизонтально масштабируемый&lt;/li&gt;
    &lt;li id=&quot;wsau&quot;&gt;Включает поддержку графиков&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;NKOP&quot;&gt;&lt;strong&gt;Наместник &lt;/strong&gt;является преемником Монарха и часто используется для наблюдения за узлами Борга.&lt;/p&gt;
  &lt;p id=&quot;UhJk&quot;&gt;&lt;strong&gt;Analog&lt;/strong&gt; — это внутренний инструмент логирования для Borg.&lt;/p&gt;
  &lt;p id=&quot;EuZ2&quot;&gt;&lt;strong&gt;Sigma&lt;/strong&gt; — это инструмент для управления конфигурацией кластера в Borg.&lt;/p&gt;
  &lt;h3 id=&quot;rsXj&quot;&gt;Хранение&lt;/h3&gt;
  &lt;p id=&quot;sik4&quot;&gt;Вполне вероятно, что Google хранит самый большой объём данных среди всех компаний в мире. В 2015 году только в Gmail &lt;a href=&quot;https://highscalability.com/how-google-backs-up-the-internet-along-with-exabytes-of-othe/&quot; target=&quot;_blank&quot;&gt;хранилось&lt;/a&gt; несколько эксабайт данных (1 эксабайт = 1 миллион терабайт), а в 2025 году на YouTube &lt;a href=&quot;https://seo.ai/blog/how-many-videos-are-on-youtube&quot; target=&quot;_blank&quot;&gt;будет размещено&lt;/a&gt; более 5 миллиардов видео. Так что можно с уверенностью сказать, что сегодня компания хранит сотни эксабайт данных, если не больше. В сложившихся обстоятельствах вполне понятно, что она разработала несколько собственных решений для хранения данных.&lt;/p&gt;
  &lt;h4 id=&quot;ZAQ7&quot;&gt;Внешние услуги&lt;/h4&gt;
  &lt;p id=&quot;pWxR&quot;&gt;&lt;strong&gt;BigQuery &lt;/strong&gt;— это бессерверное облачное хранилище данных, доступное &lt;a href=&quot;https://cloud.google.com/bigquery/docs/introduction&quot; target=&quot;_blank&quot;&gt;в Google Cloud&lt;/a&gt;, альтернатива Snowflake или &lt;a href=&quot;https://aws.amazon.com/redshift/&quot; target=&quot;_blank&quot;&gt;Amazon Redshift&lt;/a&gt;. Оно доступно в GCP с 2011 года.&lt;/p&gt;
  &lt;p id=&quot;FyCU&quot;&gt;&lt;strong&gt;Bigtable&lt;/strong&gt; — это сервис баз данных NoSQL с низкой задержкой, совместимый с &lt;a href=&quot;https://en.wikipedia.org/wiki/Apache_Cassandra&quot; target=&quot;_blank&quot;&gt;Cassandra&lt;/a&gt; и &lt;a href=&quot;https://en.wikipedia.org/wiki/Apache_HBase&quot; target=&quot;_blank&quot;&gt;HBase&lt;/a&gt;. Google вывел Bigtable на внешний рынок в 2015 году, и теперь его можно использовать &lt;a href=&quot;https://cloud.google.com/bigtable?hl=en&quot; target=&quot;_blank&quot;&gt;на GCP&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;Yjky&quot;&gt;&lt;strong&gt;Spanner &lt;/strong&gt;является базой данных по умолчанию в большинстве сервисов Google. Это глобально распределённая база данных, и в 2017 году Google сделал Spanner общедоступным; он &lt;a href=&quot;https://cloud.google.com/spanner?hl=en&quot; target=&quot;_blank&quot;&gt;доступен&lt;/a&gt; в Google Cloud.&lt;/p&gt;
  &lt;p id=&quot;uIhj&quot;&gt;&lt;strong&gt;Vitess &lt;/strong&gt;— это решение для масштабирования и управления большими кластерами баз данных MySQL. Оно было создано в 2010 году для решения проблем с MySQL, с которыми столкнулся YouTube, и успешно справилось с этой задачей. YouTube по-прежнему активно использует Vitess. В 2018 году проект стал открытым.&lt;/p&gt;
  &lt;h4 id=&quot;Z9KC&quot;&gt;Услуги только для внутренних пользователей&lt;/h4&gt;
  &lt;p id=&quot;iB2w&quot;&gt;&lt;strong&gt;Dremel &lt;/strong&gt;раньше был «внутренним эквивалентом» BigQuery. Сейчас это устаревшее название для внутреннего стека технологий бизнес-аналитики, который используется реже.&lt;/p&gt;
  &lt;p id=&quot;iaQZ&quot;&gt;&lt;strong&gt;F1&lt;/strong&gt; заменила Dremel в качестве распределённой реляционной базы данных Google. F1 была &lt;a href=&quot;https://research.google/pubs/f1-a-distributed-sql-database-that-scales/&quot; target=&quot;_blank&quot;&gt;изначально создана&lt;/a&gt; для поддержки бизнеса AdsWords, и её целью было создание базы данных, сочетающей в себе высокую доступность, масштабируемость систем NoSQL, таких как Bigtable, а также согласованность и удобство использования традиционных баз данных SQL. Она построена на базе Spanner.&lt;/p&gt;
  &lt;p id=&quot;v9mI&quot;&gt;&lt;strong&gt;Mesa &lt;/strong&gt;— это распределённая база данных, предназначенная для аналитики в реальном времени и составления отчётов по рекламе.&lt;/p&gt;
  &lt;p id=&quot;KqHB&quot;&gt;&lt;strong&gt;GTape &lt;/strong&gt;раньше была системой резервного копирования Google с использованием физических носителей. В 2011 году GTape всё ещё &lt;a href=&quot;https://sre.google/sre-book/data-integrity/#:~:text=Gmail%E2%80%94February%2C%202011%3A%20Restore%20from%20GTape&quot; target=&quot;_blank&quot;&gt;использовалась для восстановления Gmail&lt;/a&gt;после сбоя, повлекшего за собой потерю данных. &lt;em&gt;Нынешние инженеры Google, с которыми мы общались, не уверены, используется ли GTape до сих пор или её заменило другое решение для резервного копирования.&lt;/em&gt;&lt;/p&gt;
  &lt;h3 id=&quot;LBxX&quot;&gt;Другие пользовательские инфра-инструменты&lt;/h3&gt;
  &lt;p id=&quot;6QR0&quot;&gt;У Google есть сотни внутренних инструментов, в том числе несколько интересных:&lt;/p&gt;
  &lt;ul id=&quot;c3Vm&quot;&gt;
    &lt;li id=&quot;UFX1&quot;&gt;&lt;strong&gt;BeyondCorp. &lt;/strong&gt;Внутренняя система безопасности Google с нулевым доверием, используемая вместо VPN. Каждый запрос проверяется, поскольку предполагается, что сеть ненадежна. Аутентификация происходит через единый вход Google, после чего выполняется проверка устройства. BeyondCorp была выведена за пределы компании &lt;a href=&quot;https://cloud.google.com/beyondcorp?hl=en&quot; target=&quot;_blank&quot;&gt;в 2020 году&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;oX5u&quot;&gt;&lt;strong&gt;Dapper&lt;/strong&gt;: распределённая система отслеживания. &lt;a href=&quot;https://research.google/pubs/dapper-a-large-scale-distributed-systems-tracing-infrastructure/&quot; target=&quot;_blank&quot;&gt;Подробнее&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;84Xs&quot;&gt;&lt;strong&gt;Chubby: &lt;/strong&gt;распределённая служба блокировки и координации для выбора лидера и хранения метаданных. Использует &lt;a href=&quot;https://en.wikipedia.org/wiki/Paxos_(computer_science)&quot; target=&quot;_blank&quot;&gt;алгоритм Паксоса&lt;/a&gt;. &lt;a href=&quot;https://static.googleusercontent.com/media/research.google.com/en//archive/chubby-osdi06.pdf&quot; target=&quot;_blank&quot;&gt;Подробности&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;tYL3&quot;&gt;&lt;strong&gt;B4: &lt;/strong&gt;Частная программно-определяемая глобальная сеть Google. &lt;a href=&quot;https://dl.acm.org/doi/pdf/10.1145/3230543.3230545&quot; target=&quot;_blank&quot;&gt;Подробности&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;Ybsg&quot;&gt;&lt;strong&gt;Devsite: &lt;/strong&gt;внутренняя система для создания общедоступных страниц документации. Создана на &lt;a href=&quot;https://en.wikipedia.org/wiki/Django_(web_framework)&quot; target=&quot;_blank&quot;&gt;Django&lt;/a&gt; (веб-фреймворк на Python).&lt;/li&gt;
    &lt;li id=&quot;hAEH&quot;&gt;&lt;strong&gt;Специальное оборудование. &lt;/strong&gt;Google также производит собственное специализированное оборудование, такое как серверы, сетевые устройства и даже чипы. Примером может служить облачный тензорный процессор (TPU, ускоритель искусственного интеллекта), &lt;a href=&quot;https://cloud.google.com/tpu?hl=en&quot; target=&quot;_blank&quot;&gt;разработанный&lt;/a&gt; в сотрудничестве с Broadcom.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;YzIs&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!zXm7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7458c6d0-c7f7-44e0-92eb-bc7a289ceb29_2048x1009.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Центр обработки данных Google TPU. Серверы, сети, системы охлаждения и чипы, изготовленные по индивидуальному заказу. Источник: Data Center Dynamics / &lt;a href=&quot;https://www.datacenterdynamics.com/en/news/training-gemini-tpus-multiple-data-centers-and-risks-of-cosmic-rays/&quot; target=&quot;_blank&quot;&gt;Google&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;vEAm&quot;&gt;Инструменты, которые помогают инженерам запускать сервисы:&lt;/p&gt;
  &lt;ul id=&quot;1oOl&quot;&gt;
    &lt;li id=&quot;cip0&quot;&gt;&lt;strong&gt;Серверная платформа: &lt;/strong&gt;Универсальная внутренняя платформа для запуска сервиса Stubby со всеми необходимыми компонентами, такими как определение владельцев, CI/CD, мониторинг и т. д. Это стало необходимостью, так как стек технологий Google усложнился. Преимущество серверной платформы в том, что она скрывает многие сложности сервисов Google. Однако из-за этого инженеры перестали понимать, к каким платформам подключается сервис, чтобы всё работало.&lt;/li&gt;
    &lt;li id=&quot;lDXb&quot;&gt;&lt;strong&gt;Boq&lt;/strong&gt;: платформа для микросервисов, которая берет на себя большую часть работы по мониторингу, развертыванию, авторизации, аутентификации, балансировке нагрузки, интеграционному тестированию и составлению сервисов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;WvEp&quot;&gt;&lt;strong&gt;У Google так много собственных инструментов, что для поиска инструментов существует собственный инструмент&lt;/strong&gt;. Есть внутренний сайт для поиска инструментов, поддерживающих определенный стек технологий, потому что даже внутри компании сложно уследить за всеми создаваемыми и устаревшими системами!&lt;/p&gt;
  &lt;p id=&quot;yCZ5&quot;&gt;Кстати, об устаревании. Возможно, вы заметили, что Google постоянно выпускает новые версии своих инструментов (например, Borgmon → Monarch → Viceroy.) Есть старая как мир шутка о том, что в Google есть только два типа систем: устаревшие и те, что находятся в разработке.&lt;/p&gt;
  &lt;figure id=&quot;O5bG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!BfXj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd53d528d-d56b-484b-8415-7c1a6aab9ae6_1300x914.png&quot; width=&quot;1300&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Изображение &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/manu&quot; target=&quot;_blank&quot;&gt;Ману Корнет&lt;/a&gt;, “&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/manu&quot; target=&quot;_blank&quot;&gt;неофициальный карикатурист” Google&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;atMW&quot;&gt;6. ИИ в Google&lt;/h2&gt;
  &lt;p id=&quot;2kam&quot;&gt;В 2017 году компания Google изобрела трансформеры — основную концепцию больших языковых моделей — и создала одну из самых мощных моделей искусственного интеллекта под названием Gemini. Она используется в большинстве общедоступных продуктов, таких как Workspace, Gmail и Search. Разумеется, компания уже интегрировала Gemini во многие свои внутренние системы. Cider, Critique и CodeSearch имеют интеграцию с искусственным интеллектом, которая позволяет делать следующее:&lt;/p&gt;
  &lt;ul id=&quot;A5j5&quot;&gt;
    &lt;li id=&quot;KxFm&quot;&gt;Автодополнение кода (довольно «базовый» вариант использования), а также многострочное автодополнение кода&lt;/li&gt;
    &lt;li id=&quot;xjim&quot;&gt;Попросите ИИ внести изменения в текущий файл.&lt;/li&gt;
    &lt;li id=&quot;oYVU&quot;&gt;Задавайте вопросы о кодовой базе/текущем файле&lt;/li&gt;
    &lt;li id=&quot;lx5h&quot;&gt;Генерировать тесты&lt;/li&gt;
    &lt;li id=&quot;SHd5&quot;&gt;Попросите ИИ добавить комментарии к коду в CLs&lt;/li&gt;
    &lt;li id=&quot;dLKS&quot;&gt;Когда код вставляется в Cider, он автоматически адаптируется под текущий контекст. Разработчики, с которыми мы общались, считают это очень полезным&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;hO8H&quot;&gt;По словам инженеров, возможности искусственного интеллекта в Cider всё ещё уступают возможностям Cursor. Но в Cider можно добавлять сочетания клавиш для &lt;em&gt;пользовательских&lt;/em&gt; подсказок, чего нет в Cursor.&lt;/p&gt;
  &lt;p id=&quot;Te7O&quot;&gt;&lt;strong&gt;Похоже, что подход Google к инструментам для написания кода на основе ИИ заключается в том, чтобы сначала завоевать доверие. &lt;/strong&gt;Похоже, что команда разработчиков инструментов на основе ИИ уделяет первостепенное внимание выпуску действительно эффективных функций, а не недоработанных функций, которые могут ассоциироваться с ненадёжностью ИИ.&lt;/p&gt;
  &lt;p id=&quot;nuSs&quot;&gt;&lt;strong&gt;Поисковая система MOMA&lt;/strong&gt; — это внутренняя система базы знаний, которая выполняет поиск по всем внутренним документам. Естественно, она уже как минимум два года интегрирована с искусственным интеллектом. Мы слышали, что поначалу она часто выдавала ложные результаты, но с тех пор ситуация значительно улучшилась.&lt;/p&gt;
  &lt;p id=&quot;VvuT&quot;&gt;&lt;strong&gt;Внутренние модели Gemini&lt;/strong&gt;: для внутреннего использования доступны различные модели Gemini, в том числе большие и маленькие модели Gemini, модели с настроенными инструкциями, мыслящие модели и экспериментальные модели. Эти модели размещены на серверах, к которым можно обращаться с помощью внутренних инструментов, таких как блокноты Python, чтобы изучить их возможности. Разумеется, использование этих моделей не ограничено по стоимости.&lt;/p&gt;
  &lt;p id=&quot;TvAi&quot;&gt;&lt;strong&gt;Игровая площадка LLM&lt;/strong&gt;: похожа на &lt;a href=&quot;https://platform.openai.com/chat/edit&quot; target=&quot;_blank&quot;&gt;игровую площадку для разработчиков&lt;/a&gt;OpenAI, которая появилась раньше. Доступны различные модели и форматы Gemini, с которыми можно экспериментировать.&lt;/p&gt;
  &lt;p id=&quot;fbKr&quot;&gt;&lt;strong&gt;Ресурсы графического процессора: &lt;/strong&gt;Графические процессоры для размещения пользовательских моделей с тонкой настройкой или ресурсы для тонкой настройки моделей обычно выделяются для каждой команды. Мы неоднократно слышали жалобы на то, что время ожидания доступа к графическим процессорам довольно велико и это становится узким местом.&lt;/p&gt;
  &lt;p id=&quot;SaRn&quot;&gt;&lt;strong&gt;Тестирование внутренних продуктов:&lt;/strong&gt;приложение Gemini и функции искусственного интеллекта Google Workspace тестируются внутри компании перед выпуском для широкой публики.&lt;/p&gt;
  &lt;p id=&quot;1mAz&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://notebooklm.google.com/&quot; target=&quot;_blank&quot;&gt;NotebookLM&lt;/a&gt;: &lt;/strong&gt;внешне представленный продукт, который позволяет «общаться» с загруженными текстовыми, аудио- и другими ресурсами. Он очень популярен в Google: мы слышали о том, что в него загружают все документы с требованиями к продукту, а затем задают вопросы по ним.&lt;/p&gt;
  &lt;p id=&quot;bRTX&quot;&gt;&lt;strong&gt;Внутренний список всех инструментов ИИ с примечаниями по конфиденциальности: &lt;/strong&gt;внутри компании Google перечисляет все свои инструменты с поддержкой ИИ и уровни конфиденциальности, которые они поддерживают. Например, некоторые инструменты могут быть связаны с конфиденциальными документами Google, а другие — с возможностью загрузки только неконфиденциальных документов, если инструмент может вести журнал, из которого могут просочиться конфиденциальные данные.&lt;/p&gt;
  &lt;h3 id=&quot;Shk8&quot;&gt;Рой внутренних проектов GenAI&lt;/h3&gt;
  &lt;p id=&quot;wm7s&quot;&gt;По словамсотрудника L6, который поделился этим наблюдением, многие команды создают продукты GenAI, чтобы получить финансирование:&lt;/p&gt;
  &lt;blockquote id=&quot;Ui9I&quot;&gt;«В Google разрабатывается множество инструментов GenAI для конкретных организаций и команд. Руководству это нравится. Как ни странно, в наши дни это отчасти помогает получить больше финансирования».&lt;/blockquote&gt;
  &lt;p id=&quot;jPPE&quot;&gt;Я понимаю, почему Google поощряет проекты в области генеративного искусственного интеллекта и выделяет сотрудников для поддержки перспективных проектов:&lt;/p&gt;
  &lt;ul id=&quot;n9NJ&quot;&gt;
    &lt;li id=&quot;4lL5&quot;&gt;В худшем случае инженеры начинают работать с ИИ напрямую. Создавая ИИ-решения, они все становятся ИИ-инженерами, что само по себе ценно!&lt;/li&gt;
    &lt;li id=&quot;4dDe&quot;&gt;В некоторых случаях может быть создан новый продукт, который Google позже выпустит в открытый доступ. &lt;a href=&quot;https://notebooklm.google.com/&quot; target=&quot;_blank&quot;&gt;NotebookLM&lt;/a&gt; — пример такого продукта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;uAC6&quot;&gt;Наконец, если проект с использованием ИИ не имеет смысла, то ничего страшного не произойдёт. Google — очевидно, очень прибыльная компания, поэтому команда, потратившая месяц или два на проекты с использованием ИИ, которые не увенчались успехом, не понесёт больших убытков.&lt;/p&gt;
  &lt;p id=&quot;VRMc&quot;&gt;Этот «рой GenAI» и стимулирование команд к созданию ИИ-решений немного напоминают мне о политике Google в отношении 20% проектов. До начала 2010-х годов всем инженерам Google выделялся один день в неделю (20% рабочего времени) на создание &lt;em&gt;всего, что они хотели&lt;/em&gt;, что привело к появлению таких проектов, как Gmail, Google News и AdSense. Google в целом отказался от этой политики, хотя в некоторых подразделениях компании она всё ещё действует. Карикатурист Ману Корнет работал в Google, когда это решение было отменено, и считал, что это вредит инновациям:&lt;/p&gt;
  &lt;figure id=&quot;i9nA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!KMlY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b78cb6b-cc06-435f-8490-9401656ab7fd_1225x863.png&quot; width=&quot;1225&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Инновационный дух «20% проектов» может возродиться в виде роя ИИ. Источник изображения: &lt;a href=&quot;https://goomics.net/343&quot; target=&quot;_blank&quot;&gt;Ману Корне&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Sb1N&quot;&gt;GenAI создаст новые категории программного обеспечения, и, на мой взгляд, Google возвращает «масштабные инновации», поощряя любые проекты, связанные с искусственным интеллектом. Это вполне объяснимо, поскольку компания может потерять позиции на рынке, если не позволит своим командам создавать решения на основе ИИ.&lt;/p&gt;
  &lt;h2 id=&quot;drcR&quot;&gt;Выводы&lt;/h2&gt;
  &lt;p id=&quot;Rc88&quot;&gt;В технических кругах Google считается золотым стандартом в области внутренних инструментов для разработчиков и, наоборот, примером того, что происходит, когда &lt;em&gt;всё&lt;/em&gt; в технологическом стеке сделано на заказ.&lt;/p&gt;
  &lt;p id=&quot;reB0&quot;&gt;Borg, Piper, Critique и другие инструменты работают намного лучше &lt;em&gt;в целом&lt;/em&gt;, чем инструменты для разработки, к которым имеет доступ большинство инженеров на своих рабочих местах. С другой стороны, они настолько хороши, что инженеры Google не хотят использовать &lt;em&gt;публичный&lt;/em&gt; GCP и предпочитают работать с внутренним стеком инфраструктуры. В случае с распределёнными базами данных, такими как Spanner, они всё равно будут использовать внутреннюю версию, а не публичную!&lt;/p&gt;
  &lt;p id=&quot;fTIN&quot;&gt;Мы подробно рассказали о пользовательских инструментах, которые есть у инженеров технологического гиганта. Возможно, это покажется вам чрезмерным, но мы хотели дать вам рекомендации и объяснить, почему Google решил создать так много пользовательских инструментов.&lt;/p&gt;
  &lt;p id=&quot;R0AG&quot;&gt;В следующей статье этой серии мы расскажем о карьерном росте, внутренней мобильности и дадим несколько советов о том, как добиться успеха в такой компании, как Google.&lt;/p&gt;
  &lt;p id=&quot;LVLN&quot;&gt;Если вам есть что сказать по темам, затронутым в этой статье, оставьте комментарий ниже.&lt;/p&gt;
  &lt;p id=&quot;NjT3&quot;&gt;Перевод: &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/google-part-2&quot; target=&quot;_blank&quot;&gt;https://newsletter.pragmaticengineer.com/p/google-part-2&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:google</id><link rel="alternate" type="text/html" href="https://devz.su/google?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>Инженерная культура Google: часть 1</title><published>2025-10-31T06:06:33.312Z</published><updated>2025-10-31T06:19:49.289Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e4/b0/e4b0d2b4-be17-4357-bdd3-21c89a0bbd18.png"></media:thumbnail><summary type="html">«Каково это на самом деле — работать в Google?» — вот вопрос, который рассматривается в этом мини-сериале. Чтобы узнать подробности, мы поговорили с 25 нынешними и бывшими инженерами-программистами и руководителями инженерных отделов с 4-го по 8-й уровень. Кроме того, мы потратили последний год на исследования: изучали статьи и книги, в которых обсуждаются эти системы. В процессе мы собрали много информации и интересных фактов, которые объединены в этой статье (и мини-сериале). Мы надеемся, что это обеспечит беспрецедентную детализацию по сравнению с тем, что сейчас доступно в интернете.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;571s&quot;&gt;Подробное и глубокое погружение в работу Google с точки зрения инженеров-программистов и технических руководителей. Что делает Google особенным с инженерной точки зрения, инженерные роли, оплата труда и многое другое&lt;/h3&gt;
  &lt;/section&gt;
  &lt;p id=&quot;BJV6&quot;&gt;Сегодня технологический гигант Google с помощью таких продуктов, как Google Search, Android, Chrome, Gmail и других, охватывает больше людей, чем любая другая компания в мире, во всех отраслях. Он также управляет самым посещаемым веб-сайтом в мире и вторым по посещаемости веб-сайтом: YouTube. Основанная в 1998 году компания Google в прошлом году получила самую большую прибыль ($115 млрд после вычета всех расходов и налогов) среди всех компаний в мире.&lt;/p&gt;
  &lt;p id=&quot;DNlR&quot;&gt;Помимо своих масштабов, Google известна своей культурой, ориентированной на инженеров, а также высокими требованиями к кандидатам на должность инженера-программиста, которые, в свою очередь, получают большую свободу действий и хорошие условия труда. Сотрудников называют «гуглистами», а новичков — «ноуглистами». На рабочем месте поощряется атмосфера игривого интеллектуального любопытства, которую внутри компании называют «гуглизмом» — подробнее об этом позже. Эта культура существенно отличает компанию от других крупных технологических корпораций.&lt;/p&gt;
  &lt;p id=&quot;T1bk&quot;&gt;Но каково на самом деле работать в Google? Какая там корпоративная культура, как всё организовано, как команды добиваются результатов — и чем Google действительно отличается от любого другого крупного технологического бизнеса?&lt;/p&gt;
  &lt;p id=&quot;WF44&quot;&gt;&lt;strong&gt;Эта статья представляет собой &lt;em&gt;«то, что я хотел бы знать о Google до того, как устроился туда инженером-программистом / менеджером по разработке».&lt;/em&gt;&lt;/strong&gt;Она предназначена для всех, кто хочет работать в Google, а также для тех, кто хочет узнать, понять и, возможно, вдохновиться подходами, которые работают в одной из ведущих мировых компаний.&lt;/p&gt;
  &lt;p id=&quot;bJma&quot;&gt;Эта мини-серия статей, посвященных Google, содержит больше информации о различных аспектах инженерной культуры компании, чем когда-либо публиковалось в одном месте. Мы потратили почти 12 месяцев на ее изучение, в том числе пообщались с 25 нынешними и бывшими руководителями технических отделов и инженерами-программистами Google, большинство из которых занимают должность Staff (L6) или выше.&lt;/p&gt;
  &lt;p id=&quot;Kk5B&quot;&gt;Конечно, невозможно описать каждую деталь в компании, где работает более 60 000 инженеров-программистов, а продуктовые направления (в Google это называется orgs) и команды работают по-разному. Google предоставляет инженерам и командам большую свободу в принятии решений о том, как им работать, и, хотя мы не можем охватить всё это разнообразие, мы стремимся предоставить практичный и полезный обзор.&lt;/p&gt;
  &lt;p id=&quot;4TZE&quot;&gt;В первой части этого мини-сериала мы рассказываем о:&lt;/p&gt;
  &lt;ol id=&quot;uz27&quot;&gt;
    &lt;li id=&quot;iscP&quot;&gt;&lt;strong&gt;Обзор&lt;/strong&gt;. Google приносит больше прибыли, чем Microsoft и Meta, и является крупным технологическим гигантом, в котором, вероятно, работает больше всего инженеров-программистов в более чем 25 инженерных подразделениях. Миссия компании заключается в том, чтобы «систематизировать мировую информацию и сделать её общедоступной и полезной».&lt;/li&gt;
    &lt;li id=&quot;dRgd&quot;&gt;&lt;strong&gt;Что делает Google особенным? &lt;/strong&gt;За разнообразием подходов к работе стоит универсальная инженерная культура в отношении инструментов и практик. У Google уникальный, специально разработанный инженерный стек, и с самого первого дня компания создавала системы, отличающиеся от систем конкурентов, что сделало её «технологическим островом». Google исторически была более открытой, чем другие крупные технологические компании, в отношении своей внутренней работы. Имея более 120 активных продуктов, она больше всего похожа на Microsoft по широте своей деятельности и возможностям для инженеров-программистов работать над разными проектами.&lt;/li&gt;
    &lt;li id=&quot;KwGp&quot;&gt;&lt;strong&gt;Уровни и роли. &lt;/strong&gt;Между уровнями L2 и L11 существует двухуровневая карьерная лестница, а роль технического руководителя (TLM) является «третьим карьерным путём». Процесс определения уровня в Google во время собеседований является самым строгим в отрасли, а «технический руководитель» — это роль, а не уровень. К другим инженерным ролям относятся SRE, EngProd, научный сотрудник, DevRel и UXE. К другим должностям, связанным с разработкой, относятся менеджеры по продуктам, менеджеры программ, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/what-tpms-do&quot; target=&quot;_blank&quot;&gt;TPM&lt;/a&gt;, дизайнеры и технические писатели.&lt;/li&gt;
    &lt;li id=&quot;DEg7&quot;&gt;&lt;strong&gt;Вознаграждение. &lt;/strong&gt;Google платит больше, чем на других региональных рынках, и известна своими выдающимися выплатами, которые включают базовую зарплату, акции, денежные премии, а иногда и бонус за подписание контракта. Примеры таких высоких зарплат:&lt;/li&gt;
    &lt;ul id=&quot;BWxl&quot;&gt;
      &lt;li id=&quot;AqQm&quot;&gt;Инженер среднего звена (L4) обычно получает зарплату в диапазоне:&lt;/li&gt;
      &lt;ul id=&quot;yykl&quot;&gt;
        &lt;li id=&quot;DZEg&quot;&gt;Общая сумма компенсации в США составляет 250–350 тысяч долларов&lt;/li&gt;
        &lt;li id=&quot;qRsc&quot;&gt;Другие регионы: 125–185 тысяч фунтов стерлингов в Великобритании, 140–180 тысяч евро в Германии, 210–260 тысяч швейцарских франков в Швейцарии, 210–280 тысяч канадских долларов в Канаде, 200–280 тысяч австралийских долларов в Австралии, 380–450 тысяч злотых в Польше и 65–88 миллионов индийских рупий в Индии&lt;/li&gt;
      &lt;/ul&gt;
      &lt;li id=&quot;rr4v&quot;&gt;Штатный инженер-программист (L6) обычно получает зарплату в диапазоне:&lt;/li&gt;
      &lt;ul id=&quot;Wrwq&quot;&gt;
        &lt;li id=&quot;3a7m&quot;&gt;Общая сумма компенсации в США составляет 550–700 тысяч долларов&lt;/li&gt;
        &lt;li id=&quot;0X7o&quot;&gt;Другие регионы: 270–380 тысяч фунтов стерлингов в Великобритании, 250–330 тысяч евро в Германии, 370–500 тысяч швейцарских франков в Швейцарии, 420–650 тысяч канадских долларов в Канаде, 350–550 тысяч австралийских долларов в Австралии, 750–850 тысяч злотых в Польше и 1,5–2,2 миллиона индийских рупий в Индии&lt;/li&gt;
      &lt;/ul&gt;
      &lt;li id=&quot;cvnk&quot;&gt;Мы предлагаем пакеты для начинающих (L3), старших сотрудников (L5), руководящего состава (L7), а также специальные бонусы от Google, такие как бонусы для коллег, разовые бонусы и программы поощрения.&lt;/li&gt;
      &lt;li id=&quot;GkGk&quot;&gt;Google — одна из немногих компаний, которая предлагает инженерам финансово выгодную карьерную траекторию, не вынуждающую их становиться менеджерами&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;eig3&quot;&gt;&lt;strong&gt;Подбор персонала. &lt;/strong&gt;В Google, как известно, очень сложный процесс собеседования, который копируют многие другие технологические компании. Собеседования на знание структур данных и алгоритмов, проектирование систем, «гуглевость» и собеседования на руководящие должности также являются частью процесса найма, а некоторые команды используют углубленное изучение предметной области и домашние задания. Окончательное решение о найме принимает комитет по подбору персонала, но это еще не конец процесса — успешные кандидаты затем проходят «подбор команды».&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;I4rD&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://devz.su/google-part-2&quot; target=&quot;_blank&quot;&gt;Во второй части&lt;/a&gt;&lt;/strong&gt;мы дополнительно рассмотрим:&lt;/p&gt;
  &lt;ul id=&quot;Dg2f&quot;&gt;
    &lt;li id=&quot;MeuO&quot;&gt;&lt;strong&gt;Инфраструктура планетарного масштаба&lt;/strong&gt;. Внутренняя инфраструктура Google по умолчанию рассчитана на «планетарный масштаб», но Google Cloud не поддерживает его «из коробки»; поэтому большинство инженерных команд используют стек Google PROD, а не GCP.&lt;/li&gt;
    &lt;li id=&quot;rZvI&quot;&gt;&lt;strong&gt;Монорепозиторий&lt;/strong&gt;. Также известный как «Google3», он на 95 % состоит из кода Google, хранящегося в одном гигантском репозитории с миллиардами строк. Разработка на основе магистрали является нормой. Кроме того, монорепозиторий не означает, что у Google монолитная кодовая база.&lt;/li&gt;
    &lt;li id=&quot;D0HW&quot;&gt;&lt;strong&gt;Технологический стек. &lt;/strong&gt;Официально поддерживаются C++, Kotlin, Java, Python, Go и TypeScript с активным использованием Protobuf и Stubby. У Google есть руководства по языковому стилю для большинства языков, которые почти всегда соблюдаются.&lt;/li&gt;
    &lt;li id=&quot;seBp&quot;&gt;&lt;strong&gt;Инструменты для разработки. &lt;/strong&gt;Набор инструментов для разработки отличается от любого другого рабочего места. Прощайте, GitHub, Jenkins, VS Code и другие известные инструменты: здравствуйте, Piper, Fig, Critique, Blaze, Cider, Tricorder, Rosie и другие.&lt;/li&gt;
    &lt;li id=&quot;UckQ&quot;&gt;&lt;strong&gt;Вычисления и хранение данных. &lt;/strong&gt;Borg, Omega, Kubernetes, BNS, Borgmon, Monarch, Viceroy, Analog, Sigma, BigQuery, Bigtable, Spanner, Vitess, Dremel, F1, Mesa, GTape и многие другие пользовательские системы, на которых работает Google. Этот стек инфраструктуры не похож ни на один другой.&lt;/li&gt;
    &lt;li id=&quot;lOqH&quot;&gt;&lt;strong&gt;ИИ. &lt;/strong&gt;Gemini интегрирован в инструменты для разработчиков и большинство внутренних инструментов, и Google всячески поощряет команды к созданию ИИ, когда это возможно. Команды могут запрашивать ресурсы графического процессора для тонкой настройки моделей, и существует множество внутренних проектов GenAI.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;kVIO&quot;&gt;Эта статья почти в два раза длиннее большинства подробных обзоров. О Google можно рассказать очень много интересного!&lt;/p&gt;
  &lt;p id=&quot;mVO5&quot;&gt;Похожие подробные обзоры см. в &lt;strong&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/facebook&quot; target=&quot;_blank&quot;&gt;Инсайдерском обзоре инженерной культуры Meta&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/amazon&quot; target=&quot;_blank&quot;&gt;Инсайдерском обзоре инженерной культуры Amazon&lt;/a&gt;&lt;/strong&gt; и &lt;a href=&quot;https://newsletter.pragmaticengineer.com/t/engineering-culture-deepdive&quot; target=&quot;_blank&quot;&gt;других подробных обзорах инженерной культуры&lt;/a&gt;, в том числе в OpenAI, Stripe и Figma.&lt;/p&gt;
  &lt;p id=&quot;hZpL&quot;&gt;&lt;em&gt;Примечание для программистов: на этой неделе выпуск подкаста The Pragmatic Engineer выйдет завтра (в среду), а выпуск The Pulse не выйдет.&lt;/em&gt;&lt;/p&gt;
  &lt;h2 id=&quot;8MkI&quot;&gt;1. Общий обзор&lt;/h2&gt;
  &lt;p id=&quot;oBZX&quot;&gt;Давайте начнём с краткого обзора показателей, благодаря которым у Google больше пользователей и клиентов, чем у любой другой компании в мире:&lt;/p&gt;
  &lt;ul id=&quot;Zhcs&quot;&gt;
    &lt;li id=&quot;6vLl&quot;&gt;#1 и #2 самых посещаемых сайта: Google.com — это &lt;a href=&quot;https://www.similarweb.com/top-websites/&quot; target=&quot;_blank&quot;&gt;самый популярный сайт&lt;/a&gt; в мире, а YouTube занимает второе место. Google.com посещают &lt;a href=&quot;https://www.reddit.com/r/AINewsMinute/comments/1kn1n9t/google_still_dominates_the_internet_81_billion/&quot; target=&quot;_blank&quot;&gt;85 миллиардов раз в месяц&lt;/a&gt; — больше, чем следующие 9 самых посещаемых сайтов, &lt;em&gt;вместе взятых&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;WHKS&quot;&gt;Android: около &lt;a href=&quot;https://sqmagazine.co.uk/android-statistics/&quot; target=&quot;_blank&quot;&gt;4,2 миллиарда&lt;/a&gt; пользователей (около 75 % мирового рынка смартфонов)&lt;/li&gt;
    &lt;li id=&quot;eflk&quot;&gt;Chrome: около &lt;a href=&quot;https://www.aboutchromebooks.com/google-chrome-statistics/&quot; target=&quot;_blank&quot;&gt;3,45 миллиарда&lt;/a&gt; пользователей (около 65 % мирового рынка браузеров)&lt;/li&gt;
    &lt;li id=&quot;n8pS&quot;&gt;Gmail: примерно &lt;a href=&quot;https://emailsorters.com/blog/gmail-statistics/&quot; target=&quot;_blank&quot;&gt;1,8 миллиарда&lt;/a&gt; активных пользователей&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;lRZ5&quot;&gt;В 2015 году, когда Google сменила название на Alphabet, это было сделано для того, чтобы отделить основной бизнес по веб-поиску, который приносил львиную долю дохода, от убыточных проектов, таких как Waymo, Google DeepMind, Google Fiber и т. д. На практике почти весь доход Alphabet поступает от подразделения Google, и с тех пор мало что изменилось. В этой статье при упоминании Alphabet используется название «Google».&lt;/p&gt;
  &lt;h3 id=&quot;It8O&quot;&gt;Невероятно прибыльно и с большим количеством рекламы&lt;/h3&gt;
  &lt;p id=&quot;9SEv&quot;&gt;В абсолютном выражении Google в настоящее время является самой прибыльной компанией в мире. За последние 12 месяцев её прибыль (чистый доход) составила 115 миллиардов долларов при выручке в 371 миллиард долларов. Для сравнения приведём чистые доходы других крупных технологических компаний за этот период:&lt;/p&gt;
  &lt;ul id=&quot;o3r9&quot;&gt;
    &lt;li id=&quot;DE6F&quot;&gt;Microsoft: 101 миллиард долларов (из 281 миллиарда долларов выручки)&lt;/li&gt;
    &lt;li id=&quot;COzq&quot;&gt;Apple: 99 миллиардов долларов (доход — 408 миллиардов долларов)&lt;/li&gt;
    &lt;li id=&quot;eT5G&quot;&gt;Meta: 71 миллиард долларов (доход — 178 миллиардов долларов)&lt;/li&gt;
    &lt;li id=&quot;JeJ5&quot;&gt;Amazon: 70 миллиардов долларов (доход — 670 миллиардов долларов)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7aDg&quot;&gt;По своей сути Google по-прежнему остаётся рекламной компанией: около 75 % дохода поступает от продажи рекламы в Google Поиске, на YouTube и в сети Google Рекламы. Однако у компании есть несколько сервисов, которые не зависят от рекламы:&lt;/p&gt;
  &lt;ul id=&quot;e3E3&quot;&gt;
    &lt;li id=&quot;tcO9&quot;&gt;&lt;strong&gt;Google Cloud:&lt;/strong&gt;третий по величине поставщик облачных услуг после AWS и Azure, годовой доход которого составляет более 50 миллиардов долларов (около 13 % от общего дохода). &lt;em&gt;В эту цифру включен доход от Google Workspace.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;nzsj&quot;&gt;&lt;strong&gt;Оборудование плюс подписки&lt;/strong&gt;: смартфоны Pixel, гаджеты для умного дома Nest, носимые устройства Fitbit, подписки на YouTube Premium и Google One. Google зарабатывает на этом более 40 миллиардов долларов в год (около 10 % дохода)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Dcdw&quot;&gt;У Google есть несколько убыточных подразделений, которые в будущем могут начать приносить прибыль, например:&lt;/p&gt;
  &lt;ul id=&quot;d1wm&quot;&gt;
    &lt;li id=&quot;xKI6&quot;&gt;&lt;strong&gt;Gemini и искусственный интеллект: &lt;/strong&gt;Google является лидером в области искусственного интеллекта благодаря своим моделям Gemini, которые интегрированы в несколько продуктов, таких как веб-поиск. Это как бесплатный, так и платный продукт, который в настоящее время, скорее всего, приносит убытки.&lt;/li&gt;
    &lt;li id=&quot;7jiw&quot;&gt;&lt;strong&gt;Waymo&lt;/strong&gt;: лидер в области беспилотных транспортных средств, который в настоящее время обслуживает более 1 миллиона поездок в месяц в Сан-Франциско и Финиксе, США.&lt;/li&gt;
    &lt;li id=&quot;bjmh&quot;&gt;&lt;strong&gt;Google Fiber&lt;/strong&gt;: сверхбыстрый оптоволоконный провайдер со скоростью передачи данных от 1 до 8 Гбит/с. Он работает в 25 городах в 19 штатах США, включая Остин (Техас), Атланту (Джорджия), Чикаго (Иллинойс), Майами (Флорида), Денвер (Колорадо) и Сан-Диего (Калифорния).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;fBAn&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!XUp3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d535f4-b7e5-4e75-8936-80e3baf1305e_1436x970.png&quot; width=&quot;1436&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Структура доходов Google на 2024 год&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;F4Qu&quot;&gt;Глобальные офисы&lt;/h3&gt;
  &lt;p id=&quot;uZP9&quot;&gt;В Google по всему миру работает 183 000 человек, а в 2022 году их число достигло пика — 190 000 сотрудников. В 2023 году произошли массовые увольнения, и с тех пор численность сотрудников перестала расти.&lt;/p&gt;
  &lt;figure id=&quot;R3m0&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!EqPQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde80a8c6-2754-431b-ab28-929837e869f1_1172x872.png&quot; width=&quot;1172&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Google уже не развивается так быстро, как до 2022 года&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LV3v&quot;&gt;Как упоминалось выше, в Google работает около 60 000 инженеров-программистов, о чём мы можем судить по тому, что в 2020 году их было 50 000, &lt;a href=&quot;https://abseil.io/resources/swe-book/html/ch16.html&quot; target=&quot;_blank&quot;&gt;как указано&lt;/a&gt; в книге &lt;em&gt;«Разработка программного обеспечения в Google»&lt;/em&gt; — около 35 % от общего числа сотрудников. Рост численности персонала с тех пор говорит о том, что сегодня там работает 60 000 инженеров. Это делает Google одним из крупнейших работодателей для инженеров-программистов. В Amazon работает почти &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/amazon&quot; target=&quot;_blank&quot;&gt;35 000&lt;/a&gt; разработчиков, а в Meta &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/facebook&quot; target=&quot;_blank&quot;&gt;около 32 000&lt;/a&gt; инженеров-программистов. Мы уверены, что у Google самый высокий «коэффициент инженеров-программистов» среди крупных технологических гигантов.&lt;/p&gt;
  &lt;p id=&quot;o5H6&quot;&gt;&lt;strong&gt;У Google более 25 инженерных офисов.&lt;/strong&gt; Самый крупный из них:&lt;/p&gt;
  &lt;ul id=&quot;raXS&quot;&gt;
    &lt;li id=&quot;zNlg&quot;&gt;&lt;strong&gt;США: &lt;/strong&gt;Маунтин-Вью (штаб-квартира компании) и прилегающий к нему район залива Сан-Франциско, Сан-Франциско, Нью-Йорк и Сиэтл (Киркленд), а также несколько небольших офисов в таких городах, как Кембридж (Массачусетс), Лос-Анджелес (Калифорния), Сан-Диего (Калифорния), Питтсбург (Пенсильвания), Роли и Дарем (Северная Каролина).&lt;/li&gt;
    &lt;li id=&quot;S5zC&quot;&gt;&lt;strong&gt;Канада: Торонто, Монреаль, Ватерлоо и Китченер&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;I7mn&quot;&gt;&lt;strong&gt;Европа: &lt;/strong&gt;Цюрих (Швейцария), Лондон (Великобритания), Дублин (Ирландия), Мюнхен (Германия) и Париж (Франция) — крупнейшие. К более мелким офисам относятся Гамбург (Германия), Милан (Италия), Амстердам (Нидерланды), Мадрид (Испания), Стокгольм (Швеция), Копенгаген и Орхус (Дания), Хельсинки (Финляндия), Варшава и Краков (Польша), Прага (Чехия), Вильнюс (Литва), Бухарест (Румыния) и Будапешт (Венгрия).&lt;/li&gt;
    &lt;li id=&quot;A1Cf&quot;&gt;&lt;strong&gt;Индия: &lt;/strong&gt;Крупнейшими офисами являются Бангалор и Хайдарабад.&lt;/li&gt;
    &lt;li id=&quot;GcNi&quot;&gt;&lt;strong&gt;Южная Америка&lt;/strong&gt;: Мехико (Мексика), Сан-Паулу и Белу-Оризонти (Бразилия)&lt;/li&gt;
    &lt;li id=&quot;U4ri&quot;&gt;&lt;strong&gt;Ближний Восток, Азия и Австралия:&lt;/strong&gt; Тель-Авив (Израиль), Токио (Япония), Сидней (Австралия), Новый Тайбэй (Тайвань)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cygB&quot;&gt;У Google есть &lt;a href=&quot;https://about.google/company-info/locations/&quot; target=&quot;_blank&quot;&gt;более 70 офисов&lt;/a&gt;в более чем 50 странах. &lt;em&gt;Общее количество офисов превышает количество инженерных офисов, потому что во многих офисах Google нет команд разработчиков программного обеспечения, а есть нетехнические команды, такие как отделы продаж, маркетинга, консалтинга (например, для Google Cloud) и другие.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;Fc0o&quot;&gt;Хотя это и не является стандартной практикой, Google может нанимать инженеров для работы в основном в неинженерных отделах в качестве «одиночек». Один из нынешних инженеров Google рассказал нам:&lt;/p&gt;
  &lt;blockquote id=&quot;ZUr0&quot;&gt;«Одиночки встречаются не так уж часто, скорее это исключения из правил. Некоторые из них остались после короткого периода удалённой работы во время пандемии, некоторые — специалисты или очень высокопоставленные сотрудники, у которых больше возможностей для ведения переговоров и выбора места работы».&lt;/blockquote&gt;
  &lt;p id=&quot;2nQH&quot;&gt;«Одиночки» могут работать и в инженерных отделах: в этом случае они будут единственными инженерами, работающими на свою команду в этом месте, а все остальные члены команды будут находиться в других местах. В Google «одиночки» встречаются нечасто, но наше исследование показывает, что их гораздо больше, чем в других крупных технологических компаниях и крупных стартапах.&lt;/p&gt;
  &lt;h3 id=&quot;cgaD&quot;&gt;История, миссия, ценности&lt;/h3&gt;
  &lt;p id=&quot;ScOI&quot;&gt;Как известно, Google был основан аспирантами Ларри Пейджем и Сергеем Брином, которые разработали более эффективный алгоритм поисковой системы под названием &lt;a href=&quot;https://en.wikipedia.org/wiki/PageRank&quot; target=&quot;_blank&quot;&gt;PageRank&lt;/a&gt;. Использование PageRank для поиска в интернете позволило значительно улучшить результаты по сравнению с самыми популярными поисковыми системами того времени, такими как Yahoo!, AltaVista, Lycos и Ask Jeeves. Некоторые из них были порталами, на которых «рекомендовались» сайты для посещения (например, AltaVista), а другие представляли собой примитивные поисковые системы, выдававшие до 15 не особо точных результатов.&lt;/p&gt;
  &lt;figure id=&quot;F3jS&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!UiaY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ffd4e5c-708e-4fa9-a8b1-3cd6b3b4916a_1356x1422.png&quot; width=&quot;1356&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Ведущие поисковые системы в 2000 году. Google отказался от популярного в то время дизайна «избранных сайтов»&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ytil&quot;&gt;Остальное, как говорится, уже история: через два года после запуска Google стал доминирующей поисковой системой, а также глаголом («давай погуглим это»). Он выдавал больше релевантных результатов и имел гораздо более удобный интерфейс, чем его конкуренты.&lt;/p&gt;
  &lt;p id=&quot;DJc0&quot;&gt;Со временем миссия компании изменилась:&lt;/p&gt;
  &lt;ul id=&quot;Synz&quot;&gt;
    &lt;li id=&quot;aDWg&quot;&gt;&lt;strong&gt;«Систематизировать мировую информацию и сделать ее общедоступной и полезной».&lt;/strong&gt; Это была миссия компании с момента ее основания в 1998 году, и она не изменилась.&lt;/li&gt;
    &lt;li id=&quot;wm2f&quot;&gt;&lt;strong&gt;«Не будь злым».&lt;/strong&gt; Неофициальный девиз, который был частью кодекса поведения Google &lt;a href=&quot;https://en.wikipedia.org/wiki/Don%27t_be_evil&quot; target=&quot;_blank&quot;&gt;примерно&lt;/a&gt; с 2000 года, чтобы напоминать сотрудникам о необходимости действовать этично. Он оставался актуальным до 2015 года, когда Google стала частью Alphabet.&lt;/li&gt;
    &lt;li id=&quot;9lUj&quot;&gt;&lt;strong&gt;«Поступай правильно». &lt;/strong&gt;Девиз компании &lt;a href=&quot;https://www.engadget.com/2015-10-02-alphabet-do-the-right-thing.html&quot; target=&quot;_blank&quot;&gt;с 2015 года&lt;/a&gt;, который заменил собой «не будь злым».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;BNpS&quot;&gt;У Google также есть &lt;a href=&quot;https://about.google/company-info/commitments/&quot; target=&quot;_blank&quot;&gt;пять основных ценностей&lt;/a&gt;:&lt;/p&gt;
  &lt;ul id=&quot;KrA5&quot;&gt;
    &lt;li id=&quot;RasW&quot;&gt;Защита пользователей&lt;/li&gt;
    &lt;li id=&quot;pJTj&quot;&gt;Ответственный подход к созданию и внедрению ИИ&lt;/li&gt;
    &lt;li id=&quot;HWi7&quot;&gt;Расширяющиеся возможности&lt;/li&gt;
    &lt;li id=&quot;9W1N&quot;&gt;Помощь в решении проблем общества&lt;/li&gt;
    &lt;li id=&quot;aGUB&quot;&gt;Строительство для всех&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;BGWF&quot;&gt;Нынешние сотрудники Google сообщают, что эти ценности не особо учитываются в повседневной работе и кажутся довольно абстрактными и «корпоративными». Такой поверхностный подход отличается от подхода конкурентов, таких как интернет-магазин Amazon, чьи &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/49561596/amazons-leadership-principles&quot; target=&quot;_blank&quot;&gt;16 принципов лидерства&lt;/a&gt; с таким же успехом могли бы быть высечены на камне на стенах.&lt;/p&gt;
  &lt;p id=&quot;1W7f&quot;&gt;&lt;strong&gt;«Гугловость» — это то, что объединяет большинство сотрудников компании. &lt;/strong&gt;Это качество, на которое Google обращает внимание при найме сотрудников, и которым должны обладать все работники. Этот термин не имеет четкого определения, но подразумевает, что сотрудник должен быть умным, легко адаптирующимся и командным игроком, с которым приятно работать. Подробнее о «гугловости» мы рассказываем в разделе «Найм».&lt;/p&gt;
  &lt;figure id=&quot;BPyH&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!WJFO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fc9ef5b-a19a-43f5-9fa5-135e644aeb2a_1280x720.png&quot; width=&quot;1280&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Игривый и амбициозный: стиль Google начинается со знаменитой кепки «Нуглер». Источник: бывший инженер Google &lt;a href=&quot;https://www.linkedin.com/in/mohammadfraz/&quot; target=&quot;_blank&quot;&gt;Мохаммад Фраз&lt;/a&gt; («Хуглер») из своего видео «&lt;a href=&quot;https://www.youtube.com/@mohammadfraz&quot; target=&quot;_blank&quot;&gt;Набор для вступления в Google&lt;/a&gt;»&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cm7R&quot;&gt;В собственных продуктах Google можно найти множество примеров «гугловости», которые показывают, насколько ориентирована на инженеров корпоративная культура. Например, попробуйте ввести в Google запрос «рекурсия»:&lt;/p&gt;
  &lt;figure id=&quot;W9ez&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!BFio!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c38a067-89ab-4a72-be5a-f15584b4b529_1506x386.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;Рекурсия — непростая для понимания концепция. Вместо того чтобы объяснять, Google просто демонстрирует эту концепцию в поиске Google, предлагая вариант «Вы имели в виду: рекурсия?» Нажмите на эту ссылку, и вы вернётесь на ту же страницу… рекурсия!&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;KO5Z&quot;&gt;2. Что делает Google особенным?&lt;/h2&gt;
  &lt;p id=&quot;ZHGc&quot;&gt;Мы поговорили с 25 нынешними и бывшими сотрудниками Google и выяснили, что отличает эту компанию от других крупных технологических корпораций.&lt;/p&gt;
  &lt;h3 id=&quot;LHou&quot;&gt;Никакого “единого” Google&lt;/h3&gt;
  &lt;p id=&quot;pQZQ&quot;&gt;Google разделена на продуктовые направления, которые функционируют как отдельные компании. Внутри компании их часто называют «направлениями» или «организациями». Основные направления:&lt;/p&gt;
  &lt;ul id=&quot;n7eO&quot;&gt;
    &lt;li id=&quot;SoG4&quot;&gt;&lt;strong&gt;Знания и информация&lt;/strong&gt;: включает поиск Google, внутренние платформы и основные сервисы&lt;/li&gt;
    &lt;li id=&quot;rvKq&quot;&gt;&lt;strong&gt;YouTube&lt;/strong&gt;: всё, что связано с платформой для обмена видео&lt;/li&gt;
    &lt;li id=&quot;Aakf&quot;&gt;&lt;strong&gt;Облако: G&lt;/strong&gt;облачная платформа и рабочее пространство Google&lt;/li&gt;
    &lt;li id=&quot;eMnl&quot;&gt;&lt;strong&gt;Реклама и монетизация: &lt;/strong&gt;такие продукты, как Google Ads, AdSense и AdMob&lt;/li&gt;
    &lt;li id=&quot;LHtF&quot;&gt;&lt;strong&gt;Платформы и устройства: &lt;/strong&gt;программные платформы, такие как Android, Chrome, Chrome OS, и аппаратные устройства, такие как Pixel, Nest, Fitbit, Chromecast, Google TV и Google Home&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fvr5&quot;&gt;У организаций есть свои цели, приоритеты, показатели и графики планирования. А внутри каждой организации команды обладают достаточной независимостью, чтобы определять свой подход к работе. Опыт инженера в одной команде организации может сильно отличаться от опыта другого инженера в другой команде другой организации! Вот как один из нынешних инженеров Google объяснил нам это:&lt;/p&gt;
  &lt;blockquote id=&quot;gmvg&quot;&gt;«Ваш опыт во многом зависит от вашей команды. Если вы работаете над зрелым продуктом, вам предстоит пройти через множество этапов. Если вы работаете над проектом, который только запускается, вам придётся написать больше кода».&lt;/blockquote&gt;
  &lt;p id=&quot;0hMJ&quot;&gt;Технический руководитель подтвердил, что приоритеты у разных PA различаются.&lt;/p&gt;
  &lt;blockquote id=&quot;VweN&quot;&gt;«Приоритеты между продакт-агентами сильно различаются. Честно говоря, они также различаются между подгруппами в рамках одного продакт-агента. В Google принято договариваться между собой, чтобы добиться результата, а не следовать приоритетам, установленным сверху. Лично я считаю, что такое количество переговоров неэффективно и утомительно, и я бы не отказался от более четких указаний сверху!»&lt;/blockquote&gt;
  &lt;h3 id=&quot;JyHU&quot;&gt;Единая инженерная культура&lt;/h3&gt;
  &lt;p id=&quot;tTNw&quot;&gt;Несмотря на то, что продуктовые направления и команды работают независимо друг от друга, инженерная культура, судя по отзывам инженеров, с которыми мы общались, довольно универсальна.&lt;/p&gt;
  &lt;p id=&quot;D3FG&quot;&gt;&lt;strong&gt;Практики, инструменты и технологические стеки очень похожи. &lt;/strong&gt;Независимо от того, работает ли человек в YouTube, в отделе рекламы и коммерции или в другой продуктовой области, он использует одни и те же внутренние инструменты, одни и те же процессы для проверки кода, тестирования и документирования, а также одни и те же процессы монорепозитория и непрерывной интеграции — за исключением нескольких проектов с открытым исходным кодом, таких как Android и Chromium.&lt;/p&gt;
  &lt;p id=&quot;pa28&quot;&gt;Тот факт, что большинство из 60 000 инженеров Google используют практически идентичные инструменты, означает, что для перемещения команд требуется минимум усилий. Это упрощает внутренние перемещения, так как предполагает гораздо меньше изменений в процессах и инструментах, а значит, и меньшую когнитивную нагрузку, что в целом ускоряет адаптацию.&lt;/p&gt;
  &lt;p id=&quot;PgO2&quot;&gt;&lt;strong&gt;Политика и культура в разных подразделениях и командах отличаются. &lt;/strong&gt;Невозможно, чтобы культура в тысячах инженерных команд, разбросанных по десяткам локаций, была одинаковой. Вот основные различия, по мнению инженеров:&lt;/p&gt;
  &lt;ul id=&quot;rCSu&quot;&gt;
    &lt;li id=&quot;zc5h&quot;&gt;&lt;strong&gt;Политика&lt;/strong&gt;. Как вы влияете на лиц, принимающих решения в вашей организации, чтобы они отдавали приоритет тому, что важно для вашей команды? Для этого нужно хорошо разбираться в тонкостях влияния, знать самых влиятельных людей и сделать их своими союзниками. Это непростая задача для любой компании среднего или крупного размера. &lt;em&gt;Ранее мы рассказывали о &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/internal-politics-part-1&quot; target=&quot;_blank&quot;&gt;внутренней политике для разработчиков и менеджеров&lt;/a&gt;.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;MmNh&quot;&gt;&lt;strong&gt;Культура и эффективность. &lt;/strong&gt;Google утверждает, что существует «единая инженерная культура», но инженеры рассказали нам, что в разных организациях расставляют приоритеты по-разному: одни больше ценят качество, другие сосредоточены на инновациях, а третьи ставят во главу угла быструю доставку. Оценка эффективности называется GRAD (Google Reviews and Development) и зависит от организации, то есть ожидания для каждого уровня немного отличаются в разных организациях. &lt;em&gt;Мы рассмотрим эту тему во второй части этой мини-серии.&lt;/em&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;xQk8&quot;&gt;Уникальный инженерный пакет&lt;/h3&gt;
  &lt;p id=&quot;cFho&quot;&gt;Инженерная организация Google существует в другом мире, отличном от того, в котором работают другие технологические компании. Всё сводится к одному: масштабу.&lt;/p&gt;
  &lt;p id=&quot;mzgQ&quot;&gt;Google пришлось создавать системы, способные обслуживать сотни миллионов пользователей, за десять лет до того, как какая-либо другая компания в мире достигла аналогичных масштабов. Это означало, что компания внедряла уникальные системы и решения для масштабных задач по масштабированию, а общедоступные инструменты появились за пределами Google лишь десять лет спустя.&lt;/p&gt;
  &lt;p id=&quot;OTOo&quot;&gt;Какие бы инструменты или поставщиков ни использовала ваша компания для масштабирования, скорее всего, Google создала свои собственные версии на 10 или более лет раньше.&lt;/p&gt;
  &lt;ul id=&quot;kYSQ&quot;&gt;
    &lt;li id=&quot;ZI3a&quot;&gt;&lt;strong&gt;Борг&lt;/strong&gt; (управление контейнерами в масштабе): предшественник платформы для оркестрации контейнеров Kubernetes&lt;/li&gt;
    &lt;li id=&quot;jzLH&quot;&gt;&lt;strong&gt;Боргмон/Монарх&lt;/strong&gt; (наблюдаемость в масштабе): предшественник решения для наблюдаемости, Datadog&lt;/li&gt;
    &lt;li id=&quot;tcwF&quot;&gt;&lt;strong&gt;Поиск кода&lt;/strong&gt; (поиск кода в больших кодовых базах): предшественник поставщика услуг поиска кода Sourcegraph&lt;/li&gt;
    &lt;li id=&quot;4j7V&quot;&gt;&lt;strong&gt;Piper&lt;/strong&gt; (система контроля версий в масштабе Google): предшественник лидера в области контроля версий, GitHub&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;XtNe&quot;&gt;Google занимает необычную позицию: ему нет смысла внедрять такие стандартные отраслевые инструменты, как GitHub и Kubernetes, поскольку его существующий стек хорошо интегрирован. Один из инженеров Google объяснил, почему компания редко использует внешние сервисы или инструменты, даже если они могут справиться с масштабами Google:&lt;/p&gt;
  &lt;blockquote id=&quot;J0BG&quot;&gt;«Благодаря Google все работает так &lt;em&gt;хорошо&lt;/em&gt;. Поскольку весь технологический стек разработан внутри компании, каждая система имеет встроенную прозрачную интеграцию с корпоративной системой аутентификации и авторизации, а также с «волшебной» системой выставления счетов.Внешние средства всегда должны:Предоставлять абстракции аутентификацииПредоставлять абстракции выставления счетовЭти два ограничения делают внедрение новых инструментов &lt;em&gt;действительно&lt;/em&gt; чертовски сложным!”&lt;/blockquote&gt;
  &lt;h3 id=&quot;Nk4y&quot;&gt;С самого начала создавайте системы по-разному&lt;/h3&gt;
  &lt;p id=&quot;TBzz&quot;&gt;С момента своего основания компания Google отличалась от других компаний в сфере разработки.С самого начала, в 1998 году, компания делала ставку на скорость и надёжность как отличительные черты всех своих продуктов. Они рассчитывали, что инструмент веб-поиска справится с нагрузкой планетарного масштаба, как и последующие продукты, такие как Gmail, который в 2004 году был запущен с 1 ГБ бесплатного хранилища. Это было неслыханно в то время, когда хранение данных стоило гораздо дороже. Предполагалось, что эти продукты должны были быть рассчитаны на миллиарды пользователей.&lt;/p&gt;
  &lt;p id=&quot;X6GY&quot;&gt;Чтобы достичь такого масштаба, Google с самого начала пришлось создавать собственный технологический стек, поскольку не существовало готовых технологических стеков, способных справиться с нагрузкой планетарного масштаба. В конце 90-х общепринятой практикой было вертикальное масштабирование машин, то есть покупка максимально мощного сервера (называемого мейнфреймом) и попытка запустить приложение на одном сервере. Компания Sun была одним из крупнейших производителей мейнфреймов того времени, и большинство компаний вкладывали значительные средства в дорогостоящее высокопроизводительное оборудование.&lt;/p&gt;
  &lt;p id=&quot;KkeJ&quot;&gt;Компания Google пошла другим путём, решив закупать дешёвое стандартное оборудование и создавать кластеры центров обработки данных, в которых использовались десятки тысяч относительно недорогих машин для обработки нагрузок, с которыми не могли справиться даже самые большие мейнфреймы в мире.&lt;/p&gt;
  &lt;p id=&quot;hcMR&quot;&gt;Вот как работал поисковый кластер Google в 2003 году, согласно&lt;a href=&quot;https://static.googleusercontent.com/media/research.google.com/en//archive/googlecluster-ieee.pdf&quot; target=&quot;_blank&quot;&gt;официальному документу Google&lt;/a&gt;описывающему архитектуру кластера Google:&lt;/p&gt;
  &lt;blockquote id=&quot;9MJg&quot;&gt;«Чтобы обеспечить достаточную пропускную способность для обработки запросов, наш сервис состоит из нескольких кластеров, распределённых по всему миру.В каждом кластере насчитывается несколько тысяч машин, а географически распределённая система защищает нас от катастрофических сбоев в работе центров обработки данных (например, вызванных землетрясениями или масштабными отключениями электроэнергии).Система балансировки нагрузки на основе DNS выбирает кластер с учётом географической близости пользователя к каждому физическому кластеру. Система балансировки нагрузки минимизирует время обработки запроса пользователя, а также учитывает доступную пропускную способность в различных кластерах.&lt;/blockquote&gt;
  &lt;p id=&quot;5OYt&quot;&gt;В то время такой подход был революционным, и ни одна другая компания не публиковала столько подробностей о своей индивидуальной настройке центра обработки данных. Google продолжала публиковать информацию о том, как она организовывала и эксплуатировала кластеры, например, в этой статье в «&lt;em&gt;&lt;a href=&quot;https://sre.google/sre-book/table-of-contents/&quot; target=&quot;_blank&quot;&gt;Инженерии надёжности сайтов в Google&lt;/a&gt;» &lt;/em&gt;книге:&lt;/p&gt;
  &lt;p id=&quot;hvPV&quot;&gt;«Топология центра обработки данных Google:&lt;/p&gt;
  &lt;ul id=&quot;8HYr&quot;&gt;
    &lt;li id=&quot;Dtjp&quot;&gt;Десятки машин установлены на стеллаже.&lt;/li&gt;
    &lt;li id=&quot;dDUC&quot;&gt;Стеллажи стоят в ряд.&lt;/li&gt;
    &lt;li id=&quot;SX82&quot;&gt;Одна или несколько строк образуют кластер.&lt;/li&gt;
    &lt;li id=&quot;BcrZ&quot;&gt;Обычно в здании центра обработки данных размещается несколько кластеров.&lt;/li&gt;
    &lt;li id=&quot;Spwj&quot;&gt;Несколько зданий центров обработки данных, расположенных близко друг к другу, образуют кампус».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;wwJX&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!uslE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9f76bd3-9414-480b-bc12-b8feed95d553_900x488.png&quot; width=&quot;900&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Топология кампуса центра обработки данных Google. Источник: &lt;a href=&quot;https://sre.google/sre-book/table-of-contents/&quot; target=&quot;_blank&quot;&gt;Отдел обеспечения надёжности сайтов в Google&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;B78S&quot;&gt;Необычная открытость&lt;/h3&gt;
  &lt;p id=&quot;TXNl&quot;&gt;По сравнению с другими крупными технологическими компаниями Google очень открыто и прозрачно рассказывает о своей работе как внутри компании, так и за её пределами. &lt;em&gt;Обратите внимание, что с 2020 года эта открытость, похоже, снизилась.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;DcVE&quot;&gt;Внутри компании &lt;em&gt;по сути&lt;/em&gt; &lt;em&gt;всё&lt;/em&gt;было доступно всем сотрудникам: документы по планированию, стратегии, код, документация и т. д. После утечек в 2020 году доступ в масштабах всей компании был заменён на доступ в масштабах продуктовой области. Бывший инженер Google Cloud рассказал нам:&lt;/p&gt;
  &lt;blockquote id=&quot;BLS8&quot;&gt;«Политика открытости по умолчанию» начала меняться примерно в 2019–2020 годах. Именно тогда Google начал заниматься более спорными темами, и в прессу стало чаще попадать конфиденциальные документы.По умолчанию доступ к внутренним документам Google Docs был открыт для всех сотрудников компании. Примерно с 2019–2020 годов доступ по умолчанию предоставляется только на уровне подразделения, то есть вы можете искать документы только в своём подразделении, а не во всём Google.&lt;/blockquote&gt;
  &lt;p id=&quot;hqzL&quot;&gt;Внешне Google опубликовал &lt;a href=&quot;https://research.google/pubs/&quot; target=&quot;_blank&quot;&gt;более 10 000 статей&lt;/a&gt; с подробным описанием того, как работает компания и как создаются продукты. Ни одна другая компания не публиковала столько информации о своей внутренней работе.&lt;/p&gt;
  &lt;p id=&quot;zUyz&quot;&gt;Как известно, в 2017 году компания Google опубликовала статью под названием &lt;a href=&quot;https://research.google/pubs/attention-is-all-you-need/&quot; target=&quot;_blank&quot;&gt;«Внимание — это всё, что вам нужно»&lt;/a&gt;, в которой описывалась новая сетевая архитектура под названием «трансформеры». Эта статья легла в основу больших языковых моделей (БЯМ), и эта идея лежит в основе ChatGPT и других БЯМ. Опубликовав эту статью вместо того, чтобы придержать свой прорывной метод, компания Google, возможно, ускорила развитие ИИ на несколько лет!&lt;/p&gt;
  &lt;h3 id=&quot;NPsp&quot;&gt;Технологический остров&lt;/h3&gt;
  &lt;p id=&quot;7VDA&quot;&gt;В Google всё, что связано с разработкой программного обеспечения, уникально. Новички могут забыть о том, как использовать систему контроля версий, как запускать CI/CD и как управлять инфраструктурой. В Google используются разные уникальные системы для всего, что связано с созданием, развертыванием и поддержкой программного обеспечения, и всему этому нужно учиться.&lt;/p&gt;
  &lt;p id=&quot;ndGQ&quot;&gt;Термин «технологический остров» был придуман Урсом Хёльцле, восьмым сотрудником Google, во внутреннем документе почти десять лет назад. Как рассказал нам бывший сотрудник Google:&lt;/p&gt;
  &lt;blockquote id=&quot;0Dyv&quot;&gt;Термин «технологический остров» впервые был использован Урсом Хёльцле много лет назад в его докладе о том, что уникальный технологический стек Google (он же «жизнь на собственном технологическом острове») может стать проблемой в долгосрочной перспективе. В своём докладе он утверждал, что нам следует искать способы приблизиться к «технологическому материку», а не продолжать существовать на нашем собственном острове.В начале 2000-х подход «по-гугловски» был преимуществом. Но по мере того, как отрасль развивалась и появлялись новые технологии с открытым исходным кодом, этот «технологический остров» начал негативно влиять на производительность. Например, новым сотрудникам Google требуется больше времени на обучение по сравнению с компаниями, которые используют «стандартные для отрасли» технологические стеки.&lt;/blockquote&gt;
  &lt;p id=&quot;uA5s&quot;&gt;Дискуссия о том, должен ли Google оставаться технологическим островком или ему следует стать ближе к материку, вызывает споры. Вот что рассказал нам действующий инженер Google:&lt;/p&gt;
  &lt;blockquote id=&quot;4HRc&quot;&gt;«Сама идея перехода на более стандартизированный стек технологий вызывает некоторые разногласия внутри Google. Некоторые давние сотрудники Google, с которыми я общался, настолько привыкли к внутренним технологиям, что искренне считают их лучшими. Конечно, есть и те, кто придерживается противоположного мнения и пытается перевести Google на GCP, поскольку сервисы GCP общедоступны и не привязаны к Google, а значит, являются «мейнстримом». Однако все попытки провалились.&lt;strong&gt;В наши дни более распространена точка зрения, согласно которой Google следует использовать гибридный подход&lt;/strong&gt;: использовать GCP и объединять его с открытым исходным кодом, когда это целесообразно. Это отличается от подхода «поднять и перенести», при котором всё переносится на более стандартный стек. Гибридный подход предполагает, что некоторые сервисы Google никогда не будут работать без внутренних технологий.”&lt;/blockquote&gt;
  &lt;h3 id=&quot;Oq33&quot;&gt;Делаю много вещей&lt;/h3&gt;
  &lt;p id=&quot;5ciV&quot;&gt;По сравнению с такими компаниями, как Meta и Amazon, Google создаёт множество продуктов, платформ и технологий.&lt;/p&gt;
  &lt;ul id=&quot;AW1r&quot;&gt;
    &lt;li id=&quot;p6nL&quot;&gt;&lt;strong&gt;Поисковая система&lt;/strong&gt;: основной продукт&lt;/li&gt;
    &lt;li id=&quot;UOyn&quot;&gt;&lt;strong&gt;Операционные системы&lt;/strong&gt;: Android и ChromeOS&lt;/li&gt;
    &lt;li id=&quot;zx27&quot;&gt;&lt;strong&gt;Браузер&lt;/strong&gt;: Chrome&lt;/li&gt;
    &lt;li id=&quot;Fsi3&quot;&gt;&lt;strong&gt;Аппаратное обеспечение&lt;/strong&gt;: устройства Pixel и ноутбуки ChromeOS&lt;/li&gt;
    &lt;li id=&quot;SktZ&quot;&gt;&lt;strong&gt;Облачный провайдер&lt;/strong&gt;: Google Cloud&lt;/li&gt;
    &lt;li id=&quot;bmqZ&quot;&gt;&lt;strong&gt;Корпоративные инструменты&lt;/strong&gt;: Google Документы и Google Meet&lt;/li&gt;
    &lt;li id=&quot;LjdX&quot;&gt;&lt;strong&gt;Платформа для контента&lt;/strong&gt;: YouTube&lt;/li&gt;
    &lt;li id=&quot;DXzR&quot;&gt;&lt;strong&gt;Сервис потоковой передачи музыки: YouTube Music&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;gTRe&quot;&gt;&lt;strong&gt;Инструменты разработчика&lt;/strong&gt;: Flutter, Firebase&lt;/li&gt;
    &lt;li id=&quot;Q3mO&quot;&gt;&lt;strong&gt;Языки программирования и открытый исходный код&lt;/strong&gt;: Go, Kubernetes, Angular, PyTorch и другие&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fLxc&quot;&gt;Крупнейшая технологическая компания, наиболее близкая к Google по широте ассортимента продуктов, — это, вероятно, Microsoft. У производителя Windows также есть поисковая система (Bing), операционная система (Windows), браузер (Edge), аппаратное обеспечение (Surface), облачный провайдер (Azure), корпоративные инструменты (Office 365, Microsoft Teams), социальные сети (LinkedIn, GitHub), инструменты для разработчиков (VS Code) и языки программирования / открытый исходный код (TypeScript, .NET и другие).&lt;/p&gt;
  &lt;p id=&quot;GqED&quot;&gt;Работа инженером в Google может подразумевать работу с чем угодно: от документации до транскодирования видео, мобильных приложений или инфраструктуры. Если сотрудник хочет получить новый опыт, он может перейти в другую команду, работающую в совершенно другой области.&lt;/p&gt;
  &lt;figure id=&quot;Zm7o&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!4d-s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0338d5-116e-419a-a70a-456acf4186ef_1600x1157.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;У Google более 120 активно разрабатываемых продуктов&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;vTDH&quot;&gt;3. Уровни и роли&lt;/h2&gt;
  &lt;p id=&quot;yqA6&quot;&gt;В Google есть карьерная лестница с двумя направлениями для инженеров-программистов и технических руководителей, а также интересная должность под названием «технический ведущий менеджер» (Tech Lead Manager, TLM). На каждом уровне, как правило, одинаковая общая сумма вознаграждения (подробнее о вознаграждении мы расскажем в следующем разделе).&lt;/p&gt;
  &lt;p id=&quot;h1Lj&quot;&gt;Это значит, что, работая индивидуально, можно зарабатывать столько же, сколько менеджеры и директора, при этом не нужно управлять инженерами. На уровнях L5 и L6 инженеры, которые берут на себя обязанности технического руководителя, часто получают возможность подняться по карьерной лестнице до уровня менеджера. Те, кто хочет руководить небольшими командами, но не хочет становиться менеджерами, могут быть техническими лидами. Вот как выглядят уровни на этих параллельных путях:&lt;/p&gt;
  &lt;figure id=&quot;QYPm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!RdLf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a36263f-aa9a-4901-a68b-2a94fc9b3005_1094x694.png&quot; width=&quot;1094&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Инженерные уровни Google: IC, менеджер и TLM&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;DEQb&quot;&gt;&lt;em&gt;Мы опубликовали подробный обзор сходств и различий между ролями IC, менеджера и TLM в &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/engineering-career-paths&quot; target=&quot;_blank&quot;&gt;инженерных карьерных траекториях в крупных технологических компаниях и стартапах&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;h3 id=&quot;EuLK&quot;&gt;Карьера программиста&lt;/h3&gt;
  &lt;p id=&quot;VOwM&quot;&gt;Карьерная лестница SWE мало чем отличается от карьерных лестниц в других крупных технологических компаниях и стартапах. Отчасти это связано с тем, что многие компании создают свои карьерные лестницы для инженеров, взяв за образец Google.&lt;/p&gt;
  &lt;p id=&quot;XLFq&quot;&gt;&lt;strong&gt;В Google самые строгие требования к уровню подготовки на собеседованиях. &lt;/strong&gt;Новых инженеров часто &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/the-seniority-rollercoaster&quot; target=&quot;_blank&quot;&gt;понижают в должности&lt;/a&gt;когда они приходят: например, старший инженер в Amazon может получить должность L4 (старший инженер III уровня), а штатному инженеру в быстрорастущей компании могут предложить должность L5 (старший инженер) в Google. Обычно это происходит по двум причинам:&lt;/p&gt;
  &lt;ul id=&quot;pSJM&quot;&gt;
    &lt;li id=&quot;Xyyj&quot;&gt;Комитет по найму Google принимает решения о найме и повышении в должности, и понижение в должности встречается гораздо чаще. Компания скорее наймёт человека, у которого есть потенциал для роста, чем возьмёт того, кто не справится с работой.&lt;/li&gt;
    &lt;li id=&quot;MGqT&quot;&gt;Google платит больше, чем в среднем по рынку. Даже при понижении в должности предложение от Google часто означает повышение зарплаты. Если есть предложение с более высокой зарплатой на должности, с которой будет проще перейти на следующий уровень, то почему бы не согласиться?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;G3ri&quot;&gt;&lt;em&gt;Подробнее о понижении и повышении уровня мы рассказываем в выпуске &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/the-seniority-rollercoaster&quot; target=&quot;_blank&quot;&gt;«Американские горки» стажа&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;AgQw&quot;&gt;&lt;strong&gt;«Технический руководитель» — это должность, а не уровень. &lt;/strong&gt;Технические руководители отвечают за технические аспекты проектов, такие как разработка архитектуры, принятие технических решений, определение приоритетности задач и управление проектами. Они назначаются техническим руководителем каждого проекта и не занимаются управлением персоналом.&lt;/p&gt;
  &lt;p id=&quot;JgWr&quot;&gt;Вопрос уровней обычно связан не столько с тем, что менеджер назначает технического руководителя, сколько с масштабом проекта. Даже инженеру уровня 3 могут поручить руководить простым проектом, особенно если это поможет ему получить повышение до уровня 4. Инженеры обладают большой самостоятельностью, поэтому они часто берут на себя инициативу и становятся «фактическими техническими руководителями». &lt;em&gt;Подробнее об этом мы рассказываем в статье &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/engineers-leading-projects&quot; target=&quot;_blank&quot;&gt;«Инженеры-программисты, руководящие проектами».&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;ynZM&quot;&gt;&lt;strong&gt;Стать научным сотрудником Google очень сложно. &lt;/strong&gt;В настоящее время в компании работает не более 20 научных сотрудников Google из 60 000 инженеров; на этом уровне находятся менее 0,1 % всех инженеров Google. В некотором смысле это логично: перейти на следующий уровень после уровня L6 (штатный сотрудник) становится экспоненциально сложнее, поэтому логично, что сотрудников уровня L7 гораздо меньше, чем сотрудников уровня L6, а сотрудников уровня L8 — ещё меньше, чем сотрудников уровня L7, и т. д.&lt;/p&gt;
  &lt;p id=&quot;g4K3&quot;&gt;Среди известных сотрудников Google &lt;a href=&quot;https://en.wikipedia.org/wiki/Urs_H%C3%B6lzle&quot; target=&quot;_blank&quot;&gt;Урс Хёльцле&lt;/a&gt; (инженер № 8 и первый вице-президент Google по инженерным вопросам), &lt;a href=&quot;https://en.wikipedia.org/wiki/Amit_Singhal&quot; target=&quot;_blank&quot;&gt;Амит Сингхал&lt;/a&gt; (возглавлял Google Search в течение 15 лет) и &lt;a href=&quot;https://en.wikipedia.org/wiki/Blaise_Ag%C3%BCera_y_Arcas&quot; target=&quot;_blank&quot;&gt;Блейз Агуэра-и-Аркас&lt;/a&gt; (технический директор по технологиям и обществу).&lt;/p&gt;
  &lt;p id=&quot;Qm8h&quot;&gt;В Google всего два старших научных сотрудника (на уровне L11): &lt;a href=&quot;https://en.wikipedia.org/wiki/Sanjay_Ghemawat&quot; target=&quot;_blank&quot;&gt;Санджай Гхемават&lt;/a&gt; и &lt;a href=&quot;https://en.wikipedia.org/wiki/Jeff_Dean&quot; target=&quot;_blank&quot;&gt;Джефф Дин&lt;/a&gt;. Эта пара внесла огромный вклад в создание масштабируемой и отказоустойчивой инфраструктуры Google, в том числе написав &lt;a href=&quot;https://en.wikipedia.org/wiki/MapReduce&quot; target=&quot;_blank&quot;&gt;MapReduce&lt;/a&gt;. The New Yorker рассказывает об их истории в статье «&lt;a href=&quot;https://www.newyorker.com/magazine/2018/12/10/the-friendship-that-made-google-huge&quot; target=&quot;_blank&quot;&gt;Дружба, которая сделала Google огромным&lt;/a&gt;».&lt;/p&gt;
  &lt;h3 id=&quot;g2io&quot;&gt;Роль Ведущего технического менеджера&lt;/h3&gt;
  &lt;p id=&quot;B6rF&quot;&gt;Должность технического руководителя появилась в Google раньше, чем в других компаниях, таких как Uber, была введена аналогичная должность. Это сочетание функций индивидуального разработчика и менеджера, при котором индивидуальный разработчик уровня L6 или выше принимает на себя ответственность за 4–6 непосредственных подчиненных и получает должность «технического руководителя».&lt;/p&gt;
  &lt;p id=&quot;1TZ8&quot;&gt;По словам технических руководителей Google, логика этой роли такова:&lt;/p&gt;
  &lt;ul id=&quot;TmJd&quot;&gt;
    &lt;li id=&quot;z1qf&quot;&gt;Многие инженеры Staff+ (на уровне L6 и выше) &lt;em&gt;не&lt;/em&gt; хотят становиться менеджерами на полную ставку или руководить большими командами&lt;/li&gt;
    &lt;li id=&quot;LkKB&quot;&gt;Тем не менее многие из них — отличные технические руководители&lt;/li&gt;
    &lt;li id=&quot;W4oh&quot;&gt;Для проектов, в которых задействована небольшая команда — максимум 5–6 человек, — почему бы не создать «гибридную» руководящую должность? Технический руководитель L6+ фактически выполняет функции менеджера&lt;/li&gt;
    &lt;li id=&quot;9j8g&quot;&gt;Ограничение: команда не может состоять более чем из 6 человек&lt;/li&gt;
    &lt;li id=&quot;vSZ9&quot;&gt;В качестве отдельной роли TLM учитывает, что они занимаются &lt;em&gt;некоторыми&lt;/em&gt; аспектами управления персоналом и не могут выполнять столько же работы, как коллеги, не имеющие отчетов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;O6X6&quot;&gt;&lt;strong&gt;Роль TLM более распространена в Google, чем в других крупных технологических компаниях. &lt;/strong&gt;Как рассказал нам действующий штатный инженер:&lt;/p&gt;
  &lt;blockquote id=&quot;I0Sy&quot;&gt;«Я не видел, чтобы TLM использовались так же широко, как в Google. На позициях TLM обычно работают самые сильные специалисты, управляющие небольшими командами. Цель состоит в том, чтобы выпускать продукт быстрее и с меньшими бюрократическими проволочками. Например, у меня был TLM уровня L7, и я видел, как TLM уровня L8 управляют командами из 4–6 специалистов.Эти TLM, как правило, являются &lt;em&gt;очень&lt;/em&gt;талантливыми специалистами, которые хотят работать очень быстро с очень небольшой командой. Роль TLM также довольно распространена в исследовательских проектах».&lt;/blockquote&gt;
  &lt;p id=&quot;vZux&quot;&gt;Самый большой недостаток роли TLM заключается в том, что продвигаться по карьерной лестнице в этой должности сложно. На уровнях IC и менеджер достаточно чётко обозначены требования для перехода на следующий уровень. Но инженер, занимающий должность TLM, может рассчитывать на то, что останется на этом уровне до тех пор, пока он занимает эту должность. Это ещё одна причина, по которой эта должность больше подходит для специалистов IC уровня 7+, которые не ожидают — и даже не хотят — повышения.&lt;/p&gt;
  &lt;h3 id=&quot;NuMb&quot;&gt;Карьерный рост менеджера&lt;/h3&gt;
  &lt;p id=&quot;1Be2&quot;&gt;Менеджеры по инжинирингу отвечают за продуктивность, эффективность и удовлетворённость своих подчинённых. Наиболее распространённое соотношение между менеджером и инженерами — от 1:8 до 1:12. В крайних случаях это может быть всего 3 подчинённых или около 30. Чем больше число, тем меньше внимания менеджер может уделять каждому подчинённому и тем выше риск выгорания.&lt;/p&gt;
  &lt;p id=&quot;U23f&quot;&gt;В обязанности технических руководителей входит:&lt;/p&gt;
  &lt;ul id=&quot;y6OA&quot;&gt;
    &lt;li id=&quot;KEOO&quot;&gt;Обучение инженеров для их профессионального роста&lt;/li&gt;
    &lt;li id=&quot;ZpRE&quot;&gt;Содействие карьерному росту сотрудников&lt;/li&gt;
    &lt;li id=&quot;eTau&quot;&gt;Управление эффективностью: пройдите процедуру GRAD (Google Reviews and Development)&lt;/li&gt;
    &lt;li id=&quot;aYJX&quot;&gt;Участвуйте в найме сотрудников и обсуждении вопросов оплаты труда. Чем выше должность технического руководителя, тем больше у него возможностей для участия. Директора и вышестоящие руководители часто имеют больше прав при обсуждении вопросов оплаты труда&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;QwIT&quot;&gt;&lt;strong&gt;Менеджеры по инжинирингу должны быть инженерами. &lt;/strong&gt;В книге &lt;em&gt;«Инженерия программного обеспечения в Google»&lt;/em&gt; объясняется, почему компания требует наличия инженерного образования:&lt;/p&gt;
  &lt;blockquote id=&quot;npUZ&quot;&gt;«Многие компании нанимают квалифицированных менеджеров по работе с персоналом, которые могут практически ничего не знать о разработке программного обеспечения, чтобы те руководили инженерными командами. Компания Google с самого начала решила, что менеджеры по разработке программного обеспечения должны иметь инженерное образование. Это означало, что нужно было нанимать опытных менеджеров, которые раньше были инженерами-программистами, или обучать инженеров-программистов менеджменту».&lt;/blockquote&gt;
  &lt;p id=&quot;SCMp&quot;&gt;&lt;strong&gt;Раньше Google гораздо меньше доверял своим техническим руководителям.&lt;/strong&gt;Бывший штатный инженер Google рассказал нам:&lt;/p&gt;
  &lt;blockquote id=&quot;CROR&quot;&gt;«В первые годы Google не доверял менеджерам. Все системы были устроены таким образом, что влияние отдельных менеджеров было ограниченным. Решения о продвижении по службе принимались не менеджерами, а комитетом по продвижению, состоящим из инженеров! Ваша оценка как менеджера была лишь одним из факторов, учитываемых комитетом.Менеджеры не могли запрещать членам команды переходить в другие команды и не могли устанавливать ограничения на приём в свои команды.В какой-то момент менеджеры стали отвечать за вашу зарплату, но не за долю в компании, которая предоставлялась на уровне директора, поэтому ваш менеджер даже не знал о вашем полном компенсационном пакете.&lt;/blockquote&gt;
  &lt;p id=&quot;AYxK&quot;&gt;Сегодня менеджеры пользуются большим доверием, но по-прежнему не имеют решающего голоса при распределении акций, хотя и видят общую сумму вознаграждения своих непосредственных подчинённых.&lt;/p&gt;
  &lt;p id=&quot;nuwo&quot;&gt;Подробнее об управлении и лидерстве в Google читайте в главе «&lt;a href=&quot;https://abseil.io/resources/swe-book/html/ch05.html&quot; target=&quot;_blank&quot;&gt;Как руководить командой&lt;/a&gt;» в книге &lt;em&gt;«Разработка программного обеспечения в Google»&lt;/em&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;IXkY&quot;&gt;Другие роли&lt;/h3&gt;
  &lt;p id=&quot;qtP2&quot;&gt;Помимо инженеров-программистов (SWE) и технических менеджеров, в Google есть и другие инженерные должности.&lt;/p&gt;
  &lt;p id=&quot;3qo3&quot;&gt;&lt;strong&gt;Инженеры по обеспечению надёжности сайтов (SRE) &lt;/strong&gt;— это должность, появившаяся в Google в 2003 году. «Сайт» изначально означал «Google.com», а SRE отвечают за работу крупных сайтов и приложений. Как вспоминал &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/reliability-engineering&quot; target=&quot;_blank&quot;&gt;Дэйв О’Коннор, один из первых SRE,&lt;/a&gt; о происхождении этой должности:&lt;/p&gt;
  &lt;blockquote id=&quot;vSbQ&quot;&gt;«В 2003 году появилась должность SRE-инженера. Бену Трейнору Слоссу было поручено создать «производственную команду» Google, и, по его собственным словам, он создал «то, что получается, когда вы просите инженера-программиста разработать операционную команду». Так в Google появилась должность SRE-инженера. С самого начала в SRE-команде в разной степени присутствовали специалисты по системам и операциям, а также инженеры-программисты. Значительная часть работы команды заключалась в создании инструментов и методов, необходимых для управления автопарком Google.&lt;/blockquote&gt;
  &lt;p id=&quot;HfyH&quot;&gt;В каждой продуктовой организации есть собственная команда SRE, обычно состоящая из 30–200 специалистов. Они сотрудничают с инженерами-программистами, как описано в &lt;a href=&quot;https://research.google/pubs/how-google-sre-and-developers-work-together/&quot; target=&quot;_blank&quot;&gt;Как Google SRE и разработчики работают вместе&lt;/a&gt;:&lt;/p&gt;
  &lt;figure id=&quot;EQGR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!djde!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61fd33c-0694-4f03-bb72-e2ee32b061c5_1600x888.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Как SRE и разработчики сотрудничают в Google&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;XFRW&quot;&gt;Роль SRE была популяризирована в &lt;a href=&quot;https://docs.google.com/document/d/1hVEWRpdFm78Wu0pZlJR1WXdH-2JDvFY6vknLiRpDG2E/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;книге Google о SRE&lt;/a&gt; в 2016 году. Это бесплатная книга, которую можно &lt;a href=&quot;https://docs.google.com/document/d/1hVEWRpdFm78Wu0pZlJR1WXdH-2JDvFY6vknLiRpDG2E/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;прочитать здесь&lt;/a&gt;. Мы также подробнее рассказали о роли SRE в статье &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/reliability-engineering&quot; target=&quot;_blank&quot;&gt;Что такое инженерия надёжности&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;Ohhe&quot;&gt;Другие роли, о которых стоит упомянуть:&lt;/p&gt;
  &lt;p id=&quot;E97f&quot;&gt;&lt;strong&gt;EngProd&lt;/strong&gt;: Функция, которая обеспечивает инженеров и команды необходимыми инструментами и средой для работы над продуктом: настройка тестовых стендов, запуск приложений, упаковка, настройка тестовых лабораторий для устройств, промежуточных сред и т. д.&lt;/p&gt;
  &lt;p id=&quot;AoHs&quot;&gt;&lt;strong&gt;Исследователи (RS). &lt;/strong&gt;Работают вместе с SWE и занимаются исследованиями. Требования к кандидатам очень высоки, и одной докторской степени недостаточно. На самом деле в Google большинство людей с докторской степенью, которые занимаются исследованиями, — это SWE, а не RS, которые должны не только иметь внушительный список научных публикаций, но и хорошо разбираться в программировании.&lt;/p&gt;
  &lt;p id=&quot;0w7y&quot;&gt;&lt;strong&gt;DevRel:&lt;/strong&gt;сокращение от «отношения с разработчиками», иногда также используется термин «поддержка разработчиков». В обязанности входит:&lt;/p&gt;
  &lt;ul id=&quot;TEIu&quot;&gt;
    &lt;li id=&quot;jtbK&quot;&gt;Создание статей и видеороликов для инженеров&lt;/li&gt;
    &lt;li id=&quot;CwF0&quot;&gt;Выступления на конференциях и онлайн&lt;/li&gt;
    &lt;li id=&quot;vDPa&quot;&gt;Быть «нулевым клиентом»: первопроходцами и тестировщиками новинок&lt;/li&gt;
    &lt;li id=&quot;TTsv&quot;&gt;Фрикшн-логгинг (также называемый «фрикшн-ингом»): ведение блога с явной целью зафиксировать моменты трения&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Y8nb&quot;&gt;DevRel — это &lt;em&gt;инженерная&lt;/em&gt; должность, а не маркетинговая; многие функции и инструменты для продуктов Google созданы DevRels.&lt;/p&gt;
  &lt;p id=&quot;1HBU&quot;&gt;Обычно эта роль предполагает взаимодействие с внешними сторонами, в том числе с разработчиками, использующими инструменты и платформы Google. Однако есть и внутренние роли в сфере DevRel, которые заключаются в поддержке команд из разных организаций и проектных групп.&lt;/p&gt;
  &lt;p id=&quot;DZNz&quot;&gt;&lt;strong&gt;UX-инженеры (UXE): &lt;/strong&gt;это подмножество SWE и гибридная роль, в рамках которой UXE работают с командами дизайнеров и разработчиков над такими задачами, как:&lt;/p&gt;
  &lt;ul id=&quot;4Cw6&quot;&gt;
    &lt;li id=&quot;oRIS&quot;&gt;Создание прототипов&lt;/li&gt;
    &lt;li id=&quot;ihte&quot;&gt;Разработка интерфейса&lt;/li&gt;
    &lt;li id=&quot;tZzf&quot;&gt;Разработка дизайн-систем, например работа над Material Design&lt;/li&gt;
    &lt;li id=&quot;vTlc&quot;&gt;Разработка фреймворка пользовательского интерфейса&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;kGb9&quot;&gt;Недостаток работы UX-дизайнером в Google по сравнению с работой SWE-инженером заключается в том, что внутри компании гораздо меньше возможностей для карьерного роста, потому что вакансий SWE в 10 раз больше, чем вакансий UX-дизайнеров.&lt;/p&gt;
  &lt;p id=&quot;lbte&quot;&gt;&lt;strong&gt;Инженер по продажам&lt;/strong&gt; &lt;strong&gt;(SE), инженер по работе с клиентами (CE),&lt;/strong&gt; &lt;strong&gt;инженер по техническим решениям&lt;/strong&gt;: эти должности чаще встречаются в подразделении Google Cloud. Инженеры по продажам работают с клиентами GCP и обычно участвуют в процессе продаж. Инженеры по работе с клиентами взаимодействуют с отделами продаж, клиентами и продуктовыми командами и выполняют функции, аналогичные &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/forward-deployed-engineers&quot; target=&quot;_blank&quot;&gt;инженерам с расширенным доступом&lt;/a&gt; (FDE). Инженеры по техническим решениям часто работают с крупными клиентами, в том числе из государственного сектора, выполняя функции, аналогичные функциям инженеров с расширенным доступом. &lt;em&gt;Подробнее о FDE мы рассказали в выпуске &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/forward-deployed-engineers&quot; target=&quot;_blank&quot;&gt;Кто такие инженеры передового базирования и почему они так востребованы?&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;wSpi&quot;&gt;В Google есть много узкоспециализированных инженерных должностей, от инженера по сетям до инженера по разработке систем и других специалистов по аппаратному обеспечению. Например, Google разрабатывает собственные процессоры и нанимает специалистов на уникальные должности, такие как &lt;a href=&quot;https://www.google.com/about/careers/applications/jobs/results/104916867683885766-senior-silicon-operations-engineer?q=engineer&amp;page=3&quot; target=&quot;_blank&quot;&gt;инженеры по кремниевым операциям&lt;/a&gt;, которые разрабатывают специализированные чипы, работая с поставщиками Google.&lt;/p&gt;
  &lt;p id=&quot;gc71&quot;&gt;Вы можете просмотреть все открытые вакансии Google &lt;a href=&quot;https://www.google.com/about/careers/applications/jobs/results?employment_type=FULL_TIME&quot; target=&quot;_blank&quot;&gt;на сайте вакансий&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;7ZE3&quot;&gt;&lt;strong&gt;Неинженерные роли в технической организации: &lt;/strong&gt;люди, занимающие эти должности, обычно не пишут код или делают это крайне редко. Разработчики часто работают с:&lt;/p&gt;
  &lt;ul id=&quot;QfMO&quot;&gt;
    &lt;li id=&quot;Fo5q&quot;&gt;&lt;strong&gt;Менеджеры по продукту: &lt;/strong&gt;они работают с разработчиками, чтобы убедиться, что &lt;em&gt;нужная вещь&lt;/em&gt; будет создана.&lt;/li&gt;
    &lt;li id=&quot;C0c0&quot;&gt;&lt;strong&gt;Менеджеры программ: &lt;/strong&gt;похожи на менеджеров по продукту, но они управляют проектами, процессами или операциями.&lt;/li&gt;
    &lt;li id=&quot;Jxha&quot;&gt;&lt;strong&gt;Менеджеры технических программ (TPM): &lt;/strong&gt;выполняют те же функции, что и менеджеры программ, но обладают дополнительными техническими знаниями. &lt;em&gt;Ранее мы рассказывали о том, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/what-tpms-do&quot; target=&quot;_blank&quot;&gt;чем занимаются TPM и чему инженеры-программисты могут у них научиться&lt;/a&gt;.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;WCBk&quot;&gt;&lt;strong&gt;Дизайнеры&lt;/strong&gt;: существует множество разновидностей этой профессии: UX-дизайнеры, UI/визуальные дизайнеры, моушн-дизайнеры, исследователи пользовательского опыта, UX-исследователи (UXR), менеджеры программ дизайна (DPM) и разговорные дизайнеры (CUI)&lt;/li&gt;
    &lt;li id=&quot;aMrB&quot;&gt;&lt;strong&gt;Технические писатели:&lt;/strong&gt; создают документацию и примеры кода, которые публикуются на страницах для разработчиков, например на Android, в облаке и т. д.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;Ajnr&quot;&gt;4. Компенсация&lt;/h2&gt;
  &lt;p id=&quot;dYz5&quot;&gt;Если Google и известен чем-то среди технических специалистов, так это компенсацией. Девяносто девять процентов компаний не могут или не хотят платить столько, сколько предлагает Google, и ни для кого не секрет, что компания готова платить больше, чем конкуренты, за высококлассных специалистов и кандидатов, которых они &lt;em&gt;действительно&lt;/em&gt;хотят привлечь.&lt;/p&gt;
  &lt;p id=&quot;BpyI&quot;&gt;Будучи менеджером в Uber, я столкнулся с такой ситуацией, когда мы набирали сотрудников в новый офис в Бангалоре, Индия. Кандидаты, которым мы предлагали работу, а также Google, почти всегда выбирали не Uber. Дело в том, что, когда они сообщали Google о нашем предложении, компания просто добавляла 10%, чтобы перебить наше предложение.&lt;/p&gt;
  &lt;h3 id=&quot;6GUJ&quot;&gt;Структура компенсации&lt;/h3&gt;
  &lt;p id=&quot;KeSV&quot;&gt;Компенсационный пакет состоит из нескольких компонентов:&lt;/p&gt;
  &lt;ul id=&quot;vc1z&quot;&gt;
    &lt;li id=&quot;owT9&quot;&gt;&lt;strong&gt;Базовая зарплата.&lt;/strong&gt;Годовая компенсация выплачивается раз в две недели в США и Канаде и ежемесячно в Европе. Это фиксированная сумма, на которую не влияют никакие факторы, связанные с эффективностью работы.&lt;/li&gt;
    &lt;li id=&quot;3hlx&quot;&gt;&lt;strong&gt;Акции / паи&lt;/strong&gt;. При трудоустройстве в Google вы получаете новый пакет акций, которые распределяются в течение 4 лет. 33 % распределяются в первый год, 33 % — во второй, 22 % — в третий и 12 % — в четвёртый. После распределения акций их можно продать в любое время или оставить у себя.&lt;/li&gt;
    &lt;li id=&quot;5gZO&quot;&gt;&lt;strong&gt;Бонус за трудоустройство. &lt;/strong&gt;Не предоставляется каждому новому сотруднику, но более опытные сотрудники (L5 и выше) могут договориться о единовременной выплате денежного бонуса при трудоустройстве в Google. Бонус выплачивается в течение первых месяцев работы, но может быть возвращен, если сотрудник уволится в течение двух лет.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Ikom&quot;&gt;В конце года бонусы выплачиваются как наличными, так и в виде акций:&lt;/p&gt;
  &lt;ul id=&quot;o3rG&quot;&gt;
    &lt;li id=&quot;0YxO&quot;&gt;&lt;strong&gt;Денежный бонус. &lt;/strong&gt;При выполнении плановых показателей выплачивается целевой денежный бонус. Если показатели выше или ниже плановых, размер бонуса может варьироваться.&lt;/li&gt;
    &lt;li id=&quot;5zdp&quot;&gt;&lt;strong&gt;Повторное распределение акций.&lt;/strong&gt; В конце года, если ожидания по результатам работы оправдались, обычно проводится повторное распределение акций наряду с выплатой денежного бонуса. Повторное распределение акций происходит в течение 4 лет с шагом в 25 %.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;izi3&quot;&gt;&lt;strong&gt;Общая сумма вознаграждения (ОСВ) &lt;/strong&gt;представляет собой сумму базового оклада + денежного бонуса + выплаченного акционерного капитала.&lt;/p&gt;
  &lt;h3 id=&quot;3MB9&quot;&gt;Типичные компенсационные пакеты L3 и L4&lt;/h3&gt;
  &lt;p id=&quot;AoPy&quot;&gt;Давайте рассмотрим несколько типичных пакетов для новых сотрудников. &lt;em&gt;Лучшим источником данных об этих пакетах является &lt;a href=&quot;https://www.levels.fyi/companies/google/salaries/software-engineer&quot; target=&quot;_blank&quot;&gt;Levels.fyi&lt;/a&gt;, где вы можете ознакомиться с тысячами пакетов Google.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;nuj7&quot;&gt;&lt;strong&gt;Разработчик начального уровня: 160 000–250 000 долларов в США, &lt;/strong&gt;и пропорционально меньше в других регионах. Должность L3 в Google — это должность начального уровня. Компания нанимает выпускников и специалистов с опытом работы от нескольких лет.&lt;/p&gt;
  &lt;figure id=&quot;g7PI&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!a3wW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F524d2a5f-f2b0-412e-a5fd-e2e584bbca68_1236x834.png&quot; width=&quot;1236&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Реальные предложения от Google. Источник большинства данных: Levels.fyi, &lt;a href=&quot;https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l3&quot; target=&quot;_blank&quot;&gt;вознаграждение Google L3&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fgk1&quot;&gt;&lt;strong&gt;Вознаграждение в Google зависит от местоположения. &lt;/strong&gt;Компания выплачивает вознаграждение высшего уровня в рамках &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/trimodal&quot; target=&quot;_blank&quot;&gt;тримодальной модели вознаграждения&lt;/a&gt;. Однако компания корректирует пакеты вознаграждения в зависимости от местоположения и гарантирует, что выплачивает больше, чем &lt;em&gt;региональные&lt;/em&gt; конкуренты. Однако, если посмотреть на пакеты вознаграждения L3, становится ясно, что общая сумма вознаграждения в США и Швейцарии значительно выше, чем в других регионах.&lt;/p&gt;
  &lt;p id=&quot;AMYN&quot;&gt;Поскольку оплата в Google зависит от местоположения, теоретически сотрудник из региона с более низкой стоимостью жизни может получить более выгодное предложение о полностью удалённой работе, чем в Google. Но, по моему опыту, такое случается редко, потому что высокооплачиваемые полностью удалённые должности обычно предназначены для старших инженеров-программистов и выше, а на этом уровне Google начинает платить действительно хорошо. Кроме того, очень сильным кандидатам компания всегда может предложить больше.&lt;/p&gt;
  &lt;p id=&quot;TV7w&quot;&gt;&lt;strong&gt;L4&lt;/strong&gt; — это средний уровень, который всё же ниже уровня старшего SWE (L5). Типичные диапазоны для этого уровня:&lt;/p&gt;
  &lt;ul id=&quot;6R7F&quot;&gt;
    &lt;li id=&quot;M4Xr&quot;&gt;&lt;strong&gt;США&lt;/strong&gt;: 250 000–350 000 долларов (общая годовая компенсация)&lt;/li&gt;
    &lt;li id=&quot;4StE&quot;&gt;&lt;strong&gt;Швейцария:&lt;/strong&gt; 210 000–260 000 швейцарских франков&lt;/li&gt;
    &lt;li id=&quot;i83a&quot;&gt;&lt;strong&gt;Великобритания:&lt;/strong&gt; от 125 000 до 185 000 фунтов стерлингов&lt;/li&gt;
    &lt;li id=&quot;6Dh5&quot;&gt;&lt;strong&gt;Германия и Ирландия: &lt;/strong&gt;140 000–180 000 евро&lt;/li&gt;
    &lt;li id=&quot;M5zH&quot;&gt;&lt;strong&gt;Канада: &lt;/strong&gt;210 000–280 000 канадских долларов&lt;/li&gt;
    &lt;li id=&quot;pyPl&quot;&gt;&lt;strong&gt;Австралия: &lt;/strong&gt;200 000–280 000 австралийских долларов&lt;/li&gt;
    &lt;li id=&quot;Pfis&quot;&gt;&lt;strong&gt;Польша: &lt;/strong&gt;380 000–450 000 злотых в Польше,&lt;/li&gt;
    &lt;li id=&quot;kabs&quot;&gt;&lt;strong&gt;Индия: &lt;/strong&gt;65–88 лакхов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;mJTS&quot;&gt;Компенсация старшим SWE (L5) и штатным SWE (L6)&lt;/h3&gt;
  &lt;p id=&quot;LQ4Z&quot;&gt;Старший специалист по SWE может зарабатывать в США до 500 000 долларов. На этом уровне опционы становятся более значимыми по сравнению с базовой зарплатой. На уровне старшего специалиста (L5) вознаграждение значительно увеличивается за счёт пакетов опционов. Обычно при получении предложения можно договориться об опционах, но имейте в виду, что они могут быть намного ниже или — в удачных случаях! — выше, чем в предложениях ниже:&lt;/p&gt;
  &lt;figure id=&quot;aBee&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!GW6V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb4b4bad-ec0c-4f5b-83b9-63adb1660d9b_1228x846.png&quot; width=&quot;1228&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Реальные компенсационные пакеты в Google, в том числе для сотрудников с большим стажем. Источник: Levels.fyi, &lt;a href=&quot;https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l5&quot; target=&quot;_blank&quot;&gt;Пакеты L5 в Google&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;96HC&quot;&gt;&lt;strong&gt;L6&lt;/strong&gt; — это должность штатного инженера. На эту должность сложно как устроиться, так и продвинуться по карьерной лестнице, в отличие от перехода с L4 на L5. Вот как обычно оплачивается эта должность в годовом исчислении:&lt;/p&gt;
  &lt;ul id=&quot;1syU&quot;&gt;
    &lt;li id=&quot;TMTy&quot;&gt;&lt;strong&gt;США:&lt;/strong&gt; $550,00–700,000&lt;/li&gt;
    &lt;li id=&quot;PsOK&quot;&gt;&lt;strong&gt;Швейцария:&lt;/strong&gt; 370 000–500 000 швейцарских франков&lt;/li&gt;
    &lt;li id=&quot;qoeO&quot;&gt;&lt;strong&gt;Великобритания:&lt;/strong&gt; от 270 000 до 380 000 фунтов стерлингов&lt;/li&gt;
    &lt;li id=&quot;cydL&quot;&gt;&lt;strong&gt;Германия и Ирландия: &lt;/strong&gt;250 000–330 000 евро&lt;/li&gt;
    &lt;li id=&quot;46zT&quot;&gt;&lt;strong&gt;Канада: &lt;/strong&gt;420 000–650 000 канадских долларов&lt;/li&gt;
    &lt;li id=&quot;coul&quot;&gt;&lt;strong&gt;Австралия: &lt;/strong&gt;350 000–550 000 австралийских долларов&lt;/li&gt;
    &lt;li id=&quot;YUJO&quot;&gt;&lt;strong&gt;Польша: &lt;/strong&gt;750 000–850 000 злотых в Польше,&lt;/li&gt;
    &lt;li id=&quot;7Gy4&quot;&gt;&lt;strong&gt;Индия: &lt;/strong&gt;1,5–2,2 миллиона рупий&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;HeeD&quot;&gt;Работа на миллион долларов: старший специалист SWE&lt;/h3&gt;
  &lt;p id=&quot;lmAg&quot;&gt;Должность L7 (старший штатный инженер-программист) — это самая низкая должность, на которой некоторые специалисты в США могут зарабатывать более 1 млн долларов в год — обычно в районе залива Сан-Франциско. Компенсационные пакеты в значительной степени зависят от акций: размер пакета определяется первоначальным грантом и дополнительными выплатами. В США на таких должностях почти всегда платят больше 600 000 долларов, и разброс становится очень большим.&lt;/p&gt;
  &lt;figure id=&quot;FyOb&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!XYU7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcfdbfd-9070-4f48-8598-d982555127f9_1228x808.png&quot; width=&quot;1228&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Фактические компенсационные пакеты в Google. Источник данных: Levels.fyi, &lt;a href=&quot;https://www.levels.fyi/companies/google/salaries/software-engineer/levels/l7&quot; target=&quot;_blank&quot;&gt;Пакеты L7 в Google&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;XYwi&quot;&gt;В Google достаточно сложно получить должность L6, а продвинуться по карьерной лестнице до L7 ещё сложнее. Чтобы получить эту должность извне, кандидатам обычно нужно долгое время проработать на аналогичной должности в другой крупной технологической компании, добиться влияния в отрасли или получить признание в конкретной области. В настоящее время специалисты по машинному обучению и искусственному интеллекту получают более высокие зарплаты, поскольку на эти должности сложнее найти кандидатов, чем на «традиционные» должности SWE.&lt;/p&gt;
  &lt;p id=&quot;fPKy&quot;&gt;&lt;strong&gt;В небольших офисах очень сложно получить должность уровня L6+. &lt;/strong&gt;Должности уровня L7 в основном встречаются в США и в крупных офисах, например в Швейцарии. В таких офисах, как Бангалор, таких должностей очень мало, а в небольших офисах часто нет должностей уровня L7 и выше. Должности уровня L8 обычно встречаются в крупных офисах в районе залива Сан-Франциско, Нью-Йорке, Сиэтле и Лос-Анджелесе, а также в Швейцарии.&lt;/p&gt;
  &lt;p id=&quot;EdEF&quot;&gt;&lt;strong&gt;Высокая зарплата — одна из причин, по которой опытные инженеры остаются в компании на 10 и более лет. &lt;/strong&gt;Google предлагает опытным инженерам предсказуемый карьерный рост. При наличии навыков и удачи можно продолжать увеличивать свой доход, оставаясь индивидуальным разработчиком!&lt;/p&gt;
  &lt;p id=&quot;7mlU&quot;&gt;Большинство компаний требуют, чтобы инженеры становились менеджерами или старшими менеджерами, чтобы получать такое же вознаграждение, как инженеры уровня L6 и выше в Google. Это можно назвать «золотыми наручниками», потому что инженеру уровня L6+ в Google сложно найти место, где он мог бы работать как индивидуальный специалист, не согласившись на значительное снижение зарплаты!&lt;/p&gt;
  &lt;h3 id=&quot;qxHx&quot;&gt;Бонусы для коллег, разовые бонусы, программы поощрения&lt;/h3&gt;
  &lt;p id=&quot;GhZ0&quot;&gt;Щедрые выплаты Google не ограничиваются базовыми окладами, акциями и ежегодными денежными премиями: у компании есть виды премий, которые редко встречаются в других технологических компаниях.&lt;/p&gt;
  &lt;p id=&quot;1q6N&quot;&gt;&lt;strong&gt;Премии от коллег &lt;/strong&gt;— это небольшие награды, на которые вы можете номинировать коллег. Сумма варьируется в зависимости от региона: около 200 долларов за номинацию в США и Цюрихе. Премии используются для того, чтобы сказать «спасибо» за хорошую работу. Сумма довольно небольшая, но особенность в том, что она исходит от коллег! И она может накапливаться: если вы получаете одну такую номинацию в месяц от коллеги, которому помогаете, то это около 2400 долларов в год. Как объяснил нам один из нынешних инженеров-программистов:&lt;/p&gt;
  &lt;blockquote id=&quot;Z2RC&quot;&gt;«Премии для коллег используются часто, и вы можете выплачивать до пяти таких премий в квартал. Обычно это делается, например, так: «Спасибо, что отвлеклись от своей обычной работы и помогли мне вчера исправить эту ошибку!»&lt;/blockquote&gt;
  &lt;p id=&quot;CyIo&quot;&gt;Существуют разумные ограничения на получение бонуса: каждый инженер может выплатить до пяти бонусов коллегам в течение квартала и не может назначать одного и того же человека на несколько кварталов подряд. Во многих крупных компаниях есть внутренние системы, позволяющие сотрудникам благодарить друг друга (так, чтобы это видел их руководитель), но микробонусы в виде наличных — это уникальная особенность Google!&lt;/p&gt;
  &lt;p id=&quot;cnPT&quot;&gt;&lt;strong&gt;Разовые премии&lt;/strong&gt; выплачиваются менеджерами в качестве благодарности за сверхурочную работу и значительный вклад. Размер разовых премий обычно составляет от 200 до 2000 долларов. Разовые премии выплачиваются за успешное завершение крупных проектов, а также за выдающиеся (иногда героические!) достижения.&lt;/p&gt;
  &lt;p id=&quot;fpO7&quot;&gt;&lt;strong&gt;Программы поощрения&lt;/strong&gt; — это награды для целых команд, добившихся значительных успехов. Например, все члены команды могут получить премию в размере 5000 долларов или полностью оплаченную поездку в Исландию за успешное завершение очень важного проекта.&lt;/p&gt;
  &lt;h2 id=&quot;MijS&quot;&gt;5. Прием на работу&lt;/h2&gt;
  &lt;p id=&quot;BjFL&quot;&gt;В процессе найма сотрудников в Google есть уникальные элементы: алгоритмические собеседования, «гугловость» и подбор команды.&lt;/p&gt;
  &lt;h3 id=&quot;ALf3&quot;&gt;Алгоритмические интервью&lt;/h3&gt;
  &lt;p id=&quot;W7O8&quot;&gt;Google, вероятно, стал первопроходцем в области алгоритмических собеседований, которые мы называем «LeetCode-интервью».&lt;/p&gt;
  &lt;p id=&quot;kWld&quot;&gt;Цикл собеседований в Google для инженеров-программистов почти всегда включает в себя написание кода, то есть решение алгоритмической задачи за 30–60 минут. &lt;em&gt;Этот тип собеседования часто называют собеседованием по структурам данных и алгоритмам (DSA).&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;xhly&quot;&gt;Вопросы могут касаться реализации экзотических структур данных, таких как &lt;a href=&quot;https://leetcode.com/problems/design-circular-queue/description/&quot; target=&quot;_blank&quot;&gt;круговая очередь&lt;/a&gt;, &lt;a href=&quot;https://leetcode.com/problems/design-hashmap/description/&quot; target=&quot;_blank&quot;&gt;хеш-таблица&lt;/a&gt; или &lt;a href=&quot;https://leetcode.com/problems/time-based-key-value-store/description/&quot; target=&quot;_blank&quot;&gt;хранилище «ключ-значение» с привязкой ко времени&lt;/a&gt;. Кандидатов могут попросить реализовать решения алгоритмических задач, таких как &lt;a href=&quot;https://leetcode.com/problems/two-sum/description/&quot; target=&quot;_blank&quot;&gt;сумма двух чисел&lt;/a&gt;: &lt;em&gt;«для заданного массива целых чисел nums и целого числа target вернуть индексы двух чисел, сумма которых равна target»,&lt;/em&gt; или &lt;a href=&quot;https://leetcode.com/problems/longest-common-prefix/description/&quot; target=&quot;_blank&quot;&gt;самый длинный общий префикс&lt;/a&gt;: «&lt;em&gt;напишите функцию для поиска самой длинной общей префиксной строки среди массива строк и сотен других строк».&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;eiYE&quot;&gt;Эти собеседования по программированию могут проводиться на любом языке, который удобен кандидатам. Большинство из них выбирают язык, с которым они работают, выразительный и простой в использовании. Вам не разрешается использовать библиотеки для сложных задач: вы можете использовать только базовые элементы и должны сами создавать любые структуры или утилиты, которые хотите использовать. Если собеседование проходит очно и с использованием доски, то реализация в псевдокоде может быть приемлемым первым шагом, но ожидается, что кандидаты напишут на доске правильный код, который скомпилируется и будет работать как оптимальное решение.&lt;/p&gt;
  &lt;p id=&quot;82ft&quot;&gt;Книга&lt;em&gt; «&lt;a href=&quot;https://www.crackingthecodinginterview.com/&quot; target=&quot;_blank&quot;&gt;Как пройти собеседование по программированию&lt;/a&gt;» &lt;/em&gt;была написана бывшим инженером-программистом Google Гейл Лаакманн Макдауэлл, чтобы помочь инженерам подготовиться к алгоритмическим собеседованиям. Книга переиздавалась шесть раз, а также было выпущено продолжение, &lt;em&gt;&lt;a href=&quot;https://www.beyondctci.com/&quot; target=&quot;_blank&quot;&gt;«Как пройти собеседование по программированию. Часть 2»&lt;/a&gt;&lt;/em&gt;. Ведущий автор Майк Мроцка поделился в этом информационном бюллетене советами о том, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-to-get-unstuck-during-coding-interviews&quot; target=&quot;_blank&quot;&gt;как опытные инженеры справляются с трудностями во время собеседований по программированию.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;5pM9&quot;&gt;Распространённая критика в адрес таких собеседований заключается в том, что они не отражают повседневную работу. Однако Google и многие другие крупные компании проводят такие собеседования по веским причинам:&lt;/p&gt;
  &lt;ul id=&quot;KPoD&quot;&gt;
    &lt;li id=&quot;xWFL&quot;&gt;&lt;strong&gt;Достаточно хорошая эвристика.&lt;/strong&gt; Инженеры, которые успешно проходят такие собеседования, обычно хорошо пишут код. С другой стороны, кандидатам очень сложно показать себя с лучшей стороны, если их навыки программирования слабы.&lt;/li&gt;
    &lt;li id=&quot;EFo8&quot;&gt;&lt;strong&gt;Легко масштабируется для новых интервьюеров&lt;/strong&gt;. В Google работают десятки тысяч инженеров, которые проводят собеседования, и каждый год к ним присоединяются тысячи новых специалистов. По этой причине необходим процесс, в который легко вовлечь людей, чтобы даже новые интервьюеры могли достаточно хорошо оценивать кандидатов.&lt;/li&gt;
    &lt;li id=&quot;JrGo&quot;&gt;&lt;strong&gt;Легко заменить утекшие вопросы.&lt;/strong&gt; В масштабах Google утечка вопросов во внешний мир — это обычное дело. Поэтому необходим процесс собеседования с банком из тысяч взаимозаменяемых вопросов.&lt;/li&gt;
    &lt;li id=&quot;U16m&quot;&gt;&lt;strong&gt;Можно сделать за час&lt;/strong&gt;. Собеседования не должны затягиваться, а процесс, который занимает несколько дней или недель, не сработает, потому что кандидаты часто работают полный день в другом месте и не могут взять несколько дней отгула, например, для испытательного срока.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;yFnl&quot;&gt;Google &lt;a href=&quot;https://techdevguide.withgoogle.com/resources/?topics=algorithms&amp;topics=data-structures&quot; target=&quot;_blank&quot;&gt;предлагает материалы для подготовки&lt;/a&gt; к собеседованиям по программированию, в которых перечислены возможные вопросы и даны пояснения к понятиям, которые могут встретиться.&lt;/p&gt;
  &lt;h3 id=&quot;LXSQ&quot;&gt;Типичный процесс собеседования&lt;/h3&gt;
  &lt;p id=&quot;ZvwY&quot;&gt;Вот как проходит типичное собеседование с инженером-программистом в самой прибыльной компании мира:&lt;/p&gt;
  &lt;figure id=&quot;tloT&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!w-SE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d2953a8-1d37-47c8-b5a2-50b44e93c4ea_1226x1168.png&quot; width=&quot;1226&quot; /&gt;
    &lt;figcaption&gt;Чтобы получить предложение о работе инженером-программистом в Google, нужно пройти несколько собеседований&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ROy3&quot;&gt;Каждый этап сложнее и занимает больше времени, чем предыдущий. Собеседование на месте обычно состоит из 2–3 последовательных собеседований, перерыва на обед и ещё 2–3 собеседований. Термин «собеседование на месте» связан с тем, что раньше Google привозил кандидатов «на место» в офис. С 2020 года большинство собеседований на месте проводятся по видеосвязи в Google Meet. Есть признаки того, что Google начинает возвращать очные собеседования для &lt;em&gt;некоторых&lt;/em&gt; собеседований, но на момент публикации большинство собеседований проводится по видеосвязи.&lt;/p&gt;
  &lt;p id=&quot;UIAN&quot;&gt;&lt;strong&gt;«Гугловость» — это гугловская версия «соответствия корпоративной культуре». &lt;/strong&gt;В своей книге &lt;a href=&quot;https://www.amazon.com/Work-Rules-Insights-Inside-Transform/dp/1455554790&quot; target=&quot;_blank&quot;&gt;Work Rules&lt;/a&gt;бывший вице-президент Google по работе с персоналом Ласло Бок даёт следующее определение:&lt;/p&gt;
  &lt;blockquote id=&quot;3Glo&quot;&gt;«Гугловость» включает в себя такие качества, как интеллектуальная скромность, добросовестность, терпимость к неопределённости и склонность к сотрудничеству. Она воплощает в себе соответствие корпоративной культуре, которое Google ищет не только в технических навыках».&lt;/blockquote&gt;
  &lt;p id=&quot;DhXl&quot;&gt;Ветеран Google Энди Майло работает там уже 15 лет и &lt;a href=&quot;https://www.google.com/about/careers/applications/stories/google-sales-engineering-insights/&quot; target=&quot;_blank&quot;&gt;определяет&lt;/a&gt; «гугловость» следующим образом:&lt;/p&gt;
  &lt;blockquote id=&quot;by7Q&quot;&gt;«За годы работы здесь я понял, что в Google есть множество составляющих. Если бы мне нужно было выделить три наиболее важных аспекта, я бы сказал следующее:&lt;/blockquote&gt;
  &lt;ol id=&quot;YBws&quot;&gt;
    &lt;li id=&quot;9GBh&quot;&gt;Ставя пользователя на первое место&lt;/li&gt;
    &lt;li id=&quot;SDtP&quot;&gt;Мышление в 10 раз&lt;/li&gt;
    &lt;li id=&quot;YDs5&quot;&gt;Всегда поступаю правильно.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ZSVz&quot;&gt;Я думаю, что, ориентируясь на эти три принципа, мы сможем помочь миру достичь невероятных высот».&lt;/p&gt;
  &lt;p id=&quot;Hwct&quot;&gt;«Гуглистость» обычно сводится к демонстрации таких качеств, как:&lt;/p&gt;
  &lt;ul id=&quot;BuXe&quot;&gt;
    &lt;li id=&quot;jGhU&quot;&gt;Любопытство&lt;/li&gt;
    &lt;li id=&quot;GHG7&quot;&gt;Будьте скромны и открыты для обратной связи&lt;/li&gt;
    &lt;li id=&quot;BjT4&quot;&gt;Доводить дела до конца&lt;/li&gt;
    &lt;li id=&quot;Fmjo&quot;&gt;Поступаешь правильно&lt;/li&gt;
    &lt;li id=&quot;zOz3&quot;&gt;Поддержание высоких стандартов&lt;/li&gt;
    &lt;li id=&quot;JhIr&quot;&gt;Наличие новых идей&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;NGP9&quot;&gt;Для уровней L5 и выше также проводится оценка лидерских качеств. В руководстве, которое Google разослал менеджерам по продуктам, содержатся советы по проведению собеседований на Googleyness и Leadership:&lt;/p&gt;
  &lt;blockquote id=&quot;7HOX&quot;&gt;«Менеджеры по продукту Google мечтают о новой прорывной идее, преуспевают в условиях неопределённости, ценят обратную связь, эффективно бросают вызов существующему положению дел и поступают правильно. Они эффективно руководят и оказывают влияние, управляют проектами, доводят дела до конца, работают в команде и стремятся к саморазвитию.Они проявляют любознательность и стремятся узнать больше, а также способны предлагать новые концепции продуктов и улучшать их функции. Узнайте, что значит быть «гуглистом», прочитав &lt;a href=&quot;https://about.google/company-info/philosophy/&quot; target=&quot;_blank&quot;&gt;корпоративную философию Google&lt;/a&gt; и «Ценности Google».&lt;/blockquote&gt;
  &lt;p id=&quot;dRV3&quot;&gt;Этот совет предназначен для менеджеров по продукту, но также применим к старшим инженерам и техническим руководителям.&lt;/p&gt;
  &lt;p id=&quot;guo8&quot;&gt;&lt;em&gt;Подробнее о процессе найма мы рассказываем в подробных обзорах &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/hiring-software-engineers&quot; target=&quot;_blank&quot;&gt;Найм инженеров-программистов&lt;/a&gt; и &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/hiring-engineering-managers&quot; target=&quot;_blank&quot;&gt;Найм технического директора&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;h3 id=&quot;IBdQ&quot;&gt;Подготовка к собеседованиям в Google&lt;/h3&gt;
  &lt;p id=&quot;tLyf&quot;&gt;Немногие собеседования при приёме на работу требуют более тщательной подготовки, чем собеседования Google по структуре данных, алгоритмам и проектированию систем, и они стали стандартом для большинства крупных технологических компаний и стартапов. Ниже приведены несколько популярных ресурсов. &lt;em&gt;Я не имею никакого отношения к этим ресурсам, и ни одна из ссылок не является партнёрской. Подробнее читайте в моём заявлении об этике.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;5KmI&quot;&gt;&lt;strong&gt;Собственные материалы Google для подготовки:&lt;/strong&gt; Google предлагает подборку видео, статей и упражнений для подготовки к собеседованиям. В отличие от многих других ресурсов, они бесплатны и заслуживают &lt;a href=&quot;https://techdevguide.withgoogle.com/paths/interview/&quot; target=&quot;_blank&quot;&gt;внимания.&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;pLeG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!rQ_w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89511214-ccfe-48c5-8e9f-576c3d0d37e6_1534x748.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Руководство Google по &lt;a href=&quot;https://techdevguide.withgoogle.com/&quot; target=&quot;_blank&quot;&gt;подготовке к собеседованию&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nFWn&quot;&gt;&lt;strong&gt;Технический скрининг, структуры данных и алгоритмы&lt;/strong&gt;: Существует бесчисленное множество книг, видео и онлайн-курсов по подготовке к собеседованиям в стиле LeetCode:&lt;/p&gt;
  &lt;ul id=&quot;3fiH&quot;&gt;
    &lt;li id=&quot;AlKe&quot;&gt;&lt;strong&gt;Книги&lt;/strong&gt;: &lt;a href=&quot;https://www.crackingthecodinginterview.com/&quot; target=&quot;_blank&quot;&gt;«Как пройти собеседование по программированию»&lt;/a&gt; очень известна, а более поздняя книга &lt;a href=&quot;https://www.beyondctci.com/&quot; target=&quot;_blank&quot;&gt;«Как пройти собеседование по программированию. Часть 2»&lt;/a&gt; является своевременным обновлением. &lt;a href=&quot;https://elementsofprogramminginterviews.com/&quot; target=&quot;_blank&quot;&gt;«Элементы собеседований по программированию»&lt;/a&gt;, &lt;a href=&quot;https://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880&quot; target=&quot;_blank&quot;&gt;«Жемчужины программирования»&lt;/a&gt; и &lt;a href=&quot;https://www.algorist.com/&quot; target=&quot;_blank&quot;&gt;«Руководство по разработке алгоритмов»&lt;/a&gt; также будут полезны при подготовке.&lt;/li&gt;
    &lt;li id=&quot;c7Bw&quot;&gt;&lt;strong&gt;Сайты&lt;/strong&gt;: &lt;a href=&quot;https://leetcode.com/&quot; target=&quot;_blank&quot;&gt;LeetCode&lt;/a&gt; — самый популярный сайт для подготовки к тысячам собеседований по алгоритмическому программированию. Среди других сайтов можно выделить &lt;a href=&quot;https://www.codewars.com/&quot; target=&quot;_blank&quot;&gt;Codewars&lt;/a&gt;, &lt;a href=&quot;https://projecteuler.net/&quot; target=&quot;_blank&quot;&gt;Project Euler&lt;/a&gt; и другие.&lt;/li&gt;
    &lt;li id=&quot;mVBX&quot;&gt;&lt;strong&gt;Курсы&lt;/strong&gt;: &lt;a href=&quot;https://neetcode.io/&quot; target=&quot;_blank&quot;&gt;NeetCode&lt;/a&gt; — самый популярный онлайн-курс на данный момент. Есть &lt;a href=&quot;https://www.google.com/search?q=data+structures+and+algorithm+course&amp;sca_esv=af69388857e2a179&amp;source=hp&amp;ei=zq2-aImEAZuB9u8P-aqt4Qg&amp;iflsig=AOw8s4IAAAAAaL673vnIKgez-lZwyi0p6HKAvhjjii7W&amp;ved=0ahUKEwiJo7O8-MiPAxWbgP0HHXlVK4wQ4dUDCBc&amp;uact=5&amp;oq=data+structures+and+algorithm+course&amp;gs_lp=Egdnd3Mtd2l6IiRkYXRhIHN0cnVjdHVyZXMgYW5kIGFsZ29yaXRobSBjb3Vyc2UyBxAAGIAEGAoyBxAAGIAEGAoyBxAAGIAEGAoyBxAAGIAEGAoyBxAAGIAEGAoyBxAAGIAEGAoyBxAAGIAEGAoyBxAAGIAEGAoyBxAAGIAEGAoyBxAAGIAEGApI3CFQAFj8IHAAeACQAQCYAWKgAdQRqgECMza4AQPIAQD4AQGYAiSgApASwgIFEAAYgATCAgsQLhiABBjRAxjHAcICBRAuGIAEwgIOEC4YgAQYxwEYjgUYrwHCAggQLhiABBjUAsICBxAuGIAEGAqYAwCSBwIzNqAH-boDsgcCMza4B5ASwgcHMTQuMjEuMcgHMA&amp;sclient=gws-wiz&quot; target=&quot;_blank&quot;&gt;десятки других курсов.&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;6Sdj&quot;&gt;&lt;strong&gt;YouTube:&lt;/strong&gt; на YouTube огромное количество контента; просто введите в поиск «&lt;a href=&quot;https://www.youtube.com/results?search_query=data+structures+algorithms&quot; target=&quot;_blank&quot;&gt;структуры данных и алгоритмы&lt;/a&gt;» или более конкретный термин. Многие инженеры-программисты, прошедшие эти собеседования, делятся своими подходами и советами по подготовке.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;6JSc&quot;&gt;&lt;strong&gt;Проектирование систем&lt;/strong&gt;: это ещё одна область, которая была тщательно задокументирована.&lt;/p&gt;
  &lt;ul id=&quot;33BO&quot;&gt;
    &lt;li id=&quot;983f&quot;&gt;&lt;strong&gt;Книги:&lt;/strong&gt; &lt;a href=&quot;https://www.amazon.com/System-Design-Interview-insiders-Second/dp/B08CMF2CQF&quot; target=&quot;_blank&quot;&gt;«Интервью по системному проектированию: том 1»&lt;/a&gt; и &lt;a href=&quot;https://www.amazon.com/System-Design-Interview-Insiders-Guide/dp/1736049119&quot; target=&quot;_blank&quot;&gt;«Том 2»&lt;/a&gt; Алекса Сю и &lt;a href=&quot;https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321&quot; target=&quot;_blank&quot;&gt;«Проектирование приложений с интенсивным использованием данных»&lt;/a&gt; Мартина Клеппманна — самые популярные материалы для подготовки. &lt;em&gt;Мы опубликовали &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/payments-system&quot; target=&quot;_blank&quot;&gt;главу о проектировании платёжной системы из книги «Интервью по системному проектированию»&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;t14I&quot;&gt;&lt;strong&gt;Курсы&lt;/strong&gt;: &lt;a href=&quot;https://bytebytego.com/&quot; target=&quot;_blank&quot;&gt;ByteByteGo&lt;/a&gt; от Алекса Сю популярен. По запросу &lt;a href=&quot;https://www.google.com/search?q=systems+design+interview+course&quot; target=&quot;_blank&quot;&gt;«курс по прохождению собеседований по системному проектированию»&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;NLmW&quot;&gt;&lt;strong&gt;Видео на YouTube: как и в случае с видео по подготовке к экзаменам по структурам данных и алгоритмам, здесь много полезного материала&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;IDBq&quot;&gt;&lt;strong&gt;Глубокое погружение в предметную область&lt;/strong&gt;: подготовьтесь к успеху, став экспертом в своей области и освоив распространённые инструменты, фреймворки и практики. Вы должны знать, как именно они работают, каковы их недостатки, а также уметь создавать продукты в этой области.&lt;/p&gt;
  &lt;p id=&quot;fCDY&quot;&gt;&lt;strong&gt;Собеседование на тему Google и лидерства: &lt;/strong&gt;разберитесь в ценностях Google, кратко опишите свой опыт и достижения, чтобы привести лучшие примеры во время собеседования, и ознакомьтесь с советами по проведению поведенческих собеседований, такими как &lt;a href=&quot;https://www.google.com/search?q=behaviorual+interview+star+method&quot; target=&quot;_blank&quot;&gt;метод STAR&lt;/a&gt;. Это собеседование довольно типично для «собеседования с менеджером по найму». Большинство кандидатов испытывают трудности на технических собеседованиях, а не на этом.&lt;/p&gt;
  &lt;h3 id=&quot;i4pF&quot;&gt;Приёмная комиссия (ПК)&lt;/h3&gt;
  &lt;p id=&quot;VJ2b&quot;&gt;В большинстве компаний решение о найме принимается после собеседования на месте и подведения итогов. Как правило, решение принимает менеджер по найму, который часто является будущим руководителем кандидата. Но в Google всё по-другому. После каждого собеседования интервьюеры оставляют письменный отзыв и выставляют общую оценку кандидату в соответствии с системой оценки рекомендаций при найме:&lt;/p&gt;
  &lt;ul id=&quot;jKav&quot;&gt;
    &lt;li id=&quot;nbfx&quot;&gt;Сильный найм (SH)&lt;/li&gt;
    &lt;li id=&quot;U1kH&quot;&gt;Прокат (H)&lt;/li&gt;
    &lt;li id=&quot;wuIY&quot;&gt;Бережливый наем (LH)&lt;/li&gt;
    &lt;li id=&quot;Ik13&quot;&gt;Бережливое увольнение (LNH)&lt;/li&gt;
    &lt;li id=&quot;jKQx&quot;&gt;Без проката (NH)&lt;/li&gt;
    &lt;li id=&quot;uuVc&quot;&gt;Strong No Hire (SNH)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;jJ3E&quot;&gt;На этом этапе специальная комиссия по найму рассматривает отзывы и принимает решение о найме. Гейл Лаакманн Макдауэлл описала этот процесс в выпуске 2016 года &lt;a href=&quot;https://www.crackingthecodinginterview.com/&quot; target=&quot;_blank&quot;&gt;Cracking The Coding Interview&lt;/a&gt;:&lt;/p&gt;
  &lt;blockquote id=&quot;CI7J&quot;&gt;«Письменный отзыв передается в комитет по найму (КН), состоящий из инженеров и менеджеров, для вынесения рекомендации о найме/отказе в найме. Отзыв обычно разбивается на четыре категории (аналитические способности, программирование, опыт и коммуникация), и вам выставляется общая оценка от 1,0 до 4,0. В состав КН обычно не входят ваши интервьюеры. Если это происходит, то исключительно по воле случая.Чтобы продлить предложение, HC хочет видеть хотя бы одного интервьюера, который является «энтузиастом и сторонником». Другими словами, пакет с баллами 3,6, 3,1, 3,1 и 2,6 лучше, чем пакет со всеми баллами 3,1.Вам не обязательно блистать на каждом собеседовании, а качество экрана вашего телефона обычно не является решающим фактором при принятии окончательного решения.Если комиссия по найму рекомендует принять вас на работу, ваше резюме будет передано в комиссию по компенсациям, а затем в комиссию по управлению персоналом. Принятие решения может занять несколько недель, поскольку процесс состоит из множества этапов и комиссий.&lt;/blockquote&gt;
  &lt;p id=&quot;met8&quot;&gt;&lt;strong&gt;Рекомендации действительно влияют на процесс найма. &lt;/strong&gt;Помимо результатов собеседования, единственным фактором, который может повлиять на решение комиссии по найму, является положительная рекомендация от действующего сотрудника Google. Поэтому, если вы знаете кого-то в Google, попросите его порекомендовать вас с пояснением. Если он работал с вами ранее и может сказать о вас что-то хорошее, это может повлиять на решение «не нанимать» в пользу «нанять».&lt;/p&gt;
  &lt;h3 id=&quot;y3m9&quot;&gt;Подбор команд и срок действия пакетов&lt;/h3&gt;
  &lt;p id=&quot;5Gw8&quot;&gt;После того как комиссия по найму принимает решение о «приеме на работу», предложение о работе поступает не сразу. Успешному кандидату сначала нужно найти команду, которой он нужен. До 2023 года этот процесс был довольно быстрым, потому что Google постоянно расширялся, а команды нуждались в новых сотрудниках. Однако сегодня подбор команды становится препятствием, из-за которого некоторые рекомендации о «приеме на работу» остаются без внимания. Как мы сообщали &lt;a href=&quot;https://newsletter.pragmaticengineer.com/i/160142389/team-match-evolution&quot; target=&quot;_blank&quot;&gt;в The Pulse:&lt;/a&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;BNEy&quot;&gt;«Подбор команды превратился в фактическое второе собеседование, несмотря на попытки компаний представить его иначе. Из наших бесед с менеджерами по подбору персонала мы узнали, что они обычно проводят собеседование с десятью кандидатами на одну должность. Эти менеджеры настоятельно рекомендуют кандидатам тщательно готовиться к этому этапу и адаптировать свои презентации специально для той команды, в которую они хотят попасть».&lt;/blockquote&gt;
  &lt;p id=&quot;JZIT&quot;&gt;&lt;strong&gt;После одобрения комитетом по найму следует годичный период, в течение которого команда должна «заявить» права на успешного кандидата, прежде чем ему будет сделано предложение. &lt;/strong&gt;Поскольку подбор команды становится всё более сложной задачей, стоит знать, что существует крайний срок, до которого вы должны занять своё место в компании. В недавнем посте на Reddit внешний кандидат уровня L4, проходивший собеседование в Google, пожаловался, что получил один отзыв «Strong Hire», два отзыва «Hire» и один отзыв «Lean Hire», а также общую рекомендацию «Hire» от комитета. Но, несмотря на эти заслуги, они не получили ни одного предложения. Один из комментаторов предположил, что это произошло из-за отсутствия интереса со стороны команд, &lt;a href=&quot;https://www.reddit.com/r/leetcode/comments/1c452rx/confused_on_my_google_interview_feedback/&quot; target=&quot;_blank&quot;&gt;написав&lt;/a&gt;:&lt;/p&gt;
  &lt;blockquote id=&quot;qmfD&quot;&gt;«Менеджеры по найму просто не проявили к вам интереса. После сокращения штата в Google стало очень распространённым явлением, когда кандидат «проходит» собеседование, но не получает предложения о работе. У вас есть год, чтобы найти работу в команде, прежде чем истечёт срок действия вашего пакета документов для собеседования».&lt;/blockquote&gt;
  &lt;p id=&quot;stzJ&quot;&gt;&lt;strong&gt;В целом процесс найма в Google обеспечивает большую внутреннюю мобильность, чем в большинстве крупных технологических компаний.&lt;/strong&gt; Бывший менеджер по разработке объяснил преимущества процесса найма в Google и подбора команд:&lt;/p&gt;
  &lt;blockquote id=&quot;Z9CH&quot;&gt;«Фундаментальное отличие от других компаний заключается в том, что Google проводит подбор персонала в масштабах всей компании, а не в рамках отдельных команд. Google нанял &lt;em&gt;вас&lt;/em&gt;, и вы попали в команду. Это значит, что люди, которые проводили собеседование с вами, могли больше никогда вас не увидеть, менеджер команды не проводил собеседование с людьми, которые присоединялись к команде, и т. д.»Предполагалось, что такой подход приведёт к повышению стандартов. Когда руководителю &lt;em&gt;действительно&lt;/em&gt;нужно кого-то нанять, он может быть готов снизить требования к кандидату, чтобы нанять его &lt;em&gt;сейчас&lt;/em&gt;, а не ждать несколько месяцев.Недостаток такого подхода в том, что, когда вы присоединяетесь к команде, вы ещё не знаете, в какую команду попадаете. Обычно люди принимали предложение Google, а в первый рабочий день узнавали, в какой команде они работают. Люди, у которых были чёткие предпочтения в отношении команд, иногда просто не принимали предложение Google.Плюсами были более доверительные отношения между командами и внутренняя мобильность. В такой компании, как Microsoft, чтобы перейти в другую команду, нужно было пройти повторное собеседование, потому что в каждой команде были свои стандарты найма, и команды не доверяли друг другу. В Google, если вы хотите перейти в другую команду, собеседование не требуется.&lt;/blockquote&gt;
  &lt;p id=&quot;T9Uc&quot;&gt;&lt;strong&gt;В эпоху стремительного роста Google подбор команды сводился к «вытягиванию жребия».&lt;/strong&gt;Бывший менеджер по разработке делится интересным анекдотом о том, как происходил подбор команды:&lt;/p&gt;
  &lt;blockquote id=&quot;p4I7&quot;&gt;«Когда я в 2007 году устроился в нью-йоркский офис, там действовала система, в рамках которой все команды с открытыми вакансиями ранжировались по приоритету. Список новых сотрудников на предстоящий понедельник рассылался. В порядке приоритета каждая команда могла выбрать кого-то из списка или пропустить его и передать дальше. Это повторялось до тех пор, пока все новые сотрудники не были распределены по командам.Этот процесс вызывал разногласия между кандидатами и новыми сотрудниками, потому что были кандидаты, которых определенные команды с более низким приоритетом &lt;em&gt;действительно&lt;/em&gt; хотели видеть в своих рядах, но не получали их, а некоторые кандидаты были &lt;em&gt;действительно&lt;/em&gt; готовы работать в командах с более низким приоритетом, но не попадали в них. За прошедшие годы этот процесс претерпел множество изменений, чтобы лучше учитывать предпочтения команд и кандидатов».&lt;/blockquote&gt;
  &lt;h2 id=&quot;tN7s&quot;&gt;Выводы&lt;/h2&gt;
  &lt;p id=&quot;Q7f5&quot;&gt;Фух! Это было очень познавательно — а ведь мы едва ли наполовину изучили материал, который собирали в течение нескольких месяцев, изучая, каково это — работать в Google. Во второй части этой мини-серии мы расскажем о процессе оценки эффективности работы инженеров в Google, о внутренних системах, инженерных процессах, о том, как команды и инженеры добиваются результатов, а также поделимся полезными советами от сотрудников Google о том, как преуспеть в одной из самых успешных компаний мира.&lt;/p&gt;
  &lt;p id=&quot;Br4G&quot;&gt;&lt;em&gt;Спасибо всем нынешним и бывшим сотрудникам Google, которые поделились подробностями и идеями, многие из которых публикуются здесь впервые.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;nSpD&quot;&gt;Надеюсь, эта статья была для вас полезной. Если у вас есть информация о Google, которой вы хотели бы поделиться с другими читателями, пожалуйста, оставьте комментарий или отправьте нам сообщение.&lt;/p&gt;
  &lt;p id=&quot;g19E&quot;&gt;Перевод: &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/google&quot; target=&quot;_blank&quot;&gt;https://newsletter.pragmaticengineer.com/p/google&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:new-trend-programming</id><link rel="alternate" type="text/html" href="https://devz.su/new-trend-programming?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>The Pulse #149: Новый тренд: программирование с помощью запуска параллельных ИИ-агентов</title><published>2025-10-31T06:01:32.818Z</published><updated>2025-11-06T07:19:31.463Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/cd/dc/cddc3561-b154-4f34-aca8-7bc13283aac0.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!pXH_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57384951-24dc-4e88-92f6-7248804ff2e5_1456x1072.png&quot;&gt;The Pulse — это серия публикаций о событиях, инсайтах и тенденциях в сфере крупных технологических компаний и стартапов. Заметили интересное событие или тенденцию? Нажмите «Ответить» и поделитесь со мной.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;jF4d&quot;&gt;Кроме того: протокол ACP, инструменты для обеспечения безопасности ИИ, сравнение опыта проведения собеседований в 8 технологических компаниях и многое другое&lt;/h3&gt;
  &lt;/section&gt;
  &lt;p id=&quot;zQyD&quot;&gt;&lt;em&gt;The Pulse — это серия публикаций о событиях, инсайтах и тенденциях в сфере крупных технологических компаний и стартапов.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;KOsI&quot;&gt;Сегодня мы рассмотрим:&lt;/p&gt;
  &lt;ol id=&quot;n6u8&quot;&gt;
    &lt;li id=&quot;dbpv&quot;&gt;&lt;strong&gt;Новая тенденция: программирование с помощью запуска параллельных ИИ-агентов. &lt;/strong&gt;Всё больше разработчиков экспериментируют с параллельным запуском агентов для написания кода&lt;/li&gt;
    &lt;li id=&quot;juPc&quot;&gt;&lt;strong&gt;Протокол ACP.&lt;/strong&gt; Новый протокол, разработанный командой Zed, который упрощает создание инструментов ИИ для IDE по сравнению с протоколом MCP&lt;/li&gt;
    &lt;li id=&quot;VckX&quot;&gt;&lt;strong&gt;Инструменты для обеспечения безопасности на основе ИИ работают на удивление хорошо?&lt;/strong&gt; Инструменты для обеспечения безопасности на основе ИИ хорошо справляются с выявлением уязвимостей в зрелых проектах с открытым исходным кодом&lt;/li&gt;
    &lt;li id=&quot;67ch&quot;&gt;&lt;strong&gt;Является ли ИИ единственным двигателем экономического роста в США?&lt;/strong&gt; Сорок процентов ВВП США в этом году приходится на расходы, связанные с ИИ, а 60% венчурного капитала направляется в сферу ИИ. Будем надеяться, что это не обернётся пузырём, который лопнет, как в 2001 году&lt;/li&gt;
    &lt;li id=&quot;Ne6g&quot;&gt;&lt;strong&gt;Сравнение собеседований в 8 крупных технологических компаниях.&lt;/strong&gt; &lt;a href=&quot;https://www.linkedin.com/in/puneet-patwari/&quot; target=&quot;_blank&quot;&gt;Пунит Патвари&lt;/a&gt;подал заявки в 8 крупных технологических компаний и получил 6 предложений. Он сравнивает свои впечатления от собеседований в Meta, Amazon, Uber и 5 других компаниях&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;iOi3&quot;&gt;1. Новая тенденция: программирование с использованием параллельных ИИ-агентов&lt;/h2&gt;
  &lt;p id=&quot;E2S4&quot;&gt;Поскольку агентские интерфейсы командной строки, такие как Claude Code, OpenAI Codex, Cursor и многие другие, становятся всё более популярными, я наблюдаю тенденцию к тому, что всё больше разработчиков программного обеспечения экспериментируют с одновременным запуском нескольких агентов для выполнения отдельных задач.&lt;/p&gt;
  &lt;p id=&quot;D5kk&quot;&gt;Я поговорил с инженером-антропологом Сидом Бидасарией о &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-claude-code-is-built&quot; target=&quot;_blank&quot;&gt;том, как создается Claude Code&lt;/a&gt;, и в конце нашего разговора он упомянул, что у него было несколько агентов, работающих повсюду, и что это сделало его работу более продуктивной. Аналогичным образом, инженер-программист Саймон Уиллисон, которого я считаю экспертом в области искусственного интеллекта, опубликовал статью о “&lt;a href=&quot;https://simonwillison.net/2025/Oct/5/parallel-coding-agents/&quot; target=&quot;_blank&quot;&gt;принятии образа жизни агента параллельного программирования&lt;/a&gt;.” Он пишет:&lt;/p&gt;
  &lt;blockquote id=&quot;MuCg&quot;&gt;«Некоторое время назад я получил несколько сообщений от инженеров, которые запускают сразу несколько агентов для написания кода — несколько экземпляров Claude Code или OpenAI Codex одновременно, иногда в одном репозитории, иногда в нескольких контрольных версиях или рабочих деревьях git.Поначалу я относился к этому довольно скептически. Код, сгенерированный ИИ, нуждается в проверке, а это значит, что естественным ограничением во всём этом является скорость, с которой я могу проверять результаты. Сложно уследить за одной большой языковой моделью, учитывая, как быстро она генерирует данные. Какой смысл запускать несколько моделей одновременно, если это только отдаляет меня от цели?Несмотря на мои опасения, за последние несколько недель я заметил, что постепенно начинаю привыкать к образу жизни агента по параллельному кодированию.Я могу сосредоточиться только на проверке и внедрении одного существенного изменения за раз, но я обнаруживаю, что всё больше задач можно выполнять параллельно, не перегружая мозг основной работой.&lt;/blockquote&gt;
  &lt;p id=&quot;aayL&quot;&gt;Саймон &lt;a href=&quot;https://simonwillison.net/2025/Oct/5/parallel-coding-agents/&quot; target=&quot;_blank&quot;&gt;делится советами о том, что ему помогает&lt;/a&gt;, упоминая в качестве примеров использования исследования, задачи по обслуживанию и целенаправленную работу.&lt;/p&gt;
  &lt;p id=&quot;0fWn&quot;&gt;&lt;strong&gt;Интересно поразмышлять о том, может ли параллельная работа с агентами изменить устоявшиеся за десятилетия методы разработки программного обеспечения. &lt;/strong&gt;Предположим, что разработчики программного обеспечения, которые запускают сразу несколько агентов, становятся более продуктивными, чем их коллеги, работающие над одной задачей за раз. Если это так, то у этой практики есть шанс распространиться, если достаточное количество разработчиков программного обеспечения будет стремиться к повышению продуктивности или захочет не отставать от коллег, которые делают больше, чем раньше.&lt;/p&gt;
  &lt;p id=&quot;a0p2&quot;&gt;Но для многих продуктивных инженеров в докомпьютерную эпоху работа заключалась в том, чтобы находиться в состоянии потока. Состояние потока выглядит примерно так:&lt;/p&gt;
  &lt;ul id=&quot;pcFk&quot;&gt;
    &lt;li id=&quot;SXVF&quot;&gt;Разбираться в движущихся частях&lt;/li&gt;
    &lt;li id=&quot;4qVx&quot;&gt;Разработайте решение, проверьте его, доработайте&lt;/li&gt;
    &lt;li id=&quot;bIIC&quot;&gt;Когда вы будете довольны результатом, отправьте запрос на проверку кода — или, если проверка не требуется, просто объедините и опубликуйте его&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;5uHV&quot;&gt;Прерывание этого процесса нарушает состояние потока, и требуется время, чтобы вернуться в него. Именно поэтому разработчики программного обеспечения стараются уделять первостепенное внимание времени, необходимому для сосредоточенной работы над кодом.&lt;/p&gt;
  &lt;p id=&quot;O8zy&quot;&gt;Конечно, это не универсальный подход для всех высокопродуктивных инженеров. Когда я был руководителем инженерной группы, самые продуктивные инженеры в моей команде часто переключались между задачами и умели делать несколько дел одновременно. Вот как выглядит обычный день старшего инженера, выполняющего функции технического руководителя:&lt;/p&gt;
  &lt;ul id=&quot;hqqG&quot;&gt;
    &lt;li id=&quot;5Mei&quot;&gt;&lt;strong&gt;Рецензирование кода. &lt;/strong&gt;Придя в офис, просмотрите открытые рецензии на код, оставленные с прошлой ночи&lt;/li&gt;
    &lt;li id=&quot;SDm9&quot;&gt;&lt;strong&gt;Кодинг.&lt;/strong&gt; Займитесь программированием самостоятельно&lt;/li&gt;
    &lt;li id=&quot;fOYb&quot;&gt;&lt;strong&gt;Встаньте.&lt;/strong&gt;Как обычно&lt;/li&gt;
    &lt;li id=&quot;8WeP&quot;&gt;&lt;strong&gt;Ещё код.&lt;/strong&gt; Выполняйте работу. &lt;em&gt;По крайней мере, такова идея. На самом деле:&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;gS2M&quot;&gt;&lt;strong&gt;Прерывания: &lt;/strong&gt;обзоры кода, просьбы о помощи, похлопывания по плечу. Самый продуктивный инженер в команде регулярно получает сообщения с просьбой проверить код, чтобы разблокировать товарищей по команде или помочь кому-то еще, кто застрял, или менеджер (прошу прощения!) хлопает их по плечу, прося о помощи в чем-либо.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;6Kcp&quot;&gt;&lt;strong&gt;Интересно, будут ли старшие инженеры и выше «естественным образом» работать с параллельными ИИ-агентами, &lt;/strong&gt;исходя из их существующих привычек и того, чем они занимаются сейчас:&lt;/p&gt;
  &lt;ul id=&quot;YJ8g&quot;&gt;
    &lt;li id=&quot;ZWIl&quot;&gt;Держите в голове параллельные рабочие процессы, например то, чем в данный момент занимаются члены команды.&lt;/li&gt;
    &lt;li id=&quot;J6z4&quot;&gt;Проверка кода в нескольких рабочих потоках: они являются &lt;em&gt;основными&lt;/em&gt; проверяющими код и обычно проверяют все изменения кода в 2–5 рабочих потоках. Они могут не выполнять работу, но знают, когда она выполнена правильно.&lt;/li&gt;
    &lt;li id=&quot;dyFD&quot;&gt;Умеют справляться с отвлекающими факторами: они научились добиваться успеха, несмотря на то, что их постоянно отвлекают.&lt;/li&gt;
    &lt;li id=&quot;nFjv&quot;&gt;Умеют направлять коллег: поскольку их постоянно отвлекают, они научились делегировать задачи и объяснять членам команды, почему работа должна быть выполнена срочно.&lt;/li&gt;
    &lt;li id=&quot;0AhW&quot;&gt;Навыки письма: эти инженеры часто пишут отзывы о коде, составляют такие документы, как RFC, в которых описывается работа, создают тикеты для разделения проектов на части и критикуют работу коллег. Все это требует эффективного письменного общения.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;GSXv&quot;&gt;Благодаря ИИ-агентам инженеры, которые хотят работать продуктивнее, могут развить в себе качества, присущие хорошим техническим руководителям. На данный момент я слышал только о том, что параллельных агентов успешно используют старшие инженеры.&lt;/p&gt;
  &lt;p id=&quot;bamq&quot;&gt;Впрочем, этот рабочий процесс подходит не всем: я спросил создателя Flask &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/python-go-rust-typescript-and-ai&quot; target=&quot;_blank&quot;&gt;Армина Ронахера&lt;/a&gt; о его опыте работы с параллельными агентами. Он сказал мне:&lt;/p&gt;
  &lt;blockquote id=&quot;Nxsn&quot;&gt;«Иногда я отключаю параллельных агентов, но не так часто, как раньше.Дело в том, что мой разум может обработать лишь определённый объём информации!&lt;/blockquote&gt;
  &lt;p id=&quot;mrNy&quot;&gt;&lt;strong&gt;Но теперь мы на новой территории, где любой разработчик может запустить параллельное кодирование с помощью агентов. &lt;/strong&gt;Повысит ли это продуктивность инженеров или просто заставит людей &lt;em&gt;чувствовать&lt;/em&gt; себя более продуктивными? Возможно, со временем станет ясно, что инженеры, которые делают что-то одно за раз и не отвлекаются, создают более надёжное программное обеспечение. Или, может быть, окажется, что работа с параллельными агентами приводит к тому, что больше задач остаётся нерешёнными, а итераций становится больше, что сводит на нет все преимущества.&lt;/p&gt;
  &lt;p id=&quot;FL8U&quot;&gt;Мы это выясним. Лично я вижу только то, что всё больше разработчиков экспериментируют с параллельными агентами.&lt;/p&gt;
  &lt;p id=&quot;mMLe&quot;&gt;&lt;strong&gt;Мне кажется, что при работе с ИИ-агентами важнее основы разработки программного обеспечения. &lt;/strong&gt;Я начал использовать ИИ-агентов в своих сторонних проектах, и пока что успешно. Я делаю несколько вещей:&lt;/p&gt;
  &lt;ul id=&quot;BTMJ&quot;&gt;
    &lt;li id=&quot;SjLm&quot;&gt;Тестирование: во всех побочных проектах есть модульные тесты, потому что я научился не доверять своей работе без проверки&lt;/li&gt;
    &lt;li id=&quot;wvaR&quot;&gt;Небольшие описательные задания: я даю небольшие по объёму задания, которые объясняю, и привожу примеры&lt;/li&gt;
    &lt;li id=&quot;MEpL&quot;&gt;Рефакторинг: каждая третья или четвёртая задача заключается в том, чтобы агент рефакторил написанный им код (например, выделил его в метод или перенёс в новый класс)&lt;/li&gt;
    &lt;li id=&quot;eGCH&quot;&gt;Отзыв: я слежу за тем, что делает агент&lt;/li&gt;
    &lt;li id=&quot;jrRE&quot;&gt;Делайте мелочи сами: я не закрываю IDE и вручную меняю всё, что требует внесения изменений в несколько строк, чтобы быть в курсе состояния кодовой базы&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;piwu&quot;&gt;Я постоянно слышу одно и то же от других инженеров: «обязательные» инженерные практики, такие как проверка агентом всех тестов перед продолжением работы, приводят к лучшим результатам. Это неудивительно, и именно поэтому такие практики становятся всё более популярными. ИИ-агенты недетерминированы и в некоторой степени ненадёжны; эти практики делают их гораздо более надёжными и удобными в использовании.&lt;/p&gt;
  &lt;h2 id=&quot;Wmkf&quot;&gt;2. Протокол ACP&lt;/h2&gt;
  &lt;p id=&quot;Ziwv&quot;&gt;Компании JetBrains и Zed объявили о сотрудничестве в рамках &lt;a href=&quot;https://agentclientprotocol.com/overview/introduction&quot; target=&quot;_blank&quot;&gt;протокола Agent Client Protocol&lt;/a&gt;. Крупнейшие конкуренты VS Code, использующие собственные интегрированные среды разработки, которые не являются ответвлениями VS Code, заявляют, что цель ACP — обеспечить взаимодействие между редакторами кода и агентами. Протокол ACP был изначально создан командой Zed.&lt;/p&gt;
  &lt;p id=&quot;MJpZ&quot;&gt;Постоянные читатели этой публикации могут спросить: «Подождите, разве MCP не решает эту проблему?» И действительно, MCP (Model Context Protocol, «USB-C для приложений ИИ») был создан под влиянием интерфейсов IDE. И один из вариантов его использования заключается в том, что он значительно упрощает подключение IDE к агентам. Из статьи &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/mcp&quot; target=&quot;_blank&quot;&gt;Протокол MCP: новый строительный блок для инструментов разработки ИИ&lt;/a&gt;:&lt;/p&gt;
  &lt;figure id=&quot;5nCy&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!pXH_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57384951-24dc-4e88-92f6-7248804ff2e5_1456x1072.png&quot; width=&quot;1456&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;Краткий обзор архитектуры MCP. Из &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/mcp&quot; target=&quot;_blank&quot;&gt;Протокола MCP: новый строительный блок для инструментов разработки ИИ&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FPJh&quot;&gt;Итак, зачем нужен новый протокол, почему бы просто не продолжать использовать MCP? Дело в том, что MCP создавался не для IDE: компания Anthropic разработала его как способ взаимодействия любого приложения с агентами. IDE взяли его на вооружение, потому что это было лучше, чем отсутствие возможности добавлять интеграцию с агентами.&lt;/p&gt;
  &lt;p id=&quot;s7Et&quot;&gt;ACP поддерживает несколько функций, которых нет в MCP:&lt;/p&gt;
  &lt;ul id=&quot;MN56&quot;&gt;
    &lt;li id=&quot;kofX&quot;&gt;Двунаправленная связь между агентами и IDE&lt;/li&gt;
    &lt;li id=&quot;xizi&quot;&gt;Поддержка интерактивных рабочих процессов, таких как генерация кода и встроенные подсказки&lt;/li&gt;
    &lt;li id=&quot;EQl2&quot;&gt;Поддержка вызова локальных инструментов в среде разработки, включая чтение файлов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;JCcF&quot;&gt;ACP был сделан совместимым с MCP, и можно использовать существующие серверы MCP. Однако ACP позволяет поставщикам добавлять улучшенную поддержку сценариев использования, связанных с кодированием.&lt;/p&gt;
  &lt;p id=&quot;cFgy&quot;&gt;На первый взгляд, протокол ACP гораздо больше подходит для IDE, чем MCP. Учитывая, что Zed и JetBrains добавили поддержку, я ожидаю, что VS Code и его форки, такие как Cursor, Windsurf и другие, последуют их примеру. Поздравляю команду Zed с созданием этого протокола. Узнайте больше &lt;a href=&quot;https://agentclientprotocol.com/overview/introduction&quot; target=&quot;_blank&quot;&gt;на сайте ACP.&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;ftrS&quot;&gt;3. Инструменты для обеспечения безопасности на основе ИИ работают на удивление хорошо?&lt;/h2&gt;
  &lt;p id=&quot;ziSX&quot;&gt;Два недавних события показали, что инструменты на основе ИИ весьма полезны для выявления проблем в системе безопасности:&lt;/p&gt;
  &lt;p id=&quot;dUKx&quot;&gt;&lt;strong&gt;Обнаружены десятки уязвимостей в &lt;a href=&quot;https://en.wikipedia.org/wiki/CURL&quot; target=&quot;_blank&quot;&gt;Curl&lt;/a&gt; (URL клиента)&lt;/strong&gt; Популярный инструмент командной строки был выпущен в 1996 году и на сегодняшний день является &lt;em&gt;очень&lt;/em&gt; зрелым программным обеспечением. Две недели назад инженер-программист Джошуа Роджерс отправил список проблем, которые он обнаружил с помощью инструментов на базе искусственного интеллекта. На основе этого разработчик Curl Дэниел Стенберг &lt;a href=&quot;https://mastodon.social/@bagder/115241241075258997&quot; target=&quot;_blank&quot;&gt;выпустил&lt;/a&gt; 22 исправления, и их число продолжает расти. Выяснилось, что все проблемы с безопасностью присутствовали, но разработчики пока не сообщали о них. Как здорово использовать инструменты искусственного интеллекта!&lt;/p&gt;
  &lt;p id=&quot;T4Pa&quot;&gt;&lt;strong&gt;ИИ-агент Google для обеспечения безопасности кода: &lt;/strong&gt;Поисковый гигант поделился подробностями о внутреннем проекте под названием &lt;a href=&quot;https://deepmind.google/discover/blog/introducing-codemender-an-ai-agent-for-code-security/&quot; target=&quot;_blank&quot;&gt;CodeMender&lt;/a&gt;. Этот ИИ-инструмент использует &lt;a href=&quot;https://en.wikipedia.org/wiki/Static_program_analysis&quot; target=&quot;_blank&quot;&gt;статический анализ&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Dynamic_program_analysis&quot; target=&quot;_blank&quot;&gt;динамический анализ&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Differential_testing&quot; target=&quot;_blank&quot;&gt;дифференциальное тестирование&lt;/a&gt; и другие методы для поиска проблем. Затем отладчик и браузер исходного кода генерируют и проверяют исправления. Google &lt;a href=&quot;https://deepmind.google/discover/blog/introducing-codemender-an-ai-agent-for-code-security/&quot; target=&quot;_blank&quot;&gt;сообщает&lt;/a&gt;, что за последние 6 месяцев CodeMender помог исправить 72 уязвимости в проектах с открытым исходным кодом. CodeMender не является готовым продуктом, но тот факт, что Google делится этими результатами, говорит о том, что на основе этого исследования будет выпущен какой-то продукт для обеспечения безопасности с помощью ИИ.&lt;/p&gt;
  &lt;p id=&quot;kZ0n&quot;&gt;Мне кажется, что инструменты на основе ИИ теперь полезны не только для &lt;em&gt;выявления&lt;/em&gt; потенциальных проблем с безопасностью, но и для проверки, исправления и создания новых задач.&lt;/p&gt;
  &lt;h2 id=&quot;Xi3v&quot;&gt;4. Является ли искусственный интеллект единственным фактором роста экономики?&lt;/h2&gt;
  &lt;p id=&quot;9gAr&quot;&gt;В СМИ появились сообщения о том, что инвестиции в ИИ являются практически единственным фактором роста экономики США. Например, в статье Financial Times говорится, что &lt;a href=&quot;https://www.ft.com/content/6cc87bd9-cb2f-4f82-99c5-c38748986a2e&quot; target=&quot;_blank&quot;&gt;Америка сделала большую ставку на ИИ&lt;/a&gt;:&lt;/p&gt;
  &lt;blockquote id=&quot;kCYM&quot;&gt;«Сотни миллиардов долларов, которые компании инвестируют в ИИ, в этом году составляют поразительные 40 % от общего роста ВВП США. Некоторые аналитики считают, что эта оценка не отражает в полной мере расходы на ИИ, поэтому реальная доля может быть ещё выше.В 2025 году на долю компаний, занимающихся искусственным интеллектом, пришлось 80 % прироста акций в США. Это помогает финансировать и стимулировать рост экономики США, поскольку фондовый рынок, основанный на искусственном интеллекте, привлекает деньги со всего мира и способствует буму потребительских расходов среди богатых людей.&lt;/blockquote&gt;
  &lt;p id=&quot;MoSL&quot;&gt;Более 60 % венчурных инвестиций направляется в компании, занимающиеся искусственным интеллектом. Из Pitchbook:&lt;/p&gt;
  &lt;figure id=&quot;cWAo&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!MUZ8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea8f3c2-097f-4ff3-84f0-1c4d306255c1_1218x870.png&quot; width=&quot;1218&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;ИИ доминирует в сфере венчурного финансирования. Источник: &lt;a href=&quot;https://pitchbook.com/news/reports/q3-2025-quantitative-perspectives-a-fork-in-the-road&quot; target=&quot;_blank&quot;&gt;Анализ Pitchbook&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0jXl&quot;&gt;Тем временем цены на акции таких компаний, как AMD, резко выросли. Были заключены несколько интересных сделок, например, OpenAI пообещала купить чипы AMD на сотни миллиардов долларов (за деньги, которых у неё нет), а AMD предложила OpenAI до 10 % акций компании.&lt;/p&gt;
  &lt;p id=&quot;3Vvr&quot;&gt;Это странная на первый взгляд сделка, которая пришлась по душе фондовому рынку. Вот как её охарактеризовал аналитик Bloomberg Мэтт Левин &lt;a href=&quot;https://www.bloomberg.com/opinion/newsletters/2025-10-06/openai-is-good-at-deals&quot; target=&quot;_blank&quot;&gt;кратко&lt;/a&gt;:&lt;/p&gt;
  &lt;blockquote id=&quot;cpd8&quot;&gt;«Как проходят переговоры [между OpenAI и AMD]? Если в общих чертах:OpenAI: нам бы понадобились ваши чипы мощностью шесть гигаватт для логического вывода.AMD: Потрясающе. Это будет стоить 78 миллиардов долларов. Как вы хотите заплатить?OpenAI: Мы думали объявить о сделке, и это увеличило бы стоимость вашей компании на 78 миллиардов долларов, что должно было покрыть расходы.AMD: …Открытый доступ: …AMD: Нет, я почти уверен, что за чипы нужно платить.OpenAI: Почему?AMD: Не знаю, просто кажется неправильным этого не делать.OpenAI: Хорошо. Почему бы нам не заплатить вам наличными за стоимость чипов, а вы вернёте нам акции, и когда мы объявим о сделке, акции вырастут в цене, и мы вернём свои 78 миллиардов долларов.AMD: Да, думаю, это сработает, хотя мне кажется, что мы должны получить хоть какую-то выгоду.OpenAI: Хорошо, можешь забрать половину. Ты даёшь нам акции на сумму около 35 миллиардов долларов, а остальное оставляешь себе».&lt;/blockquote&gt;
  &lt;p id=&quot;RJhP&quot;&gt;Одновременно происходят три вещи:&lt;/p&gt;
  &lt;ul id=&quot;znrp&quot;&gt;
    &lt;li id=&quot;4M8Q&quot;&gt;&lt;strong&gt;Инвестиции в ИИ в этом году составят ~40% ВВП США. &lt;/strong&gt;По сути, если бы не эти масштабные инвестиции, мы могли бы оказаться на грани рецессии.&lt;/li&gt;
    &lt;li id=&quot;iZjt&quot;&gt;&lt;strong&gt;Инвестиции в ИИ составляют ~60% всего венчурного капитала.&lt;/strong&gt; По сути, если вы не технологическая компания, которая занимается ИИ, вам будет всё сложнее и сложнее привлекать деньги.&lt;/li&gt;
    &lt;li id=&quot;ZPuF&quot;&gt;&lt;strong&gt;Компании, занимающиеся искусственным интеллектом, используют бухгалтерский учёт для повышения цен на акции. &lt;/strong&gt;OpenAI заинтересована в том, чтобы стоимость акций таких партнёров, как AMD, продолжала расти, если она заключает сделки, по которым OpenAI получает графические процессоры бесплатно, когда стоимость акций становится достаточно высокой.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;VOnf&quot;&gt;С одной стороны, подобные сложные финансовые механизмы могут создать ощущение раздувающегося «пузыря» ИИ, который в какой-то момент может лопнуть — примерно так же, как сложные финансовые инструменты привели к мировому финансовому кризису 2007–2008 годов.&lt;/p&gt;
  &lt;p id=&quot;Em27&quot;&gt;С другой стороны, ИИ и большие языковые модели &lt;em&gt;являются&lt;/em&gt; революционными технологиями, которые позволяют нам создавать то, что раньше было невозможно! Мы видим это в разработке программного обеспечения: ИИ-агенты генерируют больше кода, который проверяется разработчиками, но не пишется ими. Некоторые разработчики отключают ИИ-агентов, и теперь вы можете назначить ИИ-агенту задачу, чтобы он в одно касание исправил ошибку — например, как это уже поддерживает Linear.&lt;/p&gt;
  &lt;p id=&quot;p0zm&quot;&gt;По сути, LLM позволяют добавлять диалоговый интерфейс к любому типу системы, которую мы создали заранее, плюс они обещают новые типы продуктов и варианты использования. И примеры использования искусственного интеллекта распространяются повсюду: разработка программного обеспечения и поддержка клиентов - это две области, в которых агенты нашли “соответствие продукта рынку”, и за ними наверняка последуют другие.&lt;/p&gt;
  &lt;p id=&quot;wSb0&quot;&gt;Если рассматривать это с точки зрения технологического прорыва, то инвестиции в ИИ вполне рациональны:&lt;/p&gt;
  &lt;ul id=&quot;a9Mv&quot;&gt;
    &lt;li id=&quot;d75u&quot;&gt;&lt;strong&gt;Инвестиции в ИИ могут принести более высокую прибыль, чем вложения в другие перспективные направления. &lt;/strong&gt;Для компании с бюджетом на исследования и разработки в размере 1 млн долларов США вложение &lt;em&gt;большей&lt;/em&gt; части средств в эксперименты с ИИ сейчас кажется вполне разумным, поскольку эта технология обладает большим потенциалом. К тому же конкуренты делают то же самое!&lt;/li&gt;
    &lt;li id=&quot;welz&quot;&gt;&lt;strong&gt;С точки зрения венчурного инвестора, инвестиции в ИИ кажутся лучшей краткосрочной инвестицией. &lt;/strong&gt;Всего за 4 года стоимость OpenAI выросла в 25 раз: в 2021 году компания оценивалась в 20 миллиардов долларов, а сегодня её стоимость составляет 500 миллиардов долларов. Ещё более поразительно то, что Anthropic была основана в 2021 году (когда OpenAI уже оценивалась в 20 миллиардов долларов!) и стоит 183 миллиарда долларов! Инвесторы, вложившие деньги в первый раунд финансирования Anthropic в 2022 году (когда компания была оценена в 4 миллиарда долларов), получили 45-кратную прибыль всего за 3 года&lt;/li&gt;
    &lt;li id=&quot;KPr6&quot;&gt;&lt;strong&gt;ИИ способствует росту фондового рынка.&lt;/strong&gt; Инвесторы видят потенциал ИИ и спешат приобрести компании, которые вкладывают значительные средства в эту область, в надежде получить высокую прибыль, став одними из первых дальновидных «инвесторов в ИИ»&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;qYa4&quot;&gt;В последний раз мы наблюдали такие инвестиции и такой энтузиазм в сфере технологий на пороге нового тысячелетия (примерно в 1999 году), когда интернет начал стремительно развиваться: начался бум доткомов, который превратился в пузырь, а затем лопнул в 2001 году. Сектору потребовались годы, чтобы оправиться от этого краха, и невозможно сказать, не движемся ли мы сегодня к чему-то подобному. Есть множество признаков того, что рынок и экономика выигрывают от позитивного отношения к искусственному интеллекту, и неизвестно, изменится ли что-то в этом отношении и когда это произойдёт.&lt;/p&gt;
  &lt;p id=&quot;Yjy7&quot;&gt;Даже после краха доткомов технологическая отрасль восстановилась и вернулась к росту в течение нескольких лет. А некоторые из крупнейших технологических компаний современности были основаны незадолго до этого или сразу после: Google в 1998 году (до краха) и Facebook в 2004 году (после краха).&lt;/p&gt;
  &lt;h2 id=&quot;GHLL&quot;&gt;5. Сравнение собеседований в 8 крупных технологических компаниях&lt;/h2&gt;
  &lt;p id=&quot;Lmor&quot;&gt;&lt;a href=&quot;https://www.linkedin.com/in/puneet-patwari/&quot; target=&quot;_blank&quot;&gt;Пунит Патвари (Puneet Patwari)&lt;/a&gt; недавно принял предложение о работе в Atlassian в качестве главного инженера-программиста. За три месяца он прошёл более 60 собеседований в 11 компаниях, рассказал он мне, при этом он отказался ещё от трёх собеседований после того, как принял предложение Atlassian, в том числе от Meta. После этого он &lt;a href=&quot;https://www.linkedin.com/posts/puneet-patwari_i-interviewed-at-google-uber-walmart-amazon-activity-7379375609354883072-Rkq1/&quot; target=&quot;_blank&quot;&gt;сравнил&lt;/a&gt; собеседования в крупнейших компаниях:&lt;/p&gt;
  &lt;figure id=&quot;UTeY&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://substackcdn.com/image/fetch/$s_!fd6d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F411215af-a63b-411f-9192-d6a7ef71481e_1390x1236.png&quot; width=&quot;1390&quot; /&gt;
    &lt;figcaption&gt;&lt;em&gt;На что был похож каждый этап собеседования. Источник: &lt;a href=&quot;https://www.linkedin.com/posts/puneet-patwari_i-interviewed-at-google-uber-walmart-amazon-activity-7379375609354883072-Rkq1/&quot; target=&quot;_blank&quot;&gt;Пунит Патвари&lt;/a&gt;&lt;/em&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;A6U1&quot;&gt;Вот ещё несколько наблюдений, которыми поделился со мной Пунит (Puneet):&lt;/p&gt;
  &lt;blockquote id=&quot;CtfC&quot;&gt;&lt;strong&gt;Amazon&lt;/strong&gt;: собеседование с менеджером по подбору персонала в Amazon было одним из самых необычных, в которых я когда-либо участвовал. Мы так увлеклись беседой, что она заняла 160 минут вместо запланированных 60! Нам пришлось сделать перерыв между собеседованиями.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Atlassian&lt;/strong&gt;: Два этапа собеседования, посвящённые лидерским качествам (ЛК) и ценностям, сыграли решающую роль в определении того, что я буду работать на уровне Principal. Конечно, собеседование по системному проектированию тоже сыграло свою роль. Atlassian уделяет большое внимание ЛК для инженеров уровня Principal.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Salesforce&lt;/strong&gt;: этап проектирования системы был основан на &lt;em&gt;фактических&lt;/em&gt; требованиях к работе. Это была задача на миграцию, в ходе которой интервьюер хотел проверить, смогу ли я полностью контролировать проект, в центре которого находятся клиенты.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Confluent&lt;/strong&gt;: когда я говорю, что это было самое сложное с точки зрения умственных способностей собеседование, я имею в виду, что каждый навык проверялся на двух собеседованиях! То есть 2 собеседования по структурам данных и алгоритмам (СДА), 2 собеседования по проектированию систем, 2 поведенческих собеседования.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Я не могу не подчеркнуть, насколько важны поведенческие интервью на уровнях Staff+ и выше. &lt;/strong&gt;Успешное прохождение этих собеседований сыграло решающую роль в получении предложений о работе на уровнях Staff и Principal. Конечно, нужно было хорошо разбираться в программировании и системном проектировании, но, по моему мнению, именно поведенческие аспекты определяли уровень и возможность получения предложения о работе.&lt;/blockquote&gt;
  &lt;p id=&quot;8uOG&quot;&gt;Из рассказа Пунита о его собеседованиях в ведущих технологических компаниях я выделил несколько моментов:&lt;/p&gt;
  &lt;ul id=&quot;LaU0&quot;&gt;
    &lt;li id=&quot;wtpw&quot;&gt;&lt;strong&gt;Собеседования по алгоритмическому программированию проводятся повсеместно! &lt;/strong&gt;Чтобы претендовать на должность старшего специалиста и выше, вам нужно хорошо разбираться в таких сложных темах, как динамическое программирование. В этой статье мы расскажем, как успешно пройти такое собеседование. &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-to-get-unstuck-during-coding-interviews&quot; target=&quot;_blank&quot;&gt;Как опытные инженеры справляются с собеседованиями по программированию&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;cMjR&quot;&gt;&lt;strong&gt;Собеседования проходят тяжело и отнимают много времени. &lt;/strong&gt;Даже после того, как Пунит получил предложения, ни одна компания не сократила процесс рассмотрения. Пуниту пришлось отказаться ещё от трёх собеседований, в том числе от собеседования в Meta, потому что к тому времени, когда они должны были состояться, он уже получил предложение от Atlassian и принял его.&lt;/li&gt;
    &lt;li id=&quot;Yk31&quot;&gt;&lt;strong&gt;На сложном рынке труда по-прежнему востребованы «лучшие» кандидаты. &lt;/strong&gt;Мы рассказали о том, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/state-of-the-tech-market-in-2025-hiring-managers&quot; target=&quot;_blank&quot;&gt;насколько сложен текущий рынок труда в сфере технологий для соискателей&lt;/a&gt;, но Пунит прошёл собеседования в 11 компаниях и получил 6 предложений. Чтобы пройти отбор по резюме, его кандидатура должна была соответствовать многим требованиям: опыт работы более 10 лет и должность старшего инженера-программиста в Microsoft. Он также был &lt;em&gt;действительно&lt;/em&gt; хорошо подготовлен.&lt;/li&gt;
    &lt;li id=&quot;5Zxz&quot;&gt;&lt;strong&gt;Невезение может случиться в любой момент&lt;/strong&gt;. Похоже, что Пуниту не повезло на собеседовании в Uber: интервьюер был непреклонен и не готов к диалогу. Возможно, у него был тяжёлый день или он хотел поскорее закончить собеседование. Или это могло быть тем, что Стив Йегге называет &lt;a href=&quot;https://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html&quot; target=&quot;_blank&quot;&gt;антипетлёй интервьюера&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;mvyz&quot;&gt;Перевод: &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/the-pulse-149-new-trend-programming&quot; target=&quot;_blank&quot;&gt;https://newsletter.pragmaticengineer.com/p/the-pulse-149-new-trend-programming&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:ZuTbNXrUmKu</id><link rel="alternate" type="text/html" href="https://devz.su/ZuTbNXrUmKu?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>Инженерная культура Google</title><published>2025-10-31T05:54:16.580Z</published><updated>2025-10-31T05:55:27.694Z</updated><summary type="html">Мы с Элин Нильссон рассказываем о том, как на самом деле устроены инженерная культура, инструменты и системы Google.</summary><content type="html">
  &lt;p id=&quot;A7rC&quot;&gt;Мы с Элин Нильссон рассказываем о том, как на самом деле устроены инженерная культура, инструменты и системы Google.&lt;/p&gt;
  &lt;figure id=&quot;VJB0&quot; class=&quot;m_column&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/sj9Q2VcfUeA?autoplay=0&amp;loop=0&amp;mute=0&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;u923&quot;&gt;&lt;strong&gt;В этом видео&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;X5KA&quot;&gt;Каково это &lt;em&gt;на самом деле&lt;/em&gt; быть инженером в Google?&lt;/p&gt;
  &lt;p id=&quot;mbuL&quot;&gt;В этом специальном выпуске, посвящённом глубокому погружению в тему, мы рассказываем о том, как на самом деле работает инженерное дело в Google. Мы несколько месяцев изучали инженерную культуру поискового гиганта и поговорили с более чем 20 нынешними и бывшими сотрудниками Google, чтобы провести это глубокое погружение с &lt;strong&gt;&lt;a href=&quot;https://www.linkedin.com/in/hejelin/&quot; target=&quot;_blank&quot;&gt;Элин Нильссон&lt;/a&gt;&lt;/strong&gt;, исследователем технологической отрасли из &lt;strong&gt;The Pragmatic Engineer&lt;/strong&gt; и бывшим стажёром Google.&lt;/p&gt;
  &lt;p id=&quot;aSUv&quot;&gt;Google всегда была организацией, ориентированной на инженерное дело. Мы рассказываем о её собственном стеке и инструментах, культуре проектирования документации, а также о системах оценки эффективности и продвижения по службе, которые определяют карьерный рост. Мы также изучаем корпоративную культуру, которая, кажется, создана для инженеров: щедрые льготы, удивительно лёгкое дежурство, которое часто считается лучшим в отрасли, и пристальное внимание к решению масштабных технических проблем.&lt;/p&gt;
  &lt;p id=&quot;quCl&quot;&gt;Если вы подумываете о том, чтобы подать заявку в Google, или вам интересно, как развивалась инженерная культура компании, в этом выпуске вы узнаете, каково было работать в Google в прошлом и как обстоят дела сегодня, а также кто подходит для работы в Google в наши дни.&lt;/p&gt;
  &lt;p id=&quot;iS17&quot;&gt;&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/googles-engineering-culture&quot; target=&quot;_blank&quot;&gt;https://newsletter.pragmaticengineer.com/p/googles-engineering-culture&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>devz:what-is-good-software-architecture</id><link rel="alternate" type="text/html" href="https://devz.su/what-is-good-software-architecture?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=devz"></link><title>Что такое хорошая архитектура программного обеспечения?</title><published>2025-10-31T05:41:34.925Z</published><updated>2025-10-31T05:56:23.087Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/de/98/de98dfb2-b260-412c-b662-02026019e432.png"></media:thumbnail><category term="software-architecture" label="Архитектура ПО"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/21/00/21005a46-9f77-480c-a791-3bd0e0fb17f6.png&quot;&gt;Чтобы попытаться ответить на этот, казалось бы, простой вопрос, я обратился к ветерану разработки программного обеспечения Мэттью Хоторну. Он работает инженером-программистом более 25 лет и является автором готовящейся к выходу книги «Добейся результата или умри, пытаясь», в которой он делится опытом работы с программным обеспечением, архитектурой и выводом продукта на рынок. Книга находится на стадии раннего выпуска и должна выйти в следующем году.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;XqwG&quot;&gt;Как выглядит хорошая архитектура, как улучшить свои навыки в её создании и почему архитекторы не всегда являются решением проблемы. Гостевая публикация Мэтью Хоторна, который создавал крупные системы в Netflix и Twitter&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;UxMq&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Xfni&quot;&gt;Чтобы попытаться ответить на этот, казалось бы, простой вопрос, я обратился к ветерану разработки программного обеспечения &lt;a href=&quot;https://www.linkedin.com/in/mhawthorne/&quot; target=&quot;_blank&quot;&gt;Мэттью Хоторну&lt;/a&gt;. Он работает инженером-программистом более 25 лет и является автором готовящейся к выходу книги &lt;a href=&quot;https://pushtoprodordietrying.com/&quot; target=&quot;_blank&quot;&gt;«Добейся результата или умри, пытаясь»&lt;/a&gt;, в которой он делится опытом работы с программным обеспечением, архитектурой и выводом продукта на рынок. Книга находится на стадии раннего выпуска и должна выйти в следующем году.&lt;/p&gt;
  &lt;p id=&quot;1ltb&quot;&gt;Мэтт работал в Comcast, Twitter и Netflix, где он провёл шесть лет в 2010-х. Во время его работы в Netflix каждый инженер ежедневно принимал архитектурные решения и часто выпускал новые функции, которые становились доступны десяткам миллионов пользователей — и всё это без единого упоминания должности «архитектор».&lt;/p&gt;
  &lt;p id=&quot;rsiY&quot;&gt;В этом выпуске Мэтт рассказывает о:&lt;/p&gt;
  &lt;ol id=&quot;Zlfw&quot;&gt;
    &lt;li id=&quot;5DiQ&quot;&gt;&lt;strong&gt;Архитекторы не решают архитектурных проблем. &lt;/strong&gt;В Netflix долгое время не было архитекторов, но основы архитектуры оставались прочными.&lt;/li&gt;
    &lt;li id=&quot;kIFM&quot;&gt;&lt;strong&gt;Отказ от решения сегодняшних проблем в пользу решения проблем завтрашних: переход на AWS. &lt;/strong&gt;Переход в облако AWS создал множество проблем для Netflix, на решение которых впоследствии потребовались серьёзные усилия. Но это также устранило существующие проблемы.&lt;/li&gt;
    &lt;li id=&quot;fxTB&quot;&gt;&lt;strong&gt;Положительные характеристики архитектуры&lt;/strong&gt;. Они уравновешивают практические и амбициозные задачи, объединяют людей и системы и не связаны с хорошим кодом.&lt;/li&gt;
    &lt;li id=&quot;Bldw&quot;&gt;&lt;strong&gt;Плохая архитектура — это большой объём работы, который мало что меняет. &lt;/strong&gt;Это всё равно что переставлять мебель в доме, который нужно снести и построить на его месте что-то более удобное.&lt;/li&gt;
    &lt;li id=&quot;dnH0&quot;&gt;&lt;strong&gt;Удачные архитектурные решения в проектах Netflix. &lt;/strong&gt;Необычные компромиссы, создание инструментов для сокращения объёма оперативной работы, отказ от одних ограничений в пользу других и модернизация систем для повышения их эффективности в будущем.&lt;/li&gt;
    &lt;li id=&quot;WZRG&quot;&gt;&lt;strong&gt;Как улучшить свои навыки в области архитектуры. &lt;/strong&gt;Разрабатывайте системы, исходя из того, что может сломаться, изучайте свою аудиторию, уделяйте внимание нужным деталям и становитесь ценным сотрудником на нескольких должностях.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;uATZ&quot;&gt;Если вы хотите следить за публикациями Мэтта, подпишитесь на его рассылку &lt;a href=&quot;https://pushtoprod.substack.com/&quot; target=&quot;_blank&quot;&gt;Push to Prod&lt;/a&gt;. Вы также можете приобрести его незавершённую книгу &lt;a href=&quot;https://pushtoprodordietrying.com/&quot; target=&quot;_blank&quot;&gt;Push to Prod or Die Trying&lt;/a&gt;, которая на данный момент готова на 40 %.&lt;/p&gt;
  &lt;p id=&quot;N0b2&quot;&gt;На этом Мэтт заканчивает:&lt;/p&gt;
  &lt;p id=&quot;CJYq&quot;&gt;В Netflix мы предпочитали создавать прототипы, а не писать официальные предложения по архитектуре, в то время как в других компаниях я видел, как проваливались непрактичные предложения по архитектуре, а чрезмерно практичные архитектурные решения приносили успех, но оказывали ограниченное влияние. Другие предложения пылились на полках из-за отсутствия обсуждений и согласований, необходимых для создания общего плана.&lt;/p&gt;
  &lt;p id=&quot;xhJe&quot;&gt;Мне всегда казалось, что работа, определяемая фразой &lt;em&gt;архитектура программного обеспечения&lt;/em&gt;, расплывчата, а ценность, приносимая &lt;em&gt;архитекторами&lt;/em&gt; с большой буквы, сомнительна. Я говорю это исходя из личного опыта после моего недолгого и ничем не примечательного пребывания в должности «архитектора предметной области» — опыта, из которого я многое почерпнул, но мало что привнёс. Со временем я понял, что если и есть что-то, что я знаю об архитектуре, так это то, что:&lt;/p&gt;
  &lt;p id=&quot;Y7XB&quot;&gt;&lt;strong&gt;Хорошая архитектурная работа заключается в целенаправленном решении проблем, с которыми вы сталкиваетесь сегодня, ради решения более сложных проблем в будущем.&lt;/strong&gt; По сути, если вы не решаете свои проблемы, вы просто переставляете мебель.&lt;/p&gt;
  &lt;h2 id=&quot;G0kR&quot;&gt;1. Архитекторы не являются решением архитектурных проблем&lt;/h2&gt;
  &lt;p id=&quot;1ndu&quot;&gt;Я проработал в Netflix 6 лет, и за это время я увидел сотни вещей, которые делали компанию уникальной. Одной из них было отсутствие архитекторов программного обеспечения — по крайней мере, в названии должности. На самом деле у нас вообще не было инженерных уровней; каждый инженер был &lt;em&gt;старшим инженером-программистом&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;xPdc&quot;&gt;Первые четыре года я проработал в команде Edge, в которой было около 20 инженеров, занимавшихся разработкой и эксплуатацией программного уровня, расположенного между клиентскими устройствами и внутренними сервисами. «Edge» в данном случае — это граница серверной инфраструктуры Netflix, на которую приходилась большая часть эксплуатационных нагрузок.&lt;/p&gt;
  &lt;p id=&quot;KM0X&quot;&gt;Казалось, что первым делом в каждом производственном инциденте мы должны были доказать, что не виноваты. Это раздражало, но было эффективно: коллеги предполагали, что если каждый запрос клиента проходит через нашу систему, то у нас должны быть логи или метрики, собранные нашей системой, которые выявляют и проясняют проблемы. Часто так и было, а если нет, то мы работали над устранением пробелов. Конечно, иногда мы &lt;em&gt;действительно&lt;/em&gt; становились причиной инцидентов, а иногда «мы» означало «я».&lt;/p&gt;
  &lt;p id=&quot;kaHg&quot;&gt;За несколько лет мы решили самые насущные проблемы, повысив отказоустойчивость, создав гибкую периферийную маршрутизацию и внедрив предиктивное автомасштабирование. Если задуматься об этих и других проектах, над которыми я работал в гиганте потокового видео, то можно сказать, что архитектуры в привычном понимании там не было. Те, кто предлагал идеи, сами выполняли работу, что позволяло избежать неловкого разделения на «белых воротничков» и «синих воротничков», которое часто возникает между архитекторами и инженерами в технологических компаниях. Большинство технических идей зарождалось в «окопах», что приводило к осознанному выбору архитектурных решений, имевших очевидную ценность. Со временем мы вступили в новую эру, которая характеризовалась обильными дискуссиями о создании новых масштабных систем для решения воображаемых проблем будущего, а не реальных проблем настоящего.&lt;/p&gt;
  &lt;p id=&quot;LrFA&quot;&gt;&lt;strong&gt;В компании сформировался новый поведенческий архетип — «Архитектор». &lt;/strong&gt;Я говорю об инженерах, которые слонялись без дела, выдвигали новые идеи и не вносили существенного вклада в повседневную работу. Они не дежурили вместе с нами, якобы потому, что их руководители хотели дать им больше времени для мозгового штурма, так что у них было достаточно времени для разговоров и интеллектуальных изысканий, в то время как остальные из нас выполняли грязную, оперативную работу. Однажды за обедом мы с коллегой обсудили эту ситуацию. «Я не знаю, как решить эту проблему», — сказал я. «Решение, — ответил он, — в том, чтобы не было архитекторов».Я рассмеялся, но потом понял, что он не шутит.&lt;/p&gt;
  &lt;p id=&quot;PvxE&quot;&gt;&lt;strong&gt;Я думал, что Netflix не &lt;em&gt;нуждается&lt;/em&gt; в архитекторах, и рассуждал об этом в более широком смысле: действительно ли они &lt;em&gt;нужны&lt;/em&gt; какой-либо компании? &lt;/strong&gt;Давайте разберёмся, зачем нужна должность архитектора. Я считаю, что это пережиток старой школы:&lt;/p&gt;
  &lt;ol id=&quot;v01b&quot;&gt;
    &lt;li id=&quot;UnQf&quot;&gt;Дизайн: архитекторы мыслят масштабно и рисуют схемы&lt;/li&gt;
    &lt;li id=&quot;MnYz&quot;&gt;Сборка: инженеры превращают схемы в код&lt;/li&gt;
    &lt;li id=&quot;17MU&quot;&gt;Тест: QA находит ошибки&lt;/li&gt;
    &lt;li id=&quot;IeVq&quot;&gt;Эксплуатация: отдел эксплуатации обеспечивает бесперебойную работу систем&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;N2vi&quot;&gt;Эти четыре этапа неизбежны, и каждая компания подходит к ним по-своему. Представьте себе ось: слева на ней изображена отдельная роль для каждого этапа, а справа — единая роль, выполняющая все функции. Каждая компания находится где-то на этой оси.&lt;/p&gt;
  &lt;p id=&quot;Okqo&quot;&gt;Например, переход крупных компаний на гибкую методологию разработки сделал менее популярным подход «большой дизайн, заранее», и часто &lt;em&gt;Дизайн&lt;/em&gt; и &lt;em&gt;Сборка&lt;/em&gt; объединялись в один непрерывный этап. А переход к облачным технологиям, DevOps и модели «ты пишешь, ты запускаешь» часто объединяет &lt;em&gt;Сборку&lt;/em&gt;, &lt;em&gt;Тестирование&lt;/em&gt; и &lt;em&gt;Эксплуатацию&lt;/em&gt; в один этап.&lt;/p&gt;
  &lt;p id=&quot;GONq&quot;&gt;Итак, зачем Netflix нанял архитекторов? На мой взгляд, это было связано с масштабом: наше руководство считало, что нам нужны более масштабные и смелые идеи, чтобы переосмыслить работу наших систем, и что тем, кто должен был воплотить эти идеи в жизнь, нужна была дистанция от повседневной работы.&lt;/p&gt;
  &lt;p id=&quot;2o72&quot;&gt;Звучит вполне логично, но я никогда не видел, чтобы это работало. Я не пытался это исправить — я сменил команду и перешёл в группу «Инфраструктура персонализации», которая всегда меня интересовала. Эта команда была новой, и они решали конкретные проблемы. Насколько я понимаю, команда Edge продолжила успешно ревизуализировать свою платформу.&lt;/p&gt;
  &lt;p id=&quot;D7kF&quot;&gt;&lt;strong&gt;В долгосрочной перспективе успех порождает специализацию.&lt;/strong&gt; Вы решаете самые сложные задачи, а руководство спрашивает: «Каковы наши планы на ближайшие три года?». Формируются отдельные группы «мыслителей» и «строителей», и многие компании официально закрепляют эту роль за главными инженерами или штатными инженерами, которые по сути являются архитекторами. По моим наблюдениям, людям, занимающим эти должности, трудно не отрываться от реальности: их умственные способности велики, но структура и стимулы затрудняют поиск подходящих целей.&lt;/p&gt;
  &lt;h2 id=&quot;e8Vw&quot;&gt;2. Решение сегодняшних проблем ради завтрашних: переход на AWS&lt;/h2&gt;
  &lt;p id=&quot;0tYg&quot;&gt;Самый значительный компромисс, который я наблюдал в Netflix, был связан с решением, принятым ещё до моего прихода в компанию: перенос всей инфраструктуры на AWS. «Ну и что?» — можете подумать вы. Многие компании используют AWS.&lt;/p&gt;
  &lt;p id=&quot;Frva&quot;&gt;Конечно, многие компании делают это &lt;em&gt;сегодня&lt;/em&gt;, но в 2010 году ни одна крупная компания этого не делала. Я помню, как читал несколько &lt;a href=&quot;https://netflixtechblog.com/four-reasons-we-choose-amazons-cloud-as-our-computing-platform-4aceb692afec&quot; target=&quot;_blank&quot;&gt;блогов&lt;/a&gt; &lt;a href=&quot;https://netflixtechblog.com/5-lessons-weve-learned-using-aws-1f2a28588e4c&quot; target=&quot;_blank&quot;&gt;постов&lt;/a&gt; о миграции Netflix на AWS до того, как устроился туда, и думал: «Они сумасшедшие». Но после того, как я устроился и увидел ситуацию своими глазами, я понял, что в этом есть смысл.&lt;/p&gt;
  &lt;p id=&quot;MfoX&quot;&gt;Каковы последствия работы в центре обработки данных, в локальной, не облачной среде?&lt;/p&gt;
  &lt;ul id=&quot;TxcH&quot;&gt;
    &lt;li id=&quot;GDVX&quot;&gt;Стабильная сеть и оборудование.&lt;/li&gt;
    &lt;li id=&quot;EPue&quot;&gt;Ограничения по фиксированной мощности. Возможно, нет &lt;em&gt;на постоянной основе &lt;/em&gt;фиксировано, но мощность можно увеличить по мере приобретения, установки и подключения оборудования.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;W0X9&quot;&gt;Каковы последствия работы в AWS или других облачных средах?&lt;/p&gt;
  &lt;ul id=&quot;17xo&quot;&gt;
    &lt;li id=&quot;osuA&quot;&gt;Практически неограниченная, эластичная ёмкость.&lt;/li&gt;
    &lt;li id=&quot;l0uK&quot;&gt;Нестабильная работа сети и оборудования. Если слово «нестабильная» звучит резко, давайте скажем «намного менее стабильная, чем хотелось бы».&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;J57g&quot;&gt;Если бы дело было только в этом, то экономическая целесообразность использования эластичных мощностей была бы достаточно веской, чтобы считать миграцию на AWS выгодной сделкой. Но с точки зрения команды Edge, эта сделка привела к возникновению множества других проблем.&lt;/p&gt;
  &lt;p id=&quot;tcwN&quot;&gt;Например:&lt;/p&gt;
  &lt;ul id=&quot;YNNi&quot;&gt;
    &lt;li id=&quot;1c1n&quot;&gt;Зацикленность на &lt;a href=&quot;https://netflixtechblog.com/making-the-netflix-api-more-resilient-a8ec62159c2d&quot; target=&quot;_blank&quot;&gt;отказоустойчивости&lt;/a&gt; при создании &lt;a href=&quot;https://netflixtechblog.com/introducing-hystrix-for-resilience-engineering-13531c1ab362&quot; target=&quot;_blank&quot;&gt;библиотек&lt;/a&gt; для реализации &lt;a href=&quot;https://netflixtechblog.com/fault-tolerance-in-a-high-volume-distributed-system-91ab4faae74a&quot; target=&quot;_blank&quot;&gt;автоматических выключателей, ограничений параллелизма и резервных копий&lt;/a&gt;, а также &lt;a href=&quot;https://netflixtechblog.com/hystrix-dashboard-turbine-stream-aggregator-60985a2e51df&quot; target=&quot;_blank&quot;&gt;информационных панелей для отслеживания этого поведения в режиме реального времени&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;lzsn&quot;&gt;Обнаружение и завершение работы неисправных инстансов AWS.&lt;/li&gt;
    &lt;li id=&quot;o6BU&quot;&gt;Доработка &lt;a href=&quot;https://netflixtechblog.com/netflix-shares-cloud-load-balancing-and-failover-tool-eureka-c10647ef95e5&quot; target=&quot;_blank&quot;&gt;обнаружения сервисов и балансировки нагрузки программного обеспечения&lt;/a&gt;для сотен эластичных кластеров.&lt;/li&gt;
    &lt;li id=&quot;at6j&quot;&gt;Точная настройка политик реактивного автомасштабирования.&lt;/li&gt;
    &lt;li id=&quot;ND93&quot;&gt;Отказ от реактивного автомасштабирования и создание &lt;a href=&quot;https://netflixtechblog.com/scryer-netflixs-predictive-auto-scaling-engine-a3f8fc922270&quot; target=&quot;_blank&quot;&gt;прогностической&lt;/a&gt; &lt;a href=&quot;https://netflixtechblog.com/scryer-netflixs-predictive-auto-scaling-engine-part-2-bb9c4f9b9385&quot; target=&quot;_blank&quot;&gt;системы автомасштабирования&lt;/a&gt; с нуля.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ORMP&quot;&gt;Этих проблем у нас не возникло бы, если бы мы остались в дата-центре. Но они были в разы лучше, чем программное обеспечение с фиксированной пропускной способностью и ограниченным ростом клиентской базы. Это был не только хороший компромисс для бизнеса, но и катализатор для улучшения наших инженерных возможностей в планетарном масштабе.&lt;/p&gt;
  &lt;h2 id=&quot;zsB4&quot;&gt;3. Хорошие архитектурные характеристики&lt;/h2&gt;
  &lt;p id=&quot;WBrl&quot;&gt;Давайте обсудим несколько характеристик хорошей и плохой архитектуры.&lt;/p&gt;
  &lt;figure id=&quot;VAto&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/21/00/21005a46-9f77-480c-a791-3bd0e0fb17f6.png&quot; width=&quot;1418&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;ysCe&quot;&gt;Хорошая архитектура не связана с хорошим кодом&lt;/h3&gt;
  &lt;p id=&quot;rzpA&quot;&gt;В самом начале моей карьеры я присутствовал на совещании и наблюдал, как недавно принятый на работу опытный инженер в течение 30 минут что-то лихорадочно рисовал на доске. Я понятия не имел, о чём он говорит, но старшие коллеги его очень уважали, поэтому я внимательно слушал.&lt;/p&gt;
  &lt;p id=&quot;2s7R&quot;&gt;Несколько недель спустя у меня появилось свободное время, и мы вместе начали воплощать в жизнь некоторые из его идей. Его код был ужасен, и ему с трудом удавалось заставить что-либо работать. Но он сказал кое-что, что показалось моему юному разуму глубоким:&lt;/p&gt;
  &lt;blockquote id=&quot;E87j&quot;&gt;«В пользовательском интерфейсе у нас жёстко прописаны SQL-запросы, — сказал он.&lt;br /&gt;— Нам нужно изменить это так, чтобы пользовательский интерфейс обращался к сервису, который абстрагирует запрос за счёт концепции, например „получить все элементы для текущего пользователя“».&lt;/blockquote&gt;
  &lt;p id=&quot;nxc9&quot;&gt;&lt;em&gt;Это отличная идея&lt;/em&gt;, подумал я. За следующие несколько лет я многому научился у него в плане тестирования, разделения задач, горячего и холодного хранения, сжатия, форматов и схем данных и многого другого. Но я так и не понял, как человек, который так плохо пишет код, может иметь такие чёткие представления о проектировании систем. Появилась более важная мысль:&lt;/p&gt;
  &lt;p id=&quot;sJLx&quot;&gt;&lt;strong&gt;Способность человека писать качественный код совершенно не зависит от его способности создавать или распознавать качественную архитектуру.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;B6el&quot;&gt;Я работал с руководителями технических отделов, которые годами не писали код, но при этом прекрасно разбирались в технических основах. Когда было нужно, они брали бразды правления в свои руки и направляли свои команды, уводя их от дорогостоящих ошибок и открывая перед ними широкие возможности. У них не было особых навыков программирования, но они обладали безупречным чувством стиля, интуицией и вкусом.&lt;/p&gt;
  &lt;p id=&quot;y0mf&quot;&gt;Я также работал с инженерами, которые были экспертами в различных тонкостях программирования, но при этом не обладали явными способностями к созданию систем, которые могли бы слаженно и функционально работать вместе. Их способность оптимально реализовывать классы или функции не выходила за рамки редактируемых ими исходных файлов.&lt;/p&gt;
  &lt;p id=&quot;zqD0&quot;&gt;Архитектура объединяет системы, созданные с помощью кода, но при этом является отдельной дисциплиной, имеющей мало общего с программированием. Вы не сможете с помощью LeetCode создать целостную, гибкую архитектуру, которая будет служить бизнесу.&lt;/p&gt;
  &lt;p id=&quot;nqpV&quot;&gt;Почему бы и нет? Давайте рассмотрим архетип «хорошо разбирается в архитектуре, но плохо пишет код». Я заметил, что таких людей привлекают самые важные детали. При разработке новой системы они задают такие вопросы:&lt;/p&gt;
  &lt;ul id=&quot;rf2b&quot;&gt;
    &lt;li id=&quot;DFd3&quot;&gt;Какие данные мы можем собрать, чтобы обеспечить правильную работу системы?&lt;/li&gt;
    &lt;li id=&quot;bxb9&quot;&gt;Какова максимально допустимая задержка для клиентов этой системы?&lt;/li&gt;
    &lt;li id=&quot;gh9I&quot;&gt;Нужно ли нам рассчитывать результаты в режиме реального времени или это можно сделать в автономном режиме, в пакетном режиме?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;OpwT&quot;&gt;Как правило, их меньше волнуют такие детали, как иерархия классов, названия методов и структура каталогов, которые не имеют большого значения в контексте бизнеса и распределённых систем.&lt;/p&gt;
  &lt;p id=&quot;06WM&quot;&gt;Но код не может быть совершенно бесполезным, верно? Давайте рассмотрим архетип «хорошо разбирается в коде, но плохо разбирается в архитектуре». Я думаю, что он возникает, когда у людей нет опыта работы с такими вещами, как задержка в сети, резервные варианты или режимы отказа.&lt;/p&gt;
  &lt;p id=&quot;7eco&quot;&gt;Обратите внимание, что я использую слово «архитектура» в значении «архитектура распределённых систем», что является общепринятым и отражает мой личный опыт.&lt;/p&gt;
  &lt;p id=&quot;qGHa&quot;&gt;В Netflix мы часто сталкивались с тем, что в серверных службах возникали медленные утечки памяти, которые было сложно обнаружить и устранить, потому что из-за политики автомасштабирования инстансы редко работали дольше 48 часов. Если бы мы сосредоточились на устранении утечек памяти, а не на автомасштабировании, Netflix не смог бы масштабироваться в соответствии со спросом и был бы гораздо менее прибыльным.&lt;/p&gt;
  &lt;h3 id=&quot;KSX1&quot;&gt;Хорошая архитектура объединяет людей, а не только системы&lt;/h3&gt;
  &lt;p id=&quot;8NyO&quot;&gt;Несколько лет спустя, будучи штатным инженером в крупной компании, занимающейся социальными сетями, я возглавил проект по созданию аналитики для нашей системы персонализации контента в режиме реального времени.&lt;/p&gt;
  &lt;p id=&quot;ZV7D&quot;&gt;Существующая архитектура была разработана на основе прототипа, созданного до моего прихода. Мы генерировали события в наших системах во время выполнения, которые некоторое время находились в очереди, прежде чем экспортироваться во внешнее хранилище данных.&lt;/p&gt;
  &lt;p id=&quot;cHzD&quot;&gt;В ходе этих мероприятий была получена следующая информация:&lt;/p&gt;
  &lt;ul id=&quot;vaqy&quot;&gt;
    &lt;li id=&quot;ZPOL&quot;&gt;Какой контент кому был показан в какое время&lt;/li&gt;
    &lt;li id=&quot;jivq&quot;&gt;Оценка модели машинного обучения для каждой пары пользователь/товар&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ipYm&quot;&gt;Эти данные позволили нам:&lt;/p&gt;
  &lt;ul id=&quot;qnGX&quot;&gt;
    &lt;li id=&quot;iPCe&quot;&gt;Отслеживайте предвзятость на разных этапах персонализации: от подбора кандидатов до фильтрации, ранжирования и показа&lt;/li&gt;
    &lt;li id=&quot;81YF&quot;&gt;Изучайте и устраняйте такие проблемы, как:&lt;/li&gt;
    &lt;ul id=&quot;LdjB&quot;&gt;
      &lt;li id=&quot;cpiQ&quot;&gt;Почему некоторые пользователи видят пустые страницы без рекомендаций?&lt;/li&gt;
      &lt;li id=&quot;IGzb&quot;&gt;Почему некоторые материалы неожиданно становятся более популярными, чем другие?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;tbzF&quot;&gt;С «социальной» точки зрения нужно было многое учесть:&lt;/p&gt;
  &lt;ul id=&quot;ts3Z&quot;&gt;
    &lt;li id=&quot;3TbW&quot;&gt;Моя очередь из заинтересованных лиц росла в геометрической прогрессии, поскольку каждый предлагал привлечь ещё двух человек для консультаций.&lt;/li&gt;
    &lt;li id=&quot;EiCQ&quot;&gt;«Нам нужен дизайн» — эту фразу часто повторяли те, с кем я разговаривал. Когда я спросил, каких целей мы не можем достичь из-за текущего дизайна, я не получил внятных ответов.&lt;/li&gt;
    &lt;li id=&quot;rYOO&quot;&gt;У нас был прототип конкурирующего проекта, который, по мнению нескольких инженеров в команде, мы должны были использовать вместо текущей системы.&lt;/li&gt;
    &lt;li id=&quot;d7lN&quot;&gt;Граница между тем, что было «аналитикой», и тем, что ею не являлось, была размытой. Например, нас несколько раз спрашивали, можем ли мы регистрировать функции машинного обучения вместе с аналитическими данными. Мы всегда отказывались из-за плотного графика, но я чувствовал, что мы упускаем возможность решить более масштабную и важную проблему.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;3u05&quot;&gt;Нам нужно было выработать единое видение, чтобы все были на одной волне, поэтому я написал документ с описанием проблемы, которую мы решали, — как с точки зрения бизнеса, так и с точки зрения масштаба, — и добавил несколько диаграмм. Я представил несколько вариантов доработки проекта и объяснил, какой из них, по моему мнению, был лучшим и почему. Затем я поделился этим документом.&lt;/p&gt;
  &lt;p id=&quot;mKDu&quot;&gt;После нескольких недель обсуждений с командой и заинтересованными сторонами ситуация не улучшилась, а стала заметно хуже. Команда была разобщена как никогда, и несколько подгрупп двигались в разных направлениях. Идея комплексного аналитического решения казалась несбыточной мечтой.&lt;/p&gt;
  &lt;p id=&quot;PcVn&quot;&gt;Вскоре после этого я ушёл из компании, так как понял, что это не моё. Но ещё несколько месяцев я задавался вопросом, что я мог бы сделать по-другому, чтобы добиться лучшего результата. Я всегда прихожу к одному и тому же ответу:&lt;/p&gt;
  &lt;p id=&quot;XwGn&quot;&gt;&lt;strong&gt;Я был слишком сосредоточен на решении технической проблемы, в то время как основная проблема носила социальный характер.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;Dcul&quot;&gt;Моя задача заключалась не только в том, чтобы принимать оптимальные технические решения. Моя задача состояла в том, чтобы объединить всех вокруг единой концепции, независимо от того, была она технически оптимальной или нет.&lt;/p&gt;
  &lt;p id=&quot;6ZYA&quot;&gt;В упомянутом выше случае с ранжированием видео я более года периодически лоббировал этот проект, прежде чем началась работа: я представлял слайды и рассылал их всем, кого мог найти, собирал кучу данных и делал новые слайды. На какое-то время всё затихло. А потом, наконец, звёзды сошлись, и мы начали действовать.&lt;/p&gt;
  &lt;p id=&quot;zDLZ&quot;&gt;В корпоративном мире объективно хорошие идеи встречаются редко. Идеи не обязательно должны быть &lt;em&gt;хорошими&lt;/em&gt; сами по себе, они просто должны двигать людей вперёд. Конечно, хорошие идеи с большей вероятностью будут двигать людей, чем плохие, но на рабочем месте что-то считается «хорошим», если с этим согласны нужные люди.&lt;/p&gt;
  &lt;h3 id=&quot;HKZ5&quot;&gt;Хорошая архитектура сочетает в себе практичность и устремлённость ввысь&lt;/h3&gt;
  &lt;p id=&quot;jzIK&quot;&gt;Примерно в 2020 году я работал главным инженером в крупной американской телекомпании. Моя работа была связана с масштабными улучшениями в области персонализированного ранжирования видео, и я вместе с архитектором работал над решением проблемы повышения гибкости ранжирования видео. Исторически сложилось так, что большая часть контента предоставлялась продуктом либо через поиск, либо через различные подборки, составленные людьми. Для полной персонализации контента требовалось по-новому объединить несколько функций, систем и команд.&lt;/p&gt;
  &lt;p id=&quot;5tzU&quot;&gt;Давайте вкратце поговорим об этих командах. Нашим основным партнёром была команда Search — группа из 20 или около того инженеров, которые управляли большим поисковым индексом, а также системой доступа ко всем коллекциям контента, отобранным редакторами. Их приоритетной задачей была стабильная и высокодоступная выдача релевантных результатов поиска. Обычно на внедрение изменений в их систему уходило не меньше месяца.&lt;/p&gt;
  &lt;p id=&quot;fMVW&quot;&gt;Мы были командой по персонализации, в которую входило около 10 специалистов по машинному обучению и инженеров-программистов. Мы владели несколькими сервисами, которые предоставляли пользователям персонализированный контент во время работы, а также многочисленными конвейерами данных и случайными пакетными заданиями. Нашим приоритетом было повышение вовлечённости пользователей за счёт максимального увеличения объёма персонализированного контента. Если бы вы попросили нас внести изменения в нашу систему, мы, скорее всего, смогли бы запустить их в производство за два рабочих дня.&lt;/p&gt;
  &lt;p id=&quot;Jovl&quot;&gt;Нашей целью было подготовить предложение, которое с высокой вероятностью было бы одобрено командами-партнёрами. Одним из моих личных ограничений было то, что предложение по повышению персонализации должно было быть выполнимым в рамках наших текущих обязанностей и организационной структуры. Нам нужно было увеличить скорость внедрения новых функций и экспериментов в производство, поэтому мы должны были внимательно и реалистично оценивать требования, предъявляемые к самым медлительным командам.&lt;/p&gt;
  &lt;p id=&quot;nKZO&quot;&gt;Мой партнёр-архитектор не согласился с этим и сказал:&lt;/p&gt;
  &lt;blockquote id=&quot;kUGZ&quot;&gt;«Мы должны предложить наилучшее техническое решение.&lt;br /&gt;А если для этого потребуются организационные изменения, пусть этим занимаются руководители».&lt;/blockquote&gt;
  &lt;p id=&quot;uhhz&quot;&gt;Это была интересная идея, но в то время предложение, требующее реорганизации, в этой компании быстро уходило в никуда. Кроме того, это ограничило бы мои возможности для написания будущих предложений.&lt;/p&gt;
  &lt;p id=&quot;Tant&quot;&gt;В данном случае команда по поиску работала медленно по объективным причинам. Команда по персонализации работала быстро, тоже по объективным причинам. Одной из целей предлагаемых нами архитектурных изменений было ускорение тестирования новых моделей машинного обучения в производственной среде. Если бы добавление новой модели или настройка существующей модели требовали внесения изменений вручную и тестирования со стороны команды по поиску, мы бы продолжали работать медленно, в их темпе. Игнорировать это ограничение означало бы предлагать решение ограниченной ценности.&lt;/p&gt;
  &lt;p id=&quot;8QK9&quot;&gt;&lt;strong&gt;Распространённый стереотип об архитекторах заключается в том, что они предлагают решения, которые не работают в реальном мире&lt;/strong&gt;. Их решения требуют предварительного создания нового, идеального мира. В нашем случае идеальный мир можно создать путём реорганизации, которая разделит команду Search, или, возможно, путём переписывания всех сервисов с нуля.&lt;/p&gt;
  &lt;p id=&quot;yS80&quot;&gt;Но проблема не в том, чтобы придумать новые миры, а в том, чтобы совместить идеальный мир с тем, что существует на самом деле. Конечно, было бы идеально провести реорганизацию или переписать правила, но можем ли мы сделать что-то ценное в рамках существующих ограничений, чтобы выявить возможности, которые упускаются в текущем состоянии?&lt;/p&gt;
  &lt;p id=&quot;mkUO&quot;&gt;Мы стратегически подошли к решению этой проблемы и устранили её с помощью прототипирования. Мы не смогли заручиться поддержкой для масштабного предложения, поэтому предложили три разные архитектуры и запустили их параллельно с небольшим объёмом реального клиентского трафика. Вариант, который пользовался наибольшим спросом у команды по поиску, работал значительно хуже остальных, отчасти из-за некоторых архитектурных недостатков, но в основном из-за того, что они работали медленнее, чем команда по персонализации. Производственный трафик — это главное практическое отличие.&lt;/p&gt;
  &lt;h2 id=&quot;pvhs&quot;&gt;4. Плохая архитектура — это большой объём работы, который мало что меняет&lt;/h2&gt;
  &lt;p id=&quot;1K6m&quot;&gt;Давайте обсудим роль главного инженера из &lt;em&gt;«Хорошая архитектура сочетает в себе практичность и стремление к идеалу»&lt;/em&gt; раздела выше. Меня попросили рассмотреть предложение по «улучшению архитектуры персонализации», подготовленное инженером из команды, с которой я работал. Оно содержало чётко сформулированные решения, такие как:&lt;/p&gt;
  &lt;ul id=&quot;ypXN&quot;&gt;
    &lt;li id=&quot;MSAK&quot;&gt;Разделение нашего монолитного «сервиса персонализации» на микросервисы.&lt;/li&gt;
    &lt;li id=&quot;krmt&quot;&gt;Запуск наших контейнеров с помощью Amazon EKS.&lt;/li&gt;
    &lt;li id=&quot;ri1C&quot;&gt;Использование CloudWatch для сбора журналов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;IQeB&quot;&gt;Предложение было чётким, подробным и хорошо написанным. Оно произвело впечатление как на моего руководителя, так и на вышестоящее руководство. Но у меня было одно серьёзное опасение: в нём не рассматривались наиболее важные проблемы.&lt;/p&gt;
  &lt;p id=&quot;ymW9&quot;&gt;&lt;strong&gt;Проблема № 1: слишком сложно проводить A/B-тестирование.&lt;/strong&gt; У нас были функциональные, но громоздкие инструменты. Распределение пользователей по тестам включало в себя:&lt;/p&gt;
  &lt;ul id=&quot;OKpM&quot;&gt;
    &lt;li id=&quot;1PY5&quot;&gt;Поиск пользователей вручную&lt;/li&gt;
    &lt;li id=&quot;Wzoe&quot;&gt;...выгрузка пользователей в файлы CSV&lt;/li&gt;
    &lt;li id=&quot;VPKL&quot;&gt;... разделение пользователей на контрольную и экспериментальную группы&lt;/li&gt;
    &lt;li id=&quot;MrKK&quot;&gt;... сбор метрик для каждой группы путем ручного запуска заданий Spark&lt;/li&gt;
    &lt;li id=&quot;0GO3&quot;&gt;…или выполнение сложных запросов, связанных с файлами CSV&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7xnf&quot;&gt;Процесс не был масштабируемым: одновременное выполнение большого количества тестов было сложной задачей.&lt;/p&gt;
  &lt;p id=&quot;FlIY&quot;&gt;&lt;strong&gt;Проблема № 2: слишком сложно внедрять новые модели машинного обучения. &lt;/strong&gt;Нам нужно было внедрить новые модели машинного обучения для ранжирования видео. Мы создали библиотеку-оболочку для встроенной модели машинного обучения, которая использовалась для ранжирования видео в системе поиска и хранения, принадлежащей другой команде. Мы надеялись перейти на систему, в которой ранжирование предоставлялось бы как услуга по протоколу HTTP, или, возможно, инвертировать модель, чтобы &lt;em&gt;RankingService&lt;/em&gt; вызывал &lt;em&gt;SearchService&lt;/em&gt;, а не наоборот. В любом случае нам нужно было развиваться в этой области, иначе мы бы так и продолжали использовать старые модели и двигались бы очень медленно.&lt;/p&gt;
  &lt;p id=&quot;bv4S&quot;&gt;В целом решения, предложенные в проекте, были правильными и хорошими. Однако, если бы я заглянул на год вперёд после завершения этой работы, я бы увидел, что самые большие проблемы никуда не делись и они будут ограничивать нашу способность быстрее повышать ценность бизнеса.&lt;/p&gt;
  &lt;p id=&quot;hgVE&quot;&gt;&lt;strong&gt;Плохая архитектурная работа — это перестановка мебели, когда нужен новый дом.&lt;/strong&gt; Может быть, здесь изменена технология или там система разделена на несколько частей, но в конечном счёте это стазис, маскирующийся под архитектуру: ничего важного не происходит.&lt;/p&gt;
  &lt;p id=&quot;cVAQ&quot;&gt;Для этого могут быть веские причины. Для решения действительно сложной проблемы часто требуется совместная работа нескольких команд, и, возможно, некоторые из них еще не включились в процесс. Возможно, вы ждете, что продуктовая стратегия повлияет на техническую стратегию, или, может быть, ваши текущие ограничения настолько суровы, что перестановка мебели — лучшее, на что можно потратить время инженеров. Или вы можете бояться неудачи, а риск неудачи при попытке решить сложную межфункциональную проблему значительно выше, чем при решении чего-то более простого и локализованного.&lt;/p&gt;
  &lt;p id=&quot;rUyj&quot;&gt;Возвращаясь к предложению — оно было одобрено высшим руководством, которое внесло изменения, и всё прошло хорошо. Но мне не кажется, что что-то улучшилось настолько, чтобы это имело значение.&lt;/p&gt;
  &lt;h2 id=&quot;Y7ni&quot;&gt;5. Удачные архитектурные решения в проектах Netflix&lt;/h2&gt;
  &lt;p id=&quot;UUrQ&quot;&gt;Мы обсудили несколько архитектурных нюансов и антипаттернов. Теперь давайте вернёмся к моему основному тезису о том, что &lt;em&gt;хорошая&lt;/em&gt; архитектура — это последовательное решение существующих проблем с помощью более эффективных решений. Ниже приведены несколько моих любимых архитектурных компромиссов, к которым я пришёл за время работы в Netflix.&lt;/p&gt;
  &lt;h3 id=&quot;3zdU&quot;&gt;Необычные компромиссы: Зуул&lt;/h3&gt;
  &lt;p id=&quot;X5sO&quot;&gt;В первый год моей работы в Netflix для трафика API использовался сторонний прокси-сервер. Внутренний &lt;a href=&quot;https://netflixtechblog.com/redesigning-the-netflix-api-db5a7221fcff&quot; target=&quot;_blank&quot;&gt;Netflix API&lt;/a&gt; использовался практически для всего, что можно было делать на устройстве, не связанном напрямую с воспроизведением: аутентификации, поиске, получении персонализированного контента и т. д.&lt;/p&gt;
  &lt;p id=&quot;ZryP&quot;&gt;Сторонний прокси-сервер был надёжным, но неудобным в настройке, и у нас было мало информации о том, что он делает. Например, у нас не было возможности отслеживать количество одновременных подключений прокси-сервера к конкретной нижестоящей системе, кроме как через SSH-подключение к серверу и передачу &lt;a href=&quot;https://en.wikipedia.org/wiki/Netstat&quot; target=&quot;_blank&quot;&gt;netstat&lt;/a&gt; в grep, что было круто, но неудобно.&lt;/p&gt;
  &lt;p id=&quot;yBbK&quot;&gt;Со временем стало ясно, что наш сторонний прокси-сервер сильно ограничивает наши возможности как команды, поэтому один из наших самых талантливых инженеров начал проект по его переписыванию с нуля, и &lt;a href=&quot;https://netflixtechblog.com/announcing-zuul-edge-service-in-the-cloud-ab3af5be08ee&quot; target=&quot;_blank&quot;&gt;Zuul&lt;/a&gt; появился на свет. Это был специально созданный пограничный прокси-сервис, который обрабатывал все вызовы API, не связанные с воспроизведением, такие как аутентификация, поиск, получение персонализированного контента и подобные операции.&lt;/p&gt;
  &lt;p id=&quot;iAXq&quot;&gt;Переписать критически важную для бизнеса систему, которая обрабатывала более 50 000 запросов в секунду (RPS), было смелее, чем обычно, но такова была культура Netflix.&lt;/p&gt;
  &lt;p id=&quot;KXrt&quot;&gt;Zuul был написан двумя инженерами, одним из которых был я. Мы прошли путь от идеи до запуска в производство менее чем за шесть месяцев. Это был тернистый и увлекательный путь, особенно во время запуска, когда мы откатывали и повторно развертывали систему десятки раз, чтобы исправить различные проблемы на стороне устройства, связанные с OAuth, манипуляциями с HTTP-заголовками и тому подобным. Но быстрое обнаружение и исправление ошибок становится привычным делом, когда вы заменяете стабильную скучную систему гибкой, которую вы постоянно настраиваете и модифицируете.&lt;/p&gt;
  &lt;p id=&quot;MqSu&quot;&gt;&lt;strong&gt;Мы пошли на весьма необычный компромисс с Zuul:&lt;/strong&gt; снижение стабильности ради значительного повышения гибкости в важной части нашего стека. Обычно стабильность не меняют ради гибкости, но мы сделали такой выбор, потому что у нас было много идей о том, как использовать эту гибкость, например:&lt;/p&gt;
  &lt;ul id=&quot;bMWu&quot;&gt;
    &lt;li id=&quot;0WBb&quot;&gt;Пользовательские правила маршрутизации для перенаправления определённых пользователей или устройств в определённые кластеры серверных служб&lt;/li&gt;
    &lt;li id=&quot;97o2&quot;&gt;Пограничная маршрутизация и переход на другой ресурс&lt;/li&gt;
    &lt;li id=&quot;4m2X&quot;&gt;Подробная информация о трафике&lt;/li&gt;
    &lt;li id=&quot;sL4A&quot;&gt;Повышенная безопасность, в том числе защита от DoS-атак и мошенничества&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8Gfo&quot;&gt;Zuul изменил подход компании к маршрутизации трафика, не связанного с CDN. Но мне всегда было интересно, как мы использовали Zuul в нестандартных ситуациях:&lt;/p&gt;
  &lt;ul id=&quot;6wfo&quot;&gt;
    &lt;li id=&quot;SkQq&quot;&gt;Мы взломали фильтры, чтобы удалить или преобразовать заголовки HTTP-ответов, которые вызывали ошибки на устройствах. Нам нужно было действовать очень точно, поскольку взаимодействие устройств и заголовков сильно различалось в зависимости от устройств и версий, и удаление заголовка ответа могло решить проблему на одном устройстве, но вызвать сбой на десяти других.&lt;/li&gt;
    &lt;li id=&quot;BdzS&quot;&gt;Мы столкнулись со множеством особенностей устройств, в том числе с отсутствием или неправильным написанием конечных точек и параметров HTTP, странными пользовательскими схемами аутентификации и многим другим. Зачастую лучше устранить подобные недочёты в одном месте, чем распределять их по всему стеку.&lt;/li&gt;
    &lt;li id=&quot;Xp0x&quot;&gt;Один из коллег написал фильтр, который временно блокирует Netflix у него дома, чтобы мотивировать сына делать уроки. Фильтр легко настраивается: как только уроки сделаны, он отключается.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;GT46&quot;&gt;Создание инструментов для сокращения объёма оперативной работы: Grepzilla&lt;/h3&gt;
  &lt;p id=&quot;U94j&quot;&gt;В команде On the Edge в Netflix было много оперативной работы, которая постоянно отвлекала нас от повседневных дел. Часто к нам обращались случайные инженеры из других команд с вопросами вроде: «Вы не знаете, почему я получаю ответ HTTP 5xx на этот конкретный запрос?»&lt;/p&gt;
  &lt;p id=&quot;WLWu&quot;&gt;У нас также было много производственных инцидентов. Чтобы их устранить, нам часто приходилось отвечать на такие вопросы, как «наблюдали ли вы за последние 15 минут увеличение количества сбоев в работе каких-либо конкретных вышестоящих служб?»&lt;/p&gt;
  &lt;p id=&quot;mraI&quot;&gt;Крупномасштабные инциденты — это плохо, но обычно их можно быстро устранить. По моему опыту, гораздо более болезненными были длительные проблемы с небольшим количеством запросов, которые затрагивали небольшое число клиентов. Чтобы решить такие проблемы, мы задавали вопросы, например о том, можем ли мы просмотреть все сеансы запросов с устройств типа X и найти что-то необычное.&lt;/p&gt;
  &lt;p id=&quot;0qZ4&quot;&gt;Если ваша команда перегружена вопросами и расследованиями, можно использовать несколько подходов:&lt;/p&gt;
  &lt;ol id=&quot;nkMv&quot;&gt;
    &lt;li id=&quot;MnU5&quot;&gt;Направляйте все запросы одному дежурному инженеру или инженеру службы поддержки&lt;/li&gt;
    &lt;li id=&quot;2CmN&quot;&gt;Попробуйте нормализовать потребление с помощью JIRA, Google Forms, электронных таблиц или аналогичного инструмента&lt;/li&gt;
    &lt;li id=&quot;gx2A&quot;&gt;Смиритесь с тем, что постоянные вопросы — это часть работы, и ничего не делайте, чтобы улучшить ситуацию&lt;/li&gt;
    &lt;li id=&quot;ReAL&quot;&gt;Перепоручите работу подрядчикам&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;mqdT&quot;&gt;&lt;strong&gt;Мы решили найти способ справляться с большим количеством входящих запросов.&lt;/strong&gt; Нам нужно было улучшить наши возможности по проведению расследований, а также дать возможность командам партнеров отвечать на их вопросы без нашего непосредственного участия.&lt;/p&gt;
  &lt;p id=&quot;ehf7&quot;&gt;Одним из внутренних инструментов, которые мы создали, был &lt;strong&gt;Grepzilla&lt;/strong&gt;, распределённый аналог tail и grep, или специализированная, но значительно менее функциональная версия Splunk. Мы с коллегой работали над ним неполный рабочий день в течение трёх месяцев, пока не набралось достаточно функционала для запуска в производство. Если посмотреть шире, то можно увидеть, что мы пожертвовали &lt;em&gt;необходимостью отвечать на бесконечный поток рабочих вопросов&lt;/em&gt; ради &lt;em&gt;использования системы запросов событий в реальном времени.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;2BJY&quot;&gt;Это открыло доступ к нескольким полезным функциям:&lt;/p&gt;
  &lt;ul id=&quot;Cn8K&quot;&gt;
    &lt;li id=&quot;sRUS&quot;&gt;Группировка HTTP-ошибок по зонам доступности, типам устройств, местоположению клиентов и многим другим параметрам в режиме реального времени&lt;/li&gt;
    &lt;li id=&quot;pr4d&quot;&gt;Быстрое устранение ошибок в конкретных бэкенд-системах, которые давали сбой&lt;/li&gt;
    &lt;li id=&quot;27lc&quot;&gt;Для ошибок с меньшим количеством символов нужно найти конкретные узлы, на которых возникла ошибка, чтобы мы могли &lt;a href=&quot;https://en.wikipedia.org/wiki/Secure_Shell&quot; target=&quot;_blank&quot;&gt;SSH&lt;/a&gt; подключиться к ним и найти более подробную информацию в журналах ошибок&lt;/li&gt;
    &lt;li id=&quot;Eyaf&quot;&gt;Поиск медленных запросов с последующим разделением их на самые медленные подзапросы для выявления основных причин задержек&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;WgPI&quot;&gt;Grepzilla действительно помогла нам сократить время, затрачиваемое на расследование пограничных случаев. Однажды я заметил всплеск трафика в нашем европейском кластере Zuul, запустил Grepzilla для анализа трафика и увидел, как в режиме реального времени происходит атака по словарю, в ходе которой злоумышленник перебирал пароли в алфавитном порядке.&lt;/p&gt;
  &lt;h3 id=&quot;Nny9&quot;&gt;Замена одних ограничений другими: маршрутизация на границе нескольких регионов&lt;/h3&gt;
  &lt;p id=&quot;g3Au&quot;&gt;В 2012 году произошёл &lt;a href=&quot;https://netflixtechblog.com/a-closer-look-at-the-christmas-eve-outage-d7b409a529ee&quot; target=&quot;_blank&quot;&gt;масштабный сбой в работе AWS us-east-1&lt;/a&gt; в канун Рождества, который затронул многие критически важные балансировщики нагрузки Netflix.&lt;/p&gt;
  &lt;p id=&quot;sygn&quot;&gt;Мы ненадолго задумались о создании собственных балансировщиков нагрузки, но решили этого не делать. Вместо этого мы расширили наши возможности, развернув Zuul в AWS us-west-2 и направив трафик с западного побережья Северной Америки на наши существующие серверы в us-east-1. Мы назвали Zuul в us-west-2 нашим &lt;a href=&quot;https://netflixtechblog.com/isthmus-resiliency-against-elb-outages-d9e0623484f3&quot; target=&quot;_blank&quot;&gt;Перешейком&lt;/a&gt;. Идея заключалась в том, что если у нас снова выйдет из строя балансировщик нагрузки в us-east-1, мы сможем перенаправить DNS на us-west-2, чтобы избежать этого. Задержка была бы выше, но и доступность была бы выше, что является хорошим компромиссом.&lt;/p&gt;
  &lt;p id=&quot;GnAC&quot;&gt;Но такой подход повысил отказоустойчивость только на периферии. Остальная часть нашего серверного стека по-прежнему была уязвима для сбоев в us-east-1. Поэтому мы &lt;a href=&quot;https://netflixtechblog.com/active-active-for-multi-regional-resiliency-c47719f6685b&quot; target=&quot;_blank&quot;&gt;перенесли весь наш стек в us-west-2&lt;/a&gt;и разделили трафик между регионами.&lt;/p&gt;
  &lt;p id=&quot;xB1b&quot;&gt;Очевидно, что управлять трафиком в нескольких регионах сложнее, чем в одном. Нам нужно было обеспечить разумное распределение трафика, доставлять все развертывания и изменения конфигурации во все регионы, а также определять нужный регион при отладке. Технически мы уже работали с несколькими регионами, потому что в 2011 году развернули сервис в eu-west-1 для запуска в Европе. Однако это решение было принято в первую очередь для развития бизнеса, а не для обеспечения отказоустойчивости, и не предполагало переноса существующего трафика, поскольку все европейские клиенты были новыми.&lt;/p&gt;
  &lt;p id=&quot;49XS&quot;&gt;&lt;strong&gt;Мы отказались от сложностей и ограничений, связанных с &lt;em&gt;максимальным повышением доступности в одном регионе&lt;/em&gt; в пользу сложностей, связанных с &lt;em&gt;максимальным повышением доступности в нескольких регионах&lt;/em&gt;.&lt;/strong&gt; Это позволило нам перейти от полной зависимости от одного региона AWS к частичной зависимости от нашей способности быстро и эффективно перераспределять трафик между несколькими регионами.&lt;/p&gt;
  &lt;p id=&quot;ObSs&quot;&gt;Это, несомненно, того стоило. Первым шагом в устранении серьёзных инцидентов в отдельных регионах стало перенаправление трафика в более стабильные регионы. Мы начали проводить &lt;a href=&quot;https://netflixtechblog.com/chaos-engineering-upgraded-878d341f15fa&quot; target=&quot;_blank&quot;&gt;плановые учения по аварийному переключению&lt;/a&gt;, которые сделали этот процесс более безопасным, быстрым и рутинным.&lt;/p&gt;
  &lt;h3 id=&quot;VI2a&quot;&gt;Модернизация системы для повышения эффективности в будущем: глобальные модели персонализации на основе ИИ и МО&lt;/h3&gt;
  &lt;p id=&quot;0b2u&quot;&gt;До 2016 года многие основные модели персонализации Netflix обучались на региональном уровне. Это означало, что модели, используемые для рекомендаций контента в определённом географическом регионе, обучались только на данных пользователей из этого региона.&lt;/p&gt;
  &lt;p id=&quot;oH2c&quot;&gt;Одним из преимуществ такого подхода было то, что собрать обучающие данные было несложно: достаточно было отфильтровать данные из соответствующего региона. Но у этого подхода были и недостатки, один из которых заключался в том, что модель не могла обучаться глобально. Модели, обученные на данных из небольших стран, не учитывали соответствующие модели использования в других странах.&lt;/p&gt;
  &lt;p id=&quot;x1S6&quot;&gt;Итак, когда в 2016 году Netflix вышел на мировой рынок, &lt;a href=&quot;https://netflixtechblog.com/recommending-for-the-world-8da8cbcf051b&quot; target=&quot;_blank&quot;&gt;то же самое сделали многие модели персонализации&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;ZbSd&quot;&gt;В связи с этим возникла новая проблема: необходимо было обеспечить обучение каждой глобальной модели на достаточном количестве данных из каждой страны, чтобы она могла эффективно работать со всеми участниками.&lt;/p&gt;
  &lt;p id=&quot;NV44&quot;&gt;&lt;strong&gt;Мы отказались от простоты обучения и использования региональных моделей в пользу сложной задачи по сбору разнообразных обучающих данных для глобальных моделей. &lt;/strong&gt;Когда в 2015 году я присоединился к команде Netflix, занимающейся инфраструктурой персонализации, я и представить себе не мог, что буду проводить большую часть времени, обсуждая обучающие данные. Но я рад, что так вышло, потому что я многому научился, например:&lt;/p&gt;
  &lt;ul id=&quot;1RYv&quot;&gt;
    &lt;li id=&quot;C2Lb&quot;&gt;При случайной выборке в наборе данных преобладают самые многочисленные группы. В то время при случайной выборке наших данных об использовании 90 % пользователей из США были бы в базе данных с длительным стажем. Это было не лучшим решением для обучения модели, которая также использовалась для обслуживания новых пользователей в Индии или Японии.&lt;/li&gt;
    &lt;li id=&quot;mYsI&quot;&gt;Если вы хотите проводить обучение с использованием одинакового объёма данных по каждой стране, размер набора данных будет ограничен численностью населения самой маленькой страны. Это не лучший вариант, так как большинство моделей плохо работают при недостаточном количестве обучающих примеров.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;JEOC&quot;&gt;Самое главное, что я понял: когда начинаешь детально изучать обучающие данные, тебя ждут сюрпризы. Это один из тех камней преткновения, за которые мы часто боимся браться из-за того, что находится под ними. Но несмотря на то, что под ними скрывается много неприглядного, там также есть возможности для роста.&lt;/p&gt;
  &lt;p id=&quot;hqzA&quot;&gt;Когда мы увидели, насколько плохи некоторые из наших обучающих данных, мы ужаснулись. Но после того, как мы это исправили, продукт стал лучше.&lt;/p&gt;
  &lt;p id=&quot;T2jh&quot;&gt;Когда мы обнаружили, что случайность, которую мы внедряли для 10 % пользователей, меняющихся каждые 10 дней, на самом деле не менялась, а просто месяцами показывалась одним и тем же пользователям, мы снова расстроились. Но, опять же, после того как мы это исправили, продукт стал лучше.&lt;/p&gt;
  &lt;p id=&quot;l0Lt&quot;&gt;Хорошая архитектура — это не только выгодные сделки и не только решение проблем, чтобы завтрашний день был лучше сегодняшнего: это ещё и выбор в пользу развития бизнеса и инженерных возможностей. Это выбор того, под какие камни заглянуть, потому что преодоление уродства, скрытого под ними, сделает вас сильнее.&lt;/p&gt;
  &lt;h2 id=&quot;mpjc&quot;&gt;6. Как улучшить свои навыки в области архитектуры&lt;/h2&gt;
  &lt;p id=&quot;g8E8&quot;&gt;Мы обсудили архитектурные нюансы и рассмотрели примеры исключительных архитектурных решений, с которыми я сталкивался за свою карьеру. Теперь я хотел бы завершить эту статью несколькими советами о том, как улучшить свои навыки в области архитектуры.&lt;/p&gt;
  &lt;h3 id=&quot;YJdz&quot;&gt;Разрабатывайте системы, исходя из того, что может сломаться&lt;/h3&gt;
  &lt;p id=&quot;EImO&quot;&gt;На протяжении всей своей карьеры я задавал на собеседованиях такой вопрос: я рисую простую систему, состоящую из двух сервисов, которые взаимодействуют по протоколу HTTP — один в качестве клиента (сервис 1), а другой в качестве сервера (сервис 2). Затем я прошу кандидата описать все возможные сбои в работе системы.&lt;/p&gt;
  &lt;p id=&quot;UEwE&quot;&gt;Обычно в ответ на это говорят, что service2 может «стать медленным», на что я отвечаю:&lt;/p&gt;
  &lt;ul id=&quot;FaTN&quot;&gt;
    &lt;li id=&quot;T36Z&quot;&gt;Что именно означает «медленно»?&lt;/li&gt;
    &lt;li id=&quot;Dake&quot;&gt;По каким причинам запросы от сервиса 1 к сервису 2 могут выполняться медленно?&lt;/li&gt;
    &lt;li id=&quot;yjwe&quot;&gt;Как измеряется задержка?&lt;/li&gt;
    &lt;ul id=&quot;Blew&quot;&gt;
      &lt;li id=&quot;oMoC&quot;&gt;Могут ли другие факторы влиять на воспринимаемую задержку service2 в зависимости от способа измерения?&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;SXtG&quot;&gt;Каковы последствия замедления работы сервиса 2 и как их можно смягчить?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;d02I&quot;&gt;После нескольких минут разговора с кандидатом я получил довольно полное представление о его профессиональных знаниях и опыте, а также узнал несколько историй о соответствующих сбоях, во время которых он был на дежурстве.&lt;/p&gt;
  &lt;p id=&quot;R08h&quot;&gt;Мы также начнём искать решения:&lt;/p&gt;
  &lt;ul id=&quot;wGFP&quot;&gt;
    &lt;li id=&quot;PjMd&quot;&gt;Чтобы ускорить работу сервиса 2, можно добавить кэш.&lt;/li&gt;
    &lt;li id=&quot;qqVH&quot;&gt;Если данные меняются нечасто, мы всегда можем проверить кэш перед отправкой запросов в сервис.&lt;/li&gt;
    &lt;li id=&quot;sCzY&quot;&gt;Если запуск кластера, способного кэшировать всё, обходится слишком дорого, то какой процент обращений к кэшу можно считать приемлемым?&lt;/li&gt;
    &lt;li id=&quot;MWno&quot;&gt;Если кэш исчезнет во время сбоя, как мы сможем ограничить зону поражения?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;zbnH&quot;&gt;&lt;strong&gt;Научитесь определять, что может пойти не так, и предлагайте решения.&lt;/strong&gt; Мы разрабатывали систему, двигаясь в обратном направлении от &lt;em&gt;эксплуатационных проблем&lt;/em&gt; к решениям, выраженным в системном проектировании. Если вспомнить продуктивные обсуждения архитектуры, в которых я участвовал, то можно сказать, что понимание эксплуатационных проблем было критически важным навыком, который часто недооценивался многими инженерами.&lt;/p&gt;
  &lt;h3 id=&quot;vx3y&quot;&gt;Знайте свою аудиторию&lt;/h3&gt;
  &lt;p id=&quot;KSmM&quot;&gt;Большая часть работы архитектора или старшего инженера заключается в том, чтобы убедить аудиторию принять ваши идеи. Без этого ничего не сдвинется с мёртвой точки.&lt;/p&gt;
  &lt;p id=&quot;VGWD&quot;&gt;Я помню, как смотрел презентацию, в которой была идея, которая запала мне в душу: цель любой презентации — убедить аудиторию совершить какое-то действие. Всё, что вы говорите, должно быть направлено на достижение этой цели.&lt;/p&gt;
  &lt;p id=&quot;KtJX&quot;&gt;Но вы не убедите инженера, используя ту же точку зрения, данные и формулировки, которые применили бы к руководителю. Точно так же вы не убедите менеджера по инжинирингу так же, как менеджера по продукту. Если копнуть глубже, то успешный подход может отличаться в зависимости от того, где находится человек — в районе залива Сан-Франциско или в Индии, не говоря уже о других странах, сферах и отраслях.&lt;/p&gt;
  &lt;p id=&quot;ARBi&quot;&gt;&lt;strong&gt;Перед каждым разговором тщательно продумывайте, какие действия вы хотите, чтобы совершила аудитория, и следите за тем, чтобы ваши слова и схемы способствовали достижению этой цели.&lt;/strong&gt; Если вы знаете свою аудиторию — кто эти люди, что они знают и чего не знают, чего они хотят, — то эта задача становится намного проще.&lt;/p&gt;
  &lt;h3 id=&quot;mVPG&quot;&gt;Сосредоточьтесь на правильных деталях&lt;/h3&gt;
  &lt;p id=&quot;7WI3&quot;&gt;При решении любой проблемы необходимо учитывать множество деталей, и некоторые из них гораздо важнее других. Один из первых шагов в решении проблемы — определение ключевых деталей и преобразование их в решения с помощью списка доступных вариантов.&lt;/p&gt;
  &lt;p id=&quot;GXbx&quot;&gt;Для этого есть несколько причин. Во-первых, нужно определить все решения, которые необходимо принять. Во-вторых, нужно классифицировать решения как важные или не очень. Незначительные решения можно отложить или делегировать кому-то другому, чтобы сосредоточиться на самых важных. Эти два типа решений можно сравнить с «односторонними» и «двусторонними» дверями, о которых говорил Джефф Безос в &lt;a href=&quot;https://s2.q4cdn.com/299287126/files/doc_financials/annual/2015-Letter-to-Shareholders.PDF&quot; target=&quot;_blank&quot;&gt;письме акционерам Amazon в 2015 году&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;ABNG&quot;&gt;Ещё одна причина такого подхода заключается в том, что вы можете эффективно донести до аудитории лишь несколько идей за раз. Предложение будет гораздо более убедительным, если вы сосредоточитесь на двух решениях, а не на двадцати. А если вы рецензируете чужое предложение, то ваши комментарии с большей вероятностью возымеют эффект, если вы ограничитесь несколькими существенными замечаниями, а не двадцатью незначительными претензиями.&lt;/p&gt;
  &lt;p id=&quot;4TAY&quot;&gt;Если говорить конкретнее, то одна из деталей, которая часто не даёт мне покоя, — это задержка. За эти годы я видел множество предложений, связанных с вычислениями, которые невозможно выполнить за приемлемое время из-за таких ограничений, как логическая последовательность, размер данных и задержка в сети. Если вы спросите об этом на совещании или при обсуждении документа, вам могут ответить: «Мы разберёмся с этим позже». Но «позже» — это слишком поздно, если фундаментальные аспекты архитектуры невозможно оптимизировать для достаточно быстрого выполнения. Чтобы донести эту мысль, вам действительно нужно углубиться в детали. В долгосрочной перспективе это будет только лучше.&lt;/p&gt;
  &lt;p id=&quot;Z9pP&quot;&gt;&lt;strong&gt;Сосредоточьтесь на главном, чтобы лучше соображать и выражать свои мысли, а также добиться максимального эффекта. &lt;/strong&gt;Ваше время, энергия и умственные способности ограничены, как и у всех остальных.&lt;/p&gt;
  &lt;h3 id=&quot;1Ii7&quot;&gt;Сделай себя полезным&lt;/h3&gt;
  &lt;p id=&quot;6BiU&quot;&gt;Независимо от должности или стажа работы, все мы занимаемся тем, что переводим проекты из стадии идеи в стадию реализации. Если следующий шаг неясен, найдите способ — любой способ — двигаться дальше.&lt;/p&gt;
  &lt;p id=&quot;xeyc&quot;&gt;Это может быть связано со многими вещами. Вот несколько личных примеров:&lt;/p&gt;
  &lt;ul id=&quot;VHQu&quot;&gt;
    &lt;li id=&quot;Ok8o&quot;&gt;Потратьте месяц на то, чтобы повысить скорость развёртывания, так как это позволит добиться многих улучшений в дальнейшем.&lt;/li&gt;
    &lt;li id=&quot;GPBl&quot;&gt;Руководить проектом, выступая посредником между несколькими командами, которые не ладят друг с другом.&lt;/li&gt;
    &lt;li id=&quot;TMFs&quot;&gt;Написание стратегических или концептуальных документов или помощь коллегам в их доработке.&lt;/li&gt;
    &lt;li id=&quot;USPq&quot;&gt;Написание тестов, инструментов или скриптов для повышения надёжности или удобства использования конкретной системы.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;xVio&quot;&gt;Этот список можно отнести к «черновой работе», поэтому следите за тем, сколько времени вы на неё тратите, если ваша организация не ценит её. Но я заметил, что если вы зарекомендовали себя как компетентный специалист, то заполнение этих пробелов и продвижение вперёд могут расширить ваши возможности в будущем. Кроме того, я заметил, что архитекторам, которые не боятся запачкать руки и выполнять чёрновую работу, гораздо проще оказывать влияние на других. Авторитет можно заслужить разными способами, и это один из них.&lt;/p&gt;
  &lt;p id=&quot;NF3t&quot;&gt;&lt;strong&gt;Постоянно приносить пользу, выполняя несколько функций, — хороший способ быть ценным сотрудником. &lt;/strong&gt;Самые эффективные старшие инженеры и архитекторы, которых я встречал, совмещали в себе роли инженера, технического директора, менеджера по продукту и руководителя проекта. Диаграммы последовательности и крупные технические инициативы — это круто, но не всегда необходимо, в то время как умение продвигать проекты вперёд — критически важный навык.&lt;/p&gt;
  &lt;h2 id=&quot;11nE&quot;&gt;Выводы&lt;/h2&gt;
  &lt;p id=&quot;vKS8&quot;&gt;За свою более чем 25-летнюю карьеру я видел, как архитектурная работа принимает самые разные формы: от документов до манифестов, от концепций до «воздуха», от смелых переписываний до бессмысленных, а также от обычной работы над функциями до масштабного брендинга.&lt;/p&gt;
  &lt;p id=&quot;Aswm&quot;&gt;&lt;strong&gt;Если ваши проблемы не решаются, значит, не решается и проблема с архитектурой, а также с технологиями, которые лежат в основе вашего бизнеса.&lt;/strong&gt; Это универсальный принцип.&lt;/p&gt;
  &lt;p id=&quot;XlRr&quot;&gt;За время моей работы в Netflix компания была далека от идеала, но мы решали архитектурные проблемы лучше, чем где-либо ещё, где я работал. На ум сразу приходят две причины: практический подход к решению проблем и бесстрашие.&lt;/p&gt;
  &lt;p id=&quot;733n&quot;&gt;Временами это бесстрашие приводило к серьёзным проблемам. Меня будили в 3 часа ночи, и я работал по 60 с лишним часов в неделю чаще, чем мне хотелось бы. Но я сталкивался и с другой крайностью: часами просиживать на совещаниях, выбирая OKR, и неделями дорабатывать квартальные планы. Позвольте мне сказать, что слишком медленное развитие вредит гораздо сильнее, чем слишком быстрое.&lt;/p&gt;
  &lt;p id=&quot;esqn&quot;&gt;Если вам пригодились мои наблюдения об архитектуре и вы не знаете, как быстрее перейти от идеи к реализации, смело обращайтесь ко мне через мою консалтинговую компанию &lt;a href=&quot;https://supremeinformatics.com/&quot; target=&quot;_blank&quot;&gt;Supreme Informatics&lt;/a&gt;. Спасибо, что прочитали. А теперь идите и что-нибудь постройте!&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;Axt4&quot;&gt;&lt;em&gt;Гергели здесь. &lt;/em&gt;Большое спасибо Мэтту за то, что он объяснил, что для него значит хорошая архитектура и как в ней совершенствоваться. Вы можете следить за Мэттом &lt;a href=&quot;https://www.linkedin.com/in/mhawthorne/&quot; target=&quot;_blank&quot;&gt;в LinkedIn&lt;/a&gt; и подписаться на его рассылку &lt;a href=&quot;https://pushtoprod.substack.com/&quot; target=&quot;_blank&quot;&gt;Push to Prod&lt;/a&gt;. И, конечно же, его книга о создании устойчивых к сбоям систем в настоящее время &lt;a href=&quot;https://pushtoprodordietrying.com/&quot; target=&quot;_blank&quot;&gt;находит своё завершение&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;Zm7B&quot;&gt;Что для вас значит хорошая архитектура программного обеспечения? Поделитесь своими мыслями в комментариях.&lt;/p&gt;
  &lt;p id=&quot;OkV0&quot;&gt;Перевод: &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/what-is-good-software-architecture&quot; target=&quot;_blank&quot;&gt;https://newsletter.pragmaticengineer.com/p/what-is-good-software-architecture&lt;/a&gt;&lt;/p&gt;

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