<?xml version="1.0" encoding="UTF-8" ?>
<rss
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:yandex="http://news.yandex.ru"
    xmlns:media="http://search.yahoo.com/mrss/"
    xmlns:turbo="http://turbo.yandex.ru"
    version="2.0">
    <channel>
        <title>
            <![CDATA[
            fuse8 : Все публикации
            ]]>
        </title>
        <atom:link href="http://fuse8.ru/rss" rel="self" type="application/rss+xml" />
        <link>http://fuse8.ru</link>
        <description>
            <![CDATA[
            Все публикации Fuse8 Online
            ]]>
        </description>
            <image>
                <url>http://fuse8.ru/Media/1373/img-0304.jpg</url>
                    <title>
                        <![CDATA[ Логотип «Фьюз Эйт Онлайн» ]]>
                    </title>
                <link>http://fuse8.ru</link>
            </image>
        <language>ru</language>
        <generator>fuse8.ru</generator>
        <lastBuildDate>Mon, 06 Apr 2026 00:00:00 GMT</lastBuildDate>
        <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>

            <item turbo="true">
                <title>
                    <![CDATA[
                    Проектирование и дизайн интерфейса «Медицинской информационной системы»
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/mis/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/mis/</guid>

                <pubDate>Fri, 13 Mar 2026 12:28:55 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;</category>
                            <category>&#x41C;&#x435;&#x434;&#x438;&#x446;&#x438;&#x43D;&#x430;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Проектирование и дизайн интерфейса «Медицинской информационной системы»</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/e495aa8c3f45d7d90091507a44077c4f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/139f30e56ef5477bb7d66fc827ea6af6"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--5157618 case-logo">
    


    <img src="/Media/2456/group-74-1.png"
         alt=""
         itemprop="">


</div>


<h1>Проектирование и&nbsp;дизайн интерфейса «Медицинской информационной системы»</h1>






<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2515/main.png"
         alt=""
         itemprop="">


</div>

<p><span data-metadata="&lt;!--(figmeta)eyJmaWxlS2V5IjoiUTgzVlFGYlRxN0s3czFaZnB0cUx2NSIsInBhc3RlSUQiOjI2MDc5MDM5NSwiZGF0YVR5cGUiOiJzY2VuZSJ9Cg==(/figmeta)--&gt;"></span><span data-metadata="&lt;!--(figmeta)eyJmaWxlS2V5IjoiUTgzVlFGYlRxN0s3czFaZnB0cUx2NSIsInBhc3RlSUQiOjI2MDc5MDM5NSwiZGF0YVR5cGUiOiJzY2VuZSJ9Cg==(/figmeta)--&gt;"></span><span>«Медицинская информационная система» (далее — МИС) — это&nbsp;приложение для&nbsp;врачей и&nbsp;пациентов. В&nbsp;МИС&nbsp;пациенты могут записаться на&nbsp;прием к&nbsp;врачу, ознакомиться со&nbsp;своей медицинской картой, узнать результаты анализов и&nbsp;посмотреть назначения. Также в&nbsp;приложении есть дневник здоровья, который помогает отслеживать важные жизненные показатели (вес, пульс, уровень сахара и&nbsp;т.д.) и&nbsp;напоминает, когда нужно сделать новое измерение.</span></p>
<p><span><strong>Наша задача на&nbsp;этом проекте </strong>— разработать дизайн интерфейса МИС. Сделать его&nbsp;удобным и&nbsp;понятным для&nbsp;пользователей-пациентов.</span></p>

<div class="umb-macro-highlights">
    <strong>Мы работали на&nbsp;этом проекте по&nbsp;NDA.</strong>
    Поэтому мы&nbsp;не&nbsp;можем раскрывать информацию о&nbsp;наших заказчиках и&nbsp;дать ссылку на&nbsp;приложение в&nbsp;Google Play и&nbsp;App&nbsp;Store. Но&nbsp;мы&nbsp;можем рассказать о&nbsp;том, как&nbsp;мы&nbsp;работали над&nbsp;созданием интерфейса и&nbsp;показать некоторые прототипы и&nbsp;макеты.
</div>

</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/f8451108d6c44df6a90bb7dd7cc2688d"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2515/main.png"
         alt=""
         itemprop="">


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/4897d3d0a13583c8fcb22a5acabcdc9a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6d47b8f35b044ae28c3904edf073d28a"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>О заказчиках</h2>
<p>Заказчиками на&nbsp;проекте выступали две&nbsp;компании. Чтобы соблюсти соглашение о&nbsp;неразглашении и&nbsp;при&nbsp;этом не&nbsp;запутать нашего читателя, дадим им&nbsp;кодовые названия:</p>
<p><img src="/Media/2458/noun_anonymous_235650-1.png" alt=""></p>
<p><span><strong>ГК «ФармАльфа»</strong> — автор идеи и&nbsp;конечный заказчик приложения МИС. Это&nbsp;группа фармацевтических компаний, одна из&nbsp;крупнейших в&nbsp;России.</span></p>
<p><img src="/Media/2459/noun_spy_235639-1.png" alt=""></p>
<p><span><strong>ООО «IT-Бета»</strong> — дочерняя IT-компания «ФармАльфа». Занималась разработкой приложения и&nbsp;внедряла в&nbsp;него наш&nbsp;дизайн.</span></p>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/a59ac4e813423b0ced440ff60055adcd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8e5f91d81f7c40839710fc0cba2c1b32"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>О проекте</h2>

<div class="timeframe">
    <div class="timeframe__item">
        <strong>&#x421;&#x442;&#x430;&#x440;&#x442; &#x440;&#x430;&#x431;&#x43E;&#x442;:</strong> декабрь 2019
    </div>
    <div class="timeframe__item">
        <strong>&#x424;&#x438;&#x43D;&#x430;&#x43B; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;:</strong> июнь 2020
    </div>
</div>

</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="threeColumns"
            data-content-element-type-key="c9b72d31-8ab3-38f4-b5fb-a9a9814ae17a"
            data-element-udi="umb://element/886eb8eb4819222bafa90d148ed02ef7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fe25d13f0f274580b9acf45907d3426b"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<h3 class="team__title" style='border-bottom-color: #FFD541'>
    Команда fuse8
</h3>

<p><strong>Руководитель проекта</strong><br>Вениамин Мустафин</p>
<p><strong>Дизайнеры</strong><br>Алексей Пилишков<br>Наталья Календарёва<br>Александр Ефремов</p>
<p><strong>Фронтенд-разработчики</strong><br>Владимир Лысов<br>Юлия Поспелова</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/365cfb81a49349e78e40a4a7eb142573"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<h3 class="team__title" style='border-bottom-color: #2682EB'>
    Команда «ФармАльфа»
</h3>

<p><span style="font-weight: 400;">Руководитель отдела маркетинга</span></p>
<p><span style="font-weight: 400;"></span><span style="font-weight: 400;">Врачи, представители частных клиник</span></p>
<p><span style="font-weight: 400;">Специалисты по&nbsp;продвижению IT-сервисов в&nbsp;сфере медицины </span></p>

<h3 class="team__title" style='border-bottom-color: #E68619'>
    Команда «IT-Бета»
</h3>

<p><span style="font-weight: 400;">Руководитель отдела разработки </span></p>
<p><span style="font-weight: 400;">Разработчики</span></p>
<p><span style="font-weight: 400;">Дизайнер</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/c5b2377d529145182241bec79b23a941"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f7c6d66e0efe4022932294eca3deb179"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2><span style="font-weight: 400;">Пролог</span></h2>
<p><span style="font-weight: 400;">Когда к&nbsp;проекту присоединились мы, у&nbsp;МИС&nbsp;была первая рабочая версия — для&nbsp;мобильных устройств и&nbsp;десктопа. Интерфейс существующего приложения и&nbsp;логика его&nbsp;работы не&nbsp;устраивали заказчика. Приложение выглядело устаревшим, тяжеловесным и&nbsp;непонятным для&nbsp;пользователей. Поэтому «ФармАльфа» начала искать студию, которая могла бы&nbsp;проанализировать МИС, понять, что&nbsp;с&nbsp;ним&nbsp;не&nbsp;так&nbsp;и&nbsp;спроектировать новый удобный интерфейс приложения. Такой студией стали мы. </span></p>
<h2><span style="font-weight: 400;">Глава первая: знакомство</span></h2>
<h3><span style="font-weight: 400;">Собираем требования</span></h3>
<p><span style="font-weight: 400;">Работу над&nbsp;проектом мы&nbsp;начали со&nbsp;сбора требований. Нам&nbsp;важно было знать о&nbsp;МИС&nbsp;всё&nbsp;— что&nbsp;это&nbsp;за&nbsp;приложение, что&nbsp;в&nbsp;нём&nbsp;можно делать, кто&nbsp;и&nbsp;как&nbsp;будет им&nbsp;пользоваться. Чтобы выяснить все&nbsp;это, мы&nbsp;провели несколько встреч с&nbsp;заказчиком.</span></p>
<p><span style="font-weight: 400;">Сперва «ФармАльфа» и&nbsp;разработчики из&nbsp;«IT-Бета» презентовали нам&nbsp;уже&nbsp;существующее приложения и&nbsp;показали всю&nbsp;его&nbsp;функциональность.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/dd30652c9492b4e5d82423eb0a7d34b3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e94129656e934c54af9f7cb96911edc3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2503/mind_map.png"
         alt=""
         itemprop="">


        <figcaption>
            Фрагмент структуры МИС (чтобы вы понимали объемы и возможности приложения —  здесь от силы 15% от всей структуры МИС)
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/190d9323ef4fd23e948095e9b3b03cc6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6502f4f3dd76409095917b65c24c5309"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Затем мы&nbsp;обсудили целевую аудиторию приложения — пол, возраст, уровень достатка, регион проживания и&nbsp;т.д. Поскольку в&nbsp;первую очередь в&nbsp;каталог МИС&nbsp;попадали частные клиники, особое внимание уделяли характеристикам потребителей платных медицинских услуг. </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/75140fa455c93631b9fb8c738ed95dc4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/d147bbef2f4e47afb96a6ed325d7b637"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2504/auditory.png"
         alt=""
         itemprop="">


        <figcaption>
            Фрагмент обзора целевой аудитории МИС
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/23e10a7f863bcc978b776f4c16725c05"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6946ad8421294035a8cc3d558b063680"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">И, наконец, познакомились с&nbsp;основными конкурентами МИС&nbsp;— другими приложениями и&nbsp;сайтами, с&nbsp;помощью которых можно записаться к&nbsp;врачу и&nbsp;отслеживать состояние своего здоровья. Их&nbsp;было пять. </span></p>
<h3><span style="font-weight: 400;">Планируем работы по&nbsp;проекту</span></h3>
<p><span style="font-weight: 400;">После сбора требований вместе с&nbsp;«ФармАльфа» мы&nbsp;отметили, что&nbsp;совершенно точно должно остаться в&nbsp;новой версии МИС, и&nbsp;зафиксировали это&nbsp;в&nbsp;Функциональных требованиях. Функциональные требования — это&nbsp;обязательный минимум.  Меньше нельзя, больше — можно, но&nbsp;только если это&nbsp;оправдано нашей основной целью — создать понятный и&nbsp;удобный интерфейс приложения. </span></p>
<p><span style="font-weight: 400;">Мы работали над&nbsp;проектом вместе с&nbsp;«IT-Бета». На&nbsp;нас&nbsp;— проектирование интерфейса и&nbsp;дизайн, на&nbsp;них&nbsp;— разработка и&nbsp;внедрение. Чтобы не&nbsp;растягивать сроки и&nbsp;не&nbsp;заваливать наших коллег сразу всеми макетами, мы&nbsp;решили двигаться по&nbsp;проекту поэтапно: закончили разработку интерфейса и&nbsp;дизайн страниц первого этапа — отдали в&nbsp;разработку «IT-Бета». Пока программисты внедряли новый дизайн в&nbsp;МИС, мы&nbsp;работали над&nbsp;следующим этапом. </span></p>
<p><strong>1 этап — интерфейс записи к&nbsp;врачу</strong></p>
<ul>
<li>Выбор врача</li>
<li>Карточка врача</li>
<li>Выбор даты и&nbsp;времени приема</li>
<li>Календарь пациента</li>
<li>Просмотр информации о&nbsp;событии</li>
<li>Просмотр событий на&nbsp;текущую дату</li>
</ul>
<p><strong>2 этап — интерфейс личного кабинета пациента</strong></p>
<ul>
<li>Главная страница</li>
<li>Личный кабинет</li>
<li>Дневник здоровья</li>
<li>Электронная медицинская карта</li>
<li>Совокупные рекомендации</li>
</ul>
<p><strong>3 этап — интерфейс справочных страниц МИС</strong></p>
<ul>
<li>Мои анкеты</li>
<li>Справочник врачей и&nbsp;клиник</li>
<li>Обратная связь</li>
</ul>
<h2>Глава вторая: аудит</h2>
<p>Чтобы создать удобный и&nbsp;понятный новый интерфейс, нужно было понять, что&nbsp;не&nbsp;так&nbsp;со&nbsp;старым. Для&nbsp;этого мы&nbsp;провели аудит МИС. Придерживались стандартного для&nbsp;нас&nbsp;плана действий:</p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Проанализировали конкурентов.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Поговорили с&nbsp;пользователями, изучили их&nbsp;потребности и&nbsp;создали их&nbsp;портреты.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Зафиксировали сценарии использования МИС.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Прогнали наших персонажей по&nbsp;этим сценариям.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Отметили, где&nbsp;интерфейс путает пользователей или&nbsp;заводит их&nbsp;в&nbsp;тупик.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Зафиксировали всё&nbsp;в&nbsp;отчете по&nbsp;аудиту и&nbsp;предложили решения конкретных интерфейсных проблем. </span></li>
</ol>
<h3>Анализируем конкурентов </h3>
<p><span style="font-weight: 400;">Нам хотелось понять, в&nbsp;чем&nbsp;конкуренты опережают МИС, что&nbsp;у&nbsp;них&nbsp;реализовано хорошо, а&nbsp;что&nbsp;не&nbsp;очень. Какими&#8209;то&nbsp;решениям мы&nbsp;вдохновлялись, а&nbsp;что&#8209;то&nbsp;занесли в&nbsp;список «ни в&nbsp;коем случае не&nbsp;повторять это». </span></p>
<p><span style="font-weight: 400;">Мы отобрали несколько приложений с&nbsp;интерфейсом поиска врача, выписали в&nbsp;таблицу всю&nbsp;их&nbsp;функциональность и&nbsp;сравнили между собой. Оценивали и&nbsp;существующий интерфейс МИС. </span></p>
<p><span style="font-weight: 400;">В этой же&nbsp;таблице мы&nbsp;вместе со&nbsp;специалистами «ФармАльфа» отмечали приоритет функциональности для&nbsp;МИС, где&nbsp;А&nbsp;— высокий приоритет, а&nbsp;С&nbsp;— низкий.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/93b97fc7ac4674a949e7a924202c567a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/b02926cc40ef455a9ed87267d7bb51dc"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2508/research_table.png"
         alt=""
         itemprop="">


        <figcaption>
            Исследование помогло нам понять, что именно нужно реализовать в новом интерфейсе МИС, чтобы приложение стало удобным и понятным для пользователя
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium legend spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c41905aa3e2446a587f7fa6fd27238b9"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>Легенда</strong></p>
<p><span><strong>1</strong> — функциональность есть и&nbsp;работает хорошо</span></p>
<p><span><strong>0,5</strong> — функциональность есть, но&nbsp;работает не&nbsp;так, как&nbsp;хотелось бы</span></p>
<p><span><strong>0</strong> — такой функциональности нет</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/36724349bcebe62b5cb248cef214e343"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/657c7b0b148c4c37b6aab505cad7220d"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Создаем портреты пользователей МИС</h3>
<p>Закончив с&nbsp;анализом конкурентов, мы&nbsp;приступили к&nbsp;детальной проработке портретов пользователей МИС. Для&nbsp;этого мы&nbsp;еще&nbsp;раз&nbsp;обратились к&nbsp;исследованию ЦА&nbsp;от&nbsp;«ФармАльфы» и&nbsp;провели несколько интервью с&nbsp;людьми, которые пользуются услугами частных клиник.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2505/persona_marina.png"
         alt=""
         itemprop="">


        <figcaption>
            Фрагмент интервью с&nbsp;одним из&nbsp;потенциальных пользователей МИС&nbsp;
        </figcaption>
</figure>

<p><span>Затем мы&nbsp;спрятались от&nbsp;коллег в&nbsp;переговорке и&nbsp;начали работать над&nbsp;портретами пользователей. Каждого персонажа старались описывать максимально детально — кто&nbsp;эти&nbsp;люди, сколько им&nbsp;лет, где&nbsp;они&nbsp;работают и&nbsp;сколько получают, что&nbsp;и&nbsp;при&nbsp;каких обстоятельствах вынудило их&nbsp;обратиться к&nbsp;врачу.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2e765df7078f795a4782fb6f9a266b35"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/85703014776e47d5a4d196fc39d04d80"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2506/ideas-photo.png"
         alt=""
         itemprop="">


        <figcaption>
            Мы много думали,обсуждали и писали —  на грифельной доске, маркерной доске и даже на стенах
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/6f7a25ec8790277412e4a52c4be1d795"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/98bf42e76e654e09a9e6df5fad136eb2"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span data-metadata="&lt;!--(figmeta)eyJmaWxlS2V5IjoiUTgzVlFGYlRxN0s3czFaZnB0cUx2NSIsInBhc3RlSUQiOjgxNTI0NTA3NSwiZGF0YVR5cGUiOiJzY2VuZSJ9Cg==(/figmeta)--&gt;"></span><span data-buffer="&lt;!--(figma)ZmlnLWtpd2kKAAAADCcAALV8e5gsSVVnRFZVP27fe+fJzPAQERERUWeGAQZEJCsrqytvV1XmZGZV33tFiuqq7O7k1ovKqr63R0RgRx1HkPfoIssiy66ILKIioouILIuIiIiIL0REdN1d1325u67ruv7OichHdd/x8x/n+6bjxImIEydOnHPixIms+27ZipKkfxCFx7NIiBsuuE67F4SmHwr813Zrds9qmO1tO0BVdgLbL9QN7m23a4BLgbPdNpuAykF4qWkDqDDQC2yitcZ9mXIv2HG8nm83XZNGrrfd0Klf6gUNt9Os9Tretm/WaPyGBns1t031zbTu23XfDhpAnQksu233gPYavfs6tn8JyK0i0re9JiHP1px6HeU5q+nY7bBX9TG7ZQbE23nzWpxgORcBC+oszcEAYgHKt81az20zCcGVXd8JiRvZng4j77CfROhmoSm0aTXo1HK7DMrdeDKMJwf+ckR92m77su27aBBujduJgpL7HWi0gRI11+q0wB9AaZntrhkAMrZ9t+MBKNV9s0X9ylXXbdpmu+d6tm+GjtsGstK1rdD1Aa2RnFGuNx0mu2E3m44XELjpoxM2kHfojG9vd5qm3/Pc5qVtJrKFqdo1uwbB5f3OhvZFYulc0HQsQpwPLrWqLu32DU4bk7UZe2MQOtYOieqmoGF6dm/XCRs9PfZmy223QZMZvMUizao2XWsHtVt3ndo2a8mjQKtFK72tZdccE8DtwWF/Fu3Gi8MwurZQ0job3NcxfRutIl+YRP+Wy7pohL7DrEOZUC1l1Zq7S2ssX2+NFc/0zWYTWgnFafV8Z7tBHK2topt2nbDrdnu7VzNDs2ry5BtUh/51qLJJlbrDVM8w7DZrNi17qzqKJsMWth0i8Mwg6IUN8LJNqgxj81tsQLJm+js2MWq0Os3QUQpcor3EVlU7PjWVLbfpZrVKk9jlMWsBlJEh3n2MqLmQLuobakha3YSa+k2TaJ8J3HrYYxqobTVMv5bV2HBs31ZbfM6+aDU7gVK48w1e7w2BGXYyLbyRZwFwU7PTctpu4IQ0xc1eP57o/VsP3KZDGyUg05oDdcdsxCowMkNRyfKA+gMkFPaK1BW4UoZDJ73tZadl8soqMMELDoA1ZwzXFgz6o0gJHb7Jt0OL5V13aHkSG8WThGrDSvb+fjTQjJYdqKwPz2RCc9Aoar7r5VVZd2FA2MB2DbrcIb6MqmntrKJKpLgW+4k1F2rlKDcpOh5sF6VsursMgIVQ8RBAEZo9y/TI+st5DZrkW+xbKkS0Fg2m8/4ink4wJvUgmBnbCnECllius2PnSma0l+O9aN6ZxIsEY3yTliE856LdDABIcATfSXIxrOkkWcwLm4bNBF5QO7MrWyY5TANzaJGWAsvkBZTroFjrqREVXeHea8FiPr0SmaP4YIIBGTEBN+Kw15duJ9SgoTpb/RmmT9eHpfBuy8wJGKbvu7usQrSIkqra93WcJpwyrBfIslYTssumlmDqFTKUZu7CNCbeWvDzzFrV7tpEQ6ZTG9XpdBT1J+4sSsVf7rSV+mMhGBbAsQCWQaca+ibDxkW2CtYGXn5jOo/vn04W/RGGa79SkC40he3PuNCBW607zGE+uhvNFzEUm3Cuh6bC0Kobhm4LkNGaLpPIWs6T6Rz2X7PrJhwKGoTluwH02PEBS/uSTYqNzUfNwPHOU3kmlgIHY0GBUC977FQqKCynCWitRW6Khqx3YTHTeSuez2meTBVZvCglA7BeeBX4w5B0xaj1k0NllIYFHw6UyDVJsuEqxSt77W2gxAXPplIGXSoMr0bHecm+NpvOFyeVtYTDBu4QoYbWSJEicNTw/DJFNOxU0M3+8XS52J7HQ0WkrPS3INicQUOpcykf4/UXi2g+QRN6OR6rIvwb+znJ27ZcTP0oie8H6UxEzA5LJuNDZhD0/3gUBZFeFETvB672HqFt0g5LC9qh9hoxEU6gtkXethTaLc/1TY6HyikZSGkRZSI65YQBytSFYur+4Iran4zZBtzXZYiNOZA4PXDcM6x6s15iulNiU7IyqjgryUgBl3iANV2Cobket/ZI4yBPLfWS2QkpgCoXSFWY1IVlsoj3j9H0iFQ807J7MGUVzCkOArUb7KGARPAWOJftXujCKbA8VhBQHmyW0/IQBaFGLeijFu9Nk5hcAeI9oDSfwqxCyh0VL0L6E9gJ+qgNqKRihZnZPra1R+E26rLjs1CrOEpQlqymy0FG2SFp9QskzrrtHoyHuwmzDjK90GnZ8KCoy5aLeL3H4jAUrBpKGNWgwx9wWTXgPKNuFVXjqGkNvTwsn/Q4db4bNd/cRrmJth37UjrsDKpdV0WGW+G8P1GiUDw+Bp4dQVbYgyOEj9dRgqg5AUTTtQHKOoJ6lAaiS0SFdd/N4qxSAZU6xHIBp1xfpYDJfN+a1wkaCqeJreeYlNZGjlKkNnNERukMBfQKpylt5ZiU0tkcpSidyxEZpfOKUWwDOqXEblhBpvRuXMEqkjet4DKqN/NMGquJ3lLEpTRvLSIVyUcVURnF2+AFHKtHbajdjgAEtzazDefAqnwHQkwXIUmOebTdT6D5asc3cNGzOlXHQoMg0mlFIhwsVA2yYBXNYQRpe9ZUpn4rmIoau4JbU84vq68Hg/l0NKrFc2VnoKMV9+9xXVg0uxY1Fka6IBOLhrDqRYR2+6IH96zcgwUKdJxzTW534D+lkeCmiMkArws5muJMZhAB1AinoSzPxaaQB/hj7OFPqY8/ZXVgYvA11OQx/hg+UOidI67iT+kQf8pMKVhMZxgwIFhcFHKmHQ46GK3+Yh5fE3JtfOedqMvxnXehMMZ33o2iNL6LkOXxXYSsjO8i5JrXn+MocCbDCOOMg2U8FN0C0a00VETjUX+0jDBGLjlsfIww6pBSuz+OhCzt98fx6Bj9ZUKnDAADRBbJYB7PFqiVqG+3P4/7GLIcR/N4UI8PlnOIFueKvvEIaILDp7zEVYnTBoB5mtWhwaw/gJ6tjPUQurjYT30ySlzK9CXhOgTqtLm0wCIFxIa4/DKMIx4axvtbHG31Zwn0Kx8Ck+Brg0TRSyuGZyOEJ9ZLQPSyGgWHSDUQWAEKi90GuFag76VyL7KF4BF/EUPi3AfA/AQsZGxO1suBTrP2S4Sj7HPrUX/BAv4T6eHWgCZh3e1xF82FYXkB4UvEDUpmEGVFJyjWAqdN0dW669faKDfMuk/tm7U2+4cz7U6LWNrCJZEu6WdxCNGSztVUeb6hyhtwEaHyRtPksPMmS5U3+xaXtwSqfqvf5Wvso8gwUd4W7HJ653Yr2KXyDmwO4R9tWZwdeEyg4oHHNhxO4DxOH8Vf4fpt4u/xJBSUX4kjh7byCbWQ7zdfVW+atI4ntrZ9OjO/OoCuoXwS4lia/2vqiMdQPrmhyq9tqHmfEqr6192nyqd6qvx6is1RPq1Zr1L9G1yPy2/0Qy6/yVPj7/R22iSnu5pwHyjvRkl8Pt0Pm1S/ByXVn2FW/S7KZ5rVLtWfhZL4vrer6Dy7C4ZQPqfa3KX9+WaU1O+5KKnft5g7DVrH86wLfOf4VqvOhvB8y+O6aXV86lfF6Ut1C86Nylpd0bfruJyirKO8G+U2yqejbGBams9BSfQvNNR6MNs28dNsuBdIbxB7cdjUdnC2o3QveM+6F6V3wbuX6Nx3wXv2nSj9C96d96AMmhdaNC5EIoj6d3DQ0L50KfuDchcl8XGxtdMi/KV2k2Ody+3OTojy2xCgEF8vQBmg/PYuBI7yhV4QEr6HkvAv8nd8qvd9r0Hlnt+p0r4PAsRyKIeh4iMK2xxV72ObaP8OushsoDzsqva4q9b94u4O68uVrh/6KEco70Y5DgJ4XiEmKKk+Rfl0lDOU96B8CcpnoJyjfCbKBOWzUC5QkpyWKJ+N8igI4LOFuIqS6F1DSfSOURK9+1ESve9ASfReipLofSdKovcylETvu1ASvZfLILibCL5CWl3m8JUEEMl/QgDRfIAAIvrdBBDV7yGAyH4vAUT3QQKI8PcRQJQfAsCsfj8BRPlVBBDlVxNAlH+AAKL8GgKI8msJIMqvI4Aov54AovwGAojyGwEwz28igCg/TABR/kECiPIPEUCU/ykBRPnNBBDlHyaAKL+FAKL8zwggym8F8HSi/M8JIMpvI4Ao/wgBRPntBBDlf0EAUX4HAUT5XxJAlP8VAUT5Rwkgyu8EcA9R/jECiPK7CCDKP04AUX43AUT5XxNAlN9DAFH+CQKI8nsJIMo/SQBR/ikAzyDKP00AUX4fAUT5Zwggyu8ngCj/LAFE+QMEEOWfI4Ao/zwBRPnfEECUPwjgmUT5Fwggyh8igCj/IgFE+cMEEOVfIoAof4QAovxvCSDKHyWAKP87AojyxwA8iyj/MgFE+eMEEOVfIYAof4IAovyrBBDlTxJAlH+NAKL8KQKI8q8TQJQ/DeBeovwbBBDlzxBAlH+TAKL8WQKI8m8RQJQ/RwBR/m0CiPLvEECUf5cAovx7ANhF/T4BRPnzBBDlPyCAKH+BAKL8hwQQ5S8SQJT/iACi/CUCiPIfE0CUvyxPpioQWi1wXIu7hUxDLINiylZ/NqMgRxr78+mYwrLFFH+N6mi6J6TcO15EiShJlSMRRglvEIdUn1BEhvhr2F/0ue86oq94hDujRUGjOXwxLslCbixoboRzyWF/OL2aADQO44ND3MIPEd4hYBxGi348AlSOwHJCsQQCxyPc0iPkOACvLaIx575U0/pRvIdb34DgDc7zqmn105IwzvzjTjlAYDTvY22bYnNvTjQnmBm1M8yMMG5iOd8o5IAEgejZmFIguaA4u3QUJ/Eegiopyih0ev68qCQIuBPxQrkG2pNkfzofixeJ9ZiF/lKxwUB4iCB5Qpy/VGz2J8Dh5uBQCxA3KgTCOkSd2Jp1cRPqxXz0zeLMfIp7BrqAk62EGgCc3WfxWcSs3rWXiXMzWkudW+DQxfloPH1xbIGMh3wlpLgub6AIsQVJ1qABwqhciY7FvpD7wDbjSdSISDSgbxCmFh9EIFxCCI+aiivnokyVXdWxgtQtahyiMotGqY+HsrB/gKVIAtu0LGhcqr6cnlSTnx8c9inWjuYJesisxhM5NWLXSAh2j6I50mdR2If0xZ9KWRpxTo1TM5exJ8icj8B9gpNFVg5Gx7PDBEeKXBtm2e8EB4pcV8O6mBAocLixD+YzaTwg5eZ+fzTaQ66mjoZE7Mszh1CLOYhfqU6vYYKHpNxCDdCDhjy7mC8nA6aPq+BcX5Uq4pzGR8NMnucbBTrCKO8hrzVMxAtwY5qPsPr0elU6TPsheqwgi6WXJox16Ly6AFwW8mo8XNC9z6C2SwBKBGSzlalmJgNc31Bb34/nycJKxYt1V6DDxfraNslMGGuD6XjcB2PaN+SXvctCbQW4gsvYh3RY+JjqNPH+8Eib3Vot2wBhGHNcX7FkKXNKhrrlsviN0hFX2tHi6nR+JWVhAqvqjzDZkGdMGTmtE+QXkWHFMiQJMxFdKYPj8d50pMknXMG8cJcKTokkRMDA3ZVMOCATq2M1cAMQbEo2dbmGwRslZ8AhAsE9C/a1HU3I8WCdai45LVKWNdwrj8jqx8sF8cvGrnoaqz1R0bppBJApFs2M+tF+hMs4hGps7sejaAdmC5NJuJFXZOiRjT48Pe7UJAIPLGq2EwRCspyeC5VRDNc4P6a1hdNguUd38T10I4S4JkkPZtMJ1EdNtL6c7I8oeU25yyLFjTjppE3RUEixqbi20vGtfgKtUEstDVKsoipny71RnByCGM1L3IbTMOqPmzl3NIlxcpKSg/ORVMzFokl2wYJWbZSmuk6k3P3gKjiF1HVn2ix49xUWVqV/fbrdu/9BlDmtExQ2JB2iSKs3Q2Fs8DlzK3EC183nzP5+Ei2g2KV5fxgv6VAq5wdOBUV24Kwls3nUH6LHenI4vQpZ46isRpDgkLQQ3TdCOonYZp3J/hT6xfO1hRwulYJisOHhSJlSQy06igfpI0qaCKObEr/nSAt3V77NG4xDboxyKKiX1EA/PZlgBXqwZe32ODqSJyaB06MKwl3orbZkrAZLd4bYj3g/hveA4mKUovlunLYuZAin7Wk3FBIBPFKDE853CGQo03SmJDhrMaiWJjVLSOBhHWnPsq5mnSsakfbHs1W7w7fEdc1AFUfCwZx8tpMn2DFLtmrKv/eQ40aWA9lHpCH1+6Q8RUCtIRuJW7BT66UP4qe7m1A0+FbSMsPYy9BM5X0QZY6yUoVq9xEUsQy5F14RzC6SMJxnEsjX6hd9Gexy5segkj674Q54oOXELT9OlG1EWvNFgAALRprA+STL/X2kEWG8HKfwBHcKpBxhCipiPRKl5OiALJ6PfmwiqohYST8/CH1GzV0u6ICiSADtcDaQKY5bd4IsoYRqHx3Up/MBrI+eWuFBriRAbyyTyNxLpqPlIqrSegm5qRnsbusZhOHUe23b1tlYs7lrXgoAyCYf/fQKh1UsiO17BAcowoDvzMytNFmOAxgqhJcInL/aOBFoJgobkOriZDtYwh3NdW19oGW/MSMvhSe+Z4rNbXhgbBoHRJhEZqSys96DM8GuXoX5Qrz8DdCGgGNYOYPxdoTjLiSOKbuotIbeo1EgFem7O4Qx9Cc0JbteVw/LZSRuXJ+gin5iXIO/gG9meoUDRZ2nyh+m548+RdIziDpgH7Ay2lesKSGMHoKH4zw5iTH5+aQT5nBQ0EjIB/RYuWhDsAQ8qPV2GzaMpuE0az23jqdYakbuE48i6ismac4H2ZwIsSAnc3IAQeGmAL9YqBox3s7mfupCS8oVNxFJYexyHoMfOYyT2ah/zIq5hVuQqrIegltvtDyI9QFemnEFcsMwFbtiwBW1LI/b/GjUR5h3qAaUZ4xUA8a4W8A6AMIyeDcBluKkFo0iRIXQs7I1BbsUY7T6dIHB7qR7qx8GyZ+hMLTT0j4MUDl1U5WMhj0ZzijCB9+RBuk8ADMUqKR7A4c7VpN9FoqeDQYAQxt5NAraUOiu7APD0EX1JVEFgKgdbwpOrYZHezwLwXuwqiG9l6LUN3/pk6Ya2ooVc5gmAZKo/B58WG4ZWW/sG+wfSoZp7GbV3VX2DH039eqljhJa06NIH3XT0XCHdwjBGZS1nimisRsPDyJoKebGKWMgqIR0hiQdexhjOmVeRg1PudttEBe7DeTlq67p07T8FR5C3Am21Hg4NV+OMtVN5xmzQ8TpYk0YDCjkM2ewnfT9ZE+UClXV4VkLmvWM4HNRoe6d9Fk1K1Qq1LNz57SmQdXwHEQcV1iZ1hWk0N+c31s3NKganouRWSSxmVVU47cM4FIXAM4woJDPS8i9XcatE6VCfSu8fHbTxf1HV1Tj84dwG3BqkPFEbMpzharqYPb5AwdaHNg+n9dUczU/zOwJxcm0uBtOIVVna4yDAe03UqlQtYhPAyhR8Ty56TRWdbdppJO46jRCz5tXEKpTPZ/eVdKEYG85hVSdt3HbKTqhW4t11aVRuDs9KoVVkwMN6R/M+7NDUhLsxqa47QRKdbyQYdPHrk1x+0mc6rpDXtOBUc35WoOOd6xiVLfmOMYuNWMU6PJoFLqmmlsJPMSVSF/6N8VjinXVpb2AfYeIjK5gbnR5bLGuuriH2edM2AyQ4HjhceJx18OrIR5qmMhEFmgiHi++olBVHe5TGKs/E08Qj88qqtFXdf5Y64niK/Oaag6IRabVyBgQTxZPuA5aDQizlm76adVTxFedQqrOHcJb8AbiNvHEFFZNXaoWrsZ3iK9exahuu3snvyF7knjSSZzqevFIz50LEIL9mtNY1f3SfjwaeVRPkOaXT86rqv0yekNUCkU9vraIUH2+jWxEZxyG4il5TTW/gHS7DdNGeunrUlg1fTsvlk7NB6V4alpRbS+M+J6UIHMuv17DqqUH/ztEGMJfkEGnxNPE006gVMcXKXsP0qD156X8hlWU6tenmU12QQlsUNwrvnEVo7rtIUKYqsgxQd5bflOhrnoMVN6CFoFHCnFnXlXtw4QOMhzG6+IuDaqGKHcjlg4g7z6BUh33aYO2o+k4WsyPkViXTy8iVJ8DtUUpknrds4pS/Q5h//qzreeJOKuoxhdzXXsQWPGVYl11GTHK6w8p+EKXcbGuukzoZITj5/zINK2otlnCcRlJB6814iV5VbXP9yk30oIjrsUJu3s45uQUUnVezNVGTevwW1Ig75tVVYcjtfFVcKiEmo5H76vMuAUsnB0bsKiKa4y8gHwqfSpWE8eJioCZyzxofqsU98eJwnoqi0FkQfU7AGUDiqmSlw5VEki10IIpL/Cdxe5dFXzj/H8ZWQxnVSc4uMbj6aRJVzpaIOb4rpVWsH9tsewj1M17vJwzuroL1jyYR+QsEC4Ve72i2KsBXYAVwVsUu7yy2MWdY4/h9CSeBAvoYIRzPhpejuZTND1QbGrrTyrU5xyHeDg83ai1S7wYr4mnW+s4Qoh1McIbY6EZTj4RE3iQAs5LQ9cZXh9J7bCED0v5kITv00kRiuRgiV08Rs6QaeD8RIADMY+XX5U35GrDtgjzfLWEA0Q40x9RGIHV/kCa6cPprDaRibxGp+ZqEUQfz2hm7OprJaVAEUbi2J3OmtE+di+PD2BLr1vp4JM3PdHj9XmP6nSxmI6vQ+UNJ/tcj9Ab8055S0xRxgyBIUINLO5NJ/uEOHxWuzxM0iITwwoT6CI8Th8nAdnXD0ql29BflXKD/UJ2rPlvkzAJdNW7wvH7OyXeaHNciA1A3urNBVQtT2H9sIz62edkHl5wIWdcNfPvunw83Q6Y6WA8nS6QIiNn9TYZTw6hVvRIMgqUL8Z2vTVFB+ww84a3pw0hbCxH/2iKttm95A3vzBr46MobfixtoHMjR78rRRf4qdOHXMQG2n9OxknWJCQeqOF1uDHF/IhMCGI5fFTiLZqrq3r3i3KZ5k8hhqJTeofEhRSbktrgEE/XGAlJuupOdhkHMRRcu6Uf11sa0ByF7fy4RLau0JQ7yo9JPGLHyaqPfI+MWG4kVDNB8oYA4H8CPYPpPgIhcKVJAf1eoNvTSWc2xJGtSfykZhMqB/0YcG+0ihDP4IMch9MAS/hpiZwVFPEwHg3BVi0+gmugZOP7CsrlweFF8yM8vRFdTPEzRGiCXUQji/cCns9zFH2BuyV+lvRfeQud5nyPxJt6wkSyxMcnJKIQ9hxgC2NDdBdNPLDn04fxOEJYAR39YLFnq48K/meL+gWJStpSMIYPyWGEA2vCddxfsGEIUjDgw3Ivc2EqdoNDl78kr6t01awrFO8jsq8TL5+UeMCHuFbPriYHQV2tGRWo3gRLxbmBKq/uAxKv/NMj5iT1y9zwXgml0A2UQlmAcNoBe/XLaVvOjpMvGrsLZTvVw8yTpO+X4lfUmaB524L0F9CvDna3ucL1uvhVqbI2tCLxaSk/iWf0A3i7oTtxw7r6Ri4RC/lrGX5/f6XhU4UdDA6ny9EwGOMwMflVl/T012VCAYUKL56PObiaXyx03IRN/A3VBOY4ZM8bPqMakMJAQFUXv6mqKtZG/bMsDngVznV0xW+lzyrYXUolfC6ts8P5bWiwdsfUfUv8DozLuhuc/m7aLxp2tYC2kJ1RAqKNynJdn5Hy90EG7EMv58FyRras3RS5JpPOS/K8FEB8XrGrwywYJC2qLv4gJ5BoCo9A4AsyexIVbzbEH8or0XE4jw8OYME/ZIgvgv+ATH8bmjBD/z/KLbKgOHgPNuSX5NEUJmofYfXe4Rz3MSzxj6EtSDZ3HsFDflnx782xo/PjjP8/WUHz9jqLaJwgZPxT1aRXXGh6vvj3uokckR4Ktukr3j9TLXrXfd7bTfEfVrDqMAf6P0pSdQrXKK6uRlgAvA98JhaKV8//pEbxLDx9EI32Edv+uQ5KmhBlIj4l5X+mjlpyHo5xqN5xl3KdCPRI+A8Y8i8k2U4TsSFv/fcY4r9w8uzEg+ebpfivdACc+BnmWfHfaJ/JY9KhBsuAOor/nuNsOBtg/keOAXP6bPuCFH+Z43k0gj5c8/9njsV4hftfanYycm0Zm+J/Z5aBwchnv13Kv8qVAzhY2uSAk4LijYb4P6vd8ez3Din/WqKVAz57shzXcSGD3MXLDfF/JWwYlmGtmtPf5LxZUHCcAkw/gZ3J/5e60eu8A79Fir/Nh5IAs1zp56X4/3J0Itn5RcT4yHgr1ohCytorDfEKY5mcfip5pTHAvuFRYXCliZBuSfnpv0Ukz196cABNu5kgCJcPGPStzeDQRQABVwSlB6dTrB6xPmAQ+248WgyRUW2h3xCzi7+S0A2FY/NKsCPye40RFCeNLTbFg7qHp3WtFU2WyjT+RsrvA39alNRei/YTaIp8aBWNyCIRfyHl96+izSSBno9RS6CI8lV404AFpMcKzd4Qrzai8V40rBG7bzHgD7iPH2HTk+gyhbXXsLLXGLh0HLaiYaw+CvmcIV6r2Q6OYXXDgEwGJiheV0Bb6vdz6+L1GllTO42nddxR05/X/ZkUb9DtFsQbDU0QJDMWX5LQQIQmQ4RNOGWBzud5E6Q4gadBeBFdZZ7eaoiHdUq7dr15KLsOgSAWoJwD1Io9EUCjtRwtYnrziPDuMEMiHBKbxzjK/lxKudpoo+UYpK6wXudvIFZR7tgOvDmQQ6jH0WiIKaDj+5gW79/3T8d7cVTXH9RQ+gfDSyvD823DROlAPdVfyhNz1Wiuikq9TxQ1WAA2uD/qpiNKWH5+DdwSZWRF8+EOja2sEFUj8bKKm42C8R6xgPmpyoNgQgnaJq3GE4H6+ZP+VZPg516UUnXKzGH1/UjBXegZuGKU1oK2WkZpl2vET9EsQngpkDYt/egurt+N3p40StNDtDKlrQRoxOjBhP4a0onhYYAsW9iwVU8gzoeXPBvvbw5/7S0sjx6fpP4I2rACerMrXTC7Ztan3Ahb9AhZuRAwe2vb9K8p3Eeode9S2GDkxja9ZW0GjD4T7Dr8mLW149JPHACd9TsBYc45pKLwZXbBzeI5vMnvL2ljDbJNGw1sU4KgAWpnIgCVbC+PcJRhg2caieUrBUvEljRC7HQTPooIQ44jgNgfUNtbjnCesuAewgNxDMtEuEJa1YyOohG68BdX7SVcyhy1sqI0Ud7cIJNVd7JX4eX3OqONaj6BKLt+zfbVC1ennVek067Z/KNLo+32muqD/FIzJY2HyKbJUhR6TNpHZlRSTP7JB8tSBUVYcUwmIcEUlPu1WKhqSODH5Op7ZTbe5r7GWpzTCYHGdQbrzFAr9xaIL2soXFtKcC0hDlEdyZWvE5xV8vA6vyCtZbyYTFIY5/Jubag2thCLynEhuiKVYOSYIhcriYRy3iefsMDFdYN8+oKBDm60M5kL9EFAilH3xA0c3HRnoUD6xI1n8/TN6Uw+Ifw+YprCtXRL8VtHOE7teGc7C9Wb91UHXFDUtf1cJiQYRiHQgbfWTgJ3xkKOIH/3hT/Su1LDkTOAnlV27EvpWygUdKcN79fjH7rhtZ6/oJEXq+7FnnrANrzgHhQlGHtoNXoe/1yovJPvNZ8p5IISUZHYJsbquR6GDjbAtIr3DUN9HcnJPOypYcPc1AlunNFNyXzQYchYxAuEjWB/kX5yqxrKV/nqhH08TEPDtYgIhZgI7etZfwfv41EDwR+wG/vYFmxjEbc5m0/T3MGZJjjE7mSnsrG25Olkygf5nLR3CastSLt83Skr15lyrQv6dD2CsQ76k6N+QvFUGta9AIcLUhsjzQfUw+B6LSL1oafKkhq0rQRY5l/7EykVKTxVSNXORJvTQZ8ZxJN/AY3rg1Jl+nT1BScpWqN4cEVI+ioSp/+MlQzjA1ZHL1UqaUyw4eivUyOZnhqh2n/crZWFCMkf2wHSM8jD6SKZTRe6aiRX+zMNp4qaDVYbUZmqmu719xHAFikrcXIXpdvKelgVh8UMz0sLZ4isqahA1gl8FIIuuHTI0tiDrwqQYY/obMd0evZEvMvACZNZcp6bFEbd9Xe1Pfl21/YDMhyJnC+fDx5G7yFmSj85WJ/C5fBk78ZpMomuZhXjFI814rEEKF0NMFhLnDRUT2fSjq6eWAIWNcyYe48h4NsTpH2x83xLoUsmUV13cvQi+x6iklCNZ5Enp03ZC1bogLskpVNAl/nbCfE+AyJeEYDHeFGiX445pvplrTCrrq9AabmtlhOqirE6dCc63qc7FtzejKmAOl0BDyAAyoLDZ4yjZNEfz1ApBbQShL50+YeNJCvsSbxyLNIdUtTFe7EDp9EByCDH/n4DnqhAvgwdgeZn9Et7q5uW6o2DaOEabMlIuH9mKaV0aSoRCrU4PTVxdB1Gg4wjTVQzgcdRnPMrTLIBI1OWu4JKnKTU6iRLRRJKs4ZBmbwS8QFDrqMNQbD6+IkCNKR1t4Ts0sGex8a4kPDhiIwsLgewKnTp4JDDYCJs3H7i9qI7Y0ZDn12lgX6PKcfkKtURWyEPyJ7ybVDhMTu6txtiPUndF1IjG9M9THQEfsW63BxGcLdRW9E8AwOATbA7S8Q7DLmlRJW6MDxJG/TF/6rDScQ7DXkOU83B7ZY4z7JP+zSU9sMQbljBe9dxOhjeFTcu0i4p+RpJDH7kphlq+eYn4oOGvHlQkPaHDHHL0YqcP2yIW+Gqd5Hopd16FP2apo7QI8CuQRmkuK1gh6k9J+KnDHl7AEkglu7PDu9bRnwLTHQQ0dZeHG9AMAsoKSH00GxmQ+6NIGiOzbX6YiMtPnL8SK0XndTeqTMzhA7OObOBK17i9SFR2nC5AN6Pxn1c9JCXS0DHgOj6oxB4rpYWgEj466KMiaoU4FewidjK6nzaHw4geNjaqkqtcvJxmAVTEZ+AyaYCNR5LOwSXIotjDWwBA3zp1QtHyk+WwbHW4ER8xJAVFoG4X67RFbc/0lq23h/gyp+IsthIKMsVZJfAzbQe0rTPEWfSuoW0C1bD6OeKLf60DSxUxFkGtYAR8XEVWVTyeiB4Xk3s9Y9HkAMQNyQr20rX/o8a8sbCQrId/JghbtoHpa66s2K9NzN1B1sDPYDZHrvLRRIPI3syGMFCEJCSb8CW3cIdPYgQlt0VtyK9jCAa+jeCSxl1JsNpQHkX8SlD3sYoPyqgbt9LNy0RnzTkHTBKZf9B9JJlBF3VN6518Wiep4rjdXAYTJdI4dbBsFr6Y7jNzj/t+7IUj63F+/vW4ZLCys3CmuEIpDob1rIvQttoxqbCz3CowwspK1jvVkXVnIRNGGLGCtcGRD0x+ekPEgkPsXZCYYp1BAkxCQ872Yhh9PPB4TGmkBuz07hNYjXdN6M8ATcps2hVxgXNArd6RYn4NPw4Vas0DfUq+2kaiwWANIL6lzhqPRT87/eIrEeNttwwxgQ3VNgp52kjD/8sTOTvAH4aAADtmXd0VdW2xtfe2Tkk9BIgIOUQIqIgShOEnH1AEQFRijwLKkoXpUhXDDEhpFClSfGiIopcFBGkhZII2FCKJ4AVkKKICipeQWzg+7659zmZOO57Y9w37l93PMeIc7J/a84111pzzbX2PpZlmzhT9qXFhVMC5fKMaZhrmanle7RufkePjv16jWx1S6vRTXsPemTMyK7jWpoqJslYVc1lxnEsY2zjWPEdRvQfO2zg8DEmYCU8YYxJNBVNZWMsI35NPePY8d37Dh4YbFrSoiwF/hNRwaJBFerNMnbv2hX944PxdGSLoxQ66jx8zMBRw/sODXYbPvSx4I19h4/rO9oEzL/udqaFAJ+1e9G1hRjLxUfmBCMFxZMiRZG1kfXB4uxgpDCyujgrGHkDj7YUZxfnRQogs4qfDEbWyKPpxfmQm4KRdRCbi7MjWyPrI4XFk67mAzScDj90Iv9D24LiHHpbX5xZnAULPIxsgMWmJsHI4uJpwchGebQlUhCMFNFG2r8OR7PrBSML8Y/iHPjJRJvNiBNuGgfhaL10uwnti9ifRIs/eoaLyPrGwchmmkDfCtcYSFbxJHhB5NQirwMS4AHa+w4Q+0a0nImWGDBcIDL0tdlnkEGYrkdAsMHMrBdYcLVYr4NaJH4Li6fBNto9omMM6+mW3a1FFGjjORCJqUUE0h6BABfwMWxWiw0erMc8xtpKC07RNK4I/oEeNmP0nhVcCEQn0sGmJkjAUtFcKZNvTNtcY8p7SYN/TZa8mW5a1yhnykvyVM02pl2NLDytSXSZqWVq23VMXRNEWl9uGiCH7PSUevXSbctKL52YyEZx/B+2hWWuMA1hv9q6svuoEY8OGdY3eNuIcX1Nz4GDxw7tO8r4D/ns6uizq6z/T0K29x0g9v/AJAwaB8kmqRePLMmuk9PWzs9cVzXuoU9feMRhxpTC/4LxJtAatW/yrB1jgbcmxGXbZrXCrQPDgXM6HWsAHKwdNxlE4eGB5Shw5HPsfGO1icsxpoPiy63ACb/BRTvPNB/KBtrBCSswxTb4Q45LkHGGtB3iyuhS9gZjWfYkkzlHEyswsWHTBNR9O9tsu0wTO5Cx7bmaxooD6b5bk7jAxC+X/c1Yjj3Z/D1VEyeQce3hVGPFg7TO1CQ+MPH9cUXGCoA8sF2TQCBjavsgY8sxb5XTpJQfWymQASmaJAQmztpxzrNZ3FmTRN8mASStjyal/fEkgjwwVZMygYx/7CtnrNIgs9ZpUjYwscux37x+Gh/SpJzfTxmQ3Wc0Ke/349i55tHymlTwZ6csSOSSeavo25QCOd5Gk0r+SMuBZNymSeVAxtkLONltkJQBmlTxvbGfFhM0SfJJaZCOszSp6o+0PEjSi5pUC2QMqJjMOcg1ZzdpUt2fgwogHd7SJDmQ0euLy705SDuoSQ01B/N+1KSmH1tFpPb+OE0uC2TMv7GMsSqBdCyvSa1ARr8Ts9hPnjlTW5Pafj+VQfpdqUkdvx8L5OEWmtT1x1MFZO71mgQDGYPa1vX6ea+DJvX8fpJA2nbXJCWQYTcqxTXNM1m9Nanvr2lVkG4DNEkNZHSfcSd3SZ7ZPFKTy/1dkgDyZ7omDfzxxIEk5Gtyhb9Pq4EkzdKkYWBii+bNvZFWma/JlWqknZ/X5Cp/pKVBtqzUpJGfO1y5pRs0aeyvHMdTdbsmV/vj4Sr03q1JE38VONJJxZpc4480EWTaIU2u9XcwvVU/qUlT5S18WpNmylun85o0971VQhX+1mjSws83G+SNBE1a+t6qo7LfeEmOXheYeHHFj4wNNb+KJq382MrYcmREH7f2XQVQrIN9Nbnen7RklOSjAzRp42+40iiv3ctr0tZfHBbr/Ps0SfMXNAEkeZMmIT8ClsrVCZq4/tTUADnaTJNwIOO3jIcYdY55cYgm7fyoK4MUzNekvd9PTZBDOzS5IZDulv6Yk5Zjun6oyY3+pF0GcvobTToEMtq1fNZYtVBabquqyU2BjA7ThtJbrtnZVJOOvrfaIMlpmtwcmPjJC2c4O7lmUjdNOvlRJ4LMG6hJZ392WNxWTtCki2/DYl00S5NbfMLYIi9p0tWPjUU0uEaTW/2Vo42zU5PbfBtG3WufJt38fhjBoK816e6T6iCPXtSkRyx188zPCZr09PupA1Lnkny7PZBxfAKOJZaJU8ma9PIzsS7IvhRN/svPkCBI9Saa3BHLgzyztpkmd/oR1AM52EqTu/xMrA7idNTkbjWeokvWtLfvjTZf9dLkHt+GZWJJH03u9Vc7GaTxEE3u83cjbf4+RpM+vg2PixZPaHK/f1ywjE+YoskDfhlnEe0yW5O+/rwxgicXa9LPjyAF5OvlmvRXMzp5pSYD/Dngyq1co8lAf+UYwdwtmgzyI+BR9sk7mgxWR9mNBzR50Lfh0Zx/RJMhfiayWM/+VpOHfMJj6elzmjzs74UASnLuJXV0qN8PC2/DgCbD/JGi8OIu3SD6eHisExZeTUb4nZRF4e3eX5NHYjaTzZlETUb6NjVAtl3ibZSfoLwLd/pAk9F+yLy9FiRpMsbvxwY51E6TsT5h4TXDNBnne0sByV+kyfhYEuSYX17R5FF/apJAFm7T5DE/QeVQ+EaTCbGkzv3LHDzu27DopNfRJN2PuirIzBaaTPQThzYDummS4duw7I0bqMkTftS8P78zQpNMvODIZYtX3n7ZGmUBSVrHAV27QKNJQLLnkoE6Ldco2/K3FstyuyKNJgPJklcGSv1QoxwgiZ1hXHdKo1z0FQvD+VOjPCAJg2V2ZimN8uFQ6ixrzD2VNZoCJOvBTXmylkZTgfzJzTM9r9JoGpBEyMJwT0uNpiMMmV7uvuw2Gs2AlQyZW/bcTRrNBBKH7Otid42ejCL2VepejWZF+yoDdM0l22Z21IphtB6q0RwgCaMs0IDxGs0FEiveTodN0mgekFxPawMdna7RUwhDjn/e3p+ar9F8IMmo+kD9l2i0AA7brMvnUuaZ9Nc0WggrWUpW164bNVoEJAlQHqj5do2ehkN5+UoBqr9bo79ZsT2cZ96IaLQYDmUOuSgnP9ToGTiU2WDanDmq0bNAkjaMMP2SFH0ODiVCHlv9z2m0BFayxbkoTS/J3ueB/EXJz2wSr9FSIAmjIqr22tIavQAki5IEq9MVNHoRyO8rP3N/kkbLgKQvFvvpNTV6CcHLbMRJtZ8Tfb4cz2VFAja+Fp7V6O/wJpWzuo1/X6HRCljJfSABaMkOjV6GlQzKRl1feL1Gr0RROaCjszVaCSTv8TwNHvlao1eBJAx+mOhaT6NVCMNfkRzzdSeNXoOVzJINZEZptBpIwqgGlPqsRmvgUF4J+UEjuEGj16NWDlCH4xqtBZJpr4LaNaGURuuA5E2Sp8JXtTVaDyQRsoROaqrRBiBxWAdo0CXj2gjkVzx8h+ujUQGQpC6vvcmjNdoEJMHzreCqKRptBpLXghSgF5dptKVkc+WaQ6s02oqJknTiuBpv0qgQDmVcjLBgj0ZFQBIhrSKXzOEbQGJlA917XqNtQBI8L1EbAxptB5Lc4Pb/o5JGO6IR2kCp1TV6E1bikEfD1SkavQUkRwP7WniNRm8DSV/1gQ630egdoFjF+7mzRu8iDNlfjNDuqdFOIImQReOqOzV6Dw4lAeKBFvfT6H1YyTdEXnd7PqzRLljJocyytnecRruBZOZZDHtnabQHSGaDE9V/ukZ7o6gc0NAFGn0A5G/YPOMu1SgCJBPFvrJf1agYSByyr+kFGu2LItb/p97UaD+Q1H/OYc5ejQ5gNmQO6fDV/Rp9CCtxSKsNn2v0UdSKlfzzLzT6GFaSh5zD1O81+gRI5pBWq3/R6FMgsULhNY9bGn0W7asMUAVHo4OwkgiTUa7nJmp0CEiWEt9YMntU0OgwkFglwOFHSRp9HkW06l1ToyNRVBVWR+pqdBRIcj4RVvMaaHQMSIZcH+izRhodB/JzPt8Mbq7RFxiyn/P5Zlgrjb4EktlIlmPoYvT5CXiT8fJzT+YIjb4CknSqhLOm4lCNTgLJlyieGncxhhj6Gkis+F0nc4ZG3wDJVPCE2nlCo2+jqDyKfAJnKYZOAflJmGN2dtHodHRQPDUevF+j72AlDpOBpk/T6HsgGTJPqHSW0Bj6AUis2NeSSyI8E+2rDlC73zT6EVZyNLDIb66s0T+ApMjzI3WLazT6CUjC4DHUuKNGZ4GkCvH+X/E+jc4BiVUAKGGMRj8Dyczz1JgzVaPz0eBZ/4/P0+gXWMkO4lej4Ss0+hVIZoNHQ+YbGv0WRTzy5nyo0e9RRKsXT2n0RxRxIx+8JA8vAEkYLBr1ymh0MRo8S03nihr9CStxSKuel2mUaftWfHmZENQoy/bXi5X85kYaTQKS6WUVevM6jbKBZEuyJndrr9FkoFhNrtdVoxwgWRR+bhh0p0a5QBJ8TaAR/TTKs2MXgDxTZrBG+f64EhITLcv/RfjSn4mN/cRne1vFJfXvtX/Z06Wbna5W7fdqqSPfPXLL+CoPOyZ+ScCU5a/QxpSzyj9hGWMamyb2E1amZWVZZhJ+XsRPiPiVzzK5lsmzTL5lplhmgWWWweh9y+yy4vZYZi8MA6kFtrHGFz0XghNjT3rqTRfSOJcHrDCkadG8SrhU1lMhytM9WrsOlU11ctx5yU74t4yX3TIff+G+HVztOq2nWOH1Oze4aUcqhAvH7Bf53riLrkPl4oHk8D0Dfncnb7sqbJltIm32GlPQlzEWdozbesp216by2d7qYfvPAwWiOAPbHhGl44af3Lo5ZUSe7vGL61DJr/apywa0pQWl+KDiue0+Y0FIHqG6unanY5tFca49/KUo1/X5DSPPFNl6SnvXoXJhxY+hryLHxZYWlOKDirHMQGM9vWiRxG43yqsGB1D+sW+PWyV7mysKHhj77uvPlijv3nLetePv2OspTy+q4X706DchUfwni0IxBUbG3G6sx75p4HnouGF0iVIq60PX7lJ2R4kihpkPbU2LKYJoHlNgbcxh/Aq8cPgc96W/ddjqNHn9sCiDBwXCfU9EQpSf7R3vOlSYEmyw7JELLi0onfg7yotSJbtdiA0oxYIKXbABXdKC0uvttZv7hpx7BrQVBVHAYWXGg4WFLZXHk1a5bLAv5SDgHJFOXKN3Rand+0tpQCkWVOiCDeiSFpSmvbGYgzJmKjIdnNCYgs4MlBrs3lNijamYLGwLDkb6oXJdn80hNuNoajjzRTrvjSsSZXzREfeGBwamMSE3/jQxZP/XFyfcX2//IuQsHL7PLRwzNzRrx3p3z+6ucLFIpNNmXSdRUDFd7Db5a9eyj2vX7u2EY8qFFSM5TCc8ovKbbuLKQzLruadmi3SYc1QYn14GY41+cLasmnP/5vdEOXDrcdmnTOf5N05zbfZHxdlUJ979tsEat9Jd10vLqKnZaBkLnzzh8XyhjVGGsC+KHA5v1/M3FVW4+vUQxlD0yo/7RDrl7EZu1VU3F112zX1us4TGRZ2OTXDbrNtZaFe661dvAa669wNPIaK93SxhpbckcN9WlNxTPVBTXthif9ugqYvCUOiML6rLjVjYtVUiq05R9U/3hiidpTdtEAUBhzCaomisZrzallwySE9haLItYwqIty0hPUWiIIopt/WbxZypUaIIYhcxBdbGnEfOXB5AwcF/9vShJ0uUr39f4TpUmBfDTm6RVau6Kk8kssgVZeNPF0JvB89IvhyfcMC1kfSh+gc3uQ47Hf1gsXv/5s7uzw0Pufc9OUkkduhLorDbrq3eE/nsD8u5vNvd9TvHuc6d5V/FHpnj9j0xC8N+RnKM0hkZKi0Kpj40onK2yO4zqrsOlbeD14bYAPpWWlA6HD+VDtNWundf3yKNfXC7SWcYKgo4Ne5/B8uL8UwM9a+4kNkQSj34mEiAZqKgNRNSJPNYtn8N5w4kRjNU4CyXFpQOXVChy5kLhssYkYHeGNmZOYFMjea+bNY263aGCsdUkWgxmyIBtomCWYV8Ky096XuZaptzjQwLOfOS33K5mktqviYDw8knEodbe1EYI6eFUjqjUm/164ivvZQoWlA6dEGFLrly7INHiM1eWRQc0nL2KWzabbL6CEWkw8CpcCCb6rwtkp3xIGA+ok8vVSE9JZaGMQXES3lIT2FVk3SOKSCGdwSUyrlpmO0Qqt/cNM6Qw9JFZWK4pYy7+qe3edFHzt9e4iCmwI8XCKSnSCCjH6zkKaxxc77b6jqv3XwMQzkfOtptBjMixA4ppdZceW8FrznuF95IqPT6YhlrVE5oX8o9skpvnmsouUHp5FdbJArL67u3tHIbNt0pm8SmgmCMPXPB9yWKeCWKKfOSJ7tOpbs24drwqDu1/RIXV333zPJckXJWUWFo3COUrJU2FfowhxA4irQ34cxjSGNza3+fHnbt+TfuKlFAjI0hlCh0YXN/UeFNRsaNnpB6H4qsm/OK61DpUnaSO2T2d6EV79zCjEAJuMGFD69nY9E/N4k9eNAgUZzHk5qIclu/iu7LP84RKd6oMC2xx2UJaUEpMcYUmpqXUdHQWejKe5/0NtbZCweweOWwf0rOduf2gs9F+Tw1EGYDSk6nQ+X79DdcNuDAxs5dKBLLdrcouMKjyB9BHTocYkPeO92M8DmZs7XPVAhPDK933dK4Bz689az7xEO1PGXI7KvDSLN17ppRDcNIjnhc/uqGGd/36X9ydiRgfJXH/UACofLPLgqywFQwhdKAUiyo8K7BBtyptKD8p5cRWpjtyARuNI4LO+6vm5F5DGkcjFUUYhxw0qxnQR3XoTJk9jA5fHsWPOvSghI+apQobOV1xE1gfxVZKopz35M7REk78gH+uuHvAxjBLRUEjATa4SJDcaFdKlK8xRSa8uDEjg+zC1wnU0oUafblsoNeeyqCuDoxRRBdxRRBnICYgmEbNG4p7xaiEEn9RknAfahs2Fn7zGuiHO22x314a1J4avuj7vb364XtkaH35cXBwb0Wh0C98GPfvISqVBMtZ4jECTtYlMyH0qQBrw604Bkcog/njedqilO39J1+J16vnFE/vNgmZmVjcRYFD7zKBukpjPxfu8h/jGGy4qELr9YOO/l7odyBYgpaGXtJzR+8bqgIWjMqIRxTxJwRxBTphntJFB5Q7+Fi6rBc4Is8NvrqEK9pWGNcN2HDvqnwPLkV87HufyrsbGTz4kXFYTohzUIvPhJy+SYRNWbe4FbmxYw/b3V5S4WZa3NPSmBsIwrniGsliv/kL5MFpYbnkApLjl0352G5vYgfELyuYUJveCDe62/s3OQSRXzhPuV5x8zK0WHzbiFP2E1MgZHXDaSn8NjFi96L3pMWzdd6CvsSRAUPjLmGV+Rzaby3YN6nygVGlD27p7s2UUwh4kydWf6O561F85885YPzc3lXcm0smBcebzaisLLwjLPxdusFjLLnvd3xmBMrlN40uDE2bz2QRqwmb+vi2tG+zFwUcg4MO6NIRoiLinetwctv2pzv0qWA8/yj5DktCg7uMLOHklcQh8qWzrtRM4/JHYUWlA6v9FSYG3VzTuEaVQM1c58rnUm8nOmYEouDirF4LRb/VJi/PJpZlxvlzRfpfPLCI6Lg3ol3dO9V7IqmCa446bhhreuQ8ArMlqh3uFTOF+nQFxX65l2Nkp2ZYqTPdX1qykoyNTyl07HfcFlJ56tIUy+P2EaUsXM/kXcmznSJImj/rUtLFEHMf1HwFcgbON8QRRnY9n6vC8yxt3T4gOEtHa0kyeknpoDI8pYoghiPKIwQxJgRzMexIXyqCTlU8JeGUypU5uP6W7EsIh1WCiq8IXgNmuBTCiyocHXYYM/u3bh8nApRAqwSBa0x84tE0kJ2ID62Sed2cUrbEkXqbuLKWp7CLftVJMXLWnnCoy+mwMhgv6V646PyeFL5sP15qpe+do8ZH3sK+xJEBQ+M+QERMAdkYhlbTAGkwb/z2OW3LPgw9ojK9UsUMpsopoDgTkY71Nx/8yH9JbYy6wmfOti9IVZz3l2QTFv5fkSJ/bhZlMVvHaUMUeJl2XWosBRF77wD2z4nuejUx4smL5k83fmBg5Je0MdBl5/J/lixRrb4mlEPwuIP1+H9ngpeOEMdpp3GtNZF6hxw7e3vPx+S+/7aZ37gyYMWV8j8soRT4oV2kSjcuTxoKPE+zzvwWvfVWk9L0WPp5OWUUl4mYgrfBeSmS8X5ueFiUU73KMDVvaNIHloOFbx6h7DesO0a4uxQyrcKKkxwhILb9lMhOSCiE2v4WZQE6/hPkoifNHCHDVHikss3iF9x5rr4CHTCTVk9Cht/l3vo1wx540GLXLwvn5VxUX62dyPL1Vlee3En/kSSi6cNJRb6LzlsLGw9eft1qDAlD/1ahNx5Uowo0bZGiSLHNxEVfF0oEoW2VVe9K5LO+JGoWN5osJDFvOngK8p2STaOl1K8xZSfG97rylRQkVSmQlu+eVHSmTkch5+b7roeb+YVww6vFVSYM0tvqiZyzne1wg6VX26vH2aDNusahmlBKZ97qPAUYANKsaBCF2xAl7Sg9E5Uanhz3i9Ku5afS1NKsaVCZ2xA57SgxLptEmXmglXSgFIsqNAFG9AlLSi99yEeH/I+FD2KsMW2ctNQyoxT4ZsNa/5/1FfBZ1BvcZ/CmxbeaktlVZVXNaTF5V5Zh7FX1qNtWKy8w0IOJLzK4rz5Xw4kr8H/+UAa6P2aISFQwfYxqEf1ZNsiqLLhDtPKMjrc+fGf/drN9UoUsaqLHxdE4TE0onIct1KqNzg6pGJexiRww3Qpaxc5zHr8o5AXEHxAE8nvS9jiLWSVOUsMlm8hlA5rEhVGHY0eF6GSGcIXUMzMC1tQIETizeakKKhPbLAl9eCv/ECzxWHVwgejQhRPuir86NEhAG8V2ohIwjOLUclgJimBr2+vi7Lr+RyX7y48UfhZTzZ4TImVn5iCGfJuxpCeIp9QeYBQcXhw4GaK74arMfYOW9khJY6bYJgKFkd+W6BkMqI2t5bfFtiAEdGC0guWVz1cT7eLgoHjLlkZKfICaidsqSAD8I1iOwr/QbGldDDTYSrzklNxTVglUiyo0AUb0CUtKI35bw==(/figma)--&gt;"></span><span>В итоге у&nbsp;нас&nbsp;получился большой документ-досье на&nbsp;наших персонажей. Мы&nbsp;знали о&nbsp;них&nbsp;всё! Их&nbsp;характер, семейное положение, какими устройствами они&nbsp;пользуются, насколько технически-подкованы, какие имеют ограничения и&nbsp;как&nbsp;принимают решения при&nbsp;выборе клиник и&nbsp;врачей. </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium legend legend-flex spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/48a1b108cbdb4d2496975d3fb9ac9e5a"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><img src="/Media/2465/google-docs-1.png" alt=""><a rel="noopener" href="https://docs.google.com/document/d/1uuavATo_rKgaLdlYDnuYJO_F8yUC31Xa7GWrXoLP-U0/edit?usp=sharing" target="_blank" data-anchor="?usp=sharing"><span>Портреты пользователей <br>и сценарии</span></a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2afe1e4e4daa40f8a1953b6bd65cfeda"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="slider"
            data-content-element-type-key="fe4b1c5b-697c-4ddf-b617-5f55c38c8017"
            data-element-udi="umb://element/f02c579094084e138f3b64fad7bcd136"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">




    <div data-cp="carousel"
         style="background-color:#ffffff;"
         class="swiper-container carousel typography__ignore-offset"
         data-settings='{&quot;pagination&quot;: {&quot;el&quot;: &quot;.swiper-pagination&quot;, &quot;clickable&quot;: true}}'>
        <div class="swiper-wrapper">
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2466/group-6978.png"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2467/group-7069.png"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2468/group-7070.png"
         alt=""
         itemprop="">

                        </div>
                </div>
        </div>
            <div class="swiper-pagination" data-carousel-ref="pagination"></div>
            <button
                type="button"
                class="carousel__navigation carousel__navigation--prev swiper-button-prev"
                data-carousel-ref="prev"
                style="color:#c4c4c4;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--l">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&lt;</span>
                </span>
            </button>
            <button type="button"
                    class="carousel__navigation carousel__navigation--next swiper-button-next"
                    data-carousel-ref="next"
                    style="color:#c4c4c4;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--r">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&gt;</span>
                </span>
            </button>
    </div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/7a69cd1edcec3bfe851aebfb8592ca44"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d45da489b5ed42bb8e88b35d5572f21e"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Формируем сценарии использования МИС</h3>
<p>У каждого из&nbsp;наших персонажей была своя цель. И&nbsp;для&nbsp;каждой из&nbsp;них&nbsp;мы&nbsp;зафиксировали важные параметры и&nbsp;условия, которые должны соблюдаться. Иначе цель не&nbsp;будет достигнута.</p>
<ul>
<li><strong>Павел должен был&nbsp;записаться на&nbsp;прием к&nbsp;урологу в&nbsp;клинику</strong> рядом с&nbsp;домом или&nbsp;работой в&nbsp;самое ближайшее время. Он&nbsp;нашел приложение МИС&nbsp;в&nbsp;интернете и&nbsp;решил опробовать его.</li>
<li><strong>У Натальи заболел сын, но&nbsp;с&nbsp;работы ее&nbsp;не&nbsp;отпустили.</strong> Пришлось искать педиатра в&nbsp;частной клинике, чтобы подруга, которая согласилась отвести ребенка Натальи к&nbsp;врачу, не&nbsp;сидела долго в&nbsp;очереди в&nbsp;бесплатной поликлинике.</li>
<li><strong>Жанну настиг приступ мигрени прямо на&nbsp;рабочем месте.</strong> Обезболивающее не&nbsp;помогло, но&nbsp;Жанна вспомнила, что&nbsp;ее&nbsp;подруга недавно посоветовала ей&nbsp;хорошего невролога — доктора Подшивалину. Жанна хочет записаться на&nbsp;прием именно к&nbsp;ней.</li>
</ul>
<p>Опираясь на&nbsp;эту&nbsp;информацию, мы&nbsp;определили все&nbsp;ключевые точки сценариев, которые помогут нашим персонажам добраться до&nbsp;конечной цели.</p>
<h3>Проводим аудит по&nbsp;сценариям</h3>
<p>Итак, МИС&nbsp;должен был&nbsp;помочь персонажам достичь их&nbsp;целей максимально быстро и&nbsp;удобно. А&nbsp;мы&nbsp;— отследить, где&nbsp;интерфейс заводит наших персонажей в&nbsp;тупик, и&nbsp;понять, как&nbsp;этого можно избежать.</p>
<p>По созданным сценариям мы&nbsp;провели Павла, Наталью и&nbsp;Жанну через существующий интерфейс МИС. И&nbsp;зафиксировали, на&nbsp;каких шагах у&nbsp;них&nbsp;возникают проблемы.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2510/audit.png"
         alt=""
         itemprop="">


        <figcaption>
            В&nbsp;отчете по&nbsp;аудиту сценариев мы&nbsp;отмечаем обнаруженные проблемы  и&nbsp;предлагаем способы их&nbsp;решения
        </figcaption>
</figure>

<p>Результаты исследований мы&nbsp;оформили в&nbsp;отчет и&nbsp;презентовали его&nbsp;заказчику. Зафиксировали комментарии и&nbsp;замечания и&nbsp;отправились работать над&nbsp;следующим важным этапом проекта — проектированием и&nbsp;прототипированием нового интерфейса МИС.</p>
<h2>Глава третья: проектирование и&nbsp;прототипирование</h2>
<p>Подведем промежуточный итог. На&nbsp;этом этапе у&nbsp;нас&nbsp;уже&nbsp;были:</p>
<ul>
<li>понимание, кто&nbsp;наши пользователи и&nbsp;что&nbsp;им&nbsp;нужно;</li>
<li>сценарии использования приложения МИС;</li>
<li>интерфейс, который ломал эти&nbsp;сценарии и&nbsp;мешал пользователям достигнуть желаемого.</li>
</ul>
<p>Нам нужно было спроектировать новый интерфейс, который помогал бы&nbsp;пользователям МИС&nbsp;достичь их&nbsp;целей.</p>
<h3>Проектируем интерфейс</h3>
<p>Мы снова изолировались в&nbsp;переговорке и&nbsp;приступили к&nbsp;работе.</p>
<p>Мы продумывали, как&nbsp;сделать путь пользователя до&nbsp;цели максимально быстрым, удобным и&nbsp;понятным. Фактически, мы&nbsp;выстраивали новую логику работы МИС, упрощали ее.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/75ad6b4d35e6f445aa2f92567256f78a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/188bd68c23654aeeb1b99ee7babd004f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2516/usserflow.png"
         alt=""
         itemprop="">


        <figcaption>
            Каждый лист на доске — это экран приложения
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/cd51938cabb2d78866ab82d39ae4c13b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6dc99f9e21cf40eaba91492151bc4545"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>На этом этапе нам&nbsp;важна была не&nbsp;эстетическая, а&nbsp;смысловая составляющая экранов: как&nbsp;они&nbsp;связаны между собой, куда ведут пользователя и&nbsp;как&nbsp;помогают достичь цели — записаться к&nbsp;врачу.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/085ef829bac364c6a0eacdfd06682284"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/b785a44ac784437e892809a389078c3e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2471/firefox_85xia7wah8-1.png"
         alt=""
         itemprop="">


        <figcaption>
            Вот они — наши первые прототипы
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/4f3ea5d0c82be146eace7c4d2ef938a5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/663c6370b13d49c5bb7d91c3951d07f8"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Детализируем прототипы</h3>
<p>Поняв, как&nbsp;именно должно работать приложение, и&nbsp;согласовав логику работы приложения с&nbsp;заказчиком, мы&nbsp;приступили к&nbsp;детализации прототипов. Работали сразу над&nbsp;мобильной и&nbsp;десктопной версиями.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c410c37f210917cd26fb17df7408cef8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/92b7ecc7ed78483db1ba3731c52c8656"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2472/figma_ukzvplykyn-1.png"
         alt=""
         itemprop="">


        <figcaption>
            Прототипы мобильной версии МИС
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d99f8ff8a83a94bf516558b0aefa6ae7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ce81676a2ff346d6b92561b4324681f6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2473/figma_emsrsvxsez-1.png"
         alt=""
         itemprop="">


        <figcaption>
            Прототипы десктопной версии МИС
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/7205c73a2082472fdb6f6f2e13d3a45c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9cd94cd2175949aebcc5a6a1d1906585"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В процессе мы&nbsp;много штурмили. Например, рассмотрели и&nbsp;отмели кучу идей, прежде чем&nbsp;решить, как&nbsp;должен выглядеть календарь для&nbsp;выбора даты и&nbsp;времени записи к&nbsp;врачу.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a560255bc50392b18464a8b43e75dbf4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e8b0d7628b9543069b193caddde4e451"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2511/calendar.png"
         alt=""
         itemprop="">


        <figcaption>
            Так зарождался удобный календарь
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/f7b0f53063f4c8d4fa753075934cdb5a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0475ae246238405c8f5feeec4106c104"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>На этом этапе нам&nbsp;важно было получить полный фидбек от&nbsp;заказчика — чтобы быть уверенными, что&nbsp;мы&nbsp;движемся в&nbsp;правильном направлении. Поэтому, в&nbsp;течение всей работы над&nbsp;прототипами мы&nbsp;часто встречались с&nbsp;«ФармАльфой» и&nbsp;«IT-бетой» — презентовали им&nbsp;результаты, проводили по&nbsp;новым сценариям работы МИС&nbsp;и&nbsp;собирали замечания.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/af3e92a04ec340c7d760a88a5aabba3f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/a1098ffb34ea4f158fb5558f289dd5f8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2512/presentation.png"
         alt=""
         itemprop="">


        <figcaption>
            Ведущий дизайнер проекта Алексей Пилишков презентует прототипы
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/ed4665435b923aa7545552a6c4a6ee49"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/61a02d545f6044bc9a4761d3e6fde291"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Все замечания, предложения и&nbsp;пожелания выписывали в&nbsp;отдельную таблицу, ранжировали по&nbsp;приоритетности и&nbsp;отмечали готовность методом светофора:</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/afd550c1c928a01f1ceac1fd602d4366"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e98ac37bf5c84cc4910dc305b2a85044"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2513/priority_table.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium legend spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1b944037a3a24640b7496b0689b8278b"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span style="color: #92d050;">Зеленый</span></strong> — задача выполнена;</p>
<p><strong><span style="color: #ffd966;">Желтый</span></strong> — в&nbsp;процессе;</p>
<p><strong><span style="color: #ff0000;">Красный</span></strong> — вместе с&nbsp;заказчиком отказались от&nbsp;реализации.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/c59886dc275e6c66a002b070ff8008a0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2f112e4098244e8bb28e36f5d5463ffe"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Глава четвертая: дизайн и&nbsp;передача в&nbsp;разработку</h2>
<p>На этап дизайна мы&nbsp;вышли с&nbsp;максимально детализированными прототипами и&nbsp;с&nbsp;брендбуком, который нам&nbsp;предоставили в&nbsp;«ФармАльфа».</p>
<h3>Cоздаем дизайн-макеты</h3>
<p>У заказчика был&nbsp;еще&nbsp;один сайт-сервис медицинский тематики. И&nbsp;в&nbsp;«ФармАльфа» хотели, чтобы МИС&nbsp;был&nbsp;похож на&nbsp;него. Поэтому, работая над&nbsp;макетами для&nbsp;МИС, мы&nbsp;опирались на&nbsp;фирменный стиль, цвета и&nbsp;шрифты из&nbsp;брендбука этого сайта.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/cb382eb1512f67835e82ab4be595c58b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/cb499eedeaa64489b16d09aefcebcd7e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2477/group-1364.png"
         alt=""
         itemprop="">


        <figcaption>
            Дизайн-макеты — мобильная версия
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7fb13c0e6afd49d17eb7330839285f90"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/c90292d44f6848ecb84c1f24ca2ed06c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2478/group-7063.png"
         alt=""
         itemprop="">


        <figcaption>
            Дизайн-макеты — десктопная версия
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/b2118dd3948b7e48c01bc871887a853c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9091c12d358648c4857ae0816c31988f"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В процессе работы над&nbsp;макетами мы&nbsp;добавили в&nbsp;существующий брендбук новые оттенки цветов (в&nbsp;том&nbsp;числе и&nbsp;для&nbsp;темной темы МИС), иконки и&nbsp;другие элементы.</p>
<h3>Формируем дизайн-систему</h3>
<p>Мы знали, что&nbsp;после окончания нашего проекта «ФармАльфа» и&nbsp;«IT-бета» продолжат поддерживать и&nbsp;развивать МИС. Чтобы со&nbsp;стороны дизайна у&nbsp;них&nbsp;не&nbsp;возникало с&nbsp;этим сложностей, мы&nbsp;подготовили дизайн-систему и&nbsp;собрали в&nbsp;неё&nbsp;все&nbsp;наши наработки.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9abb6388b3f7cdb697966482f16d0156"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/5763adf745f14dcb8c6c0879d40a5c73"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2479/web-mockup-v1-front-1.png"
         alt=""
         itemprop="">


        <figcaption>
            Фрагменты дизайн-системы МИС
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/95ff4da4f3f56338f3127be3831d10d3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6f80720dd17947d48808f9debee85979"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Теперь, если понадобится добавить какой&#8209;то&nbsp;компонент в&nbsp;МИС, не&nbsp;возникнет вопросов, как&nbsp;он&nbsp;должен выглядеть, — всё&nbsp;есть в&nbsp;дизайн-системе.</p>
<h3>Передаем дизайны в&nbsp;разработку</h3>
<p>На финальном этапе проекта мы&nbsp;подготовили технические задания на&nbsp;разработку и&nbsp;дизайн-документы для&nbsp;каждого функционального блока МИС.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1c97ecb1632f843f45891e3060964a33"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/34e36542ddbc456b9646fbc99a79463f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2514/tz.png"
         alt=""
         itemprop="">


        <figcaption>
            Фрагмент технического задания на разработку МИС
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/f8c137427b06e1375d097bc0b827b927"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/898bfe439b9141548d9ea959ac8a5638"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В ТЗ&nbsp;и&nbsp;дизайн-документах мы&nbsp;детально описали новое приложение, логику его&nbsp;работы и&nbsp;поведение всех компонентов и&nbsp;элементов МИС. Это&nbsp;облегчило задачу ребятам из&nbsp;«IT-бета», которые занимались разработкой новой версии приложения и&nbsp;внедрением наших дизайнов.</p>
<h2>Результат</h2>
<p>Результатами нашей работы на&nbsp;этом проекте стали: прототипы и&nbsp;дизайн-макеты интерфейса приложениям МИС&nbsp;(мобильная и&nbsp;десктоп-версии), дизайн-система приложения, технические задания и&nbsp;дизайн-документы для&nbsp;команды разработчиков.</p>
<p>Дальше за&nbsp;дело взялись специалисты из&nbsp;«IT-бета». Опираясь на&nbsp;наши дизайны, они&nbsp;разработали и&nbsp;запустили новую версию МИС.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/95afdf4bd5b043465c808038274ee481"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/bdb66d9c172f42d08c61efb5180f338e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2481/&#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/8c21011d4eaebc53b0252479d3a025ba"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0728936dd1cc4bd5b291e4cf795bb183"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>

<div class="umb-macro-highlights">
    <strong></strong>
    По&nbsp;условиям NDA&nbsp;мы&nbsp;не&nbsp;можем показать окончательный результат работы над&nbsp;этим проектом или&nbsp;дать на&nbsp;него ссылку. Скажем только, что&nbsp;МИС&nbsp;продолжает развиваться и&nbsp;пока работает только с&nbsp;медицинскими центрами Москвы.
</div>

</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/83cc71e9d918b3455dea9e76ecfd7d30"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c3725cb6db9c4cbc961ba0d3c4515c43"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>

<div class="typography">
        <h2 class="blockquote-new__title">Эпилог</h2>
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Этот проект стал серьезным испытанием для&nbsp;нашей команды — интересным вызовом, с&nbsp;которым мы&nbsp;не&nbsp;только справились, но&nbsp;и&nbsp;приобрели в&nbsp;процессе новые навыки. И&nbsp;апнули те, что&nbsp;у&nbsp;нас&nbsp;уже&nbsp;были. Мы&nbsp;научились работать сообща в&nbsp;ситуации, когда в&nbsp;проект вовлечены не&nbsp;две, а&nbsp;сразу три&nbsp;команды — мы, наши заказчики и&nbsp;их&nbsp;эксперты, а&nbsp;также разработчики из&nbsp;сторонней компании. Мы&nbsp;получили возможность отточить свои навыки в&nbsp;проектировании логики сложных систем, создании персонажей, сценариев и&nbsp;разработки интерфейса с&nbsp;учетом этих сценариев. Мы&nbsp;благодарны „ФармАльфе“ и&nbsp;„IT-бете“ за&nbsp;возможность поработать над&nbsp;МИС, за&nbsp;доверие и&nbsp;глубокую вовлеченность в&nbsp;проект. И&nbsp;с&nbsp;удовольствием продолжаем следить за&nbsp;развитием приложения!
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Алексей Пилишков
                </cite>
                <p class="blockquote-new__author-position">
                    ведущий дизайнер fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
<ins></ins>
<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Enterprise-разработка: что должен уметь .NET-разработчик
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Что такое enterprise разработка, какие у enterprise проектов могут быть нюансы, и какие навыки нужно обрести для успешной работы в разрезе .NET стека.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/what-you-need-to-know-about-enterprise/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/what-you-need-to-know-about-enterprise/</guid>

                <pubDate>Tue, 24 Feb 2026 08:45:34 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Enterprise-разработка: что должен уметь .NET-разработчик</h1>
                                <figure>
                                    <img src="/Media/2919/frame-272.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ed1e04fbf8c56834738a27c7ca9f7bd7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="background-color:15px 15px 5px 15px;">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1163461f4c944af4956d3b5a463dc844"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Поговорим о&nbsp;том, что&nbsp;такое enterprise разработка, какие у&nbsp;enterprise проектов могут быть нюансы, и&nbsp;какие навыки нужно обрести для&nbsp;успешной работы в&nbsp;разрезе .NET стека. </span></p>
<p><span style="font-weight: 400;">Предположим, вы&nbsp;изучили язык, фреймворк, инструменты, получили опыт разработки и&nbsp;теперь стоите на&nbsp;распутье:</span></p>
<p><strong>Путь 1</strong><span style="font-weight: 400;"> enterprise разработка: микросервисная архитектура, СУБД, очереди, gRPC и&nbsp;проч.</span></p>
<p><strong>Путь 2</strong> <span style="font-weight: 400;">геймдев: Unity</span></p>
<p><strong>Путь 3</strong><span style="font-weight: 400;"> CMS&nbsp;(content management system) и&nbsp;DXP&nbsp;(digital experience platform): Kentico, Sitecore, Optimizely</span></p>
<p><span style="font-weight: 400;">Про геймдев не&nbsp;расскажем, потому что&nbsp;им&nbsp;в&nbsp;нашей компании не&nbsp;занимаются, а&nbsp;вот&nbsp;энтерпрайз – это&nbsp;пожалуйста. Предлагаем подробно разобраться в&nbsp;нюансах и&nbsp;узнать, к&nbsp;чему нужно готовиться, если хочется в&nbsp;enterprise.</span></p>
<h2>Что такое enterprise </h2>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/5a381c26d361ec91685c9c4fc8ad615a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--13443205 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--13443205 {
                    /* manual inline */
                    padding: 0px 15px 20px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cfa9022af79143929751f02460b62cb4"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Приходит бизнес-заказчик и&nbsp;говорит: «Сделайте мне&nbsp;продукт!». Заказчику нужно изобрести «собственный велосипед» для&nbsp;выполнения конкретной бизнес-задачи. Такой «велосипед» – это&nbsp;цельная система, и&nbsp;у&nbsp;нее&nbsp;есть особенности при&nbsp;разработке:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Написание кода, который будет поддерживаться многие годы (ООП, SOLID, GOF-паттерны, Unit-тесты и&nbsp;т.д.);</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сложная бизнес-логика, которая часто меняется;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Использование проверенных фреймворков/библиотек;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Написание тестов;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Код, доступный для&nbsp;рефакторинга, и&nbsp;создания документации по&nbsp;продукту на&nbsp;его&nbsp;основе;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Регулярность code review.</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/3f3d501afc4d42eda00d7a3f37966d74"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2920/&#x432;&#x435;&#x43B;&#x43E;&#x441;&#x438;&#x43F;&#x435;&#x434;.jpg"
         alt=""
         itemprop="">


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/27862cedc9b02611d3df049635668bdd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--19492996 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--19492996 {
                    /* manual inline */
                    padding: 0px 15px 50px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3f169f6afb9c48e6aa95c7bb3b108aa6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Максимально качественный код&nbsp;нужно писать сразу, используя разные подходы и&nbsp;паттерны, чтобы в&nbsp;дальнейшем можно было расширять проект. Поскольку проект будет решать определенные бизнес-задачи, нужно готовиться к&nbsp;пониманию и&nbsp;реализации сложной бизнес-логики. Она, кстати, по&nbsp;ходу развития проекта обязательно будет меняться и&nbsp;дополняться, поэтому зазубрить на&nbsp;один раз&nbsp;не&nbsp;выйдет. А&nbsp;еще&nbsp;нужно будет погрузиться в&nbsp;доменную область, в&nbsp;которой будет вестись разработка.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Enterprise проект — это&nbsp;всегда вопрос про&nbsp;деньги. Мы&nbsp;не&nbsp;можем использовать непроверенные решения.
</div>

<p><span style="font-weight: 400;">Годятся только проверенные годами фреймворки, библиотеки, и&nbsp;инфраструктурные сервисы. Нельзя рисковать бюджетами и&nbsp;бросаться на&nbsp;первый попавшийся, только что&nbsp;вышедший новый сервис, даже если он&nbsp;кажется лучшим решением на&nbsp;планете. </span></p>
<p><span style="font-weight: 400;">Доработка и&nbsp;развитие проекта неразрывны с&nbsp;постоянным тестированием. Оно&nbsp;дает возможность дорабатывать или&nbsp;рефакторить код&nbsp;на&nbsp;протяжении долгих лет, а&nbsp;еще&nbsp;– смело трогать в&nbsp;дальнейшем старые участки кода, не&nbsp;боясь что&#8209;то&nbsp;сломать. Это&nbsp;важно, потому что&nbsp;подход «работает – не&nbsp;трогай» тут&nbsp;не&nbsp;подойдет. Ну&nbsp;и&nbsp;без&nbsp;код-ревью в&nbsp;этой связке никуда. Этот процесс помогает отлавливать несовершенства и&nbsp;баги еще&nbsp;до&nbsp;приемки тестировщиками, а&nbsp;еще&nbsp;– шарить знания о&nbsp;разработанной фиче с&nbsp;командой, которая потом сможет исправлять и&nbsp;дорабатывать фичу вместо тебя.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/27c76f86b3378ffc28ad5773c67f64ae"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d64e567c58c54570a1dae15129ae324e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Из чего состоит типичное энтерпрайз приложение</h2>
<p><img src="/Media/2922/opera-снимок_2023-04-25_151547_docsgooglecom.png" alt=""><img src="/Media/2922/opera-снимок_2023-04-25_151547_docsgooglecom.png" alt=""></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e9970047e1b54db1998f9be2ee0fb9ac"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Вот у&nbsp;нас&nbsp;есть центральное приложение, и&nbsp;нам, конечно же, для&nbsp;него нужна </span><strong>база данных</strong><span style="font-weight: 400;">. Если пишем проект с&nbsp;нуля, то&nbsp;сразу выясняем, какая база данных подойдет лучше, исходя из&nbsp;задач проекта.</span></p>
<p><strong>Логирование</strong>.<span style="font-weight: 400;"> Недостаточно просто настроить его, нужно подобрать сервис, который будет сохранять логи. Без&nbsp;логирования зачастую невозможно разобраться в&nbsp;проблемах на&nbsp;проде, невозможно восстановить какие&#8209;то&nbsp;артефакты. </span></p>
<p><strong>Метрики и&nbsp;хелсчеки</strong>.<span style="font-weight: 400;"> Мы&nbsp;не&nbsp;можем, запустив проект, отправить уже&nbsp;созданную его&nbsp;часть в&nbsp;свободное плавание, пока сидим и&nbsp;разрабатываем следующую. Сервис может и&nbsp;упасть, а&nbsp;мы&nbsp;этого не&nbsp;узнаем. Падения – это&nbsp;всегда финансовые потери для&nbsp;бизнеса, а&nbsp;их&nbsp;быть не&nbsp;должно. Чтобы их&nbsp;избежать, нужно превентивно, на&nbsp;основании бизнес-метрик, понять, что&nbsp;  идет не&nbsp;так, и&nbsp;исправить ситуацию. </span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Стоит запомнить, что&nbsp;о&nbsp;багах и&nbsp;проблемах на&nbsp;проде разработчики должны узнавать быстрее заказчика.
</div>

<p><span style="font-weight: 400;">Помимо логирования стоит предусмотреть </span><strong>error tracking</strong><span style="font-weight: 400;"> или&nbsp;трекинг исключений и&nbsp;сервис, который будет хранить ошибки отдельно. Трекинг-сервис помогает группировать, анализировать и&nbsp;фильтровать ошибки, отслеживать их&nbsp;частоту, предоставляет более детальную информацию, чем&nbsp;логи, и&nbsp;быстро отправляет нотификации об&nbsp;ошибках. Можно интегрировать трекинг ошибок с&nbsp;чатами. А&nbsp;еще&nbsp;можно создать кастомные интеграции, чтобы, например, сервис отправлял сообщения об&nbsp;обнаруженных ошибках на&nbsp;телефоны разработчиков. </span></p>
<p><span style="font-weight: 400;">Внутри enterprise приложения должно быть настроено эффективное общение между сервисами: задачи должны выполняться своевременно, нагрузка – распределяться равномерно. В&nbsp;этом помогут </span><strong>очередь, шина, или&nbsp;планировщик задач</strong><span style="font-weight: 400;">.  </span></p>
<p><span style="font-weight: 400;">Приложение нужно будет подстроить под&nbsp;деплой. Поэтому <strong>разработчику нужно знать, как&nbsp;будет развертываться инфраструктура</strong>. Например, нужно определиться с&nbsp;контейнеризацией и&nbsp;оркестрацией – выбрать сервисы и&nbsp;правильно их&nbsp;настроить. </span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    На&nbsp;проекте могут быть DevOps-специалисты, но&nbsp;это&nbsp;не&nbsp;значит, что&nbsp;ответственность за&nbsp;процесс деплоя будет лежать только на&nbsp;них.
</div>

<p><span style="font-weight: 400;">Если у&nbsp;нас&nbsp;монолит, мы&nbsp;можем кэшировать данные в&nbsp;памяти. Если микросервисы и&nbsp;для&nbsp;каждого отдельного сервиса могут подниматься несколько инстансов – кэшировать в&nbsp;памяти каждого не&nbsp;выйдет. Не&nbsp;понятно как&nbsp;это&nbsp;потом синхронно обновлять. В&nbsp;таких случаях на&nbsp;помощь приходит </span><strong>распределенный кэш</strong><span style="font-weight: 400;">: отдельно поднимается сервис, который хранит определенные данные и&nbsp;предоставляет быстрый доступ к&nbsp;ним. Как&nbsp;правило, это&nbsp;key-value хранилище.</span></p>
<p><strong>Отдельные файловые хранилища.</strong><span style="font-weight: 400;"> Зачем? За&nbsp;тем, что&nbsp;хранить файлы просто на&nbsp;диске – не&nbsp;удобно. Хранить файлы в&nbsp;базе данных – проблемно. Поэтому зачастую в&nbsp;enterprise проектах используются отдельные файловые хранилища. Это&nbsp;еще&nbsp;один инфраструктурный сервис. </span></p>
<p><span style="font-weight: 400;">Для задач, связанных с&nbsp;отображением данных, нужно подключить </span><strong>визуалайзер</strong><span style="font-weight: 400;">. Так&nbsp;удобнее следить за&nbsp;метриками, смотреть логи, отслеживать хелс-чеки. Мы, например, используем Grafana, чтобы выводить данные и&nbsp;присылать нотификации. Grafana позволяет все&nbsp;собранные данные отобразить так, чтобы было удобно их&nbsp;совокупно анализировать. </span></p>
<p><span style="font-weight: 400;">Отдельный блок – </span><strong>code style и&nbsp;анализаторы</strong><span style="font-weight: 400;"><strong>.</strong> Когда команда уже&nbsp;большая или&nbsp;среднего размера, каждый может писать код&nbsp;по-своему. Это&nbsp;порой вызывает споры на&nbsp;код-ревью. Поэтому зачастую на&nbsp;enterprise проектах используются анализаторы, которые помогают автоматически находить проблемы, потенциальные ошибки и&nbsp;проверять единый code style.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/100c1219dd65e2a372e7e9aafd024d2e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--46070980 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--46070980 {
                    /* manual inline */
                    padding: 15px 15px 0px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1df5873d19c44ae18186eaea95509134"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Какие навыки нужны для&nbsp;успешного решения задач энтерпрайз-проекта</h2>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/a643698d21f523928ba62be36195ec35"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--19471959 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--19471959 {
                    /* manual inline */
                    padding: 0px 15px 50px 15p
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0dc6840886944f729277b28a81bda9b7"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>Базы данных</strong></p>
<ul>
<li aria-level="1"><span>Таблицы, типы данных, связи, ограничения;</span></li>
<li aria-level="1"><span>написание запросов, соединений;</span></li>
<li aria-level="1"><span>индексы;</span></li>
<li aria-level="1"><span>транзакции;</span></li>
<li aria-level="1"><span>хранимые процедуры;</span></li>
<li aria-level="1"><span>представления.</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/833ad851c9b9422697097a394f56042a"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>Более продвинутый уровень</strong></p>
<ul>
<li aria-level="1"><span>План запроса;</span></li>
<li aria-level="1"><span>статистика;</span></li>
<li aria-level="1"><span>нормальные формы;</span></li>
<li aria-level="1"><span>deadlock;</span></li>
<li aria-level="1"><span>триггеры;</span></li>
<li aria-level="1"><span>внутреннее устройство фильтрации и&nbsp;соединения.</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/bec730d9d82e1e23be83d1de71477836"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--15640818 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--15640818 {
                    /* manual inline */
                    padding: 0px 15px 0px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f432646fdb724cc387f81546850bd189"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;"><img src="/Media/2923/opera-снимок_2023-04-25_152005_docsgooglecom.png" alt=""></span></p>
<p><span style="font-weight: 400;">Понятное дело, что&nbsp;нам&nbsp;нужно уметь самим создавать таблички, продумывать их&nbsp;архитектуру, понимать все&nbsp;типы связи, ограничений и&nbsp;так&nbsp;далее. Это&nbsp;must-have. </span></p>
<p><span style="font-weight: 400;">Еще нужно ориентироваться в&nbsp;разных видах индексов: покрывающих, фильтрующих, кластерных, не&nbsp;кластерных, составных. Так, уже&nbsp;на&nbsp;этапе разработки будет проще закладывать индексы, чтобы увеличить перформанс определенных запросов. Другой пример: когда мы&nbsp;видим, что&nbsp;запросы выполняются медленно, можем предложить, используя знания об&nbsp;индексах, один из&nbsp;вариантов решения. </span></p>
<p><span style="font-weight: 400;">Транзакции. Многие запросы нужно делать в&nbsp;рамках транзакций, чтобы не&nbsp;получились неконсистентные данные в&nbsp;БД.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/320c4f311c9750d23052f94c9a0e4aa4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--48780531 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--48780531 {
                    /* manual inline */
                    padding: 50px 15px 0px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/15cc5b35f6ea48128c3a43e597f2bdf2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Что нужно, чтобы продумать архитектуру enterprise приложения</h2>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">DDD;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">SOLID;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">GOF-паттерны;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">REST;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">чистая архитектура (гексагональная архитектура);</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">CI/CD;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">паттерны, используемые в&nbsp;микросервисной архитектуре.</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/6c182c82b3cde3007a57ea4f73d27cd3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--20541900 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--20541900 {
                    /* manual inline */
                    padding: 20px 15px 50px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/97f53f16eba144b0944146493986b67f"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Желательно разбираться в&nbsp;DDD-подходе, чтобы сразу правильно спроектировать приложение и&nbsp;сделать архитектуру, которую в&nbsp;дальнейшем можно будет расширять. </span></p>
<p><span style="font-weight: 400;">Принципы SOLID с&nbsp;точки зрения архитектуры сильно помогают при&nbsp;разработке. </span></p>
<p><span style="font-weight: 400;">GOF-паттерны нужны, чтобы писать более расширяемое приложение, более универсальное. Его&nbsp;легко можно будет дорабатывать, что&nbsp;нам&nbsp;очень важно. </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f8bd314d60ed49bca14a461efd1d9c9f"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">REST. Придется делать много интеграций со&nbsp;сторонними сервисами, общение между которыми зачастую реализуется через REST. Еще&nbsp;может понадобиться реализация REST API&nbsp;для&nbsp;приложения, чтобы с&nbsp;ним&nbsp;могли общаться другие сервисы, например spa.</span></p>
<p><span style="font-weight: 400;">Для дальнейшего расширения и&nbsp;развития приложения также разумно применять знания о&nbsp;чистой или&nbsp;гексагональной архитектуре. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/43b96bac8565206cca69edec7fe64f1c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--40844240 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--40844240 {
                    /* manual inline */
                    padding: 0px 15px 50px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c16fb47d18044dc0a978593fb2770f2b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Области знаний C# и&nbsp;.Net Framework для&nbsp;enterprise</h2>
<p><img src="/Media/2924/opera-снимок_2023-04-25_152919_docsgooglecom.png" alt=""></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f5220a2be3a3a790ed0440fb6b935aa3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--45994144 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--45994144 {
                    /* manual inline */
                    padding: 50px 15px 20px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/364a6cff49554f3e8f201b4e467f90d6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Инфраструктура enterprise приложения</h2>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/6aaf20c9485a22b107044962603ca52a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--8023381 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--8023381 {
                    /* manual inline */
                    padding: 20px 15px 20px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d7c6fc8d60fd4e89bc7723632f06f4cc"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Базы данных (MS&nbsp;SQL, PostgreSQL, MongoDB)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Логирование (ELK&nbsp;stack, Grafana Loki)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Отслеживание ошибок (Sentry)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сбор метрик и&nbsp;хелсчеков (Prometheus)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">CI/CD (Docker, Kubernetes, TeamCity, GitLab CI/CD)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Очереди, шина данных, планировщик задач (RabbitMQ, Kafka, Hangfire)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Файловое хранилище (Minio)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Распределённый кэш&nbsp;(Redis)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Отображение метрик, логов (Grafana)</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cb92ef406f0c45529101948328d0e666"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Дополнительно к&nbsp;этому всему неплохо бы&nbsp;знать, как&nbsp;работают разные инструменты для&nbsp;поиска проблем в&nbsp;приложении. Например, анализатор памяти (DotMemory), анализатор перфоманса (DotTrace), анализатор запросов в&nbsp;БД&nbsp;(MS&nbsp;SQL&nbsp;Server Profiler). </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3c1411369fb71f02db3c1c5971634308"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--54633164 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--54633164 {
                    /* manual inline */
                    padding: 50px 15px 25px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/95b2e88321de481391e4b657133a5cf9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Микросервисы – модно, молодёжно?</h2>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/91ea60ec34fa95761850ea6e725bd56e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--20169015 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--20169015 {
                    /* manual inline */
                    padding: 10px 15px 20px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6a2b709ec94b408ba2f1fae8f5dff00c"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Может показаться, что&nbsp;микросервисы – это&nbsp;классно и&nbsp;круто, что&nbsp;надо каждое новое приложение писать на&nbsp;микросервисах. На&nbsp;самом деле и&nbsp;здесь есть нюансы. </span></p>
<p><span style="font-weight: 400;">Чтобы реализовать приложения на&nbsp;микросервисной архитектуре, помимо знаний, описанных выше, нужно дополнительно знать паттерны микросервисного взаимодействия. </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/2c544033b64f451cbd5e1eaa97784400"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2925/opera-&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;_2023-04-25_153323_docsgooglecom.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2f548453befc82e1b01db2f0f3835d83"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--52393279 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--52393279 {
                    /* manual inline */
                    padding: 0px 15px 20px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c416c363230a4b1ca7421b7dd2f92bc0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;"><strong>Возникает куча проблем с&nbsp;распределенными транзакциями.</strong> Хорошо, когда у&nbsp;тебя есть монолит, ты&nbsp;можешь сам&nbsp;код&nbsp;обернуть в&nbsp;транзакции. Но&nbsp;с&nbsp;микросервисами это&nbsp;сделать невозможно, потому что&nbsp;в&nbsp;рамках одной транзакции может быть затронуто несколько микросервисов. В&nbsp;этом случае приходится применять паттерн Saga (Повествование). </span></p>
<p><span style="font-weight: 400;"><strong>Профилирование запросов сразу же&nbsp;усложняется несколько раз.</strong> Мы&nbsp;не&nbsp;можем взять и&nbsp;посмотреть все&nbsp;его&nbsp;логи у&nbsp;одного сервиса. Весь запрос, начиная от&nbsp;клиента, нужно собрать – воссоздать его&nbsp;«хождение» по&nbsp;разным сервисам. Для&nbsp;этого существуют специальные инструменты. </span></p>
<p><span style="font-weight: 400;"><strong>Сбор логов усложняется.</strong> Опять же, у&nbsp;нас&nbsp;нет&nbsp;одного лога у&nbsp;одного предложения, как&nbsp;в&nbsp;монолите. Нужно собирать логи с&nbsp;разных сервисов. Возможно, их&nbsp;придется стандартизировать для&nbsp;удобства отображения и&nbsp;просмотра. </span></p>
<p><span style="font-weight: 400;"><strong>Появляется сильная зависимость от&nbsp;инфраструктуры</strong>: очереди, на&nbsp;которые все&nbsp;завязано, например. Кроме интеграции нашего сервиса со&nbsp;сторонними, еще&nbsp;есть интеграция со&nbsp;своими сервисами. Все&nbsp;может упасть. И&nbsp;все&nbsp;эти&nbsp;возможные случаи нужно обрабатывать в&nbsp;коде . </span></p>
<p><span style="font-weight: 400;"><strong>Микросервисы намного сложнее развертывать</strong>. Мы&nbsp;не&nbsp;можем поменять API&nbsp;нашего сервиса и&nbsp;залить на&nbsp;прод – сломаются сервисы, взаимодействующие с&nbsp;нашим. Приходится оставлять поддержку предыдущей версии API&nbsp;для&nbsp;плавного перехода. Когда все&nbsp;остальные сервисы перейдут на&nbsp;новую версию API, можно будет удалить поддержку старой версии.</span></p>
<p><span style="font-weight: 400;"><strong>А что&nbsp;с&nbsp;отладкой на&nbsp;компьютере разработчика?</strong> Когда один сервис зависит от&nbsp;другого, мы&nbsp;не&nbsp;можем просто поднять через дебаг свой сервис и&nbsp;отдебажить все&nbsp;что&nbsp;хочется. Придется отдельно развернуть другой сервис, от&nbsp;которого мы&nbsp;зависим, и&nbsp;начать дебажить вместе с&nbsp;ним. Либо можно запилить заглушку в&nbsp;своем коде. Словом, добавляется проблема взаимодействия. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/84109b92c13532c09948a5631f4f9c62"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/90d15d9e158f48c39944e04e53eaa9e2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>За что&nbsp;любят enterprise разработку</h2>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Возможность использовать самый последний стек технологий.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Возможность совершенствовать свой код&nbsp;на&nbsp;протяжении долгого времени.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Полное погружение в&nbsp;доменную область бизнеса.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Работа с&nbsp;разными библиотеками и&nbsp;инфраструктурными сервисами.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Самостоятельное проектирование БД&nbsp;и&nbsp;архитектуры приложения.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Хорошая документация по&nbsp;проекту.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Налаженный процесс полного цикла реализации задач.</span></li>
</ul>
<p><span style="font-weight: 400;">Есть потенциальная возможность работать на&nbsp;самом последнем стеке технологий – особенно если вовремя переходить между фреймворками, а&nbsp;не&nbsp;затягивать переход на&nbsp;годы.</span></p>
<p><span style="font-weight: 400;">С другой стороны, если много микросервисов, и&nbsp;они&nbsp;используют общие библиотеки, то&nbsp;может начаться целая история с&nbsp;обновлением до&nbsp;нового фреймворка всех зависимостей. Зато если у&nbsp;вас&nbsp;средний монолит или&nbsp;несколько сервисов, то&nbsp;переходить между фреймворками достаточно просто. </span><span style="font-weight: 400;"></span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Просто обновившись, можно оптимизировать использование памяти или&nbsp;увеличить перфоманс. Это&nbsp;удобно.
</div>

<p><span style="font-weight: 400;">Вы вольны решать, что&nbsp;будете использовать в&nbsp;проекте: какие именно библиотеки, инфраструктурные сервисы и&nbsp;прочее. Иногда можно их&nbsp;поменять, если совсем не&nbsp;подошло изначально выбранное решение. Получается, что&nbsp;разработчик будет владеть разноплановыми технологиями. Многим как&nbsp;раз&nbsp;нравятся такие проекты за&nbsp;то, что&nbsp;на&nbsp;них&nbsp;можно расширить свой кругозор. </span></p>
<p><span style="font-weight: 400;">Вы сами проектируете базу данных и&nbsp;архитектуру приложения. Это&nbsp;своего рода вызов. С&nbsp;другой стороны, если спроектировать неправильно, то&nbsp;все&nbsp;тапки в&nbsp;вас. </span></p>
<p><span style="font-weight: 400;">Зачастую enterprise проекты создаются долгое время. Поэтому невозможно обойтись без&nbsp;хорошей документации. Ведь если команда большая, и&nbsp;есть некоторая текучка сотрудников, то&nbsp;без&nbsp;проектной документации будет невозможно поддерживать и&nbsp;дорабатывать сервис. Поэтому следить за&nbsp;ней&nbsp;обязательно – это&nbsp;и&nbsp;плюс.</span></p>

<div class="umb-macro-highlights">
    <strong>Над приложением в&nbsp;enterprise трудится целая команда:</strong>
    разработчики, тестировщики, аналитики, менеджеры, девопс-отдел, отдел баз&nbsp;данных. Они&nbsp;на&nbsp;разных этапах контролируют процессы доведения задачи до&nbsp;продакшна и&nbsp;дальнейшего тестирования, поиска проблем. Когда полный цикл реализации задач налажен, проще будет вводить в&nbsp;команду новых сотрудников.
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/483b74d45973e27017be7a830066642f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--52368374 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--52368374 {
                    /* manual inline */
                    padding: 50px 15px 50px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/368058f7aff24296b6c72cde3a2f11f4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Но не&nbsp;без&nbsp;трудностей</h2>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/9a0c193537fbda67f7c51e47f9776002"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--18259578 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--18259578 {
                    /* manual inline */
                    padding: 0px 15px 25px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ea9798ad9fe64906952ff2ef8893c4fd"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Горящие баги на&nbsp;проде, жесткие сроки реализации фич.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Нужно обладать хорошими знаниями по&nbsp;C#, .Net, базам данных.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сложный выбор подходящей под&nbsp;задачу библиотеки или&nbsp;инфраструктурного сервиса.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Без своевременного рефакторинга приложение превратится в&nbsp;большой ком&nbsp;грязи.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сложный онбординг нового сотрудника.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Свои «велосипеды».</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/f6ffdeddbb5e445ca7765e9fce21ba98"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2921/&#x441;&#x442;&#x443;&#x43B;-&#x432;-&#x43E;&#x433;&#x43D;&#x435;.jpg"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d0e26bc7112b2bc16fdec4c3454c026f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--36322687 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--36322687 {
                    /* manual inline */
                    padding: 0px 15px 25px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0d6303aca0054585867d134c97d22899"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Горящие баги на&nbsp;проде – правда для&nbsp;всех типов проектов. Пример: нам&nbsp;нужно реализовать фичу к&nbsp;определенному сроку, потому что&nbsp;зависим от&nbsp;регуляторных рисков. Тут&nbsp;либо внедряем функционал в&nbsp;срок, либо мы&nbsp;теряем деньги. Когда что&#8209;то&nbsp;сломалось на&nbsp;проде, бывает необходимо подключаться в&nbsp;любое время: утром, днем и&nbsp;ночью, чтобы срочно что&#8209;то&nbsp;пофиксить. </span></p>
<p><span style="font-weight: 400;">По-хорошему, чтобы попасть в&nbsp;энтерпрайс команду, нужно обладать хорошими знаниями по&nbsp;базам данных, фреймворку .Net, языку C#, чтобы не&nbsp;совершать элементарных ошибок. Если допускать ошибки в&nbsp;каких&#8209;то&nbsp;базовых вещах –  неправильно использовать коллекции, асинхронный код&nbsp;– будут блокеры в&nbsp;разработке и&nbsp;расход бюджета впустую. </span></p>
<p><span style="font-weight: 400;">Необходимость подбора библиотеки или&nbsp;инфраструктурного сервиса – это&nbsp;и&nbsp;плюс, и&nbsp;минус одновременно. С&nbsp;одной стороны, у&nbsp;вас&nbsp;развязаны руки: вы&nbsp;можете попробовать то, что&nbsp;сами хотите. С&nbsp;другой – если вы&nbsp;выберете что&#8209;то&nbsp;не&nbsp;то, потом это&nbsp;будет сложно заменить. Нужно уметь думать превентивно. </span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Вся&nbsp;ответственность за&nbsp;неправильно выбранный сервис или&nbsp;библиотеку лежит на&nbsp;вас. Это&nbsp;и&nbsp;минус.
</div>

<p><span style="font-weight: 400;">Рефакторинг. Нельзя написать проект и&nbsp;потом его&nbsp;только дописывать, не&nbsp;возвращаясь к&nbsp;уже&nbsp;реализованным частям. Постоянно придется рефакторить отдельные участки кода или&nbsp;переписывать их&nbsp;по&nbsp;разным причинам. Требования к&nbsp;продукту по&nbsp;мере его&nbsp;развития могут меняться. Поэтому если не&nbsp;будет своевременного рефакторинга, через несколько лет&nbsp;придется просто  выбросить это&nbsp;приложение и&nbsp;написать его&nbsp;с&nbsp;нуля. А&nbsp;это&nbsp;очень сложная задача, когда у&nbsp;тебя есть текущее работающее приложение на&nbsp;проде. </span></p>
<p><span style="font-weight: 400;">У каждой компании есть свой велосипед. Это&nbsp;значит, что&nbsp;разные разработчики используют свои библиотеки, свои инфраструктурные решения, работают в&nbsp;своей доменной области. Поэтому нельзя просто взять и&nbsp;сменить компанию: прийти и&nbsp;сразу же&nbsp;влиться в&nbsp;работу после совершенно других проектов. </span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    На&nbsp;то, чтобы вкатываться в&nbsp;новые проекты, всегда будут требоваться время и&nbsp;усилия.
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/77b40b3a828beaa0599c6d79832709b5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ef7cff2dd9844ca4985338b755a11b05"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Что почитать по&nbsp;теме</h2>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/4013c0a834364cd78442c9ba605d8e72"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--19880569 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--19880569 {
                    /* manual inline */
                    padding: 0px 15px 50px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7134b0041cc04e5883e620c9c28349af"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>CLR via&nbsp;C#. Программирование на&nbsp;платформе </strong><strong>Microsoft .NET Framework 4.5 </strong></p>
<p><span style="font-weight: 300;">Джеффри Рихтер</span></p>
<p><strong>Паттерны объектно-ориентированного </strong><strong>проектирования </strong></p>
<p><span style="font-weight: 300;">Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссиденес</span></p>
<p><strong>Чистая архитектура. Искусство разработки </strong><strong>программного обеспечения </strong></p>
<p><span style="font-weight: 300;">Роберт Мартин</span></p>
<p><strong>Принципы юнит-тестирования </strong></p>
<p><span style="font-weight: 300;">Владимир Хориков</span></p>
<p><strong>Микросервисы. Паттерны </strong><strong>разработки и&nbsp;рефакторинга </strong></p>
<p><span style="font-weight: 300;">Крис Ричардсон</span></p>
<p><strong>Реализация методов </strong><strong>предметно-ориентированного </strong><strong>проектирования</strong> </p>
<p><span style="font-weight: 300;">Вон Вернон</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/54744c75bad746f1a98ccf2d78f297a5"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2927/frame-274.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как провести демо: о подготовке, презентации и способах работы с обратной связью заказчика
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Демо — шанс для клиента увидеть продукт вживую, а для команды — получить фидбэк и скорректировать курс. Как провести демо так, чтобы оно сработало?
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-lead-a-clients-demo/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-lead-a-clients-demo/</guid>

                <pubDate>Tue, 24 Feb 2026 08:31:41 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как провести демо: о подготовке, презентации и способах работы с обратной связью заказчика</h1>
                                <figure>
                                    <img src="/Media/3150/slide-16_9-131.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d8ffa5192fdceba488c23a4f22762219"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0f0e16fd40e04d3f8da0048650a61549"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Зачем вообще проводить демо? Есть же&nbsp;дизайны, детально расписанные юзер стори или&nbsp;ТЗ, критерии приемки. В&nbsp;конце концов, есть люди с&nbsp;зарплатой, которые проверяют, соответствует ли&nbsp;разработанное нами требованиям заказчика. Профит демо как&nbsp;процесса выражается в&nbsp;ценностях для&nbsp;заказчика и&nbsp;исполнителя. </p>
<p><strong>Ценность для&nbsp;заказчика.<span> </span></strong>Демо дает возможность потрогать продукт еще&nbsp;на&nbsp;этапе разработки и&nbsp;скорректировать ее&nbsp;курс — может, понадобится пересмотреть юзер стори, пофиксить что-то, добавить или&nbsp;наоборот убрать. </p>
<p><strong>Ценность для&nbsp;разработчика.</strong><span> </span>Для нас&nbsp;основная ценность демо прежде всего в&nbsp;  получении фидбэка «из первых рук», и, чего уж&nbsp;таить, в&nbsp;обретении уверенности (иногда ложной) в&nbsp;том, что&nbsp;мы&nbsp;на&nbsp;правильном пути. </p>
<blockquote>
<p>Есть множество практик проведения демо. Некоторые очень распространены. Другие используются редко. Демо — вообще весьма индивидуальный процесс для&nbsp;каждой команды (особенно при&nbsp;отсутствии зафиксированных регламентов проведения демо). </p>
</blockquote>
<p>Я расскажу о&nbsp;нашем опыте. Что&#8209;то&nbsp;в&nbsp;нем&nbsp;универсально и&nbsp;подойдет многим командам. Что&#8209;то&nbsp;— очень специфично. Просто берите на&nbsp;вооружение то, что&nbsp;кажется вам&nbsp;полезным, а&nbsp;остальное смело пропускайте. </p>
<p>Итак, мы&nbsp;условно разделяем клиентское демо на&nbsp;два&nbsp;основных этапа — подготовка и&nbsp;«экшон».</p>
<h2>Подготовка к&nbsp;демо </h2>
<p>Есть простой постулат о&nbsp;тяжести в&nbsp;учении и&nbsp;легкости в&nbsp;работе. Можно его&nbsp;переформулировать в&nbsp;тяжесть подготовки и&nbsp;легкость проведения демо. Серьезно, если потратить на&nbsp;подготовку достаточно времени, можно серьезно облегчить себе задачу на&nbsp;демонстрации. Вот, как&nbsp;к&nbsp;демо готовимся мы: </p>
<h3>Пишем сценарий или&nbsp;демо-документ</h3>
<p>Прежде всего стоит задуматься о&nbsp;том, что&nbsp;именно показать клиенту на&nbsp;демо. Тут&nbsp;хорошим помощником будет заранее сформированный роадмап с&nbsp;дедлайнами. Опираясь на&nbsp;него, можно просто показать те&nbsp;компоненты, чье&nbsp;время для&nbsp;появления по&nbsp;эту&nbsp;сторону реальности уже&nbsp;наступило. </p>
<p>Если роадмапа нет, можно ориентироваться на&nbsp;спринты или&nbsp;просто взять набор компонентов, который вы&nbsp;разработали с&nbsp;момента начала проекта или&nbsp;после предыдущего демо. </p>
<p>Чтобы заранее определить ход&nbsp;демо, мы&nbsp;готовим специальный документ. Сценарий, если угодно. Его&nbsp;лаконичность полностью в&nbsp;нашей власти: можно расписать все&nbsp;подробнейшим образом и&nbsp;сделать заметки для&nbsp;каждого из&nbsp;участников процесса, или&nbsp;ограничиться ссылками с&nbsp;названием компонентов/страниц. </p>
<p>Тот же&nbsp;документ можно расшарить с&nbsp;клиентом и&nbsp;предложить ему&nbsp;прописать в&nbsp;секциях фидбэк.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2692/1.png"
         alt=""
         itemprop="">


        <figcaption>
            Пример демо-документа: здесь зафиксировано, кто&nbsp;и&nbsp;что&nbsp;будет показывать клиенту, приведены ссылки + добавлен блок для&nbsp;фидбека клиента
        </figcaption>
</figure>

<p> </p>
<p>По моим наблюдениям, это&nbsp;нередко добавляет баллов команде-исполнителю, показывает, что&nbsp;ей&nbsp; и&nbsp; правда интересно мнение клиента о&nbsp; продемонстрированных фичах.</p>
<h3>Готовим среду</h3>
<p>Следующий шаг&nbsp;— подготовить подходящую для&nbsp;демонстрации среду. Важно убедиться, что: </p>
<ul>
<li>стейджинг, на&nbsp;котором вы&nbsp;собираетесь демонстрировать материал, поднят;</li>
<li>на этот стейджинг могут зайти все&nbsp;участники демо;</li>
<li>весь материал, который вы&nbsp;собираетесь демонстрировать, задеплоен;</li>
<li>содержимое этого материала не&nbsp;вызывает у&nbsp;вас&nbsp;удивления.</li>
</ul>

<div class="umb-macro-highlights">
    <strong>Совет:</strong>
    будет классно, если всю&nbsp;функциональность на&nbsp;стейджинге проверит человек из&nbsp;команды, который не&nbsp;принимал участия в&nbsp;подготовке среды. Просто потому что&nbsp;он&nbsp;свежим взглядом может заметить гораздо больше ;)
</div>

<p><span>Что касается демонстрации на&nbsp;локальной среде — компьютере одного из&nbsp;разработчиков. На&nbsp;ней, безусловно, можно показывать отдельные фичи. Но&nbsp;помните, что&nbsp;при&nbsp;таком раскладе клиент не&nbsp;сможет самостоятельно покрутить демонстрируемую функциональность. Для&nbsp;него это&nbsp;превратится в&nbsp;ситуацию «продаете — показываем — красивое».</span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2693/2.png"
         alt=""
         itemprop="">


        <figcaption>
            Котики-клиенты, которые не&nbsp;могут пощупать фиче-рыбов на&nbsp;локальной среде
        </figcaption>
</figure>

<p> </p>
<p>Но тем&nbsp;не&nbsp;менее, если у&nbsp;нас&nbsp;в&nbsp;локали лежит добротная фича, которой по&nbsp;каким&#8209;то&nbsp;причинам нет&nbsp;на&nbsp;стейджинге (неполная реализация/работа только при&nbsp;участии духовых инструментов/не успели залить), а&nbsp;откровенно нового в&nbsp;демо мало — мы&nbsp;ее&nbsp;покажем! В&nbsp;конце концов, почему бы&nbsp;приятно не&nbsp;удивить клиента? ;) </p>
<h3>Распределяем обязанности и&nbsp;роли</h3>
<p>Кажется, нет&nbsp;единого «золотого» стандарта, по&nbsp;которому надо определять участников процесса. Есть команды, в&nbsp;которых демо всегда проводит один и&nbsp;тот&nbsp;же&nbsp;человек, и&nbsp;клиент пляшет от&nbsp;восторга. В&nbsp;некоторых случаях выступает вся&nbsp;команда, и&nbsp;тоже получается отличный материал. </p>
<p>Мы обычно подключаем к&nbsp;демо всю&nbsp;команду проекта. По&nbsp;крайне мере тех, кто&nbsp;готов свободно и&nbsp;понятно рассказывать о&nbsp;проделанной работе и&nbsp;отвечать на&nbsp;вопросы. </p>
<p>Есть несколько причин, по&nbsp;которым стоит привлечь к&nbsp;проведению демо всю&nbsp;команду: </p>
<ul>
<li>это снимает нагрузку с&nbsp;тимлида: все-таки одному человеку тяжело своими силами провести часовое демо; </li>
<li>необходимость презентовать культивирует более ответственное отношение к&nbsp;результатам своего труда;</li>
<li>это повышает качество демо: лучше всего разработанный функциональность может представить именно тот, кто&nbsp;ее&nbsp;разрабатывал; </li>
<li>это дает возможность всей команде похвастаться «детищем», который они&nbsp;произвели на&nbsp;свет.</li>
</ul>
<p>К тому же, проведение демо — это&nbsp;публичное выступление. Конечно, не&nbsp;каждый рожден Крисом Роком, но&nbsp;навык публичных выступлений важен для&nbsp;хорошего разработчика. Регулярное участие в&nbsp;демо — отличный способ его&nbsp;прокачать. Клиент – это&nbsp;весьма лояльная аудитория — он&nbsp;понимает, что&nbsp;не&nbsp;в&nbsp;театре драмы. </p>
<h3>Проводим внутреннее демо</h3>
<p>Это опциональный шаг, который особенно ценен обычно на&nbsp;ранних этапах или&nbsp;в&nbsp;новых командах, которые еще&nbsp;не&nbsp;до&nbsp;конца сработаны, но&nbsp;не&nbsp;будем обделять его&nbsp;вниманием. </p>
<p>Часто даже у&nbsp;такого незначительно события, как&nbsp;свадьба, есть репетиция.  И&nbsp;нам&nbsp;тоже было бы&nbsp;неплохо ее&nbsp;провести. К&nbsp;тому же,  в&nbsp;отличие от&nbsp;свадьбы, репетиция демо принесет нам&nbsp;существенно больше профита. Ведь именно на&nbsp;этом этапе часто можно заметить/отловить огрехи, которые были допущены в&nbsp;процессе подготовки.</p>
<p>Пара советов для&nbsp;повышения продуктивности внутреннего демо:</p>
<ul>
<li>Позовите на&nbsp;демо в&nbsp;качестве таргетируемой аудитории менеджеров проекта, продакт-оунеров и&nbsp;других людей, причастных к&nbsp;процессам и&nbsp;проверкам разрабатываемой вами функциональности. Они&nbsp;обязательно накидают полезного фидбека.</li>
<li>Проводите внутреннее демо за&nbsp;пару-тройку дней до&nbsp;основного, чтобы материал и&nbsp;ход&nbsp;презентации были достаточно свежими в&nbsp;голове, и&nbsp;при&nbsp;этом осталось время внести какие&#8209;то&nbsp;критичные правки на&nbsp;основе полученного фидбэка; </li>
</ul>
<p>На этом с&nbsp;подготовкой мы&nbsp;закончили. Осталось пробежаться по&nbsp;чек-листу, убедиться, что&nbsp;мы&nbsp;ничего не&nbsp;забыли, и&nbsp;ждать назначенного дня&nbsp;и&nbsp;часа нашего основного «экшона»!</p>

<div class="umb-macro-highlights">
    <strong><h3>Чек-лист готовности к&nbsp;клиентскому демо</h3>
<p></p></strong>
    <p><span style="color: #ca132a;">✓</span> написан сценарий проведения демо;</p>
<p><span style="color: #ca132a;">✓</span> подготовлена и&nbsp;проверена на&nbsp;работоспособность среда для&nbsp;проведения демо;</p>
<p><span style="color: #ca132a;">✓</span> каждый член команды знает, о&nbsp;чём&nbsp;он&nbsp;будет рассказывать и&nbsp;что&nbsp;показывать;</p>
<p><span style="color: #ca132a;">✓</span> внутреннее демо проведено;</p>
<p><span style="color: #ca132a;">✓</span> ошибки, выявленные на&nbsp;внутреннем демо, устранены.</p>
</div>

<h2>Проведение демо</h2>
<p>Итак, мы&nbsp;всё&nbsp;подготовили, сверились с&nbsp;приведенным выше чек-листом и&nbsp;назначили встречу с&nbsp;клиентом. Открыт демо-документ и&nbsp;вкладки с&nbsp;нужными страницами, команда в&nbsp;сборе и&nbsp;знает, что&nbsp;делать. Чтобы все&nbsp;прошло гладко, вот&nbsp;еще&nbsp;несколько моментов, о&nbsp;которых стоит помнить уже&nbsp;непосредственно на&nbsp;самом демо. </p>
<h3>Управление ожиданиями</h3>
<p>Здорово, когда команда понимает, чего ждет клиент от&nbsp;каждого конкретного демо. Великолепно если команда еще&nbsp;и&nbsp;может все&nbsp;эти&nbsp;ожидания оправдать. А&nbsp;если нет? В&nbsp;этом случае лучше сразу дать клиенту понять, что&nbsp;столь вожделенный конструктор видео-каруселей к&nbsp;демонстрации пока не&nbsp;готов — то&nbsp;есть, фактически, снизить ожидания еще&nbsp;на&nbsp;старте. </p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2694/frame-1-13.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Хорошая практика — перед началом демо обозначить повестку и&nbsp;кратко обрисовать, что&nbsp;и&nbsp;в&nbsp;каком порядке вы&nbsp;будете демонстрировать. Это&nbsp;поможет клиенту скорректировать ожидания о&nbsp;предстоящем демо и&nbsp;понять, какие именно компоненты и&nbsp;функциональность он&nbsp;сможет увидеть и&nbsp;«пощупать» прямо сейчас. </p>
<h3>Сторителлинг вместо сухих перечислений</h3>
<p>Вы же&nbsp;помните, что&nbsp;  демо — это&nbsp;публичное выступление и&nbsp;работа с&nbsp;аудиторией? Про&nbsp;некоторые компоненты, особенно визуально насыщенные, рассказывать легко — все&nbsp;яркое, анимированное. Можно вообще просто радостно посвистывать в&nbsp;процессе демонстрации того, как&nbsp;у&nbsp;вас&nbsp;одна анимация на&nbsp;другую наезжает.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2695/frame-2-4.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>А что&nbsp;делать, если нам&nbsp;надо продемонстрировать «скучные» репорты или&nbsp;табличную статистику? Зачастую для&nbsp;клиента такая функциональность куда важнее всех этих украшательств и&nbsp;анимаций, ведь на&nbsp;данных этих репортов он&nbsp;будет строить свой бизнес. </p>
<p>Мы в&nbsp;таких случаях стараемся придерживаться трех правил демонстрации: </p>
<ol>
<li>Рассказываем о&nbsp;сложных и&nbsp;«скучных» компонентах через сценарии их&nbsp;использования. </li>
<li>Показываем пользу разработанной нами функциональности для&nbsp;конкретных пользователей. </li>
<li>Приводим много примеров и&nbsp;выделяем время для&nbsp;ответов на&nbsp;вопросы клиента.</li>
</ol>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/074f66fad68e242bb450bc9f82d6e922"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/abc47cc756da4ec986f2412f98db0f43"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span style="color: #ff0000;">Нет <span>❌🙅‍♀️</span></span></strong></p>
<p><span style="font-weight: 400;">Это форма для&nbsp;загрузки товаров в&nbsp; интернет-магазин. Вот&nbsp;тут&nbsp;кнопка загрузки, а&nbsp; тут&nbsp;кнопка удаления. Можно загрузить один товар или&nbsp;сразу несколько. Всё&nbsp;работает, мы&nbsp; проверяли, идем дальше.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d90c4c30dee74db88ace7988c0bcc502"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span style="color: #38761d;">Да <span>✅💁‍♀️</span></span></strong></p>
<p><span style="font-weight: 400;">Это инструмент для&nbsp;работы с&nbsp; данными из&nbsp; каталога интернет-магазина. С&nbsp; его&nbsp;помощью контент-менеджеры могут: загрузить или&nbsp;удалить товары, отредактировать описание товара, добавить изображение и&nbsp; т.д. Сейчас мы&nbsp; покажем, как&nbsp;всё&nbsp;это&nbsp;работает.</span></p>
<p><em>*показываем*</em></p>
<p>Чтобы менеджерам было удобно работать сразу с&nbsp; большим объемом товаров, мы&nbsp; добавили ...</p>
<p>Есть ли&nbsp;у&nbsp; вас&nbsp;какие&#8209;то&nbsp;вопросы или&nbsp;пожелания по&nbsp; работе этого инструмента?</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ccd5c716847cb56d5d04dc362a39b183"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/175e71828579459aac96e713efcc20d2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Упор на&nbsp;то, что&nbsp;интересно клиенту</h3>
<p>Часто команда, которая проводит демо, может зациклиться на&nbsp;визуале и&nbsp;забыть нормально описать функциональность. Или&nbsp;наоборот — слишком углубляются в&nbsp;функциональную составляющую и&nbsp;технические нюансы, упуская внешний вид. Но&nbsp;как&nbsp;понять, что&nbsp;важнее в&nbsp;каждом конкретном демо? Ответ — в&nbsp;вашем клиенте! </p>
<p><strong>Если вы&nbsp;проводите демо для&nbsp;инженеров</strong>, логично подробно расписать функциональность и&nbsp;коснуться технических моментов. </p>
<p><strong>Если же&nbsp;перед вами сидят дизайнеры</strong>, скорее всего, визуал будет интересовать их&nbsp;сильнее, чем&nbsp;все&nbsp;эти&nbsp;технические штучки.</p>
<h2>Сбор фидбека</h2>
<p>Ну вот&nbsp;мы&nbsp;и&nbsp;подошли к&nbsp;тому, ради чего все&nbsp;затевалось — к&nbsp;сбору фидбэка. Важно ли, положительный он&nbsp;или&nbsp;отрицательный? Конечно важно, но&nbsp;пользу можно извлечь в&nbsp;обоих случаях. </p>
<h3>Положительный фидбек</h3>
<p>Если фидбэк исключительно положительный — поздравляю! Скорее всего, вы&nbsp;отлично понимаете, что&nbsp;именно хочет клиент. Конечно, есть вероятность, что&nbsp;вы&nbsp;показывали дизайн инженерам, которым на&nbsp;эстетику, в&nbsp;общем-то, плевать. Но&nbsp;это&nbsp;вряд ли)) Опустим этот вариант и&nbsp;остановимся на&nbsp;том, в&nbsp;котором вы&nbsp;просто идеально провели демо. </p>
<p>Что же&nbsp;можно сделать с&nbsp;исключительно положительным фидбеком?  </p>
<p>Ну, во-первых, передать все&nbsp;комплименты команде проекта, чтобы, так&nbsp;сказать, поднять и&nbsp;поддержать их&nbsp;боевой дух.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2697/4.png" alt="" itemprop="">


</figure>

<p> </p>
<p>Во-вторых, чтобы максимизировать пользу от&nbsp;фидбека, стоит узнать, что&nbsp;же&nbsp;больше всего понравилось клиенту — четкое следование плану или&nbsp;наоборот, какие-то<span> </span>костыли<span> </span>импровизации. Позже этот позитивный опыт можно  будет переиспользовать. </p>
<h3>Отрицательный фидбек</h3>
<p>Отрицательный фидбэк — удивительная штука. Его&nbsp;довольно неприятно получать, но&nbsp;по&nbsp;части полезности он&nbsp;превосходит положительный. А&nbsp;еще&nbsp;с&nbsp;отрицательным фидбеком (если он&nbsp;по&nbsp;делу) зачастую проще работать: если клиент недоволен скоростью загрузки приложения — это&nbsp;значит, что&nbsp;скорость загрузки приложения нужно увеличить.  Да, пример утрирован, но&nbsp;отрицательный фидбэк действительно довольно четко обозначает конкретную проблему, о&nbsp;которой вы&nbsp;могли и&nbsp;не&nbsp;догадываться до&nbsp;демо.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2700/5.png" alt="" itemprop="">


</figure>

<p> </p>
<p>Иногда в&nbsp;рамках отрицательного фидбэка можно услышать про&nbsp;отсутствие фич, которые вообще не&nbsp;были запланированы в&nbsp;документации. И&nbsp;это&nbsp;не&nbsp;повод расстраиваться! Всегда можно обсудить с&nbsp;клиентом расширение скоупа проекта или&nbsp;скорректировать план следующих спринтов разработки.</p>
<p>В общем, мораль такова: негативный фидбек — это&nbsp;точки роста, поле для&nbsp;развития и&nbsp;еще&nbsp;один повод становиться лучше. Мыслим позитивно и&nbsp;фиксируем все&nbsp;замечания, чтобы принять решение по&nbsp;ним&nbsp;позднее!  </p>
<h3>Если фидбека мало</h3>
<p>Если есть ощущение, что&nbsp;фидбэка недостаточно, мы&nbsp;просим еще. И, чтобы помочь клиенту и&nbsp;разговорить его, начинаем задавать вопросы. Много вопросов! </p>
<p>Например, можно узнать мнение о&nbsp;конкретных компонентах и&nbsp;функциональностях, задавая закрые вопросы: «Поведение этого компонента для&nbsp;анонимного пользователя прописано в&nbsp;ТЗ&nbsp;размыто, он&nbsp;должен показываться ему&nbsp;или&nbsp;нет?». </p>
<p>А открытые вопросы помогут настроить клиента «на порефлексировать» — что&nbsp;понравилось, что&nbsp;не&nbsp;понравилось, а&nbsp;если бы&nbsp;было так, а&nbsp;не&nbsp;иначе и&nbsp;т.д.</p>
<p><img src="/Media/3148/slide-16_9-129.png" alt=""></p>
<p>В общем, чем&nbsp;больше вопросов вы&nbsp;зададите клиенту, тем&nbsp;больше получите информации, которую впоследствии можно использовать для&nbsp;улучшения качества вашего продукта.</p>
<h3>Лайфхак: демо может быть неофициальным</h3>
<p>Не обязательно регулярные демо превращать в&nbsp;клиентские согласования. Можно использовать их&nbsp;как&nbsp;инструмент повышения прозрачности процесса.</p>

<div class="umb-macro-highlights">
    <strong>Иногда клиентские демо могут становиться стрессом для&nbsp;команды.</strong>
    Причины этому могут быть разными, но&nbsp;предлагаю сфокусироваться не&nbsp;на&nbsp;них, а&nbsp;на&nbsp;способе минимизации стресса.
</div>

<p>Каждый цикл разработки в&nbsp;себе имеет определенные артефакты: итерации планирования, дейлики и&nbsp;демо, например, по&nbsp;понедельникам. Мы&nbsp;на&nbsp;некоторых проектах видоизменяем регулярные демо на&nbsp;уровне концепции: превращаем их&nbsp;из&nbsp;клиентских согласований в&nbsp;мероприятия, где&nbsp;клиент выступает вольнослушателем. Зовем клиента в&nbsp;каждый недельноспринтовый созвон, но&nbsp;приходить или&nbsp;нет&nbsp;он&nbsp;решает сам. Эти&nbsp;демо мы&nbsp;проводим преимущественно скорее для&nbsp;себя, чтобы синхронизироваться внутри команды и&nbsp;быть хорошо погруженными на&nbsp;протяжение всей работы. Так&nbsp;и&nbsp;планировать легче.</p>
<p>Клиент, если приходит на&nbsp;такие неформальные созвоны, может, конечно, задавать вопросы, и&nbsp;мы&nbsp;с&nbsp;удовольствием на&nbsp;них&nbsp;отвечаем, проясняем то, что&nbsp;не&nbsp;понятно. Но&nbsp;это&nbsp;не&nbsp;превращается в&nbsp;процесс согласования. Для&nbsp;этого у&nbsp;нас&nbsp;есть отдельные и&nbsp;обязательные встречи со&nbsp;своим таймингом.</p>
<p>С одной стороны, так&nbsp;получается наводить прозрачность, чтобы на&nbsp;каждом шагу клиент понимал, за&nbsp;что&nbsp;платит, видел нужный уровень вовлеченности команды, внутреннюю кухню. С&nbsp;другой стороны, наша команда при&nbsp;этом не&nbsp;перегружена ответственностью, когда каждый спринт нужно выдавать что&#8209;то&nbsp;на&nbsp;формальное согласование.</p>
<h2>Что происходит после демо</h2>
<p>Итак, вы&nbsp;закончили проводить демо, насладились овациями, раскраснелись от&nbsp;комплиментов и&nbsp;поставили в&nbsp;вазу подаренные цветы. Весь фидбэк на&nbsp;руках, теперь самое главное — доставить его&nbsp;в&nbsp;нужные руки. </p>
<p>Обычно мы&nbsp;разбираем фидбэк по&nbsp;зонам ответственности и&nbsp;распределяем по&nbsp;исполнителям. Огрехи разработки уходят разработчикам на&nbsp;ремонт. Туманные моменты в&nbsp;ТЗ, — людям, ответственным за&nbsp;написание документации на&nbsp;прояснение. Хотелки, всплывшие во&nbsp;время демо, — руководителям и&nbsp;менеджерам проекта. </p>

<div class="umb-macro-highlights">
    <strong>Важный момент:</strong>
    чтобы всё&nbsp;это&nbsp;не&nbsp;потерялось, не&nbsp;забылось и&nbsp;было исполнено к&nbsp;следующему демо, абсолютно весь фидбек должен быть обработан, преобразован в&nbsp;задачи и&nbsp;зафиксирован в&nbsp;плане следующих спринтов.
</div>

<h2>Заключение</h2>
<p>Парадоксально, но&nbsp;почему&#8209;то&nbsp;многие из&nbsp;моих коллег-разработчиков считают проведение демо каторгой. Надеюсь, статья поможет снять эту&nbsp;стигму и&nbsp;изменить подход к&nbsp;проведению демо — сделать его&nbsp;более системным и&nbsp;менее мучительным. </p>
<p>Ну и&nbsp;пара советов в&nbsp;заключение: </p>
<ul>
<li>постарайтесь сильно не&nbsp;волноваться — если вы&nbsp;нормально подготовлены, вероятнее всего, вы&nbsp;довольно здорово проведете время; </li>
<li>не забывайте контактировать с&nbsp;аудиторией, интересоваться ее&nbsp;вопросами, а&nbsp;не&nbsp;просто читать демо-документ;</li>
<li>как бы&nbsp;странно это&nbsp;не&nbsp;звучало, попробуйте сосредоточиться на&nbsp;положительных моментах демо и&nbsp;желайте отрицательного фидбэка — с&nbsp;ним&nbsp;реально интереснее работать!</li>
</ul>
<p>Удачи!</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2702/6.png" alt="" itemprop="">


</figure>

<hr>
<p><em><strong>Автор статьи:</strong><span style="font-weight: 400;"> Кирилл Кодин</span></em></p>
<p><em><strong>Редактура:</strong><span style="font-weight: 400;"> Марина Медведева</span></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    FFF: методология, которая принимает реальность и помогает делать цифровой продукт
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Держим сроки и бюджет, даже когда всё идёт не по плану. Гибкий подход для тех, кто не питает иллюзий.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/fff/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/fff/</guid>

                <pubDate>Tue, 24 Feb 2026 08:30:25 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>FFF: методология, которая принимает реальность и помогает делать цифровой продукт</h1>
                                <figure>
                                    <img src="/Media/ycqltuen/chatgpt-image-jun-17-2025-from-&#x43D;&#x430;&#x441;&#x442;&#x44F;-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ebc1ce7bd6bc4052968ca0de2cb23cb9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Мы часто говорим о&nbsp;проектировании. Оно&nbsp;важно: продумать логику, UX, фичи, приоритеты — это&nbsp;фундамент. Но&nbsp;правда в&nbsp;том, что&nbsp;на&nbsp;проектировании всё&nbsp;не&nbsp;заканчивается. Как&nbsp;только начинается разработка, в&nbsp;игру вступают совсем другие законы. Все, кто&nbsp;хоть раз&nbsp;запускал цифровой продукт, знают: как&nbsp;бы&nbsp;круто ты&nbsp;ни&nbsp;проектировал — на&nbsp;этапе разработки всегда что&#8209;то&nbsp;пойдет не&nbsp;так.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/db3bf3a9e95649589ad0c094b3c99713"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/03841ad065e84d219e6401843f5cbd2b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Какие-то фичи окажутся сложнее, чем&nbsp;предполагалось. Подрядчик сорвет интеграцию. Заказчик внезапно придет с&nbsp;«а давайте еще&nbsp;вот&nbsp;это» и&nbsp;«вот прям обязательно». И&nbsp;всё&nbsp;— план (или&nbsp;его&nbsp;часть) превращается в&nbsp;тыкву. Однако глобально ничьей вины в&nbsp;этом нет&nbsp;— так&nbsp;разрабатывается любой реальный продукт, в&nbsp;котором бизнес действительно нуждается.</p>
<p dir="ltr">Вот почему мы&nbsp;используем FFF&nbsp;— методологию, которая не&nbsp;заставляет никого делать вид, будто все&nbsp;будет (или&nbsp;уже&nbsp;идет) гладко. Об&nbsp;FFF&nbsp;нужно говорить не&nbsp;как&nbsp;о&nbsp;теории, а&nbsp;как&nbsp;об&nbsp;инструменте, который принесет результат, и&nbsp;даже сможет спасти вас&nbsp;на&nbsp;проекте, если им&nbsp;правильно пользоваться. </p>
<h2 dir="ltr">Что такое FFF</h2>
<p dir="ltr">Fixed Time. Fixed Budget. Flexed Scope.<br>Три F, три&nbsp;опоры.</p>
<ul>
<li><strong>Время фиксировано.</strong> Мы&nbsp;не&nbsp;вываливаемся из&nbsp;дедлайна.</li>
<li><strong>Бюджет фиксирован.</strong> Мы&nbsp;не&nbsp;требуем дополнительных денег за&nbsp;разработку в&nbsp;рамках зафиксированного срока.</li>
<li><strong>Функциональность гибкая.</strong> Мы&nbsp;адаптируемся — и&nbsp;сохраняем результат в&nbsp;рамках времени и&nbsp;денег.</li>
</ul>
<p dir="ltr"><strong>На практике это&nbsp;значит, что&nbsp;мы&nbsp;точно знаем, когда и&nbsp;за&nbsp;сколько клиент получит продукт. Но&nbsp;мы&nbsp;оставляем за&nbsp;собой право флексить</strong> — менять, упрощать или&nbsp;отказываться от&nbsp;части функциональности во&nbsp;благо продукта. Потому что&nbsp;по-честному понимаем, что&nbsp;в&nbsp;процессе разработки контекст может измениться.</p>
<p dir="ltr">Появляется новая задача — значит, от&nbsp;чего&#8209;то&nbsp;нужно отказаться. Что&#8209;то&nbsp;пошло не&nbsp;так&nbsp;— пересобираем скоп. Главное — к&nbsp;установленному сроку есть продукт, который работает и&nbsp;нужен. Он&nbsp;не&nbsp;раздут комом спорных фичей, не&nbsp;находится в&nbsp;бесконечной бете. А&nbsp;законченный и&nbsp;– главное – работающий MVP.</p>
<h2 dir="ltr">Пару слов об&nbsp;MVP</h2>
<p dir="ltr">Прежде чем&nbsp;углубиться в&nbsp;прелести FFF, нам&nbsp;с&nbsp;вами важно договориться о&nbsp;базовом термине. MVP&nbsp;— это&nbsp;не&nbsp;«вырезали всё, что&nbsp;не&nbsp;влезло, и&nbsp;хоть что&#8209;то&nbsp;показали». <strong>Это не&nbsp;черновик продукта, не&nbsp;его&nbsp;прототип.</strong> Не&nbsp;«ну, оно&nbsp;запускается — и&nbsp;ладно».</p>

<div class="umb-macro-highlights">
    <strong>MVP — это&nbsp;первая стабильно работающая версия продукта, которая уже&nbsp;решает задачу пользователя.</strong>
    
</div>

<p dir="ltr">Представьте, что&nbsp;вам&nbsp;нужно построить мост. Что&nbsp;можно назвать MVP&nbsp;моста? Нет, не&nbsp;доску, которая будет перекинута через реку. MVP&nbsp;должен стать, как&nbsp;ни&nbsp;странно мост, просто он&nbsp;будет такой базовой комплектации: без&nbsp;декоративных элементов, без&nbsp;освещения или, например, удобных ограждений. При&nbsp;этом он&nbsp;не&nbsp;ломается от&nbsp;дуновения ветра и&nbsp;не&nbsp;прогибается под&nbsp;весом пользователя, стабильно выполняя свою функцию.</p>
<p dir="ltr">Когда мы&nbsp;говорим «флексить» в&nbsp;контексте FFF, мы&nbsp;не&nbsp;предлагаем забить на&nbsp;всё. Мы&nbsp;предлагаем трезво посмотреть на&nbsp;то, что&nbsp;реально нужно, чтобы MVP&nbsp;стал живым, рабочим продуктом. И&nbsp;всё, что&nbsp;выходит за&nbsp;рамки этой цели — может быть честно отложено.</p>
<h2 dir="ltr">Почему FFF&nbsp;лучше, чем&nbsp;«традиционные» подходы</h2>
<h3 dir="ltr">Waterfall</h3>
<p dir="ltr">Старый-добрый водопад живет в&nbsp;фантазиях, где&nbsp;всё&nbsp;можно распланировать заранее. На&nbsp;практике — в&nbsp;момент первого форс-мажора вся&nbsp;модель рушится. Команда в&nbsp;панике, сроки сдвигаются, клиент в&nbsp;недоумении. Все&nbsp;делают вид, что&nbsp;«ещё немного, и&nbsp;всё&nbsp;будет». Никто не&nbsp;понимает, что&nbsp;именно сейчас происходит.</p>
<h3 dir="ltr">Scrum</h3>
<p dir="ltr">Скрам признаёт хаос, но&nbsp;уходит в&nbsp;другую крайность: «мы не&nbsp;можем сказать, сколько займет задача, но&nbsp;будем «спринтить». Это&nbsp;ок&nbsp;для&nbsp;стартапов или&nbsp;внутренних команд. Но&nbsp;если у&nbsp;клиента ограниченный бюджет и&nbsp;жёсткие сроки, скрам превращается в&nbsp;лотерею.</p>
<h3 dir="ltr">FFF</h3>
<p dir="ltr">FFF — методология, которая предполагает, что&nbsp;что&#8209;то&nbsp;пойдет не&nbsp;по&nbsp;плану. Но&nbsp;не&nbsp;просто знает — предлагает, что&nbsp;делать, когда это&nbsp;случится. Это&nbsp;честный, прагматичный, и&nbsp;при&nbsp;этом прозрачный способ довести проект до&nbsp;результата.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/9337fd3886db4044a582f53625f66c37"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2690792e1887432eb0d800fcc0c949c4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bff917fd19f74d5ea2828f7eae262ed4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Почему FFF&nbsp;нравится заказчикам</h2>
<p dir="ltr">Заказчики – те, кто&nbsp;заказывают разработку продукта. Не&nbsp;обязательно речь может идти о&nbsp;заказчиках при&nbsp;аутсорс-модели, когда внешний бизнес покупает разработку у&nbsp;ИТ-подрядчика. Здесь валидны и&nbsp;случаи с&nbsp;внутренними заказчиками, когда в&nbsp;рамках одной организации поступает запрос на&nbsp;продукт – от&nbsp;одного департамента к&nbsp;другому, например. Почти все&nbsp;заказчики хотят одного и&nbsp;того же:</p>
<ul>
<li>Получить продукт в&nbsp;срок.</li>
<li>Не выйти за&nbsp;рамки бюджета.</li>
<li>И при&nbsp;этом иметь возможность вносить изменения по&nbsp;ходу.</li>
</ul>
<p dir="ltr">FFF делает это&nbsp;возможным — за&nbsp;счёт гибкости скопа. Это&nbsp;как&nbsp;шопинг с&nbsp;ограниченной суммой: хочешь добавить в&nbsp;корзину еще&nbsp;одну вещь — выкинь другую. Хочешь шляпу, хотя не&nbsp;планировал? Можешь, конечно, ее&nbsp;взять, но&nbsp;тогда придется отказаться от&nbsp;футболки. Или&nbsp;от&nbsp;шорт. Или&nbsp;от&nbsp;сумки.</p>
<p dir="ltr">Все это&nbsp;звучит разумно и&nbsp;логично и&nbsp;прельщает вот&nbsp;этой самой гибкостью. Когда ты&nbsp;честно показываешь клиенту, как&nbsp;работает эта&nbsp;система — почти все&nbsp;говорят: «Логично. Погнали». </p>
<p dir="ltr">Но…</p>
<h2 dir="ltr">Флекс – всегда боль</h2>
<p dir="ltr">На этапе продаж FFF&nbsp;воспринимается отлично. Даже на&nbsp;моменте, когда мы&nbsp;четко проговариваем: «Чуваки, все&nbsp;будет круто, но&nbsp;стопроцентно настанет момент, когда мы&nbsp;придем к&nbsp;вам&nbsp;и&nbsp;скажем, что&nbsp;что&#8209;то&nbsp;не&nbsp;влезет, что&nbsp;для&nbsp;вот&nbsp;этой хотелки нужно вырезать что&#8209;то&nbsp;из&nbsp;ранее утвержденной функциональности». Люди понимают, что&nbsp;идея разумная.</p>
<p dir="ltr">И как&nbsp;бы&nbsp;вы&nbsp;классно все&nbsp;на&nbsp;старте ни&nbsp;обговорили, этот самый момент флекса всегда будет камнем преткновения. Когда надо выбирать, от&nbsp;чего отказываемся, всегда появляется элемент стресса.</p>
<p dir="ltr">Тогда и&nbsp;начинается настоящая работа. Сомнения, обиды, микроскандалы. Ключевое тут&nbsp;— доверие. Если заказчик команде не&nbsp;доверяет, любое «пофлексим» он&nbsp;воспримет как&nbsp;«вы мне&nbsp;ничего не&nbsp;сделаете, просто хотите слиться». </p>

<div class="text-highlight">
  FFF&nbsp;работает только в&nbsp;связке с&nbsp;прозрачностью и&nbsp;зрелостью. Заказчик должен понимать: мы&nbsp;не&nbsp;халтурим. Мы&nbsp;не&nbsp;уходим от&nbsp;задач. Мы&nbsp;держим срок и&nbsp;бюджет, как&nbsp;и&nbsp;обещали. Просто появился выбор, и&nbsp;его&nbsp;надо делать вместе.
</div>

<p dir="ltr">Чтобы создать контекст прозрачности, важно помнить, что&nbsp;в&nbsp;первые недели разработки флексить неразумно. Если разработчик вначале проекта уже&nbsp;начинает флексить, то&nbsp;это&nbsp;плохой разработчик, красный флаг и&nbsp;все&nbsp;такое. </p>
<p dir="ltr">Сначала мы&nbsp;просто оформляем рабочий процесс и&nbsp;показываем, как&nbsp;все&nbsp;делается. Это&nbsp;работа на&nbsp;доверие. И&nbsp;только потом, когда оно&nbsp;появится с&nbsp;обеих сторон, — можно начинать говорить про&nbsp;гибкость. О&nbsp;том, как&nbsp;это&nbsp;самое доверие выстраивать с&nbsp;первого касания с&nbsp;заказчиком, мы&nbsp;рассказали в&nbsp;<a href="/articles/how-to-sell-development/" title="Продажа разработки: как&nbsp;получать доверие заказчика и&nbsp;проекты при&nbsp;большом цикле сделки">другой статье.</a></p>
<h2 dir="ltr">Пример: FF&nbsp;Manager</h2>
<p dir="ltr">Один из&nbsp;наших продуктов, где&nbsp;FFF&nbsp;себя отлично показал, — <a href="/projects/ffm-development/" title="Freedom Football Manager: автоматизация тренировочного процесса для&nbsp;футбольной лиги Казахстана">FF Manager</a>. И&nbsp;нет, мы&nbsp;не&nbsp;назвали продукт в&nbsp;честь методологии, в&nbsp;FF&nbsp;Manager FF&nbsp;– это&nbsp;Freedom Football 🙂</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneProjectBlock"
            data-content-element-type-key="fbd4d025-d11c-4282-949f-91bea47ced9d"
            data-element-udi="umb://element/941b854d63d74af5b6b7e83c74e9afd8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

	<a href="/projects/ffm-development/">
		


    <img src="/Media/tlxhm550/image-481.png"
         alt=""
         itemprop="">

		<div class="project-block__content">
			<p>&#x421;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43D;&#x430;&#x448; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;</p>
			<span>Freedom Football Manager: автоматизация тренировочного процесса для футбольной лиги Казахстана</span>
		</div>
	</a>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/38d9e29c0e784439bb3bb5e42ea12085"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5d1c103dd0584af398b14e17eeb2e6ff"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Мы запланировали MVP. Среди фич&nbsp;не&nbsp;было драг-н-дропа тренировок в&nbsp;календарь — он&nbsp;казался слишком сложным для&nbsp;первой версии. Зато был, например, годовой календарь для&nbsp;планирования тренировок (в&nbsp;дополнение к&nbsp;недельному и&nbsp;месячному его&nbsp;видам).</p>
<p dir="ltr">Потом: приходит клиент и&nbsp;говорит, что&nbsp;драг-н-дроп нужен позарез. Окей. Сели, подумали. </p>
<p dir="ltr">Мы могли сказать нет. Но&nbsp;мы&nbsp;работаем по&nbsp;FFF. Поэтому:</p>
<ol>
<li>Мы пересмотрели план.</li>
<li>Поняли, что&nbsp;драг-н-дроп не&nbsp;такой сложный, как&nbsp;казался.</li>
<li>Выкинули годовой календарь.</li>
<li>Сделали нужную фичу.</li>
</ol>
<p dir="ltr">Всё честно, всё&nbsp;в&nbsp;срок. Бюджет тот&nbsp;же. Просто мы&nbsp;вместе выбрали, что&nbsp;важнее. А&nbsp;годовой календарь, который казался очень важным сначала, в&nbsp;итоге так&nbsp;и&nbsp;остался в&nbsp;бэклоге, как&nbsp;не&nbsp;самая необходимая в&nbsp;реальности фича. </p>
<p dir="ltr">Было тяжело? Да. Были острые переговоры? Ещё&nbsp;как. Но&nbsp;продукт получился ровно такой, какой был&nbsp;нужен.</p>
<h2 dir="ltr">Как флексить: 4 рабочих тактики</h2>
<p dir="ltr">Когда нужно менять скоп, мы&nbsp;используем несколько подходов. Вот&nbsp;самые частые:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/8aea0646be0f46f79b72eb3525e2229d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3cb3d28ce46745afb199abfdfbc22f9f"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><strong>Упростить</strong>. Запланировали сложную реализацию? Делаем проще. Запланировали автоматизацию элемента? Заменяем полуручным режимом. Пример: вместо интеграции с&nbsp;внешней базой — временно хардкодим данные.</p>
<p dir="ltr"><strong>Отказаться</strong>. Просто убираем фичу. Без&nbsp;боли не&nbsp;обойтись, но&nbsp;иногда по-другому никак.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/68ccc2955582498a8a3cc761ca9759e2"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><strong>Заменить</strong>. Вместо отдельной логики на&nbsp;элемент — что&#8209;то&nbsp;примитивнее. Пример: не&nbsp;форма обратной связи с&nbsp;логикой, а&nbsp;кнопка на&nbsp;переход в&nbsp;Telegram с&nbsp;менеджером.</p>
<p dir="ltr"><strong>Минимизировать</strong>. Убираем нефункциональные «финтифлюшки» — анимации, спецэффекты, переходы. Всё, что&nbsp;не&nbsp;критично для&nbsp;получения пользователем результата.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b2e1ef5e91424f19ba86f07e4a0fd75e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">FFF — это&nbsp;зрелость</h2>
<p dir="ltr">На FFF&nbsp;невозможно ехать, не&nbsp;разбираясь в&nbsp;управлении проектами. Эта&nbsp;методология требует зрелости от&nbsp;команды и&nbsp;клиента. Она&nbsp;для&nbsp;тех, кто&nbsp;хочет работающий продукт.</p>

<div class="umb-macro-highlights">
    <strong>FFF — это&nbsp;честный подход для&nbsp;проектов, которые нельзя растягивать. Он&nbsp;не&nbsp;всем подойдёт. Но&nbsp;сработает для&nbsp;тех, кто&nbsp;понимает, как&nbsp;делаются цифровые продукты.
</strong>
    
</div>

<p dir="ltr">Для заказчика: FFF&nbsp;требует вовлеченности. Это&nbsp;не&nbsp;пассивная история «заплатил и&nbsp;жду». Это&nbsp;история про&nbsp;партнерство и&nbsp;совместные принятия решений.</p>
<p dir="ltr">Для команды: FFF&nbsp;диктует общение без&nbsp;обманов и&nbsp;накруток. Нужно объяснять, доказывать, разбираться и&nbsp;создавать доверие через эту&nbsp;коммуникацию.&nbsp;</p>
<p dir="ltr">Гибкость в&nbsp;FFF&nbsp;– не&nbsp;способ закрыть дыры в&nbsp;опыте или&nbsp;ответственности. Это&nbsp;способ собраться, когда всё&nbsp;пошло не&nbsp;по&nbsp;плану.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/0415fec4c89c4f979e0ab4d0da287de0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как ускорить разработку цифрового продукта и почему новые разработчики только растянут сроки
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как уложиться в дедлайн без найма: вертикальные срезы, контракты и минимизация координации команды
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/development-speedrun/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/development-speedrun/</guid>

                <pubDate>Tue, 24 Feb 2026 08:29:09 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как ускорить разработку цифрового продукта и почему новые разработчики только растянут сроки</h1>
                                <figure>
                                    <img src="/Media/yerjukzr/chatgpt-image-jan-16-2026-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f709b7dda6934a0fab4ff41465bca756"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><span class="first-p">«У нас&nbsp;горят сроки, инвесторы требуют релиз как&nbsp;можно быстрее. Давайте наймем еще&nbsp;пятерых разработчиков и&nbsp;успеем к&nbsp;концу месяца?»</span></p>
<p dir="ltr"><span class="first-p">Если вы&nbsp;работаете с&nbsp;продуктами в&nbsp;ИТ, наверняка похожие ситуации происходили в&nbsp;вашей жизни. В&nbsp;понедельник клиент был&nbsp;абсолютно уверен: пять дополнительных программистов, и&nbsp;мы&nbsp;точно успеем. Во&nbsp;вторник в&nbsp;календаре не&nbsp;осталось свободных слотов — бесконечные синки и&nbsp;ни&nbsp;минуты на&nbsp;поработать. А&nbsp;к&nbsp;пятнице вместо того, чтобы писать код, опытные ребята объясняли новеньким, где&nbsp;что&nbsp;лежит и&nbsp;как&nbsp;всё&nbsp;устроено.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/80e5bcad84934e3a95123bfa6eff77e4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/89adc39575c44132b7cfab881ee68bee"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Классическая история. Кажется: два&nbsp;человека — в&nbsp;два&nbsp;раза быстрее сдадим проект, десять человек — в&nbsp;десять раз&nbsp;быстрее. Логично же?</p>
<p dir="ltr">Ну, на&nbsp;самом деле нет. С&nbsp;каждым новым участником команды появляется всё&nbsp;больше точек, где&nbsp;нужно согласовывать решения и&nbsp;синхронизировать изменения. А&nbsp;критические вещи — спроектировать архитектуру, продумать структуру базы, настроить интеграции, согласовать бизнес-логику — всё&nbsp;равно остаются последовательными этапами. Их&nbsp;просто не&nbsp;получится делать одновременно, даже если вы&nbsp;соберёте сотню программистов.</p>

<div class="umb-macro-highlights">
    <strong>Давайте разберёмся, почему механическое наращивание команды обычно не&nbsp;даёт ожидаемого результата, что&nbsp;действительно помогает уложиться в&nbsp;сроки, и&nbsp;как&nbsp;организовать работу так, чтобы люди не&nbsp;мешали друг другу.</strong>
    
</div>

<h2 dir="ltr">Почему добавление людей только замедляет проект с&nbsp;горящими сроками</h2>
<p dir="ltr">В чём&nbsp;корень проблемы? Вот&nbsp;типичная логика: чем&nbsp;больше людей в&nbsp;команде, тем&nbsp;проще распределить между ними задачи. Значит, всё&nbsp;сделается настолько быстрее, насколько больше исполнителей мы&nbsp;привлекли. Так&nbsp;обычно рассуждают те, кто&nbsp;никогда не&nbsp;создавал цифровые продукты своими руками.</p>
<p dir="ltr">А теперь как&nbsp;есть на&nbsp;самом деле. Представьте, что&nbsp;вы&nbsp;строите дом&nbsp;(возьмем метафору чуть менее избитую, чем&nbsp;про&nbsp;беременную женщину). Процесс долгий, и&nbsp;да, некоторые операции реально можно распараллелить. Позовите десять маляров — они&nbsp;покрасят все&nbsp;комнаты за&nbsp;два&nbsp;дня, а&nbsp;не&nbsp;за&nbsp;неделю, если бы&nbsp;один человек ходил из&nbsp;комнаты в&nbsp;комнату.</p>
<p dir="ltr">Но попробуйте одновременно залить фундамент и&nbsp;проложить коммуникации. Или&nbsp;расставить мебель, пока кладёте плитку на&nbsp;том&nbsp;же&nbsp;самом полу. Не&nbsp;получится физически. И&nbsp;здесь хоть триста специалистов зовите — быстрее заселиться не&nbsp;получится.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/62aaac419d79434490195281330b7080"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            И&nbsp;это&nbsp;ещё&nbsp;полбеды. Реальная проблема в&nbsp;том, что&nbsp;с&nbsp;каждым новым человеком резко вырастают затраты времени на&nbsp;координацию. Это&nbsp;закон Брукса, который гласит: если в&nbsp;проект, у&nbsp;которого уже&nbsp;проблемы со&nbsp;сроками, добавить людей, сроки только растянутся.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9245dec3b383414fbb937dfed620181c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/297c7afdc3664410a07537b2957d3522"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><strong><span class="highlighter">Новичков нужно вводить в&nbsp;курс дела.</span></strong> Опытные разработчики отвлекаются от&nbsp;своих задач, чтобы объяснить новеньким, как&nbsp;всё&nbsp;устроено. Недели три-четыре производительность падает у&nbsp;всех — и&nbsp;у&nbsp;тех, кто&nbsp;объясняет, и&nbsp;у&nbsp;тех, кто&nbsp;разбирается.</p>
<p dir="ltr"><span class="highlighter"><strong>Координация съедает время. </strong></span>Появляется больше созвонов, больше проверок кода, больше согласований. Кто&#8209;то&nbsp;ждёт, пока коллега допишет свой кусок. Другой ждёт результатов тестирования. Третий не&nbsp;может двигаться дальше, пока не&nbsp;получит фидбек по&nbsp;своей правке.</p>
<p dir="ltr">Также созвоны, которые для&nbsp;маленькой команды занимали небольшое количество времени, могут нелинейно растянуться.</p>
<p dir="ltr"><span class="highlighter"><strong>Ключевые этапы всё&nbsp;равно идут по&nbsp;очереди.</strong></span> Архитектуру нельзя проектировать параллельно — это&nbsp;последовательное принятие решений. Модель данных тоже. Интеграции настраиваются одна за&nbsp;другой. Релизы выходят по&nbsp;очереди. Скорость здесь определяется качеством решений, а&nbsp;не&nbsp;количеством рук.</p>
<p dir="ltr"><span class="highlighter"><strong>Технический долг будет только расти. </strong></span>Новые люди, которые ещё&nbsp;не&nbsp;до&nbsp;конца разобрались в&nbsp;проекте, чаще делают ошибки. И&nbsp;на&nbsp;их&nbsp;исправление опять уходит дополнительное время.</p>
<p dir="ltr">Проджекту и&nbsp;тимлиду становится сложнее выбрать разработчика, на&nbsp;которого назначить задачу. С&nbsp;командой старичков любую задачу можно назначать на&nbsp;любого человека: нужно учитывать только текущую занятость. Если набираем новичков, то&nbsp;становится все&nbsp;сложнее распределять ответственность.</p>
<h2 dir="ltr">Насколько можно ускорить релиз через найм</h2>
<p dir="ltr">Окей, допустим, мы&nbsp;всё&nbsp;равно хотим сделать тот&nbsp;же&nbsp;объём работы быстрее просто за&nbsp;счёт увеличения команды. Можно хотя бы&nbsp;посчитать, на&nbsp;что&nbsp;рассчитывать? Для&nbsp;этого обратимся к&nbsp;закону Амдала. Он&nbsp;показывает теоретический потолок ускорения. Помним: часть работы можно делать параллельно, а&nbsp;часть — только последовательно.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/32c7686f330e4cdfbbac247643d7c39a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3b0efb077928404ca0bdb3534623ea63"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Если доля параллелизуемых задач — p, а&nbsp;людей у&nbsp;нас&nbsp;N, то&nbsp;максимальное ускорение S:</p>
<p><span class="factoid-small"><strong>S(N) = 1 / ((1 - p) + p&nbsp;/ N)</strong></span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e1fbef514c1549c3ae5650786b221840"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">А реальное время T&nbsp;при&nbsp;N&nbsp;людях:</p>
<p dir="ltr"><span class="factoid-small">T(N) = T(1) × ((1 - p) + p&nbsp;/ N)</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3e3be82286624f8180150dcbd535ce6d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Это идеальные условия, когда нет&nbsp;вообще никаких накладных расходов на&nbsp;синхронизацию. В&nbsp;жизни будет только хуже.</p>
<p dir="ltr">Давайте посчитаем на&nbsp;примере. <span class="highlighter">Допустим, 70% задач можно распараллелить (p&nbsp;= 0,7), и&nbsp;один разработчик делает весь объём работы за&nbsp;9 месяцев. Мы&nbsp;наняли девятерых, думая, что&nbsp;уложимся в&nbsp;месяц.</span> Что&nbsp;получается:</p>
<p dir="ltr"><span class="factoid factoid-small">S(9) = 1 / ((1 - 0,7) + 0,7/9) ≈ 2,65</span></p>
<p dir="ltr"><span class="factoid factoid-small">T(9) ≈ 9 мес&nbsp;/ 2,65 ≈ 3,4 мес</span></p>
<p dir="ltr"><span class="highlighter">То есть даже в&nbsp;идеальном мире, где&nbsp;нет&nbsp;затрат на&nbsp;координацию по&nbsp;Бруксу, мы&nbsp;получим максимум 3,4 месяца. </span>А не&nbsp;один.</p>
<p dir="ltr">Чтобы уложиться в&nbsp;месяц при&nbsp;исходных девяти, нужно ускорение в&nbsp;9 раз. По&nbsp;формуле 1/((1 - p) + p/9) = 9 получаем, что&nbsp;p&nbsp;должно быть равно 1. То&nbsp;есть нужна стопроцентная параллелизация всех задач. Что&nbsp;в&nbsp;реальности невозможно.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/a93b7cc472bd4c73ae237cf888fb3fa1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Вывод банальный: чтобы реально ускориться, нужно менять сами задачи и&nbsp;их&nbsp;организацию, а&nbsp;не&nbsp;просто кидать в&nbsp;проект больше людей
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e077ed502ae04dfc9b953361926db922"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d9002fd372a8477a844625433bc8f455"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Как реально ускорить разработку: практические шаги вместо увеличения штата</h2>
<p dir="ltr">Парадокс, но&nbsp;всё, о&nbsp;чём&nbsp;сейчас пойдёт речь, тоже требует времени на&nbsp;внедрение. Однако это&nbsp;та&nbsp;самая инвестиция, которая окупится не&nbsp;только на&nbsp;текущем проекте, но&nbsp;и&nbsp;на&nbsp;всех следующих. Однажды настроенные процессы становятся вашим универсальным ускорителем.</p>
<h3 dir="ltr">Шаг ноль: сначала поймите, что&nbsp;на&nbsp;самом деле тормозит</h3>
<p dir="ltr"><span class="highlighter">Львиная доля задержек релизов происходит вообще не&nbsp;из&#8209;за&nbsp;нехватки рук.&nbsp;</span></p>
<p dir="ltr">Бывает, в&nbsp;разработку просто нечего отдавать, потому что&nbsp;дизайн и&nbsp;аналитика не&nbsp;поспевают. Или&nbsp;ситуация противоположная: материалов вагон, но&nbsp;они&nbsp;постоянно меняются и&nbsp;дополняются. Это&nbsp;называется feature creep, и&nbsp;добавить людей в&nbsp;такой проект — всё&nbsp;равно что&nbsp;подливать бензин в&nbsp;костёр.</p>
<p dir="ltr">Потратьте несколько часов и&nbsp;проверьте четыре момента:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/e00debf4efd4401ea19b91b6199fabcc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3b1d065df2444b3b939b0255b9ed69fa"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span class="highlighter">Есть что&nbsp;разрабатывать?</span> </strong>На две&#8209;три&nbsp;недели вперёд должен быть запас задач с&nbsp;нормальным описанием и&nbsp;готовыми макетами. Если нет&nbsp;— проблема не&nbsp;в&nbsp;разработке, а&nbsp;в&nbsp;дизайне или&nbsp;аналитике.</p>
<p><span class="highlighter"><strong>Можно быстро развернуть тестовую версию? </strong></span>Любой разработчик должен самостоятельно поднять проект и&nbsp;задеплоить свои изменения на&nbsp;тестовый стенд минут за&nbsp;10-15. Если это&nbsp;не&nbsp;так&nbsp;— у&nbsp;вас&nbsp;проблемы с&nbsp;окружением разработки и&nbsp;DevOps-практиками.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/88e12a3685b54940bb5fc2ad526793bd"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span class="highlighter">Сколько задач просто висит в&nbsp;ожидании?</span> </strong>Если больше половины задач ждут макета, доступов или&nbsp;каких&#8209;то&nbsp;решений — новые разработчики вам&nbsp;не&nbsp;помогут. Вообще.</p>
<p dir="ltr"><span class="highlighter"><strong>Сколько времени уходит на&nbsp;проверку?</strong></span> Код-ревью — пару часов максимум. Автотесты — меньше часа. Ручное тестирование — рабочий день. Если всё&nbsp;это&nbsp;дольше — у&nbsp;вас&nbsp;узкое горлышко, которое расширение команды только усугубит.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/00aa3502f00d4805b4f4998036a164b8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6f80c0a975e24693b756786c74766ef4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0f0cc5bf560949fd97ce24a3d08bf347"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Первый шаг: используйте готовые решения</h2>

<div class="umb-macro-highlights">
    <strong>Хватит изобретать велосипеды. Возьмите компоненты дизайн-систем, готовые модули аутентификации, биллинга, генераторы админок, проверенные шаблоны. Потратьте время на&nbsp;то, чтобы адаптировать и&nbsp;интегрировать их, вместо того чтобы переписывать базовые вещи с&nbsp;нуля.</strong>
    
</div>

<p dir="ltr">Это реально сокращает объём критических последовательных задач и&nbsp;увеличивает долю независимых, которые можно делать параллельно.&nbsp;</p>
<p dir="ltr">И ещё&nbsp;момент: унифицируйте повторяющиеся вещи в&nbsp;том, что&nbsp;уже&nbsp;написали. Если у&nbsp;вас&nbsp;на&nbsp;сайте три&nbsp;типа контента — не&nbsp;делайте три&nbsp;разных редактора. Сделайте один с&nbsp;настраиваемыми полями или&nbsp;переиспользуйте существующий. Меньше кода — проще жить. Проще тестировать, проще вносить изменения, проще поддерживать.</p>
<h2 dir="ltr">Второй шаг: зафиксируйте правила игры</h2>
<p dir="ltr"><span class="highlighter"><strong>Контракты между компонентами системы.</strong> Идея простая: сделать обмен данными предсказуемым, даже если в&nbsp;проекте куча неопределённости (а&nbsp;ее&nbsp;всегда куча). </span>Не нужно расписывать всё&nbsp;до&nbsp;мелочей на&nbsp;века вперёд. Зафиксируйте минимально необходимые правила, которые дают команде свободу действий и&nbsp;снимают лишнюю головную боль.</p>
<p dir="ltr">Для каждой точки обмена данными (клиент–сервер, сервис–сервис, ваш&nbsp;бэкенд–внешние системы) проговорите и&nbsp;запишите: кто&nbsp;инициирует запрос, кто&nbsp;отвечает, какие поля туда-сюда передаются. Сразу задокументируйте это&nbsp;и&nbsp;положите туда, где&nbsp;увидят разработка, тестирование и&nbsp;эксплуатация.</p>
<p dir="ltr"><span class="highlighter"><strong>Контракты внутри команды. </strong>Ещё один способ снизить когнитивную нагрузку — определения готовности задач.</span> Definition of&nbsp;Ready отвечает на&nbsp;вопрос «когда задачу можно брать в&nbsp;работу». Definition of&nbsp;Done — «когда её&nbsp;можно считать законченной и&nbsp;закрыть».</p>
<p dir="ltr">Всё это, кстати, сильно упрощает жизнь и&nbsp;новым людям. Приходит человек на&nbsp;проект и&nbsp;сразу видит, как&nbsp;описаны интерфейсы, где&nbsp;что&nbsp;лежит, как&nbsp;принято работать. Он&nbsp;просто следует понятным шаблонам, а&nbsp;не&nbsp;пытается по&nbsp;крупицам собрать картину из&nbsp;чатов. И&nbsp;ему&nbsp;работать приятнее.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/10cd6881b8e84b0bb79aca34b6f4190d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Главное — не&nbsp;перегнуть палку. Если вы&nbsp;начнёте плодить горы документов, их&nbsp;версии, сложные процедуры согласования, то&nbsp;поддержка всего этого хозяйства станет дороже самой разработки. Признак того, что&nbsp;вы&nbsp;переборщили: люди боятся трогать описание, потому что&nbsp;там&nbsp;все&nbsp;адски сложно, и&nbsp;любое изменение требует половины рабочего дня&nbsp;на&nbsp;совещания.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ae6b9cf7216e48e2adcd6a5d381dee79"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c9c93b743ef84255a1ffab9858e8b122"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Третий шаг: режьте функциональность вертикально</h2>
<p dir="ltr"><span class="highlighter">«Вертикальный срез» — это&nbsp;небольшой пользовательский сценарий, который проходит через все&nbsp;нужные части системы и&nbsp;даёт законченный результат.</span> Его&nbsp;можно показать реальному пользователю и&nbsp;получить живую обратную связь.</p>
<p dir="ltr">В отличие от&nbsp;подхода «сначала вся&nbsp;логика, потом вся&nbsp;вёрстка, потом все&nbsp;интеграции», вертикальный срез не&nbsp;требует ждать, пока «дозреет» соседний слой. Он&nbsp;уже&nbsp;готов, его&nbsp;можно потрогать.</p>
<p dir="ltr">Если поделить весь продукт на&nbsp;такие срезы, вы&nbsp;сможете гибко управлять объёмом работ в&nbsp;каждом из&nbsp;них. Время поджимает? Другая фича стала важнее? Не&nbsp;проблема — режем скоуп конкретного среза, не&nbsp;трогая остальное. Подробнее о&nbsp;том, как&nbsp;это&nbsp;делать, мы&nbsp;писали в&nbsp;статье про&nbsp;FFF.</p>


    <div class="article-block">
        <a href="/articles/fff/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/ycqltuen/chatgpt-image-jun-17-2025-from-&#x43D;&#x430;&#x441;&#x442;&#x44F;-1.png"
         alt=""
         itemprop="">

    
            <span>FFF: методология, которая принимает реальность и&nbsp;помогает делать цифровой продукт</span>
                <p>&#x410;&#x43D;&#x430;&#x441;&#x442;&#x430;&#x441;&#x438;&#x44F; &#x41C;&#x430;&#x440;&#x442;&#x44B;&#x43D;&#x43E;&#x432;&#x430;, &#x420;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x43E;&#x440;</p>
        </a>
    </div>


<p dir="ltr">Как превратить кучу фич&nbsp;в&nbsp;срезы? Возьмите большой блок («оплата», «личный кабинет» или&nbsp;«каталог») и&nbsp;разверните его&nbsp;на&nbsp;3-5 минимальных путей пользователя. Вот&nbsp;пример с&nbsp;оплатой:</p>
<ul>
<li>первый срез — «оплата картой без&nbsp;сохранения и&nbsp;без&nbsp;промокодов» (самое базовое)</li>
<li>второй — «оплата с&nbsp;промокодом»</li>
<li>третий — «оплата с&nbsp;сохранением карты для&nbsp;будущих покупок»</li>
<li>четвёртый — «оплата подарочным сертификатом»</li>
</ul>
<p>Каждый срез содержит ровно столько UI, логики и&nbsp;интеграций, сколько нужно, чтобы пройти путь от&nbsp;начала до&nbsp;конца.</p>
<p dir="ltr">Для управления срезами заранее договоритесь: что&nbsp;входит в&nbsp;минимальную версию и&nbsp;чем&nbsp;можно пожертвовать ради раннего запуска. Пусть один человек принимает быстрые решения об&nbsp;упрощениях и&nbsp;следит, чтобы срез не&nbsp;раздулся.</p>

<div class="text-highlight">
  Признак того, что&nbsp;вы&nbsp;режете правильно: каждый срез можно показать пользователям и&nbsp;включить ограниченно (например, для&nbsp;10% аудитории), не&nbsp;дожидаясь, пока будут готовы соседние части.
</div>

</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7d9927a2cc92431080684b0dbe63ed67"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Четвёртый шаг: уберите избыточную координацию</h2>
<p dir="ltr">Об этом все&nbsp;говорят, но&nbsp;многие понимают буквально: «удалить встречи из&nbsp;календаря». Но&nbsp;прям так&nbsp;не&nbsp;надо.</p>
<p dir="ltr">Да, стоит сократить регулярные созвоны до&nbsp;разумного минимума. <span class="highlighter">Но параллельно нужно перевести договорённости в&nbsp;письменные каналы.</span> Чтобы это&nbsp;работало, организуйте единую понятную структуру: тема, решение, ссылка на&nbsp;конкретный артефакт. Так&nbsp;вам&nbsp;не&nbsp;придётся записывать встречи и&nbsp;потом рыться в&nbsp;расшифровках — все&nbsp;решения уже&nbsp;зафиксированы в&nbsp;одном месте.</p>
<p dir="ltr"><span class="highlighter">Если на&nbsp;проекте делаете код-ревью — оптимизируйте этот процесс.</span> Сделайте его&nbsp;максимально предсказуемым: чёткий чек-лист критериев, понятные SLA&nbsp;по&nbsp;времени проверки, короткие очереди.</p>

<div class="umb-macro-highlights">
    <strong>Когда дублирующиеся встречи исчезают, а&nbsp;ответы на&nbsp;типовые вопросы лежат в&nbsp;одном известном месте, снижается «налог на&nbsp;координацию». Это&nbsp;прямое ускорение, и&nbsp;для&nbsp;этого не&nbsp;понадобился ни&nbsp;один новый сотрудник.</strong>
    
</div>

<p dir="ltr">Если смотреть ещё&nbsp;шире: дело не&nbsp;только во&nbsp;встречах как&nbsp;таковых. Правильнее убрать сами обсуждения, дав&nbsp;людям право самостоятельно принимать решения в&nbsp;продукте, опираясь на&nbsp;ключевые сценарии из&nbsp;предыдущего пункта.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/bcb9cc9da8ad4f52bcf715a2779cb4f0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Важно донести до&nbsp;команды простую мысль: важнее сделать продукт, а&nbsp;не&nbsp;обсудить, какого цвета должна быть кнопка. Кнопку всегда можно перекрасить за&nbsp;пять минут. Мы&nbsp;готовы смириться с&nbsp;минорными косяками, которые легко поправить потом.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ffde08ac7697461ba5d7b8344ceadbff"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0825471618104673bbda8b596e508592"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Когда расширение команды реально имеет смысл</h2>
<p dir="ltr">Безболезненно увеличить команду и&nbsp;ускорить работу можно только тогда, когда у&nbsp;вас&nbsp;уже&nbsp;есть понятные правила игры и&nbsp;подготовлены независимые блоки задач, которые можно делать параллельно.</p>
<p dir="ltr"><span class="highlighter">Вот простой тест: можете ли&nbsp;вы&nbsp;прямо сейчас выдать новому человеку план работы на&nbsp;две&nbsp;недели вперёд без&nbsp;оговорок типа «зависит от&nbsp;того, что&nbsp;сделают другие»? </span>Если да&nbsp;— отлично, тогда расширение команды действительно ускорит работу, а&nbsp;не&nbsp;создаст новые проблемы. Давайте подробнее.</p>
<h3 dir="ltr">Эффективный онбординг разработчиков: опоры и&nbsp;предсказуемая первая неделя</h3>
<p dir="ltr">Тут говорим про&nbsp;вообще любого человека, который только пришёл на&nbsp;проект. Неважно, какие у&nbsp;него специализация или&nbsp;грейд — описанные ниже правила работают для&nbsp;всех.</p>
<p dir="ltr">Выберите зоны для&nbsp;новичков. Нужны участки, где&nbsp;задачи повторяются и&nbsp;мало зависят от&nbsp;решений других людей. Например:</p>
<ul>
<li>вёрстка на&nbsp;готовой дизайн-системе</li>
<li>перенос контента по&nbsp;шаблону</li>
<li>написание автотестов по&nbsp;уже&nbsp;описанным сценариям</li>
<li>небольшие сервисы на&nbsp;одном и&nbsp;том&nbsp;же&nbsp;каркасе</li>
</ul>
<p dir="ltr">На входе в&nbsp;каждую такую зону у&nbsp;нового человека должны быть четыре опоры:</p>
<ol>
<li>Ссылка на&nbsp;действующий контракт или&nbsp;спецификацию</li>
<li>Примеры данных для&nbsp;работы</li>
<li>Инструкция для&nbsp;запуска окружения</li>
<li>Понятные критерии того, что&nbsp;считается готовым результатом</li>
</ol>
<p dir="ltr">Человек должен сразу видеть, как&nbsp;работать и&nbsp;что&nbsp;значит «выполнено».</p>
<p dir="ltr"><strong>Сделайте онбординг коротким и&nbsp;предсказуемым.&nbsp;</strong>Подготовка проекта к&nbsp;адаптации новых людей и&nbsp;удобный developer experience должны быть в&nbsp;приоритете.</p>
<p dir="ltr">В идеале у&nbsp;каждого разработчика в&nbsp;голове должна сложиться такая картина:</p>
<ul>
<li>Я понимаю архитектуру приложения и&nbsp;принципы написания кода — они&nbsp;нормально описаны</li>
<li>Я знаю, как&nbsp;проверить и&nbsp;задеплоить свои изменения без&nbsp;ошибок, есть тестовые данные и&nbsp;готовые тесты</li>
<li>Я понимаю функциональность продукта и&nbsp;то, над&nbsp;чем&nbsp;буду работать, вся&nbsp;информация в&nbsp;одном понятном месте</li>
<li>Проверка кода максимально автоматизирована — линтеры, кодстайл, SAST, AI-помощники уже&nbsp;настроены</li>
</ul>
<table border="1" style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 49.4876%;"><span class="factoid-small"><strong>Вот как&nbsp;может выглядеть первая неделя:</strong></span></td>
<td style="width: 49.4876%;">&nbsp;</td>
</tr>
<tr>
<td style="width: 49.4876%;">День 1</td>
<td style="width: 49.4876%;">Новичок поднимает окружение по&nbsp;инструкции и&nbsp;прогоняет готовый сценарий от&nbsp;начала до&nbsp;конца</td>
</tr>
<tr>
<td style="width: 49.4876%;">День 2</td>
<td style="width: 49.4876%;">Отправляет первую небольшую правку под&nbsp;фичефлагом и&nbsp;проходит ревью по&nbsp;чек-листу</td>
</tr>
<tr>
<td style="width: 49.4876%;">К концу недели</td>
<td style="width: 49.4876%;">Закрывает небольшой пользовательский сценарий целиком</td>
</tr>
</tbody>
</table>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/d41ba62501de4f9082d4a3c83c6ebf1c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Начальные задачи выбирайте так, чтобы они&nbsp;опирались на&nbsp;уже&nbsp;готовые шаблоны, а&nbsp;не&nbsp;требовали разбираться в&nbsp;уникальных хитростях вашего проекта.
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/77d97e1c56b44a3d8c5e34f6d804bb38"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5edf75bcddeb4db68e3b14807dc6e030"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Установите ограничители. Чётко разделите, какие решения новый участник принимает сам, какие согласует с&nbsp;ответственным за&nbsp;архитектуру, а&nbsp;какие вообще трогать нельзя.</p>
<p dir="ltr">Договоритесь о&nbsp;сроках код-ревью и&nbsp;реально их&nbsp;держите. Если очередь на&nbsp;проверку растёт, сразу смещайте приоритет на&nbsp;её&nbsp;разбор. Иначе вся&nbsp;выгода от&nbsp;расширения команды испарится уже&nbsp;через неделю.</p>
<h3 dir="ltr">Дальше масштабируйтесь осторожно</h3>
<p dir="ltr">Добавляйте людей ограниченно и&nbsp;только туда, где&nbsp;предыдущая порция уже&nbsp;окупилась. Признаки окупаемости:</p>
<ul>
<li>релизы стали чаще</li>
<li>среднее время код-ревью сократилось</li>
<li>задачи закрываются без&nbsp;дополнительных встреч и&nbsp;согласований</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/2b65393a3d7c46d8b108ed1420633878"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Если после добавления двух новых разработчиков среднее время прохождения типовой задачи не&nbsp;изменилось — ставить третьего в&nbsp;ту&nbsp;же&nbsp;зону бессмысленно.
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9ac46bfcc84c48f398a89c64f0d93f34"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e4ca16c8500546eb8efa4f422be0c10f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><strong>Помните о&nbsp;качестве, а&nbsp;не&nbsp;только о&nbsp;количестве.</strong> На&nbsp;практике замена нескольких мидлов и&nbsp;джунов на&nbsp;пару сильных сеньоров на&nbsp;критических участках даёт кратный эффект.&nbsp;</p>
<p dir="ltr">Разница не&nbsp;только в&nbsp;опыте. Разница в&nbsp;подходе к&nbsp;работе. «Добросовестный исполнитель» в&nbsp;срочном и&nbsp;неопределённом проекте теряет темп — он&nbsp;избегает риска, ждёт чётких инструкций, боится ошибиться.</p>
<p dir="ltr"><strong>А вот&nbsp;люди с&nbsp;мышлением решателя проблем ведут себя иначе. </strong>Они быстро находят опорные решения, берут ответственность, координируют коллег и&nbsp;двигают проект вперёд без&nbsp;лишней суматохи.</p>
<p dir="ltr"><strong><span class="highlighter">Как распознать «решателя»?</span></strong> Смотрите на&nbsp;конкретные маркеры в&nbsp;работе и&nbsp;на&nbsp;собеседовании:</p>
<ul>
<li>Человек быстро формулирует план из&nbsp;нескольких шагов, даже если данных неполные</li>
<li>Уточняет границы задачи и&nbsp;сам&nbsp;предлагает, что&nbsp;можно отложить, чтобы не&nbsp;тормозить релиз</li>
<li>Фиксирует договорённости (не&nbsp;надеется на&nbsp;память)</li>
<li>Не боится принимать обратимые решения и&nbsp;вовремя эскалирует необратимые</li>
<li>Держит прозрачность в&nbsp;коммуникации, коллеги всегда знают, на&nbsp;каком он&nbsp;этапе</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/67fbd65fd5da4bfea0a5e0ce7a827cf7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Мы&nbsp;на&nbsp;своих проектах убедились: такие ребята на&nbsp;вес&nbsp;золота. Поэтому стараемся растить их&nbsp;внутри команды. 
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b838384c85d141809c8ba8d006f30f16"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/82050bf67d6e45f8a500e6f6411de1c5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/5-developer-superpowers/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/cz0ixkbb/frame-5009627.png"
         alt=""
         itemprop="">

    
            <span>5 суперспособностей продуктового разработчика в&nbsp;B2B-командах</span>
                <p>&#x410;&#x43D;&#x434;&#x440;&#x435;&#x439; &#x421;&#x442;&#x435;&#x43F;&#x430;&#x43D;&#x43E;&#x432;, &#x422;&#x435;&#x445;&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440;, &#x43F;&#x430;&#x440;&#x442;&#x43D;&#x451;&#x440;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a574df445d3f40c18f3cc8db36a22f31"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Измеряйте результат</h3>
<p dir="ltr">Для каждого расширения команды определите метрики успеха. Договоритесь о&nbsp;них&nbsp;заранее, особенно если усиление короткое — на&nbsp;пару-тройку спринтов.</p>
<p dir="ltr">Для долгосрочных усилений обычно смотрят на:</p>
<ul>
<li>Throughput — поток выпускаемых задач</li>
<li>Lead time — время от&nbsp;начала работы над&nbsp;изменением до&nbsp;его&nbsp;выкатки</li>
<li>Частоту релизов — как&nbsp;часто выходят версии</li>
<li>Качество — количество и&nbsp;критичность багов в&nbsp;продакшене</li>
</ul>
<p dir="ltr">Если все&nbsp;показатели улучшаются вместе — расширение работает. Если два&nbsp;из&nbsp;них&nbsp;стоят на&nbsp;месте или&nbsp;ухудшаются — откатитесь назад: стабилизируйте правила, упростите сценарии, доработайте окружение. И&nbsp;только потом снова пробуйте масштабировать.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/98e899a4c65b4f418720bada0c483f5a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Запомните простую вещь: людей имеет смысл добавлять только тогда, когда вы&nbsp;убрали лишние зависимости между задачами, подготовили независимые участки работы и&nbsp;сделали процессы предсказуемыми.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/07de214c04b34c33a89fbcca01d434cd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/87b93c21dfc541faa9bb869097392a24"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Масштабируйтесь аккуратно. Измеряйте успех скоростью выполнения задач, а&nbsp;не&nbsp;количеством людей в&nbsp;команде.</p>
<p dir="ltr">Тогда каждый новый специалист действительно приблизит релиз, а&nbsp;не&nbsp;добавит ещё&nbsp;одну причину для&nbsp;задержки.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/d8b821a7cd4648fc8da3813c0ee0abbf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как создать цифровой продукт с гибридной командой и не сойти с ума
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Говорим про поиск подходов к каждому, здоровое недоверие, правильное применение мягкой силы и способы не выгорать, доводя проект до конца.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/hybrid-team-managemet/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/hybrid-team-managemet/</guid>

                <pubDate>Tue, 24 Feb 2026 03:40:05 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как создать цифровой продукт с гибридной командой и не сойти с ума</h1>
                                <figure>
                                    <img src="/Media/lm2j5lp5/&#x43D;&#x430;&#x441;&#x442;&#x44F;-3d-&#x438;&#x43B;&#x43B;&#x44E;&#x441;&#x442;&#x440;&#x430;&#x446;&#x438;&#x44F;-24-&#x444;&#x435;&#x432;&#x440;-2026-2.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a8580589bfb2477483dcaa2d7ad9d7ab"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><span class="first-p">Представим ситуацию: у&nbsp;вас&nbsp;рабочая встреча. Нужно разобрать один из&nbsp;сценариев разрабатываемого сервиса, прояснить работу системы. Подключается бэкендер. Первое, что&nbsp;он&nbsp;говорит: «Какие вопросы ко&nbsp;мне? Если нет&nbsp;— отключаюсь». Вы&nbsp;открываете рот, чтобы объяснить, что&nbsp;вопросы появятся по&nbsp;ходу разбора. Но&nbsp;он&nbsp;уже&nbsp;ушел.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f0ea574eab42471cb82add5bcf4a3ae7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e7cbf8df24a84164ac18def74d2c66c4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Это будни проекта, где&nbsp;вы&nbsp;— проджект-менеджер из&nbsp;агентства — управляете гибридной командой, которую отчасти не&nbsp;выбирали. Тут&nbsp;треть – ваши люди, еще&nbsp;треть – штатные сотрудники клиента и&nbsp;еще&nbsp;– дизайнеры из&nbsp;другого агентства. А&nbsp;вы&nbsp;посередине. Вы&nbsp;не&nbsp;нанимали этих людей. Не&nbsp;можете их&nbsp;уволить. Но&nbsp;отвечаете за&nbsp;результат.</p>
<p dir="ltr">За два&nbsp;года такого проекта вы&nbsp;столкнетесь с&nbsp;тысячей и&nbsp;одним конфликтом. С&nbsp;родственниками, нанятыми по&nbsp;знакомству. С&nbsp;людьми, которые друг друга терпеть не&nbsp;могут, но&nbsp;работают бок&nbsp;о&nbsp;бок&nbsp;и&nbsp;вроде как&nbsp;должны сделать что&#8209;то&nbsp;крутое.</p>

<div class="umb-macro-highlights">
    <strong>Эта статья — о&nbsp;том, как&nbsp;при&nbsp;таких вводных находить подходы к&nbsp;каждому, когда включать здоровое недоверие (и&nbsp;почему важно делать это&nbsp;сразу), как&nbsp;не&nbsp;выгореть и&nbsp;почему мягкость в&nbsp;управлении иногда оказывается единственным способом довести проект до&nbsp;конца. Разберем на&nbsp;реальных кейсах двухлетнего проекта.</strong>
    
</div>

</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e13231e736b042038586a4fc51a70c44"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Что такое гибридная команда и&nbsp;почему это&nbsp;не&nbsp;просто аутсорс разработка</h2>
<p dir="ltr">Говоря о&nbsp;заказной разработке, обычно представляют простую схему: есть заказчик с&nbsp;идеей и&nbsp;деньгами, есть агентство с&nbsp;готовой командой. Агентство приходит целиком — со&nbsp;своим проджектом, разработчиками, тестировщиками, дизайнерами. Все&nbsp;процессы внутри этой команды, все&nbsp;люди друг друга знают, сработались на&nbsp;предыдущих проектах.</p>

<div class="text-highlight">
  Но&nbsp;на&nbsp;деле команды продуктов чаще оказываются гибридными.
</div>

<p dir="ltr">У клиента есть свои штатные сотрудники. Например,&nbsp;тимлид, пара бэкендеров и&nbsp;тестировщиков. Но&nbsp;их&nbsp;силами целый сервис не&nbsp;создать. Поэтому он&nbsp;нанимает фронтендеров и&nbsp;мобильщиков из&nbsp;одного агентства, дизайнера из&nbsp;другого и&nbsp;еще&nbsp;одного бэкендера просто с&nbsp;рынка. Ну, вот&nbsp;так&nbsp;получилось. И&nbsp;люди из&nbsp;разных мест неизбежно будут расходиться в&nbsp;корпоративных культурах и&nbsp;представлениях о&nbsp;том, что&nbsp;такое хорошая работа.&nbsp;</p>
<p dir="ltr">И вот&nbsp;вы&nbsp;должны всем этим управлять.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/988c5d4f088e4ecf90bd0af91451cba0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Мало просто отслеживать прогресс разработки. Нужно стать авторитетом для&nbsp;людей, которых вы&nbsp;не&nbsp;нанимали. Синхронизировать тех, у&nbsp;кого за&nbsp;спиной разные менеджеры и&nbsp;разные мотивации. Сделать так, чтобы штатный сотрудник клиента не&nbsp;считал себя «более важным», потому что&nbsp;он&nbsp;в&nbsp;штате, а&nbsp;остальные тут&nbsp;временно.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Алена Молчанова
                </cite>
                <p class="blockquote-new__author-position">
                    проджект-менеджер fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/69d8f62f06e84cbba6cf93ba03ff2064"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d2d55b172def4f8794d42dfbc5ad4fd7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Нет рычагов, которые есть в&nbsp;«своей» команде. Вы&nbsp;не&nbsp;можете уволить человека, если он&nbsp;саботирует работу. Вы&nbsp;не&nbsp;всегда знаете, какие указания ему&nbsp;дает его&nbsp;собственное руководство. И&nbsp;вы&nbsp;точно не&nbsp;знаете, насколько он&nbsp;компетентен.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/21f2c2ac96154811a771683a5c03ddda"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Включайте здоровое недоверие с&nbsp;первого дня</h2>
<p dir="ltr">Есть хорошая новость: в&nbsp;IT-нише роли более-менее стандартизированы. Когда вы&nbsp;приходите на&nbsp;проект как&nbsp;проджект, вам&nbsp;не&nbsp;нужно объяснять разработчикам и&nbsp;тестировщикам, кто&nbsp;вы&nbsp;и&nbsp;почему они&nbsp;должны отвечать на&nbsp;ваши вопросы. Есть команда, есть PM&nbsp;— вот&nbsp;структура, с&nbsp;которой все&nbsp;знакомы. Примерно того же&nbsp;мы&nbsp;привыкли ожидать и&nbsp;в&nbsp;контексте остальных участников команды.&nbsp;</p>
<p dir="ltr"><em><span class="highlighter">Но есть нюанс.</span></em></p>
<p dir="ltr">Когда в&nbsp;команде появляются люди со&nbsp;стороны клиента или&nbsp;еще&nbsp;одного агентства, возникает странный эффект. Ты&nbsp;воспринимаешь этих людей ровно так, как&nbsp;их&nbsp;презентовал заказчик. Если сказали «это наш&nbsp;тимлид» — значит, он&nbsp;опытный и&nbsp;компетентный. Если «это звездный бэкендер» — значит, профессионал</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/84858997bb794693a1bba3eb1a754a57"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><span class="highlighter"><strong>Почему непросто с&nbsp;этим работать:</strong></span></p>
<ul>
<li><strong>Страх перед сторонним ресурсом: </strong>возникает ложное ощущение, что&nbsp;раз&nbsp;человека нанял клиент (который сам&nbsp;по&nbsp;себе IT-директор), значит, он&nbsp;точно эксперт и&nbsp;трогать его&nbsp;нельзя. Нет&nbsp;установки проверить человека, потому что&nbsp;он&nbsp;от&nbsp;клиента. Кажется, что&nbsp;сомневаться в&nbsp;его&nbsp;навыках — ставить под&nbsp;вопрос выбор самого заказчика.</li>
<li><strong>Иллюзия иерархии: </strong>штатные сотрудники заказчика часто считают, что&nbsp;их&nbsp;статус «инвестора» дает им&nbsp;право на&nbsp;автономные решения, даже если они&nbsp;идут вразрез с&nbsp;общим процессом.</li>
<li><strong>Скрытое управление: </strong>у людей из&nbsp;сторонних агентств есть свои руководители и&nbsp;свои KPI, которых вам&nbsp;не&nbsp;видно, но&nbsp;которые влияют на&nbsp;их&nbsp;работу.</li>
</ul>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e18b61a486ad4b2d98701f217d37506b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Не у&nbsp;всех есть привычка сразу включать критическое мышление. <span class="highlighter">А вдруг вы&nbsp;усомнитесь в&nbsp;людях, а&nbsp;окажется, что&nbsp;это&nbsp;вы&nbsp;чего&#8209;то&nbsp;не&nbsp;понимаете?</span> Да&nbsp;и&nbsp;к&nbsp;тому же&nbsp;все&nbsp;эти&nbsp;проверки будут занимать время, <em>а мы&nbsp;тут&nbsp;в&nbsp;огне, вообще-то!</em></p>
<p dir="ltr">Вот как&nbsp;было. Клиент дал&nbsp;тимлида фронтенда, которого сам&nbsp;нанял под&nbsp;проект. И&nbsp;все&nbsp;ожидали от&nbsp;него тимлидского перформанса: он&nbsp;ревьюит код, помогает планировать, берет сложные задачи. Прошло время. Оказалось, что&nbsp;у&nbsp;него грубые ошибки в&nbsp;архитектуре. Он&nbsp;не&nbsp;знает, как&nbsp;работать с&nbsp;компонентами. Системно работать не&nbsp;умеет, с&nbsp;коммуникацией тоже было туго: суть «лида» никак в&nbsp;нем&nbsp;не&nbsp;раскрывалась. По&nbsp;факту — джуниор-плюс, максимум. Но&nbsp;это&nbsp;мы&nbsp;только спустя три&nbsp;месяца узнали.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/5ee9e6c6fc8c41498f657edd70d68922"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Урок простой: авторитет PM&#8209;а&nbsp;в&nbsp;гибридной команде строится на&nbsp;отказе от&nbsp;восприятия людей в&nbsp;статусе «дано». Нужно включать критику сразу. Задавать вопросы, смотреть на&nbsp;результат и&nbsp;не&nbsp;бояться подсвечивать проблемы клиенту. Потому что&nbsp;в&nbsp;итоге за&nbsp;проваленные сроки спросят не&nbsp;с&nbsp;«не того» тимлида, а&nbsp;с&nbsp;тебя.  
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Алена Молчанова
                </cite>
                <p class="blockquote-new__author-position">
                    проджект-менеджер fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c9904370321a441fba64ddaab9b37aca"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ada79bf51ee24159b40be2848abd644f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Как мягкость может стоить полугода разработки</h2>
<p dir="ltr">Помните немногословного бэкендера из&nbsp;начала статьи? Он&nbsp;пришел в&nbsp;продукт из&nbsp;другого агентства. Должен был&nbsp;сделать большой сервис за&nbsp;три&nbsp;месяца. Задачи декомпозированы, все&nbsp;разложено по&nbsp;полочкам, план понятный. Ну, поехали.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/674091c5c2f248a6a62aa9c533c57c43"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
<p>Больше историй с проектов и способов справляться со сложностями у нас в тг – присоединяйтесь!</p>	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d70ca948d21b44419c0eb6263edd19f9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f59cf1eea2674cc3b25d9068af08eb9c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">И сначала все&nbsp;вроде было окей, работали потихонечку. Но&nbsp;потом начались странности. Он&nbsp;не&nbsp;отвечал в&nbsp;чатах, игнорировал тикеты в&nbsp;Jira, не&nbsp;реагировал на&nbsp;дедлайны. На&nbsp;созвонах появлялся с&nbsp;одним вопросом: «Есть ко&nbsp;мне&nbsp;вопросы? Озвучьте, пожалуйста. Если нет&nbsp;— я&nbsp;отключаюсь». Единственный человек, с&nbsp;которым он&nbsp;нормально общался — аналитик. Она&nbsp;работала над&nbsp;его&nbsp;функцией, писала документацию по&nbsp;его&nbsp;коду, и&nbsp;он&nbsp;ей&nbsp;доверился. Через нее&nbsp;приходилось ставить задачи и&nbsp;узнавать статус. Так&nbsp;получалось работать какое&#8209;то&nbsp;время – не&nbsp;хотелось сразу рубить с&nbsp;плеча.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5a46f49a2c90409eab3d8f3476febc0f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Прошло два&nbsp;месяца. Оказалось, что&nbsp;сделано очень мало. Сроки увеличились в&nbsp;два&nbsp;раза. Потом он&nbsp;вообще перестал делать коммиты. Об&nbsp;этом узнали через архитектора. Начали разбирательство с&nbsp;его&nbsp;агентством. В&nbsp;итоге <span class="highlighter">человек ушел, не&nbsp;оставив ничего работающего. Ноль. Ничего, что&nbsp;можно было бы&nbsp;задеплоить и&nbsp;использовать.</span></p>
<p dir="ltr"><img src="/Media/rfifgkwu/frame-2.png?rmode=max&amp;width=730&amp;height=445" alt="управление гибридной командой" width="730" height="445"></p>
<p dir="ltr">Но давайте теперь про&nbsp;то, как&nbsp;это&nbsp;выглядело в&nbsp;моменте. Вот&nbsp;вы&nbsp;РМ, <span class="highlighter">вам дали человека и&nbsp;сказали: «Через три&nbsp;месяца должен быть сервис. Вот&nbsp;тебе он&nbsp;— разбирайся»</span>. Вы&nbsp;в&nbsp;ответе за&nbsp;его&nbsp;онбординг, скорость работы. Изначально казалось, что&nbsp;он&nbsp;надолго. Что&nbsp;его&nbsp;нужно спокойно вкатить в&nbsp;команду, сделать «нашим человеком», водить на&nbsp;планирования и&nbsp;ретроспективы. Про&nbsp;нюансы его&nbsp;коммуникации известно не&nbsp;было, и&nbsp;никто не&nbsp;знал, что&nbsp;человека стоит сразу за&nbsp;горло схватить, чтобы он&nbsp;понял, что&nbsp;на&nbsp;проекте действительно нужно работать.&nbsp;</p>
<p dir="ltr">Но это&nbsp;не&nbsp;тот&nbsp;стиль управления, который приходит в&nbsp;голову первым. Да&nbsp;и&nbsp;вообще — <span class="highlighter">с людьми, которых нужно хватать за&nbsp;горло, не&nbsp;сработаешься</span>. Потому что&nbsp;если ты&nbsp;не&nbsp;привык так&nbsp;работать, это&nbsp;будет токсично и&nbsp;для&nbsp;тебя, и&nbsp;для&nbsp;него</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/521f22a73e8c47fdab5d4e9b443deba4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Урок следующий: нужно договариваться с&nbsp;клиентом на&nbsp;берегу о&nbsp;том, какое у&nbsp;него видение на&nbsp;конкретного (нового) сотрудника. Он&nbsp;временный или&nbsp;долгосрочный? Какой от&nbsp;него ожидается результат и&nbsp;в&nbsp;какие сроки? Что&nbsp;стоит учесть, вводя его&nbsp;в&nbsp;работу?

Если этого разговора не&nbsp;было — рискуете потратить много времени впустую. 
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Алена Молчанова
                </cite>
                <p class="blockquote-new__author-position">
                    проджект-менеджер fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7b0d18022936458d8e36b088a24e35fb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/98082950891a43159eb630c68f96e445"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Как предлагать помощь в&nbsp;найме и&nbsp;почему это&nbsp;ваша страховка</h2>
<p dir="ltr">Для всякой работы нужен подходящий исполнитель. Исполнители из&nbsp;примеров выше, очевидно, для&nbsp;наших задач не&nbsp;подошли. И&nbsp;здесь есть элемент найма в&nbsp;вакууме. Заказчик нанимает специалистов без&nbsp;участия команды, которая будет с&nbsp;ними работать.</p>

<div class="text-highlight">
  Он&nbsp;ищет, например,  бэкендера и&nbsp;находит человека, который на&nbsp;собеседовании отвечает правильно. Нанимает. А&nbsp;через месяц оказывается, что&nbsp;и&nbsp;лид&nbsp;не&nbsp;лид, и&nbsp;владелец продукта продуктом не&nbsp;владеет, и&nbsp;бэкендер не&nbsp;коммитит ничего неделями.
</div>

<p dir="ltr">Почему так&nbsp;происходит? У&nbsp;клиента может не&nbsp;быть компетенций в&nbsp;найме именно для&nbsp;вашего проекта. Или&nbsp;компетенции есть, но&nbsp;их&nbsp;недостаточно, чтобы понять, насколько конкретный человек подходит под&nbsp;текущие задачи, команду и&nbsp;контекст.</p>
<p dir="ltr"><span class="highlighter"><strong>Решение простое: предлагать помощь в&nbsp;найме.</strong></span></p>
<p dir="ltr">Не заходите с&nbsp;ноги и&nbsp;фразы «мы знаем лучше». Нужно вкладывать смысл «давайте вместе». Если клиент планирует нанимать фронтендера — пусть ваш&nbsp;тимлид фронта посидит на&nbsp;собеседовании как&nbsp;фасилитатор. Нанимает бэкендера — подключите своего архитектора или&nbsp;сильного бэка. Пару часов их&nbsp;времени — это&nbsp;не&nbsp;космические деньги, но&nbsp;это&nbsp;резко снижает риск получить неадекватного сотрудника.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/c238915acb514a4b912c82eb0c629865"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Это&nbsp;сильная сторона нормальных агентств: люди отбираются внимательно, тщательно, с&nbsp;душой. Навык в&nbsp;этом есть. И&nbsp;предлагать клиенту помощь — это&nbsp;забота о&nbsp;проекте. Мы&nbsp;транслируем простую мысль: «Мы уже&nbsp;в&nbsp;контексте проекта, мы&nbsp;знаем его&nbsp;нюансы. Позвольте нам&nbsp;отсмотреть кандидата, чтобы вам&nbsp;не&nbsp;пришлось искать нового через два&nbsp;месяца»
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Алена Молчанова
                </cite>
                <p class="blockquote-new__author-position">
                    проджект-менеджер fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1755690f869c4300a5b722f0d8c2f0d7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1670e4bc68644b658f0660f03ac90671"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><span class="highlighter">Иногда клиент откажет. Иногда у&nbsp;него позиция «я сам&nbsp;решууу». Ок. Но&nbsp;предлагать все&nbsp;равно нужно.</span> Зафиксировать, что&nbsp;вы&nbsp;готовы помочь, объяснить риски на&nbsp;примерах.</p>
<p dir="ltr">Потому что&nbsp;если придет очередной токсичный или&nbsp;некомпетентный человек, отвечать за&nbsp;его&nbsp;результат будете вы. И&nbsp;это&nbsp;полбеды. Вторая половина беды в&nbsp;том, что&nbsp;сроки проекта уже&nbsp;уедут за&nbsp;рамки всяческих ожиданий.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/be45e872b3f549d7984d9f8533eba95a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Нестандартные решения и&nbsp;дизайнер в&nbsp;роли владельца продукта</h2>
<p dir="ltr">Можно пойти глубже – искать внутренние ресурсы там, где&nbsp;их&nbsp;никто не&nbsp;ожидал увидеть. Особенно, когда ситуация на&nbsp;рынке не&nbsp;самая понятная.&nbsp;</p>
<p dir="ltr">Одной из&nbsp;самых больших болей нашего проекта долгое время оставался поиск владельца продукта. <span class="highlighter">Мы наблюдали классическое искажение: заказчик искал специалиста из&nbsp;книжек, который засыпает команду терминами но&nbsp;совершенно не&nbsp;чувствует живой контекст. К&nbsp;нам&nbsp;приходили такие люди, но&nbsp;они&nbsp;существовали в&nbsp;параллельной реальности.</span> Один такой специалист полгода спрашивал «какая цель спринта», так&nbsp;и&nbsp;не&nbsp;вникнув в&nbsp;суть нашего процесса.</p>
<p dir="ltr"><img src="/Media/tssjhh5s/frame-3.png?rmode=max&amp;width=693&amp;height=423" alt="" width="693" height="423"></p>
<p dir="ltr">Решение пришло изнутри: роль владельца продукта занял дизайнер, который был&nbsp;на&nbsp;проекте с&nbsp;самого старта. Назовем его&nbsp;Леша. Вот&nbsp;вам&nbsp;и&nbsp;пример того, как&nbsp;проактивность агентства помогает заказчику выйти из&nbsp;наймовой ямы.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b26201bbc1c74afb8581b483796033f8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><span class="highlighter"><strong>Почему внутренний ресурс сработал лучше классического найма:</strong></span></p>
<ul>
<li><span class="highlighter"><em>Не нужно было притираться к&nbsp;контексту</em>.</span> &nbsp;Леша уже&nbsp;понимал продукт «от и&nbsp;до», знал бизнес-логику и&nbsp;то, как&nbsp;всё&nbsp;устроено внутри, пока человек со&nbsp;стороны тратил бы&nbsp;месяцы на&nbsp;адаптацию.</li>
<li><em><span class="highlighter">Практическая польза победила пробелы в&nbsp;теории.</span></em> Леша мог&nbsp;не&nbsp;знать всех академических терминов, но&nbsp;он&nbsp;понимал, как&nbsp;продукт должен зарабатывать и&nbsp;как, например, руками поправить макеты для&nbsp;достижения цели.</li>
<li><span class="highlighter"><em>Заказчик понимал, о&nbsp;ком&nbsp;идет речь</em>.</span> Удалось оторваться от&nbsp;привычки искать «человека-методичку» и&nbsp;довериться тому, кто&nbsp;уже&nbsp;показал себя в&nbsp;деле. Всем как&#8209;то&nbsp;сразу стало ясно, что&nbsp;это&nbsp;эффективное решение.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/165273d69acd41d59d7606d4f8ff9f1c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Что&nbsp;тут&nbsp;главное? Не&nbsp;всегда нужно искать звезд с&nbsp;неба. У&nbsp;вас&nbsp;часто могут быть свои, просто их&nbsp;нужно заметить. И&nbsp;круто, если в&nbsp;команде есть человек, который способен это&nbsp;сделать
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Алена Молчанова
                </cite>
                <p class="blockquote-new__author-position">
                    проджект-менеджер fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d2991d67fd884844b2f0deef61d39a18"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/182e457d3d3740a4a6f81d6319a74347"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Почему команда из&nbsp;агентства работает не&nbsp;так&nbsp;как&nbsp;штат клиента</h2>
<p dir="ltr">Вот что&nbsp;становится заметно через несколько месяцев работы: люди из&nbsp;вашего агентства и&nbsp;люди из&nbsp;штата клиента работают по-разному. И&nbsp;нет, это&nbsp;не&nbsp;заход к&nbsp;тому, что&nbsp;одни профессиональнее других. <span class="highlighter">Просто у&nbsp;всех разная мотивация и&nbsp;разные привычки.</span></p>
<p dir="ltr">У нас&nbsp;был&nbsp;инцидент с&nbsp;тестировщиками со&nbsp;стороны клиента, они&nbsp;постоянно жаловались, что&nbsp;задачи приходят, а&nbsp;они&nbsp;не&nbsp;знают, как&nbsp;тестировать. Не&nbsp;готовились заранее, не&nbsp;разбирались в&nbsp;контексте — просто ждали, пока задача упадет к&nbsp;ним&nbsp;в&nbsp;работу, а&nbsp;потом начинали выяснять, что&nbsp;с&nbsp;ней&nbsp;делать. Окей, с&nbsp;этим тоже можно работать. Мы&nbsp;выстроили отдельный процесс: погружение тестировщиков в&nbsp;контекст задачи еще&nbsp;до&nbsp;ее&nbsp;готовности. Чтобы к&nbsp;моменту, когда нужно тестировать, все&nbsp;уже&nbsp;понимали, что&nbsp;проверять и&nbsp;зачем. Это&nbsp;предупредительная работа — разруливать проблемы до&nbsp;того, как&nbsp;они&nbsp;превратятся в&nbsp;конфликт.</p>

<div class="umb-macro-highlights">
    <strong>Но откуда растут ноги у&nbsp;такого положения дел? У&nbsp;агентской команды есть понимание: хоть они&nbsp;и&nbsp;ребята со&nbsp;стороны, спросят с&nbsp;них&nbsp;«как с&nbsp;родных» – надо сразу показывать результат, который устроит заказчика, иначе есть риск быстро распрощаться. Плюс они&nbsp;привыкли к&nbsp;культуре, где&nbsp;проактивность — норма. Потому что&nbsp;в&nbsp;заказной разработке подрядчик должен быть даже вовлеченнее, чем&nbsp;в&nbsp;заказчик. </strong>
    
</div>

<p dir="ltr">У штатных сотрудников заказчика может быть по-другому. Это&nbsp;их&nbsp;постоянное место работы. Проект для&nbsp;них&nbsp;— очередной рабочий фокус, которых может быть множество. Мотивация другая: сделать свою часть, не&nbsp;ввязываться ни&nbsp;во&nbsp;что, не&nbsp;брать на&nbsp;себя лишнее. Не&nbsp;хочется обобщать, но&nbsp;так&nbsp;реально часто происходит.</p>
<p dir="ltr"><span class="highlighter">Нужно принять, что&nbsp;команда разношерстная, и&nbsp;работать с&nbsp;тем, что&nbsp;есть.</span> С&nbsp;теми, кто&nbsp;проактивен — давать пространство для&nbsp;инициативы. С&nbsp;теми, кому нужна структура и&nbsp;четкие инструкции — обеспечивать её. С&nbsp;теми, кто&nbsp;работает через раз&nbsp;— искать рычаги влияния или&nbsp;изолировать от&nbsp;остальных, чтобы они&nbsp;не&nbsp;тормозили процесс.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/53631d6c6d9049de837b846bf2c23136"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Попытка заставить всех работать одинаково — ну, сами понимаете. Люди из&nbsp;разных культур и&nbsp;с&nbsp;разной мотивацией так&nbsp;не&nbsp;сработаются. Зато можно адаптировать стиль управления под&nbsp;каждую группу. И&nbsp;это&nbsp;уже&nbsp;работает
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Алена Молчанова
                </cite>
                <p class="blockquote-new__author-position">
                    проджект-менеджер fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2a371b6e63a34049ae8db3078b33c20b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9c73e976531d468884e21f558212d1cc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Почему неумение хватать людей за&nbsp;горло на&nbsp;самом деле спасает проекты</h2>
<p dir="ltr">Логичный возникает вопрос: как&nbsp;поженить друг с&nbsp;другом людей в&nbsp;этой всей неразберихе, где&nbsp;у&nbsp;всех своя мотивация (у&nbsp;кого&#8209;то&nbsp;вовсе отсутствующая) и&nbsp;свои методы общения?&nbsp;</p>
<p dir="ltr">Можно пойти по&nbsp;пути жесткости, как&nbsp;та&nbsp;самая Галина Ивановна, которая стучала указкой по&nbsp;доске, пока вы&nbsp;учились в&nbsp;4«Б». По&nbsp;ее&nbsp;заветам вы&nbsp;начнете рыться в&nbsp;каждом конфликте, выяснять, кто&nbsp;виноват, раздавать предупреждения, требовать дисциплины. Звучит для&nbsp;кого&#8209;то&nbsp;может и&nbsp;правильно, но&nbsp;чаще всего это&nbsp;способ угробить сначала команду, а&nbsp;потом и&nbsp;проект. Потому что&nbsp;<span class="highlighter">если вы&nbsp;начнете биться за&nbsp;правду в&nbsp;каждой ситуации, у&nbsp;вас&nbsp;не&nbsp;останется времени вести разработку</span>. А&nbsp;люди, которых вы&nbsp;пытаетесь утихомирить и&nbsp;дисциплинировать через жесткость, просто закроются. Или&nbsp;начнут саботировать. Или&nbsp;уйдут, и&nbsp;клиент найдет им&nbsp;замену, которая может оказаться еще&nbsp;хуже.</p>
<p dir="ltr"><img src="/Media/hd5awtmj/frame-4.png?rmode=max&amp;width=691&amp;height=460" alt="" width="691" height="460"></p>
<p dir="ltr">Другой подход — поиск альтернативных путей. Игнорировать чьи&#8209;то&nbsp;выкрутасы, если результат есть. Искать посредников и&nbsp;компромиссы для&nbsp;тех, с&nbsp;кем&nbsp;по&nbsp;классическому пути не&nbsp;построить связь.</p>
<p dir="ltr">Вот токсичный разработчик, который не&nbsp;отвечает в&nbsp;чатах и&nbsp;игнорирует созвоны. Можно с&nbsp;ним&nbsp;воевать. А&nbsp;можно найти человека, с&nbsp;которым он&nbsp;нормально общается, и&nbsp;коммуницировать через него. Не&nbsp;идеально, но&nbsp;работает же! Просто за&nbsp;коммитами тоже послеживайте.</p>
<p dir="ltr">Вот тестировщики, на&nbsp;которых постоянно жалуются разработчики и&nbsp;аналитики. Можно устроить разбор полетов. А&nbsp;можно подтюнить процесс кое-где, чтобы у&nbsp;них&nbsp;просто не&nbsp;осталось участков, которыми в&nbsp;теории можно объяснить простои в&nbsp;работе.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/703befeff0d947e28140c8986563b206"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Если человек проспал или&nbsp;затупил, я&nbsp;не&nbsp;устраиваю публичную казнь. Мне&nbsp;важно, чтобы задача была сделана. Лояльность, которую ты&nbsp;проявляешь к&nbsp;людям в&nbsp;мелочах, возвращается к&nbsp;тебе их&nbsp;готовностью вложиться в&nbsp;проект в&nbsp;критический момент. Они&nbsp;слышат и&nbsp;слушают, предлагают, работают в&nbsp;диалоге, а&nbsp;не&nbsp;молча сидят ждут директивных указаний. Ну&nbsp;и&nbsp;помимо всего этого, взрослые люди обычно ценят, когда относишься к&nbsp;ним&nbsp;не&nbsp;как&nbsp;злая училка к&nbsp;школьникам
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Алена Молчанова
                </cite>
                <p class="blockquote-new__author-position">
                    проджект-менеджер fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6da9e43712dd4baca34cc4db1ea8624e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5fb797e5a3ee4fdb92ec38a1a13f4ccf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Короче, тут&nbsp;можно до&nbsp;бесконечности эти&nbsp;примеры приводить. Главное – усвоить, что&nbsp;тут&nbsp;гибкость всякого рода работать будет явно лучше, чем&nbsp;попытки всех построить.</p>
<h2 dir="ltr">PM — это&nbsp;коммуникатор, которому отчаянно нужны «свои»</h2>
<p dir="ltr"><span class="highlighter">Если проект – это&nbsp;лоскутное одеяло специалистов с&nbsp;разным бэкграундом, проджект – это&nbsp;нить, которая удерживает кусочки вместе через постоянный мониторинг</span>: списаться утром, уточнить прогресс днем, вовремя заметить, что&nbsp;кто&#8209;то&nbsp;выпал из&nbsp;контекста. Такое превентивное управление конфликтами и&nbsp;притирка людей друг к&nbsp;другу часто остаются за&nbsp;кадром официальных отчетов, но&nbsp;именно они&nbsp;позволяют фичам запускаться.</p>

<div class="umb-macro-highlights">
    <strong>И тут&nbsp;попробуй вывези! Проджект вынужден постоянно «держать лицо»: транслировать адекватность и&nbsp;профессионализм даже в&nbsp;те&nbsp;моменты, когда, ну, совсем уже&nbsp;ни&nbsp;в&nbsp;какие ворота. </strong>
    
</div>

<p dir="ltr">Нельзя позволить себе привычную степень искренности, которая доступна со&nbsp;своими, — все&nbsp;эмоции от&nbsp;кринжовых рабочих ситуаций приходится перерабатывать внутри, чтобы сохранять <s>кукуху</s> статус стабильного управленца.</p>
<p dir="ltr">Ну и&nbsp;нет, мы&nbsp;тут&nbsp;не&nbsp;про&nbsp;то, чтобы всем проектным коллегам кости перемыть. Просто <span class="highlighter">порой дальнейшие действия нужно вместе обговаривать, чтобы гарантировать, что&nbsp;никто не&nbsp;поссорится, и&nbsp;все&nbsp;друг друга поймут на&nbsp;следующем митинге</span>. Такая тесная связка внутри своей команды не&nbsp;только спасает психику менеджера, но&nbsp;и&nbsp;порой рождает самые эффективные рабочие решения, которые невозможно найти в&nbsp;учебниках по&nbsp;менеджменту.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/518865cd7700426ca71694c19f165c0e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Что делать, если вы&nbsp;PM&nbsp;в&nbsp;гибридной команде</h2>
<p dir="ltr">Давайте зафиксируем, Работа в&nbsp;гибридной среде — это&nbsp;всегда игра с&nbsp;высокой степенью неопределенности. <em>Никогда не&nbsp;знаешь, где&nbsp;бабахнет.</em> Чтобы во&nbsp;всем этом выжить и&nbsp;принести пользу, стоит придерживаться нескольких принципов, выведенных «кровью» и&nbsp;сорванными сроками.</p>
<ul>
<li><span class="highlighter">Откажитесь от&nbsp;веры в&nbsp;«дано».</span> Не&nbsp;воспринимайте компетенции людей со&nbsp;стороны как&nbsp;аксиому; проверяйте их&nbsp;в&nbsp;деле с&nbsp;первой недели, чтобы не&nbsp;обнаружить джуниора на&nbsp;позиции лида спустя три&nbsp;месяца.</li>
<li><span class="highlighter">Транслируйте мягкую силу.</span> В&nbsp;коллективе, где&nbsp;смешаны штатные сотрудники заказчика и&nbsp;несколько агентств, жесткое давление приведет лишь к&nbsp;саботажу. Становитесь медиатором, который объединяет интересы и&nbsp;сглаживает углы.</li>
<li><span class="highlighter">Выходите за&nbsp;рамки таблиц и&nbsp;отчетов.</span> В&nbsp;гибридном проекте PM&nbsp;— это&nbsp;прежде всего коммуникатор. Ваша работа — это&nbsp;ежедневный ручной мониторинг настроений, планов и&nbsp;реального прогресса каждого участника.</li>
<li><span class="highlighter">Влияйте на&nbsp;найм.</span> Если вы&nbsp;видите, что&nbsp;клиент раз&nbsp;за&nbsp;разом ошибается в&nbsp;людях, предлагайте помощь в&nbsp;фасилитации интервью или&nbsp;ищите ресурсы внутри. Так&nbsp;вы&nbsp;не&nbsp;посягательствуете на&nbsp;власть, а&nbsp;защищаете проект от&nbsp;потери времени.</li>
<li><span class="highlighter">Берегите свой внутренний круг.</span> Найдите команду, с&nbsp;которой можно быть собой и&nbsp;обсуждать стратегические моменты вашей совместной работы, чтобы всем было хорошо. Это&nbsp;единственный способ сохранить адекватность, когда в&nbsp;основном на&nbsp;проекте приходится постоянно держать лицо.</li>
</ul>
<p dir="ltr">Главный месседж, который должен остаться у&nbsp;заказчика после работы с&nbsp;такой командой: <span class="highlighter">даже если на&nbsp;проекте будет десять разных агентств и&nbsp;неразбериха в&nbsp;процессах, менеджмент подрядчика способен всё&nbsp;это&nbsp;срастить и&nbsp;привести к&nbsp;качественному результату.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/c939fe142a9b443eab2a2376819a07d2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    5 суперспособностей продуктового разработчика в B2B-командах
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Кто такой продуктовый разработчик, чем он отличается от обычного и как им стать? Разбираемся, где проходит граница и существует ли она вообще.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/5-developer-superpowers/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/5-developer-superpowers/</guid>

                <pubDate>Thu, 19 Feb 2026 14:04:32 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>5 суперспособностей продуктового разработчика в B2B-командах</h1>
                                <figure>
                                    <img src="/Media/1qnjrn4d/chatgpt-image-&#x43D;&#x430;&#x441;&#x442;&#x44F;-2-&#x430;&#x43F;&#x440;-2025-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/662e27509ec84cf39748d1e2e000b20d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Итак, вы&nbsp;разработчик. Грызете гранит, положим, Java, осваиваете очередной фреймворк, учитесь управлять Kubernetes, а&nbsp;иногда даже читаете про&nbsp;консистенцию данных в&nbsp;ACID. Но&nbsp;вот&nbsp;незадача: крутые компании хотят не&nbsp;только ваших знаний. Им&nbsp;нужны&nbsp;<strong>продуктовые разработчики</strong>. Но&nbsp;кто&nbsp;это&nbsp;вообще такие? Где&nbsp;заканчивается разработчик обычный и&nbsp;начинается продуктовый? Или&nbsp;они&nbsp;вообще существуют отдельно друг от&nbsp;друга и&nbsp;пересекаются только в&nbsp;фантазиях нанимателей? Попробуем ответить на&nbsp;эти&nbsp;вопросы, составить портрет продуктового разработчика и&nbsp;разобраться, как&nbsp;же&nbsp;им&nbsp;стать.&nbsp;</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ba1240d687934588b98e83a3e158ab53"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/032f30a4ec1945e79c095623232eb4ab"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Вообще само понятие «продуктовый разработчик» довольно обтекаемо. По&nbsp;сравнению, например, с&nbsp;продуктовыми менеджерами, продуктовые разработчики скорее не&nbsp;наименование позиции, а&nbsp;надстройка восприятия компетенций сотрудника, которую каждый может понимать и&nbsp;описывать по-разному. Предлагаю сделать шаг&nbsp;в&nbsp;сторону унификации этого понятия и&nbsp;разложить по&nbsp;полочкам компетенции и&nbsp;подходы, характерные для&nbsp;продуктового разработчика.</p>
<h2>Дано</h2>
<p>У нас&nbsp;есть два&nbsp;героя: разработчики Тоня и&nbsp;Мартин. Оба&nbsp;талантливые, оба&nbsp;знают, как&nbsp;устроены фреймворки, как&nbsp;работает PostgreSQL и&nbsp;даже разбираются в&nbsp;таких нюансах, как&nbsp;вариации консистенции данных по&nbsp;ACID. Но&nbsp;их&nbsp;подходы к&nbsp;задачам кардинально различаются.</p>
<p><img style="float: left;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/395/a38/6c1/395a386c1a87c16ed6abfd1a38d02b38.png?rmode=max&amp;width=815&amp;height=489" alt="" width="815" height="489"></p>
<p><strong>Тоня:</strong> продуктовый разработчик. Будет нашим эталоном.&nbsp;</p>
<p><strong>Мартин:</strong>&nbsp;классный технарь.&nbsp;</p>
<h2>I суперспособность: понимание продукта</h2>
<p>Задача: сделать выгрузку отчетов данных в&nbsp;Excel.&nbsp;</p>
<p><span class="highlighter"><strong>Что делает Мартин</strong></span></p>
<p>Мартин быстро генерирует файл с&nbsp;колонками и&nbsp;цифрами. Файл есть, данные правильные. Но&nbsp;в&nbsp;отчете отсутствуют форматирование и&nbsp;пояснения к&nbsp;данным.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/4d7/b63/da6/4d7b63da6a1d2dc25c000af57ce90681.png?rmode=max&amp;width=855&amp;height=279" alt="" width="855" height="279"></p>
<p>Такого вида таблица выходит у&nbsp;Мартина. Технически не&nbsp;подкопаться: все&nbsp;выгружено, данные верны. Но&nbsp;черт ногу сломит в&nbsp;этих данных ввиду отсутствия контекста и&nbsp;вспомогательных расчетов. Нет, это&nbsp;не&nbsp;значит что&nbsp;Мартин не&nbsp;справился с&nbsp;задачей. Напротив – он&nbsp;все&nbsp;сделал четко как&nbsp;просили. Но&nbsp;можно было лучше.</p>
<p><span class="highlighter"><strong>Как действует Тоня</strong></span></p>
<p>Она спрашивает: «Для чего нужен этот отчёт? Как&nbsp;его&nbsp;используют?». Оказывается, это&nbsp;бухгалтеры хотят видеть цифры и&nbsp;сверять их&nbsp;с&nbsp;1С. Тоня добавляет формулы и&nbsp;базовое форматирование: итоговые суммы выделяются, данные фильтруются по&nbsp;датам, рассчитывается стоимость единицы товара. Итог: отчёт становится понятным и&nbsp;удобным, а&nbsp;бухгалтеры экономят время.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/6f3/72e/634/6f372e63421d89b7e57ebba7292e1b6b.png?rmode=max&amp;width=796&amp;height=260" alt="" width="796" height="260"></p>
<p>Форматирование – минимальное. Настроить выгрузку на&nbsp;это&nbsp;форматирование – прописать пару строчек. Зато как&nbsp;круто на&nbsp;выходе.</p>
<h3>Как Мартину стать как&nbsp;Тоня</h3>
<p>Тоня, прежде чем&nbsp;приступить к&nbsp;задаче, сформировала User Story.<img style="float: left;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/eb8/dfa/48f/eb8dfa48ffa77eb8c74301c48e6ce56a.png?rmode=max&amp;width=1050&amp;height=486" alt="" width="1050" height="486"></p>
<p>&nbsp;</p>
<p>Это фиксация требований, при&nbsp;которой мы&nbsp;не&nbsp;просто берем задачу в&nbsp;работу как&nbsp;есть, а&nbsp;добавляем ей&nbsp;дополнительного смысла. Здесь самое сложное ответить на&nbsp;вопрос «Зачем?». Важно не&nbsp;путать пользу с&nbsp;возможностью и&nbsp;не&nbsp;получать утверждение вида «Хочу загружать пользователей, чтобы пользователи загружались». Нужно копать до&nbsp;конечной потребности пользователей.&nbsp;</p>

<div class="umb-macro-highlights">
    <strong>Нам нужно представлять продукт с&nbsp;точки зрения пользователей и&nbsp;бизнеса. Отсюда можем рассуждать и&nbsp;ставить под&nbsp;сомнение предложенные решения, если что‑то оказывается непонятным или&nbsp;несвязным.</strong>
    
</div>

<p>А еще&nbsp;неплохо участвовать в&nbsp;прояснении требований к&nbsp;продукту. Да, звучит странно. У&nbsp;нас&nbsp;ведь есть продакт/аналитик/дизайнер для&nbsp;этого. Однако на&nbsp;деле реальное устройство продукта могут знать только разработчики. Ценность этого знания высока на&nbsp;начальном этапе работы над&nbsp;функцией: разработчик может подсказать неочевидные связи, более простое техническое решение, чтобы не&nbsp;тратить много времени всей команды.</p>
<h3>Полезные практики + что&nbsp;почитать</h3>
<ul>
<li><span class="highlighter">Соберите&nbsp;<strong>полезную документацию</strong>&nbsp;по проекту.</span> Чтобы онбордить новичков в&nbsp;команду, нужна медленно устаревающая информация, например:
<ul>
<li>общий бизнес-контекст продукта: как&nbsp;он&nbsp;зарабатывает или&nbsp;экономит нам&nbsp;деньги, как&nbsp;он&nbsp;встраивается в&nbsp;контекст компании;</li>
<li>портреты пользователей: кто&nbsp;пользуется продуктом, какую боль этих людей решает продукт;</li>
<li>ключевые сценарии использования: тут&nbsp;пригодятся&nbsp;<a rel="noopener noreferrer nofollow" href="/articles/how-to-use-usm" target="_blank"><u>user story mapping</u></a><u>&nbsp;</u>или customer journey map&nbsp;— оба&nbsp;формата довольно наглядные и&nbsp;могут дополнять друг друга.</li>
</ul>
</li>
<li>Если вы&nbsp;сами разработчик, который только пришел в&nbsp;команду —&nbsp;<span class="highlighter"><strong>не бросайтесь сразу пилить таски</strong>.</span> Изучите документацию, пользователей и&nbsp;реализованную функциональность.</li>
<li><span class="highlighter"><strong>Поймите ключевые метрики продукта</strong>: бизнес оценивает результаты деятельности по&nbsp;определенным показателям</span>, и&nbsp;стоит узнать у&nbsp;продакта, какие они&nbsp;сейчас, и&nbsp;чего нужно добиться. Если есть возможность – покопайтесь в&nbsp;дашбордах, где&nbsp;их&nbsp;отслеживают.</li>
<li><strong>Jobs to&nbsp;be&nbsp;done</strong>&nbsp;— альтернативный, немного более глубокий подход для&nbsp;понимания ценности продукта, вместо более простого user story. В&nbsp;нем&nbsp;мы&nbsp;представляем, что&nbsp;пользователи, как&nbsp;бы&nbsp;«нанимают» ваш&nbsp;продукт на&nbsp;определенную «работу». Для&nbsp;старта лучше всего почитать&nbsp;<a rel="noopener noreferrer nofollow" href="https://zamesin.ru/producthowto/book/about-jobs-to-be-done/" target="_blank"><u>гайд у&nbsp;Ивана Замесина</u></a></li>
<li><span class="highlighter"><strong>Догфудинг</strong>&nbsp;– самостоятельно пользоваться разрабатываемым продуктом, если это&nbsp;возможно.</span> Легко это&nbsp;делать, если ты&nbsp;пишешь интернет-банк, в&nbsp;который тебе приходит зарплата, сложнее – если систему управления электростанцией. Но&nbsp;стоит пробовать проходить отдельные сценарии, как&nbsp;реальный пользователь (не&nbsp;с&nbsp;тестовыми данными). Например, если заполнить десяток-другой заявок на&nbsp;обслуживание нашей электростанции, часто можно обнаружить пару хороших мест для&nbsp;улучшений в&nbsp;процессе.&nbsp;</li>
<li>
<p><span class="highlighter"><strong>Алан Купер, «Психбольница в&nbsp;руках пациентов»</strong> — довольно старая, но&nbsp;актуальная книга об&nbsp;интерфейсах цифровых продуктов.</span> С&nbsp;момента выхода книги многое в&nbsp;мире стало лучше, но&nbsp;мы&nbsp;все&nbsp;еще&nbsp;сталкиваемся с&nbsp;ужасно неудобными интерфейсами. Книга научит базовым принципам, по&nbsp;которым программы должны общаться с&nbsp;людьми, чтобы вы&nbsp;смогли выявлять и&nbsp;предлагать хорошие решения.</p>
</li>
</ul>
<h2>II&nbsp;суперспособность: коммуникация с&nbsp;не-технарями</h2>
<p><span class="highlighter">Кросскомандное взаимодействие – одна из&nbsp;составляющих процесса создания цифровых продуктов. </span>Часто разработчикам приходится общаться не&nbsp;только между собой, но&nbsp;и&nbsp;с&nbsp;другими членами команды, которые не&nbsp;так&nbsp;подкованы технически и&nbsp;могут просто не&nbsp;понимать «программистский» язык. И&nbsp;эта&nbsp;коммуникация может быть очень разной.&nbsp;</p>
<h3>Как общается Мартин</h3>
<p>Возникает потребность что‑то изменить или&nbsp;добавить в&nbsp;функциональности. Мартин на&nbsp;такой запрос отвечает: «А может вы&nbsp;там&nbsp;как-нибудь без&nbsp;меня разберетесь?». Когда становится понятно, что&nbsp;не&nbsp;разберутся, Мартин просит скинуть ТЗ&nbsp;и&nbsp;обещает глянуть его, как&nbsp;освободится время. Спустя пару часов получаем от&nbsp;Мартина письмо примерно следующего содержания:</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/998/ac3/1c2/998ac31c2f64d75a9460945187d95841.png?rmode=max&amp;width=1030&amp;height=333" alt="Цитата из&nbsp;блога Сергея Колганова" title="Цитата из&nbsp;блога Сергея Колганова" width="1030" height="333"></p>
<figure class="full-width ">
<figcaption><em>Цитата из&nbsp;</em><a rel="noopener noreferrer nofollow" href="https://psilonsk.livejournal.com/" target="_blank"><em>блога Сергея Колганова</em></a></figcaption>
</figure>
<p>Мартин может и&nbsp;постараться что‑то пофиксить в&nbsp;системе. Опять же, на&nbsp;основе собственного анализа в&nbsp;условиях нехватки необходимых данных. Однако, не&nbsp;разобравшись в&nbsp;том, как&nbsp;выглядит проблема на&nbsp;самом деле, есть риск сделать бесполезные фиксы.&nbsp;</p>
<h3>Как общается Тоня</h3>
<p>Ее подход в&nbsp;том, чтобы поучаствовать в&nbsp;прояснении требований и&nbsp;проектировании. Поэтому она&nbsp;может появиться на&nbsp;встречах с&nbsp;бизнес-заказчиками и&nbsp;поговорить с&nbsp;ними лично, а&nbsp;не&nbsp;через посредников. После этого она&nbsp;свяжется с&nbsp;дизайнерами и&nbsp;аналитиками, чтобы вместе спроектировать необходимые фичи, заключив в&nbsp;них&nbsp;необходимую пользу.&nbsp;&nbsp;</p>
<p>Стремясь говорить с&nbsp;коллегами на&nbsp;одном языке, Тоня анализирует ту&nbsp;же&nbsp;проблему, что&nbsp;и&nbsp;Мартин. Она&nbsp;тоже пишет письмо с&nbsp;результатами своей работы. Но&nbsp;подача в&nbsp;нем&nbsp;уже&nbsp;совсем другая:</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/0a0/95a/690/0a095a690d0858433d6491e28455525e.png?rmode=max&amp;width=857&amp;height=305" alt="" width="857" height="305"></p>
<h3>Как Мартину стать как&nbsp;Тоня</h3>
<p>Разница в&nbsp;подаче может быть не&nbsp;самой существенной, но&nbsp;пользы от&nbsp;нее&nbsp;при&nbsp;этом значительно больше. Где‑то более тщательно структурированная мысль, где‑то приведены примеры, сам&nbsp;текст проще.</p>

<div class="umb-macro-highlights">
    <strong>Само по&nbsp;себе присутствие на&nbsp;обсуждениях работы с&nbsp;не-технарями раз&nbsp;к&nbsp;разу будет улучшать способность понимать их&nbsp;и&nbsp;общаться так, чтобы они&nbsp;понимали вас.</strong>
    
</div>

<p>Со&nbsp;временем станет понятно, как&nbsp;вычленять из&nbsp;проговариваемой информации ценное, и&nbsp;как&nbsp;запрашивать нужные данные так, чтобы никто не&nbsp;сконфузился и&nbsp;ответил на&nbsp;поставленный вопрос.&nbsp;</p>
<h3>Полезные практики + что&nbsp;почитать</h3>
<ul>
<li><span class="highlighter"><strong>Книга «Пиши, сокращай» Максима Ильяхова</strong>&nbsp;— вроде про&nbsp;написание текстов, но&nbsp;на&nbsp;самом деле про&nbsp;то, как&nbsp;выделить и&nbsp;донести пользу в&nbsp;частном случае в&nbsp;виде текста.</span> Вставляет на&nbsp;место мозг, измученный канцеляризмом и&nbsp;школьными уроками русского.</li>
<li><span class="highlighter"><a rel="noopener noreferrer nofollow" href="/articles/how-to-lead-a-clients-demo" target="_blank"><strong>Участвовать в&nbsp;клиентских демо,&nbsp;когда разработчики сами демонстрируют реализованную функциональность из&nbsp;первых рук</strong></a><strong>.</strong></span>&nbsp;Демо – не&nbsp;только для&nbsp;того, чтобы отчитаться о&nbsp;сделанном, но&nbsp;и&nbsp;чтобы команда лучше узнала бизнес, получила прямую обратную связь и&nbsp;возможность ее&nbsp;обсудить. Так&nbsp;дальнейшее создание продукта будет проще. Бонус для&nbsp;руководителей: разработчики автоматом становятся ответственнее.</li>
<li><span class="highlighter"><strong>Проводить 1-2-1 с&nbsp;не-технарями</strong>&nbsp;(продактами, сейлзами, дизайнерами, саппортами):</span> если вы&nbsp;пришли в&nbsp;проект, который создает небольшая команда, полезно поближе познакомиться с&nbsp;другими коллегами. Так&nbsp;можно узнать об&nbsp;их&nbsp;собственных взглядах на&nbsp;пользователей, их&nbsp;потребности, и&nbsp;продукт. Особенно это&nbsp;полезно это&nbsp;в&nbsp;отсутствие хорошей документации.&nbsp;</li>
<li><span class="highlighter">Собственно&nbsp;<strong>работать в&nbsp;паре с&nbsp;теми же&nbsp;не-технарями</strong>.</span> Может быть полезно, например, сделать набросок интерфейса вместе дизайнером, поработать над&nbsp;проектированием какого‑то&nbsp;бизнес процесса вместе с&nbsp;аналитиком или&nbsp;планом выпуска фич&nbsp;с&nbsp;продактом. Совет довольно очевидный, но&nbsp;регулярно сталкиваюсь с&nbsp;командами, в&nbsp;которых принят многоступенчатый подход, где&nbsp;все&nbsp;работают отдельно и&nbsp;потом передают какие‑то&nbsp;артефакты в&nbsp;следующий этап на&nbsp;ревью. А&nbsp;потом через боль все&nbsp;переделывают.&nbsp;</li>
<li><span class="highlighter"><strong>Участвовать в&nbsp;</strong><a rel="noopener noreferrer nofollow" href="https://blog.sibirix.ru/customer-develoopment-vol1/" target="_blank"><strong>Customer development интервью</strong></a>. </span>Обычно их&nbsp;проводят продакт-менеджеры, и, если они&nbsp;делают это&nbsp;регулярно в&nbsp;вашей команде, вы&nbsp;можете присоединиться в&nbsp;качестве слушателя или&nbsp;ассистента и&nbsp;вести заметки.</li>
<li><span class="highlighter"><strong>Полевое исследование или&nbsp;</strong><a rel="noopener noreferrer nofollow" href="https://ru.wikipedia.org/wiki/%D0%93%D1%8D%D0%BC%D0%B1%D0%B0" target="_blank"><strong>Гэмба 現場</strong></a>&nbsp;&nbsp;— это&nbsp;когда мы&nbsp;идем на&nbsp;место, где&nbsp;пользователи работают с&nbsp;продуктом, и&nbsp;наблюдаем за&nbsp;ними, общаемся. </span>Иногда «увидеть своими глазами» и&nbsp;пара часов такого времяпровождения дают больше, чем&nbsp;чтение кучи документов. Например, вот&nbsp;история, как&nbsp;Александр Поломодов, техдир Т-Банка,&nbsp;<a rel="noopener noreferrer nofollow" href="https://t.me/book_cube/2470" target="_blank">ходил на&nbsp;гембу и&nbsp;развозил карты клиентам</a>.&nbsp;</li>
<li><span class="highlighter">Если участие пользователей в&nbsp;демо и&nbsp;полевые исследования вам&nbsp;недоступны, можно&nbsp;<strong>проводить отдельные встречи для&nbsp;сбора фидбека</strong></span>&nbsp;с небольшой группой пользователей (возможно, это&nbsp;ваши самые лояльные клиенты или&nbsp;бета-тестеры), где&nbsp;продакты могут обсудить проблемы, а&nbsp;разработчики – послушать и&nbsp;лучше понять их.</li>
<li><span class="highlighter">Еще вариант –&nbsp;<strong>поработать на&nbsp;саппорте</strong>.</span> Например, в&nbsp;продуктовой команде Basecamp разработчики&nbsp;<a rel="noopener noreferrer nofollow" href="https://basecamp.com/handbook/our-rituals" target="_blank">регулярно дежурят на&nbsp;саппорте</a>. Аналог: почитать отзывы о&nbsp;продукте.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/d5503d2781b24999a852debe0e5185a3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/fb2fe78a6cdf4166b783c0cbcd18bf04"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c830cc55339643739e37be9dab511078"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>III суперспособность: проактивность</h2>
<p>Под проактивностью мы&nbsp;понимаем способность человека самостоятельно инициировать действия и&nbsp;события, подходить к&nbsp;реализации задач творчески и&nbsp;брать ответственность за&nbsp;их&nbsp;выполнение.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7fa489fc43bd45098b7a6d9e802b7167"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Как проактивность проявляет Мартин</h3>
<p>Мартин видит бардак в&nbsp;коде и&nbsp;буквально кричит о&nbsp;необходимости рефакторинга. С&nbsp;точки зрения руководителя рефакторинг – это, конечно, круто, но&nbsp;денег не&nbsp;принесет.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/cda/975/b0a/cda975b0acb15735d51a3e30c365858b.png?rmode=max&amp;width=817&amp;height=275" alt="" width="817" height="275"></p>
<p>Мартин, разумеется, молодец, потому что&nbsp;думает о&nbsp;развитии продукта. Это&nbsp;с&nbsp;одной стороны. С&nbsp;другой – он&nbsp;предлагает продолжительную и&nbsp;часто непредсказуемую задачу как‑то внедрить в&nbsp;существующий план проекта, но&nbsp;не&nbsp;учитывает контекст: сроки, приоритеты, продуктовую стратегию.</p>
<h3>Как проактивность проявляет Тоня</h3>
<p>Тоня тоже понимает необходимость рефакторинга, но&nbsp;также понимает и&nbsp;то, что&nbsp;текущим планом работы пренебречь нельзя. Поэтому она&nbsp;предлагает не&nbsp;срочно бросить все&nbsp;силы на&nbsp;рефакторинг всей системы, а&nbsp;анализирует приоритеты.<span>&nbsp;</span></p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/498/4a5/af0/4984a5af036255eff38e478f0b849dc6.png?rmode=max&amp;width=768&amp;height=272" alt="" width="768" height="272"></p>
<h3>Как Мартину стать как&nbsp;Тоня</h3>
<p>Нужно ограничиваться не&nbsp;только базовыми данными, а&nbsp;идти чуть дальше.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/f72fac8a10214c58ac4558715f6224c7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Быть проактивным – это&nbsp; не&nbsp; просто что&#8209;то&nbsp; предлагать. Также это&nbsp; и&nbsp; не&nbsp; про&nbsp; борьбу за&nbsp; идеальный код.
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ec6adf9b5793407597cf1b60fa517eea"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f539339848df418f97c395aed94c476b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Нужно уметь оценить, что&nbsp;действительно полезно предложить в&nbsp;текущих условиях. Сделать это&nbsp;можно только при&nbsp;понимании приоритетов и&nbsp;того, как&nbsp;должен работать продукт.&nbsp;&nbsp;</p>
<h3>Полезные практики + что&nbsp;почитать</h3>
<ul>
<li><span class="highlighter">База проактивности:&nbsp;<strong>Увидел – записал.</strong>&nbsp;Фиксируйте все&nbsp;идеи, проблемы, предложения и&nbsp;наблюдения, которые могут сделать продукт лучше, но&nbsp;не&nbsp;являются срочными.</span> Это&nbsp;могут быть как&nbsp;технические улучшения (рефакторинг, оптимизация производительности), так&nbsp;и&nbsp;продуктовые (улучшение UX, добавление новых функций). Можно будет вернуться к&nbsp;ним&nbsp;позже, когда появится подходящее время или&nbsp;ресурсы.&nbsp;Главное — вести такой список системно, например, в&nbsp;виде отдельной доски в&nbsp;таск-трекере, и&nbsp;периодически его&nbsp;просматривать и&nbsp;переоценивать.</li>
<li><span class="highlighter"><strong>Ретроспективы –</strong>&nbsp;регулярное обсуждение с&nbsp;командой, что&nbsp;получилось хорошо, что&nbsp;пошло не&nbsp;так&nbsp;и&nbsp;какие улучшения можно внести в&nbsp;следующий спринт.&nbsp;</span>Вовлекает разработчиков в&nbsp;рефлексию и&nbsp;проактивную позицию, они&nbsp;участвуют и&nbsp;вносят предложения. Главное тут&nbsp;— выбрать какие‑то&nbsp;отдельные предложения, взять в&nbsp;работу и&nbsp;не&nbsp;забыть реализовать.&nbsp;</li>
<li><span class="highlighter"><strong>Прокачивать насмотренность:&nbsp;</strong>мы все&nbsp;время пользуемся кучей цифровых продуктов, иногда они&nbsp;нравятся нам, иногда приносят боль – полезно отмечать такие моменты. </span>Например, в&nbsp;папочке со&nbsp;скриншотами интересных находок. В&nbsp;них&nbsp;стоит задавать себе вопрос «Почему так&nbsp;сделано, а&nbsp;не&nbsp;иначе?», «Что конкретно не&nbsp;так?» и&nbsp;«Как можно было сделать лучше?» или&nbsp;наоборот «За счет чего так&nbsp;удобно?». Дополнительно, как&nbsp;хобби, можно устанавливать и&nbsp;тестить разные продукты.&nbsp;</li>
<li><span class="highlighter">Если лень собирать примеры самому</span>, можно подписаться на<a rel="noopener noreferrer nofollow" href="https://t.me/ilyabirman_channel" target="_blank">&nbsp;канал Ильи Бирмана</a>, где&nbsp;он&nbsp;регулярно постит примеры такого и&nbsp;делает разборы интерфейсов своих студентов&nbsp;</li>
</ul>
<h2>IV суперспособность: планирование непонятных задач</h2>
<p>Не всегда получается стартовать разработку, предварительно закрыв все&nbsp;белые пятна. То&nbsp;есть при&nbsp;реализации фич&nbsp;в&nbsp;продукте неизбежно будут возникать моменты на&nbsp;прояснение.&nbsp;&nbsp;</p>

<div class="umb-macro-highlights">
    <strong>Бытует мнение, что&nbsp; оценивать задачи с&nbsp; высокой степенью неопределенности стоит с&nbsp; большим запасом, либо перед оценкой прописывать скрупулезно ТЗ, учитывая каждую мелочь.</strong>
    
</div>

<h3>Как действует Мартин</h3>
<p>Мартин человек ответственный и&nbsp;понимает, что&nbsp;просто так&nbsp;накидать оценки не&nbsp;получится – нужна детализация. Поэтому требует подробное ТЗ. И&nbsp;такой подход на&nbsp;самом деле может работать.</p>
<p>Однако порой слишком глубокое погружение в&nbsp;детали может убить продукт еще&nbsp;на&nbsp;старте. Вот&nbsp;ТЗ&nbsp;прописали, Мартин на&nbsp;него посмотрел и&nbsp;говорит: «Разработка займет три&nbsp;года». С&nbsp;Мартином спорить сложно, но&nbsp;вот&nbsp;вопрос – кому этот продукт вообще будет нужен через три&nbsp;года? И&nbsp;точно ли&nbsp;будет?</p>
<p><img style="float: left;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/f11/c91/d8e/f11c91d8e12fd59d641688132cd03321.png?rmode=max&amp;width=1093&amp;height=400" alt="" width="1093" height="400"></p>


    <div class="article-block">
        <a href="/articles/how-to-stop-writing-huge-documentation-and-start-development-faster/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/stfntzyi/frame-11.png"
         alt=""
         itemprop="">

    
            <span>Почему продуктовое проектиро&shy;вание лучше формального ТЗ&nbsp;</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>


<h3>Как действует Тоня</h3>
<p>У Тони другая установка. Она&nbsp;знает, что&nbsp;в&nbsp;целом в&nbsp;продукте работает правило, при&nbsp;котором 20% усилий дают 80% результата. Она&nbsp;думает итерациями и&nbsp;понимает, что&nbsp;нужно выделить первую версию для&nbsp;самой большой группы пользователей. А&nbsp;дальше двигаться в&nbsp;сторону расширения сервиса, параллельно собирая обратную связь с&nbsp;пользователей.</p>
<p><img style="float: left;" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/c94/7f4/2c3/c947f42c32dc86d303200660fd67bf35.png?rmode=max&amp;width=973&amp;height=533" alt="" width="973" height="533"></p>
<h3>Как Мартину стать как&nbsp;Тоня</h3>
<p>Продуктовый подход здесь состоит в&nbsp;том, что&nbsp;<span class="highlighter">неопределенные задачи нужно прототипировать</span>. Например, вместо того чтобы заранее говорить «сложнааа, поэтому делать будем 300 лет», можно посоветоваться со&nbsp;смежной командой, чтобы получить взгляд со&nbsp;стороны. Это&nbsp;позволит разбить задачу на&nbsp;этапы и&nbsp;примерить временные и&nbsp;технические затраты.</p>
<p>Еще важно, что&nbsp;<span class="highlighter">продуктовые компромиссы обычно лучше технических.</span></p>
<ul>
<li>Технические компромиссы – это, например, наделать костылей (пусть и&nbsp;работающих), готовясь морально к&nbsp;тому, что&nbsp;в&nbsp;будущем придется разбирать гигантский техдолг.</li>
<li>Продуктовый компромисс – это&nbsp;когда, например, у&nbsp;нас&nbsp;есть в&nbsp;плане система оплаты через крипту, но&nbsp;мы&nbsp;понимаем, что&nbsp;реально пользоваться ею&nbsp;будут полтора землекопа. Поэтому просто не&nbsp;делаем эту&nbsp;функциональность. Отпадает сразу ряд&nbsp;задач и&nbsp;проблем.</li>
</ul>
<h3>Полезные практики&nbsp;</h3>
<ul>
<li><span class="highlighter"><strong>Делать быстрые черновые прототипы —&nbsp;<em>&nbsp;</em></strong>накидывать интерфейс в&nbsp;Figma или&nbsp;набросать неработающих компонентов в&nbsp;React/Vue, не&nbsp;стремясь к&nbsp;идеалу.</span> Нет&nbsp;времени на&nbsp;такое? Нарисовать карандашом на&nbsp;бумаге или&nbsp;в&nbsp;Paint. Сложный интерфейс с&nbsp;кучей данных и&nbsp;графиками? Можно набросать в&nbsp;Гугл Таблицах. И&nbsp;так&nbsp;далее. Главное — показать идею и&nbsp;обсудить её&nbsp;с&nbsp;командой.&nbsp;<strong>&nbsp;</strong></li>
<li><span class="highlighter"><strong>Показывать демо незавершенных решений.</strong>&nbsp;Не каждую фичу можно сделать в&nbsp;спринт, но&nbsp;часто важно получать фидбек и&nbsp;по&nbsp;ходу разработки</span>: на&nbsp;реальных данных могут обнаружиться необычные кейсы, которые лучше скорректировать до&nbsp;релиза.</li>
<li><span class="highlighter"><strong>Spike:&nbsp;</strong>это короткая исследовательская задача. Её&nbsp;цель — выяснить, насколько реалистично выполнить сложную часть проекта. </span>Вместо гадания и&nbsp;споров команда получает конкретный ответ: стоит ли&nbsp;браться за&nbsp;задачу сейчас или&nbsp;отложить. Обязательное условие — чётко ограниченное время на&nbsp;исследование.<br>Пример: Мы&nbsp;разрабатываем онлайн магазин, нужно добавить Apple Pay. Разработчик берёт spike на&nbsp;день, пробует SDK&nbsp;и&nbsp;делает прототип. Выясняется: работает только в&nbsp;мобильном Safari, нужен отдельный эндпойнт на&nbsp;бекенде.</li>
<li><span class="highlighter"><a rel="noopener noreferrer nofollow" href="https://www.artlebedev.ru/kovodstvo/sections/167/" target="_blank"><strong>Метод прогрессивного&nbsp;</strong></a><strong>JPEG</strong> – cначала делаем костяк решения: от&nbsp;начала до&nbsp;конца, без&nbsp;стремления к&nbsp;идеалу.</span> Главное — дойти до&nbsp;рабочей версии как&nbsp;можно быстрее. Потом улучшаем и&nbsp;допиливаем. Такой подход экономит ресурсы, ускоряет проверку гипотез и&nbsp;быстрее приносит пользу пользователю.<br>Пример: Вместо полной реализации покупки в&nbsp;онлайн магазине команда запускает базовую версию: товар → корзина → оплата → спасибо. Пользователи уже&nbsp;могут заказывать, бизнес — зарабатывать. Остальные детали (разные варианты оплаты, доставки, промоакции, связь c&nbsp;CRM&nbsp;и&nbsp;т.д.) добавляют позже, шаг&nbsp;за&nbsp;шагом.</li>
</ul>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/115a478bd4624b18917b38c43e532253"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>V суперспособность: ответственность за&nbsp; результат</h2>
<p>Критерии готовности задачи могут определяться от&nbsp; компании к&nbsp; компании, от&nbsp; команды к&nbsp; команде, от&nbsp; разработчика к&nbsp; разработчику. Понятно, что&nbsp; здесь нельзя сделать универсального паттерна для&nbsp; выполнения любой задачи на&nbsp; каком бы&nbsp; то&nbsp; ни&nbsp; было проекте, но&nbsp; <strong><span class="highlighter">все же&nbsp; мы&nbsp; можем говорить о&nbsp; некой концепции результата. </span></strong></p>
<h3>Что есть результат для&nbsp; Мартина</h3>
<p>Мартин долго трудился над&nbsp; бэкендом системы. Делал-делал и&nbsp; выдает: «Бэк готов!». Все&nbsp; протестировано, тесты зелененькие, все&nbsp; работает – красотища. И&nbsp; да, к&nbsp; качеству реализации вопросов нет, но&nbsp; «Бэк готов!» – это&nbsp; все-таки не&nbsp; совсем цельный результат. Это&nbsp; скорее шаг&nbsp; к&nbsp; нему, пусть и&nbsp; довольно существенный. </p>
<h3>Что есть результат для&nbsp; Тони</h3>
<p>Тоня выполняла ту&nbsp;же&nbsp;задачу, но&nbsp;для&nbsp;нее&nbsp;понятие готовности было чуть более расширенным. Она&nbsp;понимала важность согласования модулей системы между собой, необходимость выдачи промежуточных результатов. Поэтому цельный результат получился более комплексным.</p>
<p>Для Тони «готово» — это&nbsp; когда:</p>
<ul>
<li>фича интегрирована в&nbsp; продукт,</li>
<li>проверена в&nbsp; связке с&nbsp; другими модулями,</li>
<li>доступна пользователям,</li>
<li>получена обратная связь.</li>
</ul>

<div class="umb-macro-highlights">
    <strong>В некоторых компаниях разработчики сами отслеживают целевой результат заливок: сколько человек стали пользоваться новым модулем, как&nbsp;часто они&nbsp;это&nbsp;делают, принес прибыль или&nbsp;нет. Это&nbsp;и&nbsp;продуктовый подход, и&nbsp;дополнительная галочка в&nbsp;резюме. </strong>
    
</div>

<h3>Полезные практики + что&nbsp; почитать</h3>
<ul>
<li><span class="highlighter"><strong>Явно описывать Definition of&nbsp; Done.</strong> Перед началом работы договориться, что&nbsp; значит «готово»</span>: фича протестирована, задеплоена, проверена в&nbsp; проде, заанонсирована. Это&nbsp; формирует привычку доводить до&nbsp; результата, а&nbsp; не&nbsp; останавливаться на&nbsp; этапе «код написал».</li>
<li><span class="highlighter"><strong>Введение новой роли — Feature lead. </strong>Это временная роль. Как&nbsp;тимлид, только для&nbsp;одной фичи. </span>Один разработчик берёт ответственность за&nbsp;выпуск всей фичи: от&nbsp;уточнения требований и&nbsp;синхронизации с&nbsp;командой до&nbsp;выката и&nbsp;получения обратной связи. Такая роль помогает тренировать навык видеть продукт целиком и&nbsp;доводить дело до&nbsp;конца.</li>
<li><span class="highlighter"><strong>Применять подход </strong><a rel="noopener noreferrer nofollow" href="https://www.thoughtworks.com/insights/decoder/y/you-build-it-you-run-it" target="_blank"><strong>You build it, you&nbsp; run&nbsp; it</strong></a><strong>.</strong> Команда, которая разрабатывает фичу, отвечает и&nbsp; за&nbsp; её&nbsp; поддержку после релиза. </span>Это значит: следить за&nbsp; логами, быстро реагировать на&nbsp; баги и&nbsp; инциденты, участвовать в&nbsp; улучшении стабильности. Такой подход усиливает чувство ответственности: ты&nbsp; не&nbsp; просто «сдал фичу», ты&nbsp; за&nbsp; неё&nbsp; в&nbsp; ответе и&nbsp; после продакшена. Со&nbsp; временем это&nbsp; меняет мышление — разработчик начинает проектировать так, чтобы проще было сопровождать и&nbsp; отлаживать. </li>
<li><span class="highlighter"><strong>Тестировать самому.</strong> <strong> </strong>Есть продуктовые команды, которые работают без&nbsp; выделенных QA-специалистов. </span>Например, Intercom, Basecamp, GitHub. Разработчики сами обеспечивают качество через автоматизацию, статанализ кода, мониторинг, CI/CD и&nbsp; код-ревью. Даже если у&nbsp; вас&nbsp; есть QA, не&nbsp; стоит уповать только на&nbsp; них&nbsp; – полезно провести тестирование новых фич: своих или&nbsp; чужих.</li>
</ul>
<h2>Темная сторона</h2>
<p>Погоди, не&nbsp;многовато ли? И&nbsp;с&nbsp;бизнесом пообщайся, и&nbsp;фичу сделай, и&nbsp;сам&nbsp;протестируй, и&nbsp;баги поймай, и&nbsp;метрики проверь, и&nbsp;пользователям покажи. И&nbsp;всё&nbsp;это&nbsp;— на&nbsp;фоне дедлайнов, сложного продукта и&nbsp;часто небольшой команды. Можно я&nbsp;просто буду код&nbsp;писать, а&nbsp;вы&nbsp;ТЗ&nbsp;мне&nbsp;дадите?</p>
<p><span class="highlighter"><strong>Отвечаю: можно.</strong></span></p>

<div class="text-highlight">
  Мир&nbsp;айти большой, и&nbsp;на&nbsp;рынке полно компаний, которым не&nbsp;нужен тот&nbsp;самый продуктовый разработчик, а&nbsp;нужен просто толковый прогер, глубокий технарь. Даже те&nbsp;продуктово-ориентированные компании, которым нужен продуктовый разработчик, обычно ожидают лишь часть из&nbsp;всего большого спектра ответственностей. Так&nbsp;что&nbsp;выбор есть.
</div>

<p><span class="highlighter"><strong>Быть продуктовым разработчиком — стресс</strong></span>, ведь нужно держать в&nbsp; голове целостную картину, думать о&nbsp; пользователях и&nbsp; бизнесе, переключаться между разными видами деятельности и&nbsp; отвечать за&nbsp; ошибки. </p>
<p><strong><span class="highlighter">Но награда — четкое понимание ценности своей работы</span></strong>, того как, продукт помогает людям. А&nbsp;ты&nbsp;– создатель продукта, а&nbsp;не&nbsp;просто исполнитель. Ну, и&nbsp;платят неплохо.</p>
<h2>Подведем итоги</h2>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/b4f2f63a517b459b93aa5ec806f26083"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Качества продуктового разработчика можно развивать через выработку нескольких привычек. Для&nbsp;этого не&nbsp;нужно читать триллион статей от&nbsp;продуктологов или&nbsp;ходить на&nbsp;сотни конференций.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a8db1f3dcf0d4191b8480b19b9b8d2bb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e9486bc0a7b148a69d8c5c837d84a739"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="highlighter"><strong>Задавайте вопрос «Зачем?»&nbsp;</strong></span></p>
<p>Вот прямо так: зачем эта&nbsp;задача? Что&nbsp;она&nbsp;решает? Иногда вы&nbsp;можете заметить, что&nbsp;задача вообще не&nbsp;нужна или&nbsp;её&nbsp;можно решить проще. Ну&nbsp;и&nbsp;другие вопросы тоже задавайте, если чувствуете, что&nbsp;они&nbsp;могут углубить ваше понимание. Всегда лучше спросить чем&nbsp;не&nbsp;спросить.&nbsp;</p>
<p><span class="highlighter"><strong>Разберитесь в&nbsp;продукте.</strong> </span></p>
<p>Вы не&nbsp;сможете задавать правильные вопросы, если не&nbsp;понимаете, как&nbsp;работает продукт. Нужно погружаться: изучать документацию, пробовать использовать продукт, читать отзывы пользователей – иногда в&nbsp;них&nbsp;больше мудрости чем&nbsp;в&nbsp;20 встречах с&nbsp;продактом. Ну&nbsp;и&nbsp;общайтесь с&nbsp;ребятами из&nbsp;команды, которые работают над&nbsp;разными частями функциональности.</p>
<p><span class="highlighter"><strong>Не ждите указаний сверху, действуйте сами.</strong> </span></p>
<p>Видите, что&nbsp;что‑то можно улучшить? Предлагайте. Нашли баг, который всех раздражает? Почините. Продуктовые разработчики постоянно ищут, что&nbsp;можно сделать лучше. Кажется, что&nbsp;такая фишка в&nbsp;подходе к&nbsp;работе вырабатывается сама, если продукт, который вы&nbsp;разрабатываете, действительно вам&nbsp;нравится.&nbsp;</p>
<p><span class="highlighter"><strong>Умейте искать компромиссы.</strong> </span></p>
<p>Не всегда нужно делать идеально. Иногда достаточно «нормально» или&nbsp;«хорошо». И&nbsp;это&nbsp;не&nbsp;о&nbsp;том, чтобы писать код&nbsp;абы&nbsp;как, а&nbsp;о&nbsp;понимании, где&nbsp;можно упростить задачу, чтобы сэкономить время и&nbsp;ресурсы.</p>
<p><span class="highlighter"><strong>Общайтесь с&nbsp;разными сторонами процесса.</strong> </span></p>
<p>Хорошая коммуникация — это&nbsp;умение говорить на&nbsp;языке собеседника. Технические детали должны быть понятны не-технарям, а&nbsp;бизнес-задачи — разработчикам. Продуктовые разработчики строят мосты между этими мирами, объясняя сложные вещи простым языком. Тут&nbsp;можно возразить, что&nbsp;медиатором между разработкой и&nbsp;бизнесом должен выступать проджект, аналитик или&nbsp;человек на&nbsp;другой роли, но&nbsp;даже при&nbsp;его&nbsp;наличии умение объяснить спорные моменты не&nbsp;будет лишним.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/1a7f5889f19a4fc4bcf12a9830aac514"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Чужой среди своих: как аналитику войти в уже сработавшуюся команду
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Рассказываем, как аналитику органично влиться в коллектив, выстроить взаимодействие с каждой ролью в нем и со временем стать по-настоящему «своим».
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/chuzhoi-sredi-svoikh-kak-analitiku-voiti-v-uzhe-srabotavshuyusya-komandu/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/chuzhoi-sredi-svoikh-kak-analitiku-voiti-v-uzhe-srabotavshuyusya-komandu/</guid>

                <pubDate>Thu, 05 Feb 2026 09:40:55 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Чужой среди своих: как аналитику войти в уже сработавшуюся команду</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как заложить архитектуру цифрового продукта: 6 практических принципов
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как определить, насколько глубоко на старте проекта надо продумывать его архитектуру? И на чем стоит сфокусироваться сразу, чтобы ее пришлось переделывать в процессе?
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/architectures-principles/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/architectures-principles/</guid>

                <pubDate>Mon, 26 Jan 2026 04:53:17 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как заложить архитектуру цифрового продукта: 6 практических принципов</h1>
                                <figure>
                                    <img src="/Media/xennaztf/chatgpt-image-&#x43D;&#x430;&#x441;&#x442;&#x44F;-3d-scene-apr-2025.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/12d2a5d14d99422d87173aa0a582b70e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Как определить, насколько глубоко на&nbsp;старте проекта надо продумывать его&nbsp;архитектуру? И&nbsp;на&nbsp;чем&nbsp;стоит сфокусироваться сразу, чтобы ее&nbsp;пришлось переделывать в&nbsp;процессе? В&nbsp;своё время, вдохновленный книгой «Принципы» Рэя&nbsp;Далио, я&nbsp;попробовал вывести основные подходы к&nbsp;IT-архитектуре, которые теперь сам&nbsp;активно применяю в&nbsp;работе на&nbsp;старте проектов. О&nbsp;них&nbsp;сегодня и&nbsp;расскажу, чтобы помочь начинающим архитекторам ПО.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e57538d362104e21a4d6e3ceaffdc272"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/5f0a3c3033d7458783c9bfe00ff632db"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong></strong>
    Есть еще&nbsp;множество более низкоуровневых принципов, а&nbsp;также принципов нужных на&nbsp;других этапах проектов — о&nbsp;них&nbsp;в&nbsp;другой раз. Плюс вы, конечно, слышали про&nbsp;DRY, KISS и&nbsp;прочее.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0771455686a74f8b8ac6a7dd8642e4c4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Но для&nbsp;начала ответим на&nbsp;вопрос — зачем?</h2>
<p dir="ltr">Для заказчика, незнакомого с&nbsp;разработкой, может казаться, что&nbsp;глубокое продумывание архитектуры на&nbsp;ранних этапах — это&nbsp;не&nbsp;очень важный шаг. Часто можно услышать стартаперское классическое:&nbsp;«Давайте скорее сделаем что&#8209;то&nbsp;работающее, а&nbsp;потом уже&nbsp;будем рисовать красивые диаграммы».</p>
<p dir="ltr">Но это&nbsp;очень опасный путь. Без&nbsp;сомнения, разработчики могут придумать что&#8209;то&nbsp;и&nbsp;без&nbsp;всех этих «красивых диаграмм и&nbsp;схем». Например, возьмут готовую типовую архитектуру из&nbsp;учебника или&nbsp;ту, с&nbsp;которой у&nbsp;них&nbsp;уже&nbsp;есть опыт работы, а&nbsp;может вообще будут продумывать всё&nbsp;на&nbsp;ходу. И&nbsp;к&nbsp;какому&#8209;то&nbsp;моменту у&nbsp;них&nbsp;даже что&#8209;то&nbsp;«построится». Но, исходя из&nbsp;нашего опыта, выглядеть это&nbsp;будет скорее всего как&#8209;то&nbsp;так:&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/e5a30b282e954c2e9b627793dd06a268"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--41645337">
    


    <img src="/Media/kdxfguwg/6ff3e39d71f61111b01f3ce5c2cde35f.jpeg"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/347e7becfcc94300b17e6240c39ba184"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Да, у&nbsp;нас&nbsp;есть здание. У&nbsp;него есть стены, окна, двери, балконы и&nbsp;крыша. И&nbsp;в&nbsp;нем&nbsp;даже можно жить. Но&nbsp;сколько это&nbsp;здание простоит? И&nbsp;соответствует ли&nbsp;оно&nbsp;пожеланиям тех, кто&nbsp;будет в&nbsp;нем&nbsp;жить? А&nbsp;что, если из&#8209;за&nbsp;архитектурных неточностей строительство в&nbsp;какой&#8209;то&nbsp;момент остановится —&nbsp;в&nbsp;момент, когда станет понятно, что&nbsp;продолжать опасно или&nbsp;дорого. Придется всё&nbsp;снести и&nbsp;начать заново.</p>
<p dir="ltr">Так же&nbsp;и&nbsp;в&nbsp;разработке: вместо удобного и&nbsp;понятного продукта мы&nbsp;получаем что-то, что&nbsp;начнет тормозить, как&nbsp;только зайдут реальные пользователи. А&nbsp;когда вы&nbsp;захотите внести изменения, на&nbsp;это&nbsp;будут уходить человеко-месяцы разработчиков — ведь разобраться в&nbsp;продукте невозможно! Разработчики уволятся, а&nbsp;новые придут и&nbsp;скажут, что&nbsp;надо все&nbsp;переписать.&nbsp;</p>
<p>На другой стороне спектра — основательные заказчики и&nbsp;архитекторы, которые перед стартом разработки пишут подробнейшее ТЗ. В&nbsp;нем&nbsp;они&nbsp;предусматривают все&nbsp;возможности, продумывают архитектуру вплоть до&nbsp;классов и&nbsp;UML-схем и&nbsp;структур таблицы в&nbsp;БД. Основной риск такого подхода — зависнуть на&nbsp;этапе написания ТЗ&nbsp;и&nbsp;так&nbsp;и&nbsp;не&nbsp;решить бизнес-задачу быстрее конкурентов (вот&nbsp;тут&nbsp;можно почитать, <a rel="noopener" href="/articles/how-to-stop-writing-huge-documentation-and-start-development-faster" target="_blank" title="Как перестать писать огромные ТЗ&nbsp;и&nbsp;быстрее стартовать разработку">как перестать писать огромные ТЗ</a> и&nbsp;быстрее стартовать разработку).&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/71c294a1986b405388e49a6545c8a0d0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong></strong>
    Планировать архитектуру ПО&nbsp;критически важно на&nbsp;самом старте — чтобы заложить надежный фундамент, а&nbsp;затем уже&nbsp;поверх него возвести всё&nbsp;остальное. 
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ee532b2f890242f38371c015c9bef8e4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Принцип 1: Архитектура подчиняется целям продукта и&nbsp;бизнеса</h2>
<p dir="ltr">И никак иначе.</p>
<p dir="ltr">Когда мы&nbsp;начинаем думать, что&nbsp;внутренняя архитектура продукта важнее, чем&nbsp;потребности пользователей и&nbsp;заказчиков продукта, мы&nbsp;становимся так&nbsp;называемыми «<a rel="noopener" href="https://en.wikipedia.org/wiki/Architecture_astronaut" target="_blank" title="Architecture astronaut">архитектурными астронавтами</a>». Мы&nbsp;увлекаемся архитектурой настолько, что&nbsp;создаем «красивые» и&nbsp;«элегантные» решения для&nbsp;несуществующих проблем. </p>
<p dir="ltr">Вот вам&nbsp;простой пример. Представьте, что&nbsp;нам&nbsp;нужно сделать обычный блог. А&nbsp;разработчик, увлекшись задачей, начинает внедрять микросервисы, Kafka, Kubernetes и&nbsp;все&nbsp;паттерны, какие может вспомнить, строя мини-космолёт. И&nbsp;вот&nbsp;космолёт есть. Но&nbsp;он&nbsp;никуда не&nbsp;полетит. Потому что&nbsp;нужен был&nbsp;просто блог.</p>
<p dir="ltr">С каждым таким решением продукт становится всё&nbsp;более оторванным от&nbsp;реальности. Как&nbsp;итог — время команды и&nbsp;деньги заказчика потрачены, а&nbsp;продукт получился переусложненным. При&nbsp;этом он&nbsp;еще&nbsp;и&nbsp;не&nbsp;решает задачи пользователей и&nbsp;не&nbsp;помогает бизнесу достигнуть поставленной цели. </p>
<p dir="ltr">Это может быть не&nbsp;так&nbsp;страшно для&nbsp;большой компании, которая может себе позволить дорогие эксперименты, но&nbsp;обернется катастрофой и&nbsp;полным провалом для&nbsp;небольшого бизнеса или&nbsp;стартапа. </p>
<h3 dir="ltr"><strong>А как&nbsp;надо?</strong></h3>
<p dir="ltr">Следуем общему принципу каскадности — <span class="highlighter">решения более низкого уровня основываются на&nbsp;том, что&nbsp;стоит на&nbsp;более высоком уровне.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/c991f29ebf2048028b3911519e51a571"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--65884969">
    


    <img src="/Media/mvlh5a2s/frame-59598.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/afe2cbd6c2bd4b628210eb020811fa94"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Выстраивается логическая цепочка. Фундамент — это&nbsp;стратегия компании. С&nbsp;оглядкой на&nbsp;нее&nbsp;прорабатывается стратегия продукта. Архитектура будет опираться на&nbsp;стратегию развития продукта. А&nbsp;разработчики, в&nbsp;свою очередь, будут структурировать и&nbsp;писать код, отталкиваясь от&nbsp;архитектуры.&nbsp;</p>
<p dir="ltr"><strong>Поэтому</strong>: первым делом перед созданием архитектуры стоит изучить текущую продуктовую стратегию или&nbsp;ее&nbsp;аналог.</p>
<p dir="ltr">Но на&nbsp;деле часто мы&nbsp;сталкиваемся с&nbsp;тем, что&nbsp;присутствует лишь смутное видение продукта, а&nbsp;четкой стратегии, для&nbsp;чего и&nbsp;для&nbsp;кого мы&nbsp;это&nbsp;делаем, нет. Возможно всё&nbsp;это&nbsp;«витает в&nbsp;воздухе» или&nbsp;«очевидно», но&nbsp;мы&nbsp;до&nbsp;конца не&nbsp;понимаем. Что&nbsp;делать в&nbsp;этом случае?&nbsp;</p>
<p dir="ltr">Я не&nbsp;предлагаю создавать продуктовую стратегию. Обычно, это&nbsp;не&nbsp;задача для&nbsp;архитектора, но&nbsp;стоит изучить, обсудить и&nbsp;зафиксировать ее&nbsp;ключевые моменты с&nbsp;заказчиком.&nbsp;</p>
<h3 dir="ltr">Стратегия продукта</h3>
<p dir="ltr">Давайте разберем, какие моменты, относящиеся к&nbsp;стратегии продукта, нам&nbsp;важнее всего понимать, и&nbsp;какие можно использовать инструменты для&nbsp;их&nbsp;прояснения:</p>
<h4 dir="ltr"><span class="highlighter">Цели</span></h4>
<p dir="ltr"><strong>Вопросы</strong>: Зачем продукт нужен бизнесу? На&nbsp;какие метрики бизнеса он&nbsp;должен повлиять?<br><strong>Инструменты</strong>: <a rel="noopener" href="/articles/task-understanding" target="_blank" title="К списку статей Понимание задачи by&nbsp;fuse8: что&nbsp;такое и&nbsp;зачем нужно">Понимание задачи</a>, <a rel="noopener" href="/articles/impact-mapping" target="_blank" title="Impact Mapping: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех">Карта влияний</a>.&nbsp;</p>
<h4 dir="ltr"><span class="highlighter">Экономика</span></h4>
<p dir="ltr"><strong>Вопросы</strong>: Сколько мы&nbsp;готовы потратить на&nbsp;проект? Каким образом он&nbsp;будет зарабатывать или&nbsp;экономить деньги? Сколько он&nbsp;должен заработать, чтобы быть прибыльным? Когда мы&nbsp;должны получить эту&nbsp;прибыль? Каким образом он&nbsp;может принести убытки?<br><strong>Инструменты</strong>: бюджет проекта, <a rel="noopener" href="https://library.wannabe.ru/article/zachem-nuzhna-yunit-ekonomika-i-kak-pravilno-podoyti-k-ee-razrabotke" target="_blank" title="Зачем нужна юнит-экономика и&nbsp;как&nbsp;правильно подойти к&nbsp;ее&nbsp;разработке">Юнит-экономика</a>, <a rel="noopener" href="https://yandex.ru/adv/edu/materials/koeffitsiyent-vozvrata-investitsiy-roi" target="_blank" title="Что такое коэффициент возврата инвестиций (ROI) и&nbsp;как&nbsp;им&nbsp;пользоваться">Return of&nbsp;investment</a></p>
<h4 dir="ltr"><span class="highlighter">Функциональность продукта</span></h4>
<p dir="ltr"><strong>Вопросы</strong>: Кто&nbsp;и&nbsp;как&nbsp;им&nbsp;будет пользоваться? Какие сценарии или&nbsp;пользователи наиболее важные (или&nbsp;например, прибыльные)? Какие наиболее частые? Что&nbsp;пользователи могут делать в&nbsp;продукте? В&nbsp;каком порядке мы&nbsp;хотим создавать или&nbsp;запускать продукт?<br><strong>Инструменты</strong>:&nbsp;<a rel="noopener" href="https://practicum.yandex.ru/blog/customer-journey-map/" target="_blank" title="Зачем нужна customer journey map&nbsp;и&nbsp;как&nbsp;её&nbsp;правильно построить">Customer journey mapping</a>, <a rel="noopener" href="/articles/how-to-use-usm" target="_blank" title="Как использовать User Story mapping при&nbsp;создании цифрового продукта">User story mapping</a>, <a href="https://library.wannabe.ru/article/how-to-create-a-roadmap" title="Как продакт-менеджеру собрать роадмап: 4 этапа">Roadmap</a>&nbsp;</p>
<p dir="ltr">Мы в&nbsp;своей работе используем многие из&nbsp;этих инструментов на&nbsp;этапе аналитики проекта.&nbsp;</p>
<p dir="ltr">Иногда также важно учесть технологическую стратегию компании. В&nbsp;ней&nbsp;обычно можно узнать, какие технологии, платформы, подходы и&nbsp;продукты можно или&nbsp;нужно использовать, а&nbsp;какие нет. А&nbsp;также какие ресурсы запланированы на&nbsp;развитие продукта в&nbsp;будущем.</p>
<p dir="ltr">Всё это&nbsp;помогает получить видение продукта и&nbsp;понять, зачем и&nbsp;для&nbsp;чего мы&nbsp;начинаем писать строчки кода.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/043f40e99b274d699f3390a40e076824"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong></strong>
    Программная архитектура в&nbsp;первую очередь отталкивается от&nbsp;понимания целей продукта, от&nbsp;того, что&nbsp;он&nbsp;из&nbsp;себя представляет, кто&nbsp;им&nbsp;будет пользоваться, как&nbsp;и&nbsp;зачем. 

Архитектор должен примерно понимать экономику продукта: сколько денег и&nbsp;времени заказчик готов потратить на&nbsp;его&nbsp;разработку, какую прибыль или&nbsp;пользу он&nbsp;ожидает получить после релиза. 

Также важно уже&nbsp;на&nbsp;начальных этапах проектирования думать о&nbsp;том, как&nbsp;продукт будет развиваться дальше. Хотя бы&nbsp;в&nbsp;общих чертах.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/851fc7a9d9a74a5d82f89c6295c106a5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Принцип 2: Архитектура описывает программные системы, их&nbsp;границы и&nbsp;связи</h2>
<p dir="ltr">Вроде очевидно, да? Но&nbsp;давайте разберем поглубже.</p>
<p dir="ltr">Для наглядного примера рассмотрим срез растения под&nbsp;микроскопом, который изобилует большими и&nbsp;малыми клетками.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/e460b6dc88564f36a649132e545ce6b6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--23861819">
    


    <img src="/Media/4pplqkm5/d89e54ea84f6f63cab056262052ac72e-1-1.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c78c5d486f7b4afaab96d67c33613f52"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Мы видим, что&nbsp;наибольшее скопление тканей находится в&nbsp;основном на&nbsp;границах этих клеток. Так&nbsp;и&nbsp;в&nbsp;наших системах – самое интересное происходит именно на&nbsp;границах и&nbsp;в&nbsp;связях, а&nbsp;не&nbsp;внутри элементов. Всё, что&nbsp;внутри элементов, подчинено тем&nbsp;или&nbsp;иным внешним связям.&nbsp;</p>
<p dir="ltr">Что будет, если мы&nbsp;нарушим этот принцип и&nbsp;перестанем следить за&nbsp;границами и&nbsp;связями? Это&nbsp;может повлечь за&nbsp;собой несколько проблем:</p>
<p dir="ltr"><strong>Неясные границы системы</strong>: заказчик может неявно предполагать, что&nbsp;система будет интегрирована с&nbsp;другими IT-системами компании или&nbsp;включать их. И&nbsp;в&nbsp;один прекрасный день он&nbsp;придет и&nbsp;скажет:&nbsp;«Подождите, у&nbsp;нас&nbsp;эти&nbsp;данные должны быть в&nbsp;CRM&nbsp;обязательно — это&nbsp;же&nbsp;очевидно!».&nbsp;</p>
<p dir="ltr"><strong>Ограничения связей</strong>: оказывается, что&nbsp;те&nbsp;возможности связей, которые есть, не&nbsp;позволяют делать то, что&nbsp;нам&nbsp;нужно. Например, нам&nbsp;нужно отдавать и&nbsp;получать данные c&nbsp;CRM&nbsp;в&nbsp;реальном времени, чтобы клиенты могли общаться с&nbsp;менеджерами через чат, а&nbsp;CRM&nbsp;поддерживает только массовый импорт данных, который работает медленно.</p>
<p dir="ltr"><strong>Неявные связи</strong>: мы&nbsp;меняем что&#8209;то&nbsp;в&nbsp;продукте, и&nbsp;оказывается, что&nbsp;это&nbsp;ломает работу других IT-систем компании.</p>
<p><strong>Вывод: границы и&nbsp;связи, их&nbsp;ограничения – это&nbsp;самое важное.</strong></p>
<p dir="ltr">Чтобы как&#8209;то&nbsp;приземлить этот принцип, мы&nbsp;чаще всего используем вариацию диаграммы системного контекста из&nbsp;так&nbsp;называемой <a href="https://c4model.com/">Модели С4</a> — обычно она&nbsp;понятна абсолютно всем, а&nbsp;не&nbsp;только технарям.</p>
<p>В ней&nbsp;все&nbsp;просто. Для&nbsp;примера, представим, что&nbsp;мы&nbsp;создаем систему «Агрегатор сервисов доставки»:</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/3c7f61f26bed425d8c90021c4d25c8aa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--37411731">
    


    <img src="/Media/vv5dro0w/5.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--37411731 {
                    /* manual inline */
                    max-width:1000 px;
                }
            }
            </style>
</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/531914d3a322484ba806172aa0617a97"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f155fe703c36446784f9afbb1f8a5aa2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><br>У нас&nbsp;есть клиенты, которые заказывают доставку, и&nbsp;администраторы, которые следят за&nbsp;качеством работы сервиса. А&nbsp;также другие IT-системы, с&nbsp;которыми сервис должен взаимодействовать. Например, API&nbsp;сторонних сервисов доставки, система бухгалтерского учета и&nbsp;телеграм-бот.</p>
<p dir="ltr">Важно на&nbsp;этом этапе не&nbsp;просто перечислить все&nbsp;связи, но&nbsp;понять и&nbsp;зафиксировать их&nbsp;суть — что&nbsp;конкретно мы&nbsp;хотим через них&nbsp;делать. Дальше необходимо изучить эти&nbsp;системы и&nbsp;проверить, действительно ли&nbsp;это&nbsp;возможно.</p>
<p>Затем мы&nbsp;проектируем более низкие уровни C4 (как&nbsp;правило, уровень контейнеров или&nbsp;компонентов) и&nbsp;схему инфраструктуры, и&nbsp;также следим за&nbsp;их&nbsp;связями и&nbsp;ограничениями.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/adcfe4b7fcdf4a9e8d1a034bda8337f2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong></strong>
    Качественное определение границ подсистем и&nbsp;понимание типов связей — это&nbsp;основа архитектуры.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bd9fa54ab5ea447182903bb9996a4200"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Принцип 3: Архитектура работает с&nbsp;двумя типами ограничений — железо и&nbsp;люди</h2>
<p dir="ltr">Архитектура – это&nbsp;всегда про&nbsp;ограничения. Есть фундаментальные ограничения, которые не&nbsp;позволяют нам&nbsp;взмахнуть волшебной палочкой и&nbsp;мгновенно получить работающий продукт.</p>
<p dir="ltr">В нашем случае ограничителями выступают железо и&nbsp;люди. Архитектура должна ответить на&nbsp;вопрос, как&nbsp;мы&nbsp;разберемся с&nbsp;этими ограничениями. &nbsp;</p>
<h3 dir="ltr">Ограничение первое: железо&nbsp;</h3>
<p dir="ltr">Очевидный факт — все&nbsp;мы&nbsp;видели приложения, которые неадекватно работают и&nbsp;тормозят даже в&nbsp;простых условиях &nbsp;— с&nbsp;небольшим количеством данных на&nbsp;достаточно мощных компьютерах и&nbsp;смартфонах (привет, Notion!).&nbsp;</p>
<p dir="ltr">Чтобы избежать такой истории мы, как&nbsp;архитекторы, должны всегда думать вот&nbsp;о&nbsp;чем:&nbsp;&nbsp;</p>
<ol>
<li><strong>Рабочая среда</strong>: &nbsp;На каких устройствах и&nbsp;операционных системах будет работать программное обеспечение, каковы их&nbsp;характеристики?</li>
<li><strong>Данные</strong>: Сколько места потребуется для&nbsp;данных и&nbsp;где&nbsp;эти&nbsp;данные будут храниться?</li>
<li><strong>Сети</strong>: &nbsp;По каким сетям будут передаваться данные и&nbsp;каково качество этих сетей?</li>
</ol>
<p dir="ltr">И, поскольку мы&nbsp;живем в&nbsp;физическом мире, в&nbsp;нем&nbsp;всё&nbsp;рано или&nbsp;поздно что&#8209;то&nbsp;сломается. Поэтому подумаем сразу и&nbsp;об…&nbsp;</p>
<ol start="4">
<li><strong>Устранении неполадок</strong>: как&nbsp;мы&nbsp;будем справляться с&nbsp;поломками?&nbsp;</li>
</ol>
<p dir="ltr">&nbsp;Когда нам&nbsp;нужно представить, с&nbsp;чем&nbsp;придется справляться в&nbsp;нашей работе на&nbsp;новом проекте, мы&nbsp;стараемся брать самые базовые цифры.</p>
<p><strong>В таблице ниже представлены примеры <a rel="noopener" href="https://gist.github.com/hellerbarde/2843375" target="_blank" title="Latency numbers every programmer should know">фундаментальных ограничений</a>:</strong></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/772c12d99bc344dfa68385b098fde302"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--55991990">
    


    <img src="/Media/ff0c54sx/6.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/267012fac4174ded9861a6e9adae5921"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b951c8e5c709486082f54e37866945f9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><br>Ещё одну полезную статью-выжимку об&nbsp;основных показателях задержки для&nbsp;фронтенд-разработчиков написал CTO&nbsp;американской облачной платформы Vercel Малте Убл&nbsp;— <a rel="noopener" href="https://vercel.com/blog/latency-numbers-every-web-developer-should-know" target="_blank" title="Latency numbers every frontend developer should know">Latency numbers every frontend developer should know</a>. </p>
<p dir="ltr">Чтобы понять, как&nbsp;требования вашего продукта соответствуют этим ограничениям, обычно достаточно «на салфетке» оценить значения ключевых параметров в&nbsp;будущей системе, оттолкнувшись от&nbsp;стратегии продукта. </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/67175a9f6aa24705a909621842131003"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/1phj5qd3/tab1.png"
         alt=""
         itemprop="">


        <figcaption>
            Модель расчета на основе исторических данных для гипотетического интернет магазина.<br/>В реальности стоит также учесть пиковые нагрузки вроде «черной пятницы» 
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5d5ceaa6fdda4688b3458eaf658c9b45"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0df40063440d4f40bae4d35f1379494e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Здесь также важно учитывать все&nbsp;тяжелые данные, которые будут использоваться на&nbsp;проекте &nbsp;— изображения, видеоролики, аудиофайлы и&nbsp;т.д. Не&nbsp;подумав об&nbsp;этом наперед, можно упереться в&nbsp;ограничения или&nbsp;в&nbsp;ценовую политику хостинга. Всегда задавайте себе вопрос — сколько терабайт мы&nbsp;можем передать.</p>
<p dir="ltr">Замечу, что&nbsp;тут&nbsp;я&nbsp;не&nbsp;предлагаю заниматься «<a rel="noopener" href="https://wiki.c2.com/?PrematureOptimization" target="_blank" title="Premature Optimization" data-anchor="?PrematureOptimization">преждевременной оптимизацией</a>», то&nbsp;есть оптимизацией приложения для&nbsp;того, чтобы использовать по&nbsp;максимуму вычислительные ресурсы. Я&nbsp;лишь призываю вас&nbsp;понять на&nbsp;данном этапе работы реальные требования бизнеса и&nbsp;сделать так, чтобы для&nbsp;них&nbsp;система работала приемлемо-быстро.</p>
<h3 dir="ltr">Ограничение второе: люди</h3>
<p dir="ltr">У людей ограниченное внимание, границы знаний и&nbsp;представлений о&nbsp;том, что&nbsp;и&nbsp;как&nbsp;должно работать. Как&nbsp;архитекторы, мы&nbsp;должны помнить, для&nbsp;кого мы&nbsp;вообще эту&nbsp;архитектуру разрабатываем.&nbsp;</p>
<p dir="ltr">Один разработчик не&nbsp;может держать в&nbsp;своей рабочей памяти весь проект. Ежедневно он&nbsp;тратит большую часть времени, читая код&nbsp;и&nbsp;разбираясь, как&nbsp;он&nbsp;работает, а&nbsp;не&nbsp;занимаясь его&nbsp;написанием. В&nbsp;этом смысле архитектура служит картой.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/a44817ff21f145659410e9204e9d7d21"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/0kbiqh45/b6b62bec107b88764837aae5e4c81ce3.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c80b8cd5b2f74663b36a95677d0aacd1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Разработчику важно знать, куда и&nbsp;как&nbsp;добраться в&nbsp;разрабатываемом продукте, понять, что&nbsp;нужно изменить, сделать это&nbsp;изменение и&nbsp;выяснить, на&nbsp;какие части системы оно&nbsp;повлияет.</p>
<p dir="ltr"><span class="highlighter"><strong>Архитектура должна работать на&nbsp;тех, кто&nbsp;будет с&nbsp;ней&nbsp;взаимодействовать</strong></span>. Нам&nbsp;важно понять, кто&nbsp;эти&nbsp;люди, что&nbsp;они&nbsp;уже&nbsp;знают и&nbsp;что&nbsp;им&nbsp;еще&nbsp;предстоит изучить.&nbsp;</p>
<p dir="ltr">Если сейчас этих людей нет, нужно придумать, как&nbsp;они&nbsp;появятся — мы&nbsp;наймем их, привлечем подрядчиков или&nbsp;найдем еще&nbsp;какой&#8209;то&nbsp;способ собрать команду?&nbsp;</p>
<h4 dir="ltr">Кто будет работать с&nbsp;архитектурой:</h4>
<p dir="ltr"><strong>Команда разработки</strong>. Обычно мы&nbsp;знаем, кто&nbsp;будет разрабатывать архитектуру будущего проекта. Но&nbsp;бывают и&nbsp;случаи, когда мы&nbsp;не&nbsp;можем этого точно сказать. Например, когда в&nbsp;большой компании проводится тендер на&nbsp;разработку платформы, которая стартанет только через год.&nbsp;</p>
<p dir="ltr"><strong>Внутренние заказчики и&nbsp;аудиторы</strong>. Те&nbsp;люди, которым вы&nbsp;будете сдавать проект. Иногда это&nbsp;CTO, иногда архитектурный комитет, который следит, чтобы архитектура всех продуктов компании следовала общей IT-стратегии.</p>
<p dir="ltr"><strong>Внешние контролирующие органы</strong>. В&nbsp;некоторых индустриях, например, в&nbsp;финансах или&nbsp;здравоохранении, есть те, кто&nbsp;будет проверять ваши продукты перед запуском.</p>
<p dir="ltr"><strong>Команда поддержки и&nbsp;развития</strong>. Иногда разрабатывает продукт одна команда, а&nbsp;развитием продукта занимается другая.</p>
<p dir="ltr">В зависимости от&nbsp;уровня знаний и&nbsp;навыков этих людей, вы&nbsp;поймете, какие подходы в&nbsp;архитектуре будут привычны и&nbsp;просты во&nbsp;внедрении, а&nbsp;какие могут вызвать сложности. В&nbsp;последнем случае понадобится более глубокая проработка архитектурных решений, чтобы команда могла их&nbsp;реализовать.&nbsp;</p>
<p dir="ltr">Примеры:</p>
<ul>
<li aria-level="1">
<p dir="ltr">Мы создаем продукт небольшой командой опытных сеньор-разработчиков, которые проектировали похожие системы. Дальнейшим развитием будут заниматься они&nbsp;же&nbsp;(например, так&nbsp;работает команда разработки Telegram).&nbsp;</p>
</li>
</ul>
<p dir="ltr">В таком случае можно не&nbsp;описывать глубоко архитектуру на&nbsp;начальном этапе — достаточно дать ключевые данные и&nbsp;каркас архитектуры.</p>
<ul>
<li aria-level="1">
<p dir="ltr">Мы — госкомпания, и&nbsp;хотим провести тендер на&nbsp;создание продукта, который должен вписаться it-стратегию компании. Разработка займет несколько лет. Задействована большая команда, собранная из&nbsp;разных подрядчиков.&nbsp;</p>
</li>
</ul>
<p dir="ltr">В этом случае понадобится детальное описание большинства аспектов архитектуры проекта, а&nbsp;также, возможно, архитектурные шаблоны и&nbsp;детальные схемы взаимодействий для&nbsp;подрядчиков (мы&nbsp;же&nbsp;не&nbsp;знаем уровень их&nbsp;компетенций).</p>
<h4 dir="ltr">В архитектуре для&nbsp;людей важно описать:&nbsp;</h4>
<p dir="ltr"><strong>Разбиение на&nbsp;предметные области</strong>. Разрабатывая достаточно крупную систему, можно разбить ее&nbsp;на&nbsp;предметные области. Например, в&nbsp;онлайн-ритейл продукте у&nbsp;вас&nbsp;могут быть: привлечение пользователей, продажи, обработка заказов, каталог продуктов и&nbsp;пр.&nbsp;</p>
<p dir="ltr">Разделение большой команды разработки на&nbsp;эти&nbsp;области повысит эффективность работы — разработчики не&nbsp;будут наступать друг другу на&nbsp;пятки. Это&nbsp;то, что&nbsp;в&nbsp;domain-driven design называют <a rel="noopener" href="https://martinfowler.com/bliki/BoundedContext.html" target="_blank" title="Bounded Context">bounded context</a>.</p>
<p dir="ltr"><strong>Общие ключевые архитектурные подходы</strong>. Например, это&nbsp;модульный монолит или&nbsp;микросервисы. Если микросервисы, но&nbsp;нужно будет также описать паттерны взаимодействия.&nbsp;</p>
<p dir="ltr">Ваша задача — собрать те&nbsp;подходы, которые подойдут именно вашей команде и&nbsp;продукту. И&nbsp;описать их&nbsp;команде, конечно же.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/a3d213321cab4c8dbd68b90bc06f1a60"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong></strong>
    Продумывая программную архитектуру, нужно держать в&nbsp;уме&nbsp;два&nbsp;архитектурных ограничения —  «железный» и&nbsp;«для людей». 
Если был&nbsp;упущен первый аспект, «для железа», мы&nbsp;получим что&#8209;то&nbsp;тормозящее, хрупкое и&nbsp;ненадежное.
Если не&nbsp;продумать архитектуру «для людей»,  скорее всего в&nbsp;результате получится либо переусложненный продукт, либо система, в&nbsp;которой человеку будет непонятно, где&nbsp;и&nbsp;что&nbsp;находится. В&nbsp;любом случае разработка будет медленной.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5e9ab5da13354f0b80800ed68b6a699d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Принцип 4: Архитектура нужна для&nbsp;роста и&nbsp;изменения продукта в&nbsp;будущем</h2>
<p dir="ltr">Тоже довольно очевидно, да? Если бы&nbsp;нам&nbsp;не&nbsp;надо было менять продукт — про&nbsp;архитектуру мы&nbsp;бы&nbsp;не&nbsp;думали.</p>
<p dir="ltr">Посмотрев на&nbsp;роадмап и&nbsp;цели продукта, полезно наметить именно те&nbsp;области, которые у&nbsp;вас&nbsp;будут меняться, хорошенько подумать и&nbsp;на&nbsp;определенный период времени спланировать, что&nbsp;может вырасти:&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/01d8da77034e4155baea13ca9c12195c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--65774951">
    


    <img src="/Media/5veabpqp/tab-2.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2bec9f02ba9e43fd81c91ea70e935886"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Соответственно, в&nbsp;хорошей архитектуре внесение изменений в&nbsp;этих областях не&nbsp;должно потребовать большого количества времени команды разработки и&nbsp;большой переделки.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/e6b8bfaf766f42e0949a19cf56bcddd0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong></strong>
    Скорость адаптации программного продукта к&nbsp;планируемым или&nbsp;желаемым изменениям – это&nbsp;критерий качества ИТ-архитектуры.
Даже если мы&nbsp;разрабатываем продукт, который не&nbsp;планируем дальше активно развивать (например сайт компании, который дальше будет просто наполняться контентом 3-5 лет&nbsp;без&nbsp;изменений функциональности) — мы&nbsp;как&nbsp;минимум должны иметь план архитектуры на&nbsp;время разработки.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bdf8c67f02fe4333b46405617e3dee49"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Принцип 5. Архитектура ПО&nbsp;может эволюционировать вместе с&nbsp;продуктом.&nbsp;</h2>
<p dir="ltr">Часто у&nbsp;IT-директоров, привыкших покупать и&nbsp;внедрять «коробочные» решения, есть желание описать и&nbsp;проработать всю&nbsp;архитектуру вплоть мелочей до&nbsp;начала разработки. Чтобы зафиксировать ее&nbsp;«на века» и&nbsp;не&nbsp;трогать никогда в&nbsp;будущем.</p>
<p dir="ltr">Эта логика отталкивается от&nbsp;ложного ощущения неизменяемости архитектуры ПО. Но&nbsp;в&nbsp;отличие от&nbsp;архитектуры здания, обычно не&nbsp;подразумевающей в&nbsp;проекте будущей реконструкции, архитектура ПО&nbsp;— вещь более гибкая.&nbsp;</p>
<p dir="ltr">На начальном этапе правильно думать о&nbsp;программной архитектуре не&nbsp;как&nbsp;об&nbsp;архитектуре здания, а&nbsp;скорее сравнивать ее&nbsp;с&nbsp;ландшафтным дизайном или&nbsp;садоводством.&nbsp;</p>
<p dir="ltr">Разработчики продукта постоянно что&#8209;то&nbsp;«садят» — массы кода появляются, начинают разрастаться, где&#8209;то&nbsp;затухают и&nbsp;загнивают. А&nbsp;мы, как&nbsp;садоводы, пытаемся это&nbsp;все&nbsp;организовать в&nbsp;единое целое.&nbsp;</p>
<p dir="ltr">Мы можем взять одно деревце и&nbsp;переместить его&nbsp;в&nbsp;другое место, пересадить цветы на&nbsp;клумбе нашего проекта, убрать уже&nbsp;увядшие и&nbsp;ненужные растения и&nbsp;т.д.&nbsp;</p>
<p dir="ltr">По факту, с&nbsp;такой концепцией получается, что&nbsp;у&nbsp;нас&nbsp;достаточно широкая, в&nbsp;отличии от&nbsp;строительных архитекторов, и&nbsp;более гибкая область действий.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/2bf947d6966844f6b5dc46534628fb08"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--7909290">
    


    <img src="/Media/4eodz205/group-5009632-1.jpg"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f96a65f834f544d89d1963ae3889e467"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Получается, что&nbsp;ответ на&nbsp;вопрос «Как сделать так, чтобы не&nbsp;переделывать» – никак. И&nbsp;вообще, это&nbsp;неправильный вопрос. Правильный вопрос – «<strong>Как сделать так, чтобы не&nbsp;пришлось переделывать в&nbsp;ближайшие N&nbsp;месяцев</strong>».&nbsp;</p>
<p dir="ltr">Есть множество кейсов о&nbsp;том, как&nbsp;компании делали довольно масштабные изменения архитектуры по&nbsp;мере роста:&nbsp;</p>
<ul>
<li aria-level="1">
<p dir="ltr"><a rel="noopener" href="https://newsletter.pragmaticengineer.com/p/real-world-eng-8" target="_blank" title="Real-world Engineering Challenges #8: Breaking up&nbsp;a&nbsp;Monolith">Khan Academy переписали монолит на&nbsp;Python в&nbsp;сервисы на&nbsp;Go&nbsp;без&nbsp;изменения логики</a></p>
</li>
<li aria-level="1">
<p dir="ltr"><a rel="noopener" href="https://www.instabug.com/blog/how-we-migrated-our-front-end-while-scaling-at-instabug" target="_blank" title="How We&nbsp;Migrated Our&nbsp;Frontend While Scaling at&nbsp;Instabug">Instabug перевели интерфейс в&nbsp;фреймворка Angular на&nbsp;Vue</a></p>
</li>
<li aria-level="1">
<p dir="ltr"><a rel="noopener" href="https://www.uber.com/blog/mezzanine-codebase-data-migration/" target="_blank" title="Project Mezzanine: The&nbsp;Great Migration">Uber переехали с&nbsp;PostgreSQL на&nbsp;MySQL</a></p>
</li>
</ul>
<p dir="ltr">А вот&nbsp;пример из&nbsp;нашей практики: мы&nbsp;проектировали внутреннюю CRM-систему для&nbsp;финансового бизнеса с&nbsp;прицелом на&nbsp;развитие 3-5 лет. Нагрузка на&nbsp;систему на&nbsp;текущий момент была небольшая, но&nbsp;довольно высокой была сложность бизнес-процессов. Запустить первую версию хотели достаточно быстро - за&nbsp;полгода. Мы&nbsp;выбрали архитектуру модульного монолита. А&nbsp;для&nbsp;будущего роста предусмотрели возможность выделить отдельные модули в&nbsp;микросервисы и&nbsp;горизонтально масштабировать — это&nbsp;пригодилось только через пару лет.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/8f4a54e214094e8a8a0b07c4b40ebfad"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong></strong>
    Мораль такова: вполне можно оставить в&nbsp;архитектуре некоторые пустые места или&nbsp;временные решения, если мы&nbsp;знаем, что&nbsp;сможем их&nbsp;изменить в&nbsp;будущем.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/08763b4816b74054914f1dd930c5783b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Принцип 6: Самоописываемость кода и&nbsp;архитектуры</h2>
<p dir="ltr">Если кратко, иногда проще написать код, чем&nbsp;нарисовать диаграмму.</p>
<p dir="ltr">Диаграммы статичны. Они&nbsp;устаревают, когда код&nbsp;и&nbsp;продукт меняется, и&nbsp;становятся бесполезными, если их&nbsp;не&nbsp;обновлять (о&nbsp;чем&nbsp;обычно забывают), в&nbsp;отличие от&nbsp;других инженерных дисциплин. У&nbsp;нас&nbsp;всегда есть описание того, как&nbsp;на&nbsp;самом деле устроен наш&nbsp;продукт — это&nbsp;его&nbsp;исходный код.&nbsp;</p>
<p dir="ltr">Хороший код&nbsp;— самоописываемый. Читая его, можно легко понять, что&nbsp;же&nbsp;делает продукт. Почему бы&nbsp;не&nbsp;воспользоваться этим замечательным свойством?</p>
<h3 dir="ltr">Примеры:</h3>
<p dir="ltr"><strong>Образцовый пример реализации типовой фичи</strong>. Когда нужно описать команде, как&nbsp;должны должны взаимодействовать разные модули приложения, архитектор может написать код&nbsp;для&nbsp;небольшой функций продукта, провести по&nbsp;нему команду и&nbsp;в&nbsp;дальнейшем использовать для&nbsp;онбординга новых разработчиков.&nbsp;</p>
<p dir="ltr">Аналогично — использование шаблонов проектов, следующих нужным паттернам (пример <a rel="noopener" href="https://github.com/fullstackhero/dotnet-microservices-boilerplate" target="_blank" title=".NET Microservices Boilerplate">микросервисной архитектуры для&nbsp;.NET</a>).</p>
<p dir="ltr"><strong>Примеры кода отдельных типовых паттернов внутри приложения</strong>. Например, обращения между микросервисами, логирование, аутентификация, юнит-тесты, взаимодействия клиент-сервер и&nbsp;т.д. Архитектор может собрать код&nbsp;для&nbsp;паттернов в&nbsp;один гайд или&nbsp;реализовать их&nbsp;сразу в&nbsp;виде готовых модулей.</p>
<p dir="ltr"><strong>Автогенерация документации по&nbsp;коду</strong>. Вот&nbsp;несколько примеров:&nbsp;</p>
<ul>
<li aria-level="1">
<p dir="ltr">Самый частый пример&nbsp;— документация для&nbsp;API, их&nbsp;запросов, параметров и&nbsp;форматов данных.&nbsp;</p>
</li>
<li aria-level="1">
<p dir="ltr">Для REST API&nbsp;разработчики пишут код&nbsp;бекенда, затем на&nbsp;его&nbsp;основе автоматически генерируется спецификация в&nbsp;формате OpenAPI и&nbsp;документация в&nbsp;виде <a rel="noopener" href="https://habr.com/ru/articles/541592/" target="_blank" title="Swagger (OpenAPI 3.0)">Swagger UI</a>. Аналогичные инструменты есть для&nbsp;AsyncAPI, gRPC.&nbsp;</p>
</li>
<li aria-level="1">
<p dir="ltr">ER диаграммы по&nbsp;коду БД. Они&nbsp;могут быть довольно наглядными, особенно если сначала таблицы сгруппировать вручную.&nbsp;</p>
</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography block__limiter spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/d105bc3639274267be3e05982f6b4b4f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/nl4jhac1/ezgif-5c25a4efd95212.gif"
         alt=""
         itemprop="">


        <figcaption>
            Интерактивная документация по БД, сгенерированная через <a href="https://liambx.com/" title="Liam ERD" target="_blank">Liam ERD</a>
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b34bfdc90eea4117ae1c8d53af5cd330"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b36c7f529f244dfcb5d72a0e79b83308"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li aria-level="1">
<p dir="ltr">Документация по&nbsp;модулям на&nbsp;основе кода и&nbsp;комментариев в&nbsp;нем. Примеры:&nbsp;<a rel="noopener" href="https://typedoc.org/" target="_blank" title="TypeDoc">TypeDoc</a>, <a rel="noopener" href="https://dotnet.github.io/docfx/" target="_blank" title="docfx Search">docfx</a></p>
</li>
<li aria-level="1">
<p dir="ltr"><a href="https://dotnet.github.io/docfx/"></a>Более редкий пример —&nbsp;<a rel="noopener" href="https://github.com/byndyusoft/aact?tab=readme-ov-file#%D0%B0%D0%B2%D1%82%D0%BE%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B-1" target="_blank" title="Генерация архитектуры из&nbsp;описанной «as Code» инфраструктуры" data-anchor="?tab=readme-ov-file#%D0%B0%D0%B2%D1%82%D0%BE%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B-1">генерирование схем архитектуры по&nbsp;коду для&nbsp;инфраструктуры (например, K8S).</a></p>
</li>
</ul>
<p dir="ltr"><strong>Автотесты для&nbsp;архитектуры</strong>. Многие языки позволяют написать свои правила, по&nbsp;которым можно проверить код&nbsp;проекта в&nbsp;время сборки на&nbsp;предмет следования нужной архитектуре. Например, что&nbsp;нет&nbsp;лишних зависимостей между слоями. Примеры: <a rel="noopener" href="https://github.com/TNG/ArchUnitNET" target="_blank" title="ArchUnitNET">ArchUnitNET</a>, <a rel="noopener" href="https://github.com/ts-arch/ts-arch" target="_blank" title="ts-arch">ts-arch</a></p>
<p dir="ltr"><strong>Многие инструменты разработчиков и&nbsp;IDE</strong> помогают легко найти нужную информацию по&nbsp;проекту. Что&nbsp;избавляет от&nbsp;потребности поддерживать высокую степень актуальности документации. Например, инструменты анализа зависимостей, <a rel="noopener" href="https://youtu.be/iKyoR_qEsKM?si=bxflkZ-yNuLy0-4z&amp;t=1060" target="_blank" title="Checking out&nbsp;NDepend, a&nbsp;static code analysis tool for&nbsp;.NET" data-anchor="?si=bxflkZ-yNuLy0-4z&amp;t=1060">типа NDepend, покажут как&nbsp;связаны модули в&nbsp;коде</a>.&nbsp;</p>
<p dir="ltr">Плюсом является то, что&nbsp;схема здесь — это&nbsp;не&nbsp;просто картинка, а&nbsp;интерактивная карта, которую можно зумить и&nbsp;погружаться в&nbsp;отдельные проекты и&nbsp;группы связанных модулей.</p>
<p dir="ltr">В больших проектах эти&nbsp;инструменты помогут только для&nbsp;отдельных частей приложения. Конечно, если у&nbsp;вас&nbsp;«<a rel="noopener" href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B0%D0%B3%D0%B5%D1%82%D1%82%D0%B8-%D0%BA%D0%BE%D0%B4" target="_blank" title="Спагетти-код">спагетти архитектура</a>», картина не&nbsp;будет наглядной, но&nbsp;по&nbsp;крайней мере, она&nbsp;будет актуальной.</p>
<h2 dir="ltr">Заключение</h2>
<p dir="ltr">Если вы&nbsp;оттолкнетесь от&nbsp;принципов, перечисленных в&nbsp;статье, ваша архитектура перестанет быть произвольной, переусложненной, недостаточной.&nbsp;</p>
<p dir="ltr">Вы сможете создать архитектуру на&nbsp;том&nbsp;уровне, который будет целесообразен вашему проекту и&nbsp;его&nbsp;текущей фазе (если у&nbsp;вас&nbsp;достаточно времени и&nbsp;навыков, конечно).&nbsp;</p>
<p dir="ltr">Это непростая задача, но&nbsp;при&nbsp;должном внимании и&nbsp;терпении у&nbsp;вас&nbsp;обязательно все&nbsp;получится! Удачи!</p>
<p dir="ltr">&nbsp;</p>
<p dir="ltr"><em><strong>Иллюстрации в&nbsp;статье</strong><strong>:</strong> </em><a rel="noopener" href="https://unsplash.com/@mclee?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash" target="_blank" title="MChe Lee&nbsp;на&nbsp;Unsplash" data-anchor="?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">MChe Lee</a> и&nbsp;<a rel="noopener" href="https://unsplash.com/@jancanty?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash" target="_blank" title="Jan Canty на&nbsp;Unsplash" data-anchor="?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Jan Canty</a>, Сайт «<a rel="noopener" href="https://moscowchronology.ru/" target="_blank">История Москвы</a>»</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/250f54914b814faaa4f6154c57e41a79"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Дизайн и разработка нового сайта АО «Уралпромбанк»
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/uralprombank-redesign-and-development/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/uralprombank-redesign-and-development/</guid>

                <pubDate>Thu, 22 Jan 2026 06:39:14 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>
                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Дизайн и разработка нового сайта АО «Уралпромбанк»</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/8f16f31a5a2a74980a689a74c48b9a04"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5ad1df12704b4df9b618b9d790ebfbcd"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<div class="umb-macro-image-with-offset umb-macro-image-with-offset--60492051 case-logo">
    


    <img src="/Media/2607/upb_logo.png"
         alt=""
         itemprop="">


</div>


<p> </p>
<h1>Дизайн и&nbsp;разработка нового сайта АО&nbsp;«Уралпромбанк»</h1>






<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2615/main.png"
         alt=""
         itemprop="">


        <a class="button button--contured button--project" href='https://www.uralprombank.ru/person' target="_blank">Перейти на&nbsp;сайт</a>
</div>

<p>Заказчик — акционерное общество «Уральский Промышленный Банк» (далее — «Уралпромбанк»). Мы&nbsp;разработали для&nbsp;них&nbsp;новый адаптивный сайт — со&nbsp;свежим дизайном, переработанной структурой и&nbsp;удобным интерфейсом для&nbsp;бизнеса и&nbsp;частных лиц.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/983db786da58413db5c3cf455903a8f9"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="padding-left: 60px;">  <img src="/Media/2812/group-89-traced.png" alt=""></p>
<p>      <strong>        3-е место</strong><br>   Лучшие сайты-сервисы<br>      Tagline Awards 2022</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/06d2255a40544fcfa66ea2f4afb59c96"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2615/main.png"
         alt=""
         itemprop="">


        <a class="button button--contured button--project" href='https://www.uralprombank.ru/person' target="_blank">Перейти на сайт</a>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/e6da0a15fd80e36954b988d8fc2be4b3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium about-case spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d283251591f040bfbe2d15310c0034de"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>О проекте</h2>

<div class="timeframe">
    <div class="timeframe__item">
        <strong>&#x421;&#x442;&#x430;&#x440;&#x442; &#x440;&#x430;&#x431;&#x43E;&#x442;:</strong> апрель 2021
    </div>
    <div class="timeframe__item">
        <strong>&#x424;&#x438;&#x43D;&#x430;&#x43B; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;:</strong> ноябрь 2021
    </div>
</div>

</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="threeColumns"
            data-content-element-type-key="c9b72d31-8ab3-38f4-b5fb-a9a9814ae17a"
            data-element-udi="umb://element/86b14c6e1848889e324c3c88315f8474"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5936523b8cdc46e5899e5ba581a0fa6e"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<h3 class="team__title" style='border-bottom-color: #FFD541'>
    Команда fuse8
</h3>

<p><strong>Руководитель проекта<br></strong>Вениамин Мустафин</p>
<p><strong>Дизайнеры<br></strong>Алексей Пилишков<br>Наталья Календарёва</p>
<p><strong>Тимлид<br></strong>Артём Черненко</p>
<p><strong>Бэкенд-разработчики<br></strong>Максим Захаров<br>Илья Стародубов</p>
<p><strong>Фронтенд-разработчики<br></strong>Екатерина Чекина<br>Кирилл Зуев</p>
<p><strong>QA-инженер<br></strong>Алексей Герасимов</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/71df1bb32d9b4c63af1cab500eb9e22a"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<h3 class="team__title" style='border-bottom-color: #07A589'>
    «Уралпромбанк»
</h3>

<p><strong>Директор по&nbsp;развитию<br></strong>Александр Яхнин</p>
<p><strong>Ведущий маркетолог<br></strong>Екатерина Арсеньева</p>
<p><strong>Технический директор<br></strong>Владимир Бучко</p>
<p><strong>Разработчики<br></strong>Нариман Ибатуллин<br>Николай Латыш</p>
<p><strong>Начальник отдела </strong><br><strong>информационной безопасности<br></strong>Антон Кучерявый</p>
<p><strong>Председатель правления банка<br></strong>Михаил Парфентьев</p>
<p><strong>Заместитель председателя правления банка<br></strong>Артём Курзанов</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/df82357d6b1d93481f556814ad31fb7b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/84ccb39552d640c08692619be9ae2abf"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Предыстория</h2>
<p>На момент обращения к&nbsp;нам&nbsp;у&nbsp;«Уралпромбанка» уже&nbsp;был&nbsp;свой сайт. Его&nbsp;разработали и&nbsp;запустили еще&nbsp;в&nbsp;2014 году.</p>
<p>За прошедшие 7 лет&nbsp;сайт сильно разросся, структура размылась, накопилось много неактуальных документов и&nbsp;неработающих ссылок — пользователям стало сложно ориентироваться. Да&nbsp;и&nbsp;дизайн образца 2014 года сегодня смотрелся уже&nbsp;не&nbsp;так&nbsp;свежо. А&nbsp;ещё&nbsp;сайт не&nbsp;был&nbsp;адаптирован под&nbsp;мобильные устройства, хотя 48% пользователей заходили на&nbsp;него именно со&nbsp;смартфонов.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2605/old-site-screen.png"
         alt=""
         itemprop="">


        <figcaption>
            Предыдущая версия сайта «Уралпромбанк» (главная страница)
        </figcaption>
</figure>

<p>Сайт нуждался в&nbsp;глобальном обновлении и&nbsp;переосмыслении. За&nbsp;это&nbsp;взялась наша команда. Начали мы, как&nbsp;всегда, со&nbsp;сбора требований, выяснения целей заказчика и&nbsp;постановки задач.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/89362916499056744df2ac452bd60236"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e32484f6889c4692b9bf8fcf09d5e82c"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Цели и&nbsp;задачи</h2>
<p>Итак, первое, что&nbsp;мы&nbsp;сделали — это&nbsp;познакомились с&nbsp;нашим заказчиком.</p>
<p>«Уралпромбанк» — это&nbsp;крупный банк, зарегистрированный в&nbsp;Челябинске в&nbsp;1994 году. Работает с&nbsp;физическими и&nbsp;юридическими лицами. Основные направления деятельности — обслуживание и&nbsp;кредитование клиентов из&nbsp;Челябинской области, операции на&nbsp;долговом и&nbsp;межбанковском рынках.</p>

<div class="umb-macro-highlights">
    <strong>Основная бизнес-цель «Уралпромбанка»</strong>
    на&nbsp;момент обращения к&nbsp;нам&nbsp;— это&nbsp; увеличение потока заявок с&nbsp;сайта на&nbsp;кредиты, ипотеки, обслуживание и&nbsp;открытие счетов.
<p>Также важно было максимально полно, достоверно и&nbsp;удобно раскрывать на&nbsp;сайте информацию о&nbsp;деятельности банка для&nbsp;акционеров и&nbsp;регуляторов.</p>
</div>

<p>Чтобы помочь клиенту добиться этих целей, мы&nbsp;должны были полностью обновить сайт «Уралпромбанка» — технически, логически и&nbsp;визуально:</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">создать современный дизайн для&nbsp;нового сайта;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">спроектировать понятную и&nbsp;простую структуру сайта;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">оптимизировать анкеты-заявки на&nbsp;услуги и&nbsp;продукты банка, упростить процесс их&nbsp;заполнения;&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">создать новый каталог, в&nbsp;котором пользователям будет легко ориентироваться;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">проработать раздел «Раскрытие информации», сделать так, чтобы акционеры и&nbsp;регуляторы могли легко и&nbsp;быстро отфильтровать и&nbsp;запросить нужную информацию за&nbsp;разные периоды времени;&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">оптимизировать объём информации в&nbsp;разделах;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">разработать и&nbsp;запустить новый адаптивный сайт.</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/9c4b6cd5079c91c1a04a8e38bf87d692"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/df6b6ca5fb3d432bae3b7e2f319d0132"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Аналитика</h2>
<p>На этапе аналитики мы&nbsp;погружались в&nbsp;бизнес-процессы клиента, знакомились с&nbsp;его&nbsp;целевой аудиторией и&nbsp;основными конкурентами</p>
<p>Сперва клиент рассказал нам&nbsp;все&nbsp;о&nbsp;своей целевой аудитории: её&nbsp;средний возраст, географические характеристики, какие устройства они&nbsp;используют чаще всего для&nbsp;входа на&nbsp;сайт и&nbsp;какими продуктами и&nbsp;услугами интересуются</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d5f2c21bfb8ed62743bca9fbd677ed23"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/bc669d34ff6e46b1b214758b9502cccb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2592/bank-analitycs.png"
         alt=""
         itemprop="">


        <figcaption>
            Это выдержка таблицы обработок заявок с сайта, она помогла нам понять, за какими услугами клиенты обращаются в «Уралпромбанк»
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/a9e0d9ae9fb74871a985cc03d64890d5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4bf3ef38d11548a9bbc5c965b000b363"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Затем мы&nbsp;провели анализ конкурентов. Смотрели в&nbsp;первую очередь на&nbsp;ту&nbsp;функциональность, которая была актуальна для&nbsp;нашего заказчика — это&nbsp;кредитные калькуляторы, каталоги банковских продуктов, контентные страницы и&nbsp;т.д.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7706de0cfbd07f1533ecfb6b0df3fb7a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/80654b04b31548be95e4ec9f3bc51f18"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2594/competitor-amalitiycs.png"
         alt=""
         itemprop="">


        <figcaption>
            Анализ конкурентов «Уралпромбанка» и поиск лучших решений 
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/052ddd8570bee463d25b1d7893f9af9b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4338c1051f0741429c3c34bfdbcfdddc"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Нашей целью было выявить основные паттерны поведения пользователей на&nbsp;банковских сайтах и&nbsp;использовать их&nbsp;при&nbsp;проектировании новой версии сайта «Уралпромбанка».</p>
<p>Затем мы&nbsp;погрузились в&nbsp;данные метрик. Это&nbsp;помогло нам&nbsp;еще&nbsp;лучше понять целевую аудиторию, выявить самые популярные разделы сайта и&nbsp;отловить страницы отказов.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ebc3c5fe03514406fb98ce24176ef031"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/919680ab04644007a738030f39437219"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2616/&#x430;&#x43D;&#x430;&#x43B;&#x438;&#x442;&#x438;&#x43A;&#x430;.png"
         alt=""
         itemprop="">


        <figcaption>
            Основные выводы о ЦА по данным аналитики
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/de1b6082e120816f080f85d53e9b0096"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cbbdb576568244b79ed677b02015fd1e"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В результате мы&nbsp;пришли к&nbsp;пониманию, каким должен быть новый сайт.</p>
<p>Мы изучили брендбук «Уралпромбанка» (на&nbsp;тот&nbsp;момент он&nbsp;состоял только из&nbsp;лого и&nbsp;цветовой палитры) и&nbsp;приступили к&nbsp;формированию общего визуального решения.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/966fab9bf7515a6f34b0feb2a937781b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/dd1576f591b34e41b1d3a2cce0491f05"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Дизайн</h2>
<p><strong>Общее визуальное решение (ОВР)</strong> — это&nbsp;наш&nbsp;способ достичь взаимопонимания с&nbsp;заказчиком в&nbsp;отношении дизайна сайта. Сперва мы&nbsp;выяснили все&nbsp;предпочтения по&nbsp;стилю и&nbsp;цветовой палитре, а&nbsp;затем подготовили два&nbsp;варианта ОВР&nbsp;для&nbsp;главной страницы сайта.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/280c885a5da14d8a875a5cc9e36a1e75"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="slider"
            data-content-element-type-key="fe4b1c5b-697c-4ddf-b617-5f55c38c8017"
            data-element-udi="umb://element/3cdc2e6de8424fa7a65ab2d225ab8f6c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">




    <div data-cp="carousel"
         style="background-color:#ffffff;"
         class="swiper-container carousel typography__ignore-offset"
         data-settings='{&quot;pagination&quot;: {&quot;el&quot;: &quot;.swiper-pagination&quot;, &quot;clickable&quot;: true}}'>
        <div class="swiper-wrapper">
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2614/&#x43E;&#x432;&#x440;1-1.png"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2613/&#x43E;&#x432;&#x440;-2-2.png"
         alt=""
         itemprop="">

                        </div>
                </div>
        </div>
            <div class="swiper-pagination" data-carousel-ref="pagination"></div>
            <button
                type="button"
                class="carousel__navigation carousel__navigation--prev swiper-button-prev"
                data-carousel-ref="prev"
                style="color:#c4c4c4;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--l">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&lt;</span>
                </span>
            </button>
            <button type="button"
                    class="carousel__navigation carousel__navigation--next swiper-button-next"
                    data-carousel-ref="next"
                    style="color:#c4c4c4;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--r">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&gt;</span>
                </span>
            </button>
    </div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/3480885f21de133b158ac88c4563f77d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c2a515a1a46e43fc8a936ffd942db90a"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Это были не&nbsp;окончательные макеты, а&nbsp;скорее их&nbsp;чуть менее детализированные первичные варианты — с&nbsp;сеткой, цветовым решением, элементами управления, типографикой и&nbsp;с&nbsp;некоторыми контентными компонентами. Эти&nbsp;первые наброски помогли нам&nbsp;убедиться, что&nbsp;мы&nbsp;выбрали правильные стилистику и&nbsp;цветовую гамму.</p>
<p>Заказчику понравились оба&nbsp;варианта ОВР, поэтому окончательный дизайн стал компиляцией самых удачных решений из&nbsp;обоих макетов.</p>
<p>Результатом работы на&nbsp;этом этапе стали дизайн-макеты всех страниц нового сайта «Уралпромбанка» и&nbsp;обширная библиотека компонентов. Последняя значительно облегчила работу нашей команде разработки и&nbsp;помогла добиться консистентности дизайна.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium legend legend-flex spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/76ac85d6d40f4954b196f59b5b017b13"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span data-metadata="&lt;!--(figmeta)eyJmaWxlS2V5IjoiOEYzS1BadWVuVEJwRHFzNEM4ajJpTiIsInBhc3RlSUQiOjE0MTI2Njk0MzgsImRhdGFUeXBlIjoic2NlbmUifQo=(/figmeta)--&gt;"></span><span data-buffer="&lt;!--(figma)ZmlnLWtpd2kKAAAApycAALV8e7gkSVVnRFbVffTt7nk/QURERESdFzMDIpKVlXUr+1ZV5mRW1e1uR4q6VVn35nS9qKy63XdEBBwVR95PF1kWWVYR2REVEVlUZFlERERERURERNfddd2Xu+u67uN3TkQ+6t4ev/1n5/vmxokTESdOnDjnxIkTWf2YbIRx3NsPW0ezUIhrzrlOsxu0TL8l8F/Trdhdq2Y2t+0AVdkObD9XN7i33awALgTOdtOsAyoGrQt1G0CJgW5gE6017suUu8GO43V9u+6aNHK96bac6oVuUHPb9Uq37W37ZoXGb2iwW3GbVN9M6r5d9e2gBtSpwLKbdhdor9Z9oG37F4DcyiN926sT8nTFqVZRnrHqjt1sdcs+ZrfMgHg7a16JYiznPGBBnaXZ70MsQPm2Wem6TSYhuLLrOy3iRjang9A76MUhulloatm0GnRquB0G5W40GUSTfX85oj5Nt3nR9l00CLfC7URByf02NNpAiYprtRvgD6C0zGbHDAAZ277b9gAUqr7ZoH7FsuvWbbPZdT3bN1uO2wSy1LGtlusDWiM5o1yvO0x2w67XHS8gcNNHJ2wg79Ap395u102/67n1C9tMZAtTNSt2BYLL+p1u2eeJpTNB3bEIcTa40Ci7tNvXOE1M1mTstUHLsXZIVNcFNdOzu7tOq9bVY6+33GYTNJnBGyzSrHLdtXZQu3HXqWyzltwEWg1a6c0Nu+KYAG6pOdu1Ov6n5luDg94s3I0WB63wykKJ7nTwQNv0bbSKbJUSgxsuK6bR8h1eBzQL1UJarbi7tODi1RZc8kzfrNehotCiRtfX86+tout2lbDrdnO7WzFbZtnkyTeoDmVsU2WTKlWHqZ5i2K1XbJLBVnkUTgYN6ADk4ZlB0G3VwMs26TUsz2+wNcmK6e/YxKjRaNdbjtLmAm0s9q3c9qmpaLl1N62VWFw8Zi2AZjLEqoARFReiRn1DDUmqm9BZv24S7VOBW211mQZqWzXTr6Q1tiLbt9V+n7HPW/V2oLTvbI3Xe01gttqpSl7LswC4rt5uOE03cFo0xfVeL5ro/VsP3LpDGyUg04oD3cdsxCowMkVRyfKALQAkFPaKdBe4QopDJ73tRadh8spKsMdzDoA1Zww/F/R7o1AJHY7Kt1sWy7vq0PIkNoonaakNK9jDYdjXjBYd6K8PN2VCc9AoKr7rZVVZdWFN2MBmBYrdJr6MsmntrKIKpLgWO401F2rlKJ8p2h4MGaWsu7sMgIWW4iGAItS7lumRKyhmNWiSb7GjKRHRStifznuLaDrBmMSdYGZsK8QJWGK5zo6dKZnRXI73wnl7Ei1ijPFNWobwnPN2PQAgwREcKcnFsKaTeDHPbRo2E3hB7cyubJjkPQ3MoUVaCCyTF1CsgmKlq0aUdIV7rwWL+fRSaI6i/QkGpMQEfIrDR4B02y0NGqqz1ZtBeZP1YSm82zJ1Aobp++4uqxAtoqCq9gNtpw4PDesFsqjVhOyyriWYeIUUtZZ3POtq8nPTiBht4ARgPst2xyaCMuHDKE+no7A3cWdhshfFdlPZAlaFYQG8DGAZtMst32TYOM8mwqrBsqhN59HD08miN8Jw7WRyoobaMFPGuTYcbtVhdrPRnXC+iKDlhHM9NOWGlt1Wy20AMhrTZRxay3k8ncPkK3bVhHdBg7B8N4BSOz5gaV+wScuhCagZOPh5Ks/EUuBtLGgT6kWPPUwJheXUAa01yGfRkHVIHDEDoI1UnFzd7MCupvNGNJ8TA6nC8iaglAzAxuF74DVbpFFGpRcfKNM1LHh6oESmb5LNW6ln0WtuAyXOeTaVMuhQYXgVigAK9pXZdL44rtIFnE9wmohOtN6KBIHTieeXCaJm0zqAMeq9o+lysT2PBopIUWl5TuIZg4ZS+kI2xustFuF8gib0cjxWWHhB9oaS93O5mPphHD0M0qmImB2WTMqHTCFYydEoDEK9KOyJH7jax7Rsk7ZeWlAbpQQIo3BONS3yyYWW3fBc3+QQqpiQgZQWYSqiE64aoEwcLabu9S+p/UmZrcHJXYTYmAOJMwYRAsOqNysspjshNiUrowztIVMGXOAB1nQJhuZ63NrjjYM8tdQLZrtFMVcxR6rEpM4t40U0PELT41LxTMvuwsZV/Kc4CNRusB8DEvFe4Fy0uy0XroPlsYKA8mCznIaHwAk1akEftXhvGkfkIxAiAqX5FGYZUm6rEBPSn8BO0EdtQCkRK+zP9rGtXYrQUZdtn4VaxoGDsmDVXQ5Fig5Jq5cjcdptdmE83E2YVZDptpyGDT+Lumy4CPG7LA5DwaqhgFE1ChEAF1UDTj3qVlI1jq3W0MvD8kmPEdUzqxsV39xGuYm2HftCMuwUqh1XBZNbrXlvokSheLwd/h+hWKsLD4mTQMcSouIEEE3HBiiruAegNBCQIpCs+m4ajRVyqMRTFnM45RNLOUzqFNe8dlBTOE1sPcMktDYylCK1mSFSSqfoDqBwmtJWhkkonc5QitKZDJFSOqsYxTagU0LsmhVkQu/aFawied0KLqV6Pc+ksZroDXlcQvPGPFKRvCmPSineDC/gWF1qQ+0WhCm46JlNOAdW5VsRiLoIXDLMbXYvhuarHd/A3dBqlx0LDYJIJxWJoDFXNciCVcyHEaTtaVOR+q1gSmrsCm5NOb+0vh7059PRqBLNlZ2Bjlbcf8B1YdHsWtRYGOmCTCwcwKoXIdrt8x7cs3IPFijQOc81ud2G/5RGjMslJgO8LuRoisOaQYRZI5yGsjgXm0Lu44+xhz+FHv4U1YGJwVdQk0f4Y/hAoXeGuIw/hQP8KTKlYDGdYUCfYHFeyJl2OOhgNHqLeXRFyLXxHXegLsd33InCGN9xF4rC+E5CFsd3ErI0vpOQa15vjqPAmQxCjDP2l9FAdHJEt5KAEo2HvdEyxBi55ODydmFUIaVmbxwKWRj2xtHoCP1lTKcMAANEFnF/Hs0WqBWob6c3j3oYshyH86hfjfaXc4gW54q+FwlogsOnvMSFijMNgHma1aHBrNeHnq2M9RDTuNhPfTJKXN30VeIqBKq0ubTAPAVEkLgvM4wjHhrG+5sfbfVmMfQrGwKT4MuFRNFNKoZnI9An1gtAdNMaRY3IThBYAgqL3Qa4lqPvJXLPs4WoEn8RXOLcB8D8BCxkbE7ay4FOs/ZLxKnsc6thb8EC/nPp4W6BJmHd5XEXzYVheQHhC8QNSmYQZUnnNNYCp0nR1brrV5ooN8yqT+2blSb7h1PNdoNY2kIMSPf60ziEaElnKqo8S8EhymtwXaHyWtPkePQ6S5XX+xaXNwSqfqPf4cvuTWSYKG8OdjkjdIsV7FJ5KzaH8LdZFicUbg9UPPCEmsM5nyfqo/hrXL9J/D2JhILya3Hk0FY+udLiW9DXVesmreMpjW2fzsyvD6BrKJ+KAJfm/4Yq4jGUT6up8htrat6nt1T9mx5Q5TM8VX4zBe0on1mvlqn+La7H5bf6LS6/zVPj7/B2miSnO+twHyjvQkl83u236lS/ByXVn2WW/Q7Ke81yh+r3oSS+7+8oOs/ugCGUzynXd2l/vh0l9XsuSur3HeZOjdbxPOscX0a+06qyITzf8rhuWm2f+pVx+lLdgnOjslJV9O0qrrAoqyjvQrmN8m6UNUxL8zkoif65mloPZtsmfuo19xzpDWIvDpuaDs52lO457777UXrnvPuJzgPnvGffgdI/591xD8qgfq5B41rIHVH/Ng4a2pcOJYxQ7qIkPs43dhqEv9Csc6xzsdneaaH8LgQoxNeDKAOU392BwFG+wAtahO+iJPwL/R2f6j3fq1G557fLtO/9ALEcykFL8RG2mhxVD7FNtH/7HeQ/UB50VHvUUet+qLPD+nKp47d8lCOUd6EcBwE8rxATlFSforwb5QzlPShfhPJZKOco70UZo7wP5QIlyWmJ8tkoD4MAPluIyyiJ3hWURO8IJdF7GCXR+x6URO/FKIne96Ikei9BSfS+DyXRe6kMgruI4Muk1WEOX04Akfx+AojmIwQQ0R8ggKj+IAFE9ocIILqvIIAI/zABRPlRAMzqjxBAlF9JAFF+FQFE+dUEEOXXEECUX0sAUX4dAUT59QQQ5TcQQJTfCIB5fhMBRPnNBBDltxBAlH+UAKL8jwggym8lgCj/GAFE+W0EEOV/TABRfjuAu4nyPyGAKL+DAKL84wQQ5XcSQJT/KQFE+V0EEOV/RgBR/gkCiPJPEkCU3w3gHqL8UwQQ5fcQQJR/mgCi/F4CiPI/J4AoP0YAUf4ZAojy+wggyj9LAFH+OQDPIso/TwBRfj8BRPkXCCDKHyCAKP8iAUT5gwQQ5V8igCh/iACi/C8IIMofBnAvUf5lAojyrxBAlH+VAKL8EQKI8q8RQJQ/SgBR/pcEEOWPEUCU/xUBRPnjAO4jyr9OAFH+BAFE+TcIIMqfJIAo/yYBRPlTBBDl3yKAKH+aAKL82wQQ5c8AuJ8o/w4BRPmzBBDl3yWAKH+OAKL8ewQQ5d8ngCj/AQFE+fMEEOU/JIAofwEAu6g/IoAof5EAovzHBBDlLxFAlP+EAKL8ZQKI8p8SQJS/QgBR/jMCiPJX5fFUBUKrBY5rcZeQSYhlUEzZ6M1mFORIYzifjiksW0zx1yiPpntCyr2jRRiLglQ5EmEU8GxxQPUJRWSIvwa9RY/7riP6ika4M1oUNJqDh3BJFnJjQXMjnIsPeoPp5RigcRDtH+AWfoDwDgHjIFz0ohGgYgiWY4olEDge4pYeIscBeG0RjjkppprWD6M93Pr6BG9wNlhNq1+jhHHq/++UfQRG8x7Wtik29+ZEc4KZUTvFzAjjOpbztUL2SRCIno0pBZILirMLh1Ec7SGokqKIQifxz4pSjIA7Fi+Qa6A9iYfT+Vi8UKxHLPQXiw0GWgcIkifE+YvFZm8CHG4ODrUAca1CIKxD1ImtWRfXoZ7PWl8vTs2nuGegCzjZiqkBwOkhi88iZvWuvUScmdFaqtwChy7OhuPpQ5EFMh4SmZDiuryGIsQGJFmBBgijdCk8EkMhh8DWo0lYC0k0oG8QphLthyBcQAiPmoor56JIlV3VsYQEL2ocojKLRqGHt7VWbx9LkQQ2aVnQuER9OW+pJj/bP+hRrB3OY/SQaY0ncirErhET7B6Gc6TPwlYP0hd/IWVhxDk1Ts1cxJ4gvz4C9zFOFlnaHx3NDmIcKXJtkObIYxwocl0N62BCoMDhxhDMp9J4RMrNYW802kOupoqGWAzlqQOoxRzEL5WnVzDBo1JuoQbolYY8vZgvJ32mj6vgXF+VSuKMxoeDVJ5nazk6wijuIa81iMWDuDHNR1h9cr0qHCT9ED2WkMXSSxPGOnReXQAuCnk5Gizo3mdQ2wUABQLS2YpUM+M+rm+orQ+jebywEvFi3SXocL6+tk0yE8Zafzoe98CY9g3ZZe+iUFsBruAyhpAOCx9TnSTeGxxqs1urpBsgDGOO6yuWLGVGyVC3XBa/UTjkSjNcXJ7OLyUsTGBVvREmG/CMCSMndYL8IjKsWIYkYcaiI2VwNN6bjjT5mCuYF+5SwQmRmAgYuLuSCQdkYlWsBm4Agk3IJi7XMHij5Aw4RCC4Z8G+tsMJOR6sU80lp3nKsoJ75SFZ/Xi5IH7Z2FVPY7UnKlo3jQAyxaKZUT8chriMQ6jG5jAahTswW5hMzI28IkOPrPXg6XGnJhF4YFGzHSMQksXkXCiNIrjG+RGtrTUNlnt0F99DN0KIK5L0YDadQH3UROvLyXBEyWvKXeYpbkRxO2kKB0KKTcW1lYxv9GJohVpqoZ9gFVU5W+6NovgAxGhe4rY1bYW9cT3jjiYxjk9ScHA+koq5WDTJLljQqo3CVNeJlDsMLoNTSF13ps2Cd19hYVX6V6fbuev/iTKndYLchiRDFGn1siiMDT5nbiRO4Lr5nBkO43ABxS7Me4NoSYdSMTtwSijSA2ctns3D3gA91uOD6WXIGkdlOYQEB6SF6L7RopOIbdaZDKfQL56vKeRgqRQUgw0PR8qUGirhYdRPHlGSRBjdlPihR1q4u/Jt3mAccmOUQ0G9oAb6yckEK9CDLWu3y9GRPDYJnB5VEO5Cb7UlYzVYujPAfkTDCN4DiotRiuZ7cdq6kCGctqfdUIsI4CkbnHC+QyBDmaQzJcFpi0G1JKlZQAIP60h6FnU17VzSiKQ/3rOabb4lrmsGyjgS9ufks50swY5Z0lVT/r2LHDeyHMg+Ig2pXzHlCQJqDelI3IKdSjd5Nj/Z3YSiwbeSlhnGXopmKu+HKDOUlShUs4egiGXIvfCKYHaQhOE8k0C+Vr/7y2CXMz8GlfSlDnfAMy4nbvlxomgj0povAgRYMNIYzideDodII8J4OU7hCe4QSDnCFFTEeigK8eE+WTwf/dhEVBGxkn5+GPqMmrtc0AFFkQDa4WwgUxy37gRZQgnVPtyvTud9WB+9wcKDXIqB3ljGobkXT0fLRVim9RJyUzPY2dYzCMOpdpu2rbOxZn3XvBAAkHU++ukVDqtYENv3CA5QhAHfmZpbYbIcBzBUCC8WOH+1cSLQjBU2INXFyba/hDua69p6X8t+Y0ZeCk9894rNbXhgbBoHRJhEpqTSs96DM0GHyzBfiJc/G9oQcAwrZ7A67uBScO4GBLaIeUo0KgWiB2wUyEr67g5hDP0BTsGuVtXjcxE5HNcnqKRfG9fgOuCmmV7ubFFzKdeYHEX6QEmOI+qALcEiaYvBfUwYPQSPy1meEmOyo0rnzuGroJwQFeixntHeYAl4W+vu1mzYT82pV7puFa+y1Iw0KN5H1DdQ0pz30zkRbUFk5mQfMsOlAS4yVzUiPKPN/cSbFpRXriOowtjlPAI/chDFs1HviHV0CxciVWWVBLfeaLkf6bO8MOMK5IZhKozFgEtqWR63+eGoh4jvQA0ozhipBoxxzYChAISR8MYCLERxJRyFCBChckVrCnYp3Gj06C6D3Un2Vr8RkmtDYWj/pd0ZoGLisUopDXsymFGwD75DDdLRAGYoZkn2Br53rCb7HHQ+HQwANjfyaBS0IdddmQqGoYvqS6IKAFE7nhecSgXv93ghgiNhVUOmL0GpLwaT1001tBEp5jBNDCRR+QLcWWYkaW/sG1wBlAzT2PWyu6tMG/pu6tVLHTA0poehPvWmo8EO7xDiNChrNVVEYzca7IfQUsyNA8dAfAnpDEg69iDCdMq8jApedbebIC52a0jRl13Tp2n5Gz5EuxNsqfGWxJI54FSXnmfNDhCyizVhMKCQ985gO8lTyp4o5Kqqw30LmvWU4CNSoe6f9Fg1S1Qq1LMzP7WmQdXwHAQfl1iZ1hWk0N+eXWE3NKganouRaVCxmVZU43f04V0XAE4xoJDPi8nTXcQFFKVCfSccfnrpxVVIV1Tj8wdwG/BvkPFEbMozuarqYPb4WwdaHNg+m9VUczk71+wJhcy0uGtOIFVna4wzAu3XUqlQlZAPBihR/mi57iRWdbdppBO76mBCz+tXEKpTNZveVdKEYG84gVSdt3HxyTuhG/N11aWWu0bdlMCqyYGG9PbnvdkBKQl2Y1PcfAylOp5Lscm716a45ThOdd0hr+nAqOZ8w0HHW1cxqlt9HGGX6hEKdLkNha6p5kYMD3Ep1Pf/TXF7vq66NBew7xaCpEuYG12ekK+rLu5B+skTNgMkOHR4onji1fBqiIcaJjKREJqIJ4mvyVVVhwcUxurNxJPFk9KKavRVnT/oeor42qymmgNikWnVUgbE08STr4JWA1ppSyf5/Orp4utOIFXnNuEteANxs3hKAqumDlVzt+RbxdevYlS33b3j35k9VTz1OE51PX+o584ECMF+w0ms6n5hGI1GHtVjZPzl07Kqar+I3hCVQlGPb8wjVJ/vIhvRyYeBeHpWU80Pkm43YdrINH1TAqum7+bF0qn5CimekVRU2wtCvjLFSKLLb9awaunC/w4QhvDHZNAp8UzxzGMo1fGFyt6DJH79kJTfsopS/Xo0s8kuKIYNivvFt65iVLc9RAhTFUTGSIHLb8vVVY++SmHQIvBeIe7Iqqp9ENNBhsN4XdypQdUQZm7E0rHkXcdQquOQNmg7nI7DxfwIOXZ5dx6h+uyrLUqQ1OueVZTqdwD7119wPU9EaUU1PsR17UFgxZfyddVlxCivN6DgC13G+brqMqGTEY6fUyXTpKLaZjHHZSQdPNyIF2VV1T4fUpqkAUdciWJ293DM8Qmk6ryYq42aVuG3pEAKOK2qDodq48vgUAk1GY/el5lxC1g4OzZgURZXGHkOqVX6aqwijmIVATOXWdD8dikejmKF9VRCg8iC6vcASgfksyYvHqh8kGqhBVOK4Hvz3Tsq+Mb5/xKyGE6wTnBwjcfTSZ1ud7RAzPF9K61g/8pi2UOom/V4KSd3dResuT8PyVkgXMr3elm+Vw26ACuCt8h3eXm+izvHHsPpSbwO5tDBCOd8OLgYzqdoeiTf1NRfV6gvOw7whniyUWuXeAgPiydbqzhCiHUxwnNjrhlOPhYTeJAczktC1xkeIkntsISPSPmohO/T+RGK5GCJHbxLzpB04FRFgAMxi5dfmTVkasO2CPN8lYQDRDjTG1EYgdW+Okn64XRWm8hEXqOzdJUQoo9mNDN29bWSsqEII3HsTmf1cIjdy+ID2NLrVjr45E2P9Xh91qM8XSym46tQecPxPlcj9MasU9YSUZQxQ2CIUAOLe9PxPi0cPqtd3kzSIhPDCmPoIjxODycB2ddbpNJt6K/KvsF+ITvW/HdImAS66l3h+P3dEs+1Ga6FDUAK6605VCXLZv2YDHvpl2UeHnMhZ1w1s0+8fLzi9pnpYDydLpAtI2f1DhlNDqBW9F4yCpQvxna9PUEH7DCzhncmDS3YWIb+yQRts3vJGt6dNvDRlTX8VNJA50aGfk+CzvFTpW+6iA20/5KM4rRJSLxVw+twY4L5cRkTxHL4mMSzNFdX9e5X5TJJpUIMeaf0LokLKTYlscEBXrExEpJ01Z3sIg5iKLh2Sz+ttzSgOXLb+QmJxF2uKXOUH5d4z47iVR/5mAxZbiRUM0YehwDgfwY9g+kQgRC40qSAfh/QzemkPRvgyNYkflazCZWDfvS5N1pFCy/i/QyH0wBL+HmJ9BUU8SAaDcBWJTqEa6C84/tzyuXB4YXzQ7zCEV1M8QtEaIJdRCOL9xxe0jMUfYy7JX6R9F95C53xfEzieT1mImni45MSUQh7DrCFsS10F3W8tWfTt6JxiLACOvrhfM9GDxX8zxb1yxKVpCVnDL8iByEOrAnXcX/BhiFIwYCPyL3UhanYDQ5d/pq8qtKV065QvI/Knk68fEriLR/iWj276hwEdbRmlKB6EywV5waqvLoPSjz4Tw+Zk8Qvc8P7JJRCN1AKZQHCSQfs1a8nbRk7TrZo7C6U7UQPM8uXfkCK31BnguZtC9JfQL/a2N36Ctfr4jelytrQisRnpPwUXtT34e0G7sRtVdXncrFYyN9K8cPhSsOnczsYHEyXo0EwxmFi8gMv6elvy5gCChVePB9zcDW7WOi4CZv4O6oJzHHInjV8VjUghYGAqip+V1VVrI3651gc8Cqc6+iI30teWLC7lEr4/aTODucPoMHaHVP3LfF5GJd1Fzj9w6RfOOhoAW0hO6MERBuV5ro+K+UfgQzYh17Og+WMbFm7KXJNJp2X5HkpgPiiYleHWTBIWlRV/HFGINYUHofAl2T6Oirebog/kZfCo9Y82t+HBb/NEF8G/wGZ/jY0YYb+f5pZZE5xYvF6Q35FHk5hovYhVu8dzHEfwxL/DNqCvHP7cTzkVxX/3hw7Oj9K+f/zFTRvr7MIxzFCxr9QTXrFuabni3+tm8gR6aFgmz7o/UvVonfd573dFP9mBasOc6D/rSRVp3CN4upyiAXA+8BnYqF4AP13ahTPwtMH4WiI2PavdFBShyhj8Wkp/z111JLzcIxD9Y46lOtEoEfCf4Uh/1qS7dQRG/LWP2qI/8DJs2Nvn2+V4j/SAXDsd5unxX+ifSaPSYcaLAPqKP5zhrPhbID5LxkGzOmz7UtS/E2G59EI+nDN/68ZFuMV7r+p2cnItWVsiv+eWgYGI5/9Tin/NlMO4GBpk31OCoofNcT/WO2OF8B3Sfl3Eq0c8NmT5biKCxnkLh4xxP+UsGFYhrVqTn+f8WZBwXEKMP0Ydib/V+JGr/Ik/DYp/nc2lASY5kq/KMX/kaNjyc4vI8ZHxluxRhQS1n7QEC8zlvHJV5OXG33sG94X+pfqCOmWlJ9+uSG+nz/64ACadjNGEC4fMeizm/6BiwACrghKD06nWD1ifcAg9gPGZc6oNtBvgNnF30nMrHBsXrH4Wyl/yBhBcZLYYhP6pHp4Wtca4WSpTOOlhvxh8KdFSe2VcBhDU+Sjq2hEFrH4ayl/ZBVtxjH0fIxaDEWUr8SbBiwgOVZo9pp4lRGO98JBhdh9hyFerfr4ITY9Di9SWHsFK3uNgUvHQSMcROr7kC8Y4rWa7eAIVjcIyGRgguJ1ObSlfmO3Di+jkBW103hlxx01+QneX0rxBt1uQbzhwARBMmPxFSneaCA0GSBswikLdDbPmyDFCTwNwovwMvP0TkO82VhAR8rRIOqAfawRc79Fp7krV5ubMu4QEuIDykNA1dg7ATQay9EioneQEG8RM2HgXWUxj3C8/ZWUcrXRRssRSF1iXc/eRaz8XmCL8A5BTqIahaMBpoDeDzEtnscfno73orCqv7ehlBCGF1aGZ1uJiZKBeqq/kcfmqtBcayodP1HUYBXY9N6ok4woYPnZ1XBLFJEpzYY7NLZEDgE+RKytUFckjALl3BSMxwqSu6q8AtzQLVPV8LS3MrhFJOnZmb94Fvp9TiaPvob6+ZNld+klFoiC2jybrAfN6hdX+odUgl+YUUrVKTW71XcqBWuFYJTWtqYSjZ6CuMubn+K0ZFr6nV8ENv0EXv2IP2OYfiOq+SkwshvYdbw1cmvxJGmcOuzMyItA8HieUQAYXUCgUCuAWmXz44glbOpMozTv+TERejDTf4/djeA1gSwq6jHcqCzFPDXCNcahFft63PeJs60Lno0XR4c/dReWR7sg9RfghhXQK2XhnNkx0z7FWqtBm1k6F7Cg1rbpX594gFDr3oVWjZEb2/R6txkw+lSw6/Dz3daOS7/vAHTabweEOeOQAcJ727mDRdDvXNAok8YKdjlpNKB7McIkGJWJkFuyh3icwxvinmkklq/MJxZb0mhBfevwykQYr5YjgNAUUNtbjhBBsFhfjdfxCL4IARrJrx4ehiN04c/Nmks40TlqRUVpos4vg5yUuoW+Fs/eVxltlLMJRNH1K7av3vTazawinWbF5l+cGk23W1e/RijUE9J4eq2bLEWhxyR9ZEolwWTfu7AsVRiIFUdk8BJMwczeiIWqhhgeVa6+0Kbjbe4LN5PRaQGNCxzWmaJWbmoQX9qQu6gV4DhbCBt07Fq8Sjhayi4U2ZVwLeXFZJLCOJN1a0K1sYVYVIZroSuSJ0aGyXOxkjopZn2yCXNcXPVaQ59vUKiCdiZzjr6GSDDqZryBUIVuaXR1OHbH2zx5VzyVTYiTDlFc7iK+pfit4gJC7XhZPA3Vm/dUB1zJVKLiTCokGEYutMNZpF0Ibsm5rEj20g3PqHelgkO2Dz0r7dgXktdfKOhOE36vy7/yc+t1/nxIni+757vqyd7wgntQFGDsLavW9fi3UsWdbK/5xCQXFIuSxDYxVs/1VuhgDUyrG45hqE9DOX2JPTVsmJuKWYzTuime99sMGYtogUAZ7C+S741VQ/EyXxaxjwdJMLwWEqEWJkL7etrfGcMX1hDuArsxxLZgG/O4zdl8mmRLTqmIFw9cED/qW1hPTp6n61gANi8NU4yNJXMjEzbJJSXECquDi1flqHQVjtZWe+7qlR5fUrLujQ7YoeslTL/fmxz2YopHk7D4QRyaSA2NNNtQNoPrlZCUkZ56C2rQttqOIv+LCkRKRVXPEFK1M9H6tN/j9VwURg4dwKew5tJXwA8ep2iNov4lIQ3UECnNWGUxPmDl9hIVlcYE6oP+OrWUar3RwqZAm3DYKXsTkr9bBKRnkAfTRTybLnTViC/3ZhpO1D4drPatNFU13esfIoAdVTbnZA5PtxX1sDKOnhme5xbOAFlnUYKsY3g8BKg4ICBLYw+eL8ALRUgxC6bTs8fiMQPnVeoXstyuMKquv6ut07c7th+QGUrkzPm08TB6D/Fl8snG+hQOjCd7H86mSXg5rRgneKwQjwVAyWqAwVqiuKZ6OpNmePnYErCoQcrczxkCJ0WMtDl2nm95dEknqutOhl6k35OUYqrxLPL4tAl7wQodcBcndHLoIn97Ij5oQMQrAvAYLwr0IzzHVD9SFmbZ9RWICK/RcFqqYqwO3QmPhnRHhROdMRVQpyv0PgRArwjwQOMwXvTGM1QKAa0E1wRKnsBG4hX2JF6JFskOKeri/diBk+gAZPBG8SEDfi1Hvggdgean9At7q5uW6I2D2OMKbMmIuX9qKYVkaSqRDLU4OTVxdBVGg5QjTVQzgQdhRA0rTLIBI9OYuYJSFCfUqiRLRRJKs4ZBqbxi8WFDrqMNwb36eIzCPfazskNhQhbz4/LGRy0y2rhIwarQpY0jE4OJsHHLsZue7owZDX0SFvr6PasYkbNUB3aJPCB7yndBhcfs6H7CEOtx4r6QWtqY7mGiQ/Ar1uXmIIR3DpuK5ikYAGyC3Vks3m3ILSWqxIXF4j0G/Xhi1eHE4r2GPIOp5uB2S5xl2Sd9akr7YQjXrOC9qzgdDO+IaxdJl4R8hSQGP3LdDLVs8/EuaMjr+zlpf9QQNxyuyPljhrgRrnoXiXLarZvoh0lVBDIBdg3KIMXNOTtM7DkWHzDkLQEkgci8Nzt4YBnyjTnWIUlTe3G8ocEsoKSE0EPTmQ25N4KgOdLX6ouNtPjI8UO1XnRSe6eO2BZ0cM6ZIQP65vUgUdpwuQDeD8c9XIqR14xBx4DocIQDz9XCAhAJf10UMVGZrgslbCK2sjyf9gZ9CB62tqpSq5x8CmbBVMSnYbKJQI0n0A7Bpcj8WANbwAAnCPTCkTKVRXCsNTgWHzdkiUUgHpZrlA7ojbSWrff6SJnEoig2YsoSBunldjOpt2ja54hTSd1C2gqrYfRzxRZ/GggWSuI0g1rAiB+5iiw0eT0QPKsm9npHI8gBiGvilW2lFMknDHltbiHpDn7SENcNQamj7uJY7/VM3cHWQA9gtkfuchFHg9Ce9EewEIS35BuwZTdwRw8ihGV3xI1IzyMkh/6N4FJG7clgGlDeSnzWkDczyg9zqFv2kk2LxWcMeSuMUtl/EL5oGUJX9f1tXdzG85RxvPYPgukSKfAqGFZLv53b7OzTyK9K8YRKNBxaB0sKUjdza4YjkOpsWEu/qG2iGZsKP8OhDi+kqGC9WyVVc2I2YYgZK1zrE/XY5KdTSKR1gLUTClOsI0iISHjYyVoEo5/3D44whdyYncRtEqvJvhnFCbhJmEWrMi5oFrjVK4rF5+DHqVqmaahX0U/SgCwAIfU/alLpouB/CkmkPSq05YYxJrimolQ5Txp5+OdhIv8XnQsAAK1XaXQVVRKu7tx0EkhC2MIOT9YgoiTCgJK+j30X2cZxQSRoQBDCHlDJI5AQAihbIIAL4IKKorITlryJuBAW4wviqCyCLDoqKIrKeITj1Ff90mnn8GfOkXNCfae/qrp1q+reus8wTIqg2Gt/PPdulbiFdGZx/plGm+I79bq9/6D7p6dnDOs2qcfkqe27dxqXMnYg1aRaZNSmBqSUQWSSMiJ7THx4+oT0jGlkGdGziSiGEqgGkUHil24iZUYOShuT7kuu1IiF4H8iqhkwqAmcEjhy+HDFHz7MgCNTHDWFo74Z09KnZKSN992dMf5xX/e0jMy0qWTR/+92sYEAt1eFa4NjjIsMrQhtDW324b/y7FBRaHOouHwuPgRDW8oXhHaEtoWCvrPZr7FCUWhXeQ4r7C1/KlTMPBi22VGez2rFoaLyJbzVqIqoquYR9cklWu+Et5BGrpIIOc874yhewqydwx/qzeH/6oNqQA2pkdmYmpCPE9jMaEEtOV4zULhy5ZMpycmzhgweDLUI/MclMKgVJeV06bDWaD1oysSZYyek+QZOzEyjIeljpo9Pm0Lhj/jWtuLbzcZfumEfqYptRpoG5QwpamzmUWnviEe3THlUIbaouUQlkWTV5ormlmaOYDr/rogc3WGth65ttSYribcqHiJIIS9sFFhffyIZhslKE72MYQXOPsEtaZo5VNLVy5hW4KejcWREgCn1MhFWVlJyNLzl0shIL6Ncb7mU3c/LRIa9KWZosZexrMCwcy3IiGQm+1MvE2UFStbVh7d5lFDNy0SHvVnMhNp5mZiwTRQzvmFepoqVdX7Ds4639RO8TNWwtwhmRi7xMrHhnUYzc2adl4mzAu1ONScjhpns97xMfHg/VZjp8o2XqWYFMgtWk1GVK5cU72USrMDCrj4yYplp5/My1a2sQ5lBRJBHndp6mRrhCCKYyfd7mZrhqPn+QJ9UfK4dLk4kN0F2LS+TGE5aHJc6u46XqWNlffbSZTLimSkp8DJ1rayl+39BOnNpfbSXqRdOZzVmfAO8TP3wOgnMlCz3Mg2sQGH3qigoe/vEyzQM26AEvngv0yicgFhmSlK8TGM3adwef4qgSdgGpZ402cv4wklTzFye42VuChe0KjObX/EyTcNlq85MySEv08wKjLqw1LE5c83LNA/bWFy2mQlepkV4p5HM+Jp6mZZhpgYzpbd7mVZW4JGEuthPHvXp6WWSnP1EoQtyWib3yVt4sHegy4g9lLui7rQ8q2/PAI3YYxJFx8QYRvh++/OlR+bs42UdI2o9POzjDc9USbmYmPh7YvPJB073n1HzMUWR6y2KxZ1KFGfEzzZ4zVvoVmO2kW0Ycwyay1cYX1MGzTMoz6D5BuUbtMCgVQZtYKNDBh02Ij40qIwNrZqf8iz5+fqx1EFPr7JNgAlf/15sfnjkiO0C9k/my5Ma+Vk6QKiBo9pVAjGP2dSwEuSW3Ow3G9z2oBaQW9JPfz/rD63izDa6S4cRutfOK3aTed/ZM4LrbLHB2gBkvPbBIr380jVtpl1Yqo+X1fGbT42P8rsASibcAKi0C4P09Y0/2s1PPC5+K4ypyCTjmTVrnOiHndugWZJqcNspAdXv/U3nJ95nQ37R3NIK4GCm1t1GXtBNN0/Rhd0P65O/BbR6u/eXrJGn77vjZ/1mw2dEHi/bpRUA3E0v+Ewf6H9Vtzv1skgTq7qA1yIyOI26WtutWgEMKVrLroM69fQSMYJk3XqVIGrOJ9oEBaAOZgYFwLb2WwdEwhkZUx8t162HV9MKoGZOid3Cekebbebb2C+keHPBr0nDtaQCQD24ZL8A2B7o31EknNFVzhwcceDEGf+6Evz7941aAfz93AU94eu9esOk6xzSfJEcpxaw68p1+33fZV08rcA++8QxbR5tesJudmK3VggCyzy0py8vfVI/uGSuSDVm9CsCsOyAjgdFrv3hVW0C7CjN1Oof8W/q1RnLNXqiwW3PS60h1WS7ioBXnu1hT6yRI3LQ03W0Anjf186GAuN9sIBUA0ctFdBj0SauZvtUrPF27zRbFuOtcr2A0i6EbIU877qSZT+csFqnRN8ibQbJRIoA1tbv+zaLbDM/USuAeuoerlCK7rRgjoYFpIILALhcvCpD9nj4hZ7OHrEYPy4KOPVIUva41KCULGrOSlt1WtBV8wBNXX5plgS+sOt6kdKbAGabKD+CgDxeNkMrgL19j/C2vpSSwAJS9fnyCQEvT7I1Hz+NNVZnHNWymNu0LnDjACADZRf/AMhrUnIpr5Fmt5lfKFJ99tIkAZxX/bcRe2zYtkqO1uKk185tODbtpcTQ5MbgpBWKVPAFAN83bd4qEotROnLinCRu5UQpkfnT0Q/R8VoAfyAT55GlA2QHkfeUOQCL/2vmN84pCH/x7JKN8K6uXAVqLB2AO0xWcQEzziosHSCuQLkATSbmLhAKS7iArYmGkvH4Ny0dV712Tq0EOPJmv9j9lUAMs8ftS3WBUDB3AVsTneJLHYcFvaFu3XpKwJjRlh9tBom88qGz/HNXvquhgJ6ABaSKvCdeQM2cLjYUIMUCAC6gAJewgHRWQ93VA490FsBRsMMaiEeqKOfiyVpvaSigzLCAVBFtDghodP95UYAUCwC4gAJcwgKSXudTglBaD1/ixMSzwz5zd5zEAi1INbToCwF8vfuhAPnHsZlaAXw/658aCsjk9ILVIhUPBAH8VtMzgqe54KdsKKoWlqED/l94gvn1tuer+bP8O7SuwvPosX0/69njGjpg7LK2fu6G7XrLlCS/2t04Uqd3buJHfJh8kAiYDOxLAgG40QZvmESxAECOoICcwQLyhkmEBT3LrZDl7+DHvriJmlYCPku2eX7DCWc+AAiFvblAKDSvC4RC87qAY8IhaO88DwDkVbC7cc9KIOYIwwUwpznhQkq5ASquDNStnioUyXMlKAAl6TYyPfXi4P/InWzihvht6Dlb4QbDtFm6fwdPxwHsYo1Idef2PgL4PuT71pA/zAGz0f3K74LrGyejGMo/sca7OmbTSWn+vO+WiVS4cgAQn/c0YPwuk8OjHtpzUMCxu85iGOivQmf5AbEIV7shQLrh25ZbdPV77xDNClPqSkbxtI+d8wuAvEhaXcBZdS4ilg5wlQHoPCeRfw+kIrWKx4TNmUhF1yBnGDSQfPHvEfDce2cgbcgVdZVWAJhX1e/dLR2T3nkdP6BmadWMJ3a/2Lk8eU6wQqFIeOE1TvC75by+tnGLJIZ/JbPFNbxCqgvgyW33WHSRz1AT5wHwzqEX7OWX9mm17fkf7Dd+PMoarWT7TeY9JpJfBmsEYETg+oR8sedOrQDw7MpPREmf0mNGjxZpYjEXHG36gDZBAahfk54TcHFwkb78ai+RAzrGaAXAbxg8Otl2gI3sQMqrFIBHIprHxtjFq9KsSCztMpDl6Vz5q8UmEshDOajQhjzDgzzTbe61IO9NpDis/VbvIGYGPxOCmLt3bi8tNvHOlNLePPwjB4CCvZkSvcmpOrvvLCDvu8G66qcv7TW/bZnM2VxXrDileO4WYztcvmCdz8tsSMXJEsCNxa9AI1gRK34FcIcVpPI7xOamKUhl7/sUjg0AH0W5aep8PlCjuGbo6lBpKxliLuDOw9H+34mH1AvA+ZIC84MDy/Jt/DTeStKLkPQOh4HeFXWk2AXs8QYPdNC8Y1HjH9haAYxdNkG6ZAi/oGEByT7qVQJoOQvxqtr8KvSiAHnsAqSe/oj/7ua/j9iI3QLwxWljvqLQsIAUby6AKV4InC65ueQCdYGo4VS4QChcoC4QCq5cIBQS4ALeNrFyB+cmBQBFJzl1fEU5NG4jlmTi2Y15ZOKXiguYIZMbpBLAhYmrDoCP0xVZj1/K3OSfiGwy7w2tAHDaxy67ZG/8oD9uOX6ed9Psw1mZDPjHA1YOGoB6statAgaOStCv/7hcpHgDWFH3Pb4M20kTwQJSYnQBTIn+Cw==(/figma)--&gt;"></span><img src="/Media/2578/figma-icon.png" alt=""><img src="/Media/2578/figma-icon.png" alt=""><a rel="noopener" href="https://www.figma.com/file/uqLxFdKZVVLNYDClqMf7pm/%D0%94%D0%B2%D0%B0-%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82%D0%B0-%D0%BE%D0%B1%D1%89%D0%B5%D0%B3%D0%BE-%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F?node-id=0%3A1" target="_blank" title="Два варианта общего визуального решения" data-anchor="?node-id=0%3A1"><span>Два варианта общего визуального решения </span></a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/878f22f64555d594bfa6996f701030f0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/7332e1e563f64189a2e7fbb86c8ce785"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2604/new-design-mobile-desktop.png"
         alt=""
         itemprop="">


        <figcaption>
            Макеты мобильной и декстопной версии нового сайта «Уралпромбанка»
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/6fb4b97ae2a006946dd874d3950bee10"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b1e19f525a1e4bb3aea3e941dca3b5f1"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Разработка</h2>
<p>Новый сайт «Уралпромбанка» разработан на&nbsp;Umbraco. Это&nbsp;бесплатная CMS&nbsp;с&nbsp;удобной административной панелью и&nbsp;большим сообществом поддержки. Она&nbsp;постоянно развивается, в&nbsp;открытом доступе есть огромное количество модулей для&nbsp;оптимизации.</p>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/d4d6854048b0830aa69a85758585aba2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/7de844fc4d884c04a69d599b983dc2cb"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2608/technologies-2.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium legend legend-flex spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ef20a15aa640439786d34b76db206dde"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span data-metadata="&lt;!--(figmeta)eyJmaWxlS2V5IjoiOEYzS1BadWVuVEJwRHFzNEM4ajJpTiIsInBhc3RlSUQiOjIwMjkyNDYxOTAsImRhdGFUeXBlIjoic2NlbmUifQo=(/figmeta)--&gt;"></span><span data-buffer="&lt;!--(figma)ZmlnLWtpd2kKAAAApycAALV8e7gkSVVnRFbVffTt7nk/QURERESdFzMDIpKVlXUr+1ZV5mRW1e1uR4q6VVn35nS9qKy63XdEBBwVR95PF1kWWVYR2REVEVlUZFlERERERURERNfddd2Xu+u67uN3TkQ+6t4ev/1n5/vmxokTESdOnDjnxIkTWf2YbIRx3NsPW0ezUIhrzrlOsxu0TL8l8F/Trdhdq2Y2t+0AVdkObD9XN7i33awALgTOdtOsAyoGrQt1G0CJgW5gE6017suUu8GO43V9u+6aNHK96bac6oVuUHPb9Uq37W37ZoXGb2iwW3GbVN9M6r5d9e2gBtSpwLKbdhdor9Z9oG37F4DcyiN926sT8nTFqVZRnrHqjt1sdcs+ZrfMgHg7a16JYiznPGBBnaXZ70MsQPm2Wem6TSYhuLLrOy3iRjang9A76MUhulloatm0GnRquB0G5W40GUSTfX85oj5Nt3nR9l00CLfC7URByf02NNpAiYprtRvgD6C0zGbHDAAZ277b9gAUqr7ZoH7FsuvWbbPZdT3bN1uO2wSy1LGtlusDWiM5o1yvO0x2w67XHS8gcNNHJ2wg79Ap395u102/67n1C9tMZAtTNSt2BYLL+p1u2eeJpTNB3bEIcTa40Ci7tNvXOE1M1mTstUHLsXZIVNcFNdOzu7tOq9bVY6+33GYTNJnBGyzSrHLdtXZQu3HXqWyzltwEWg1a6c0Nu+KYAG6pOdu1Ov6n5luDg94s3I0WB63wykKJ7nTwQNv0bbSKbJUSgxsuK6bR8h1eBzQL1UJarbi7tODi1RZc8kzfrNehotCiRtfX86+tout2lbDrdnO7WzFbZtnkyTeoDmVsU2WTKlWHqZ5i2K1XbJLBVnkUTgYN6ADk4ZlB0G3VwMs26TUsz2+wNcmK6e/YxKjRaNdbjtLmAm0s9q3c9qmpaLl1N62VWFw8Zi2AZjLEqoARFReiRn1DDUmqm9BZv24S7VOBW211mQZqWzXTr6Q1tiLbt9V+n7HPW/V2oLTvbI3Xe01gttqpSl7LswC4rt5uOE03cFo0xfVeL5ro/VsP3LpDGyUg04oD3cdsxCowMkVRyfKALQAkFPaKdBe4QopDJ73tRadh8spKsMdzDoA1Zww/F/R7o1AJHY7Kt1sWy7vq0PIkNoonaakNK9jDYdjXjBYd6K8PN2VCc9AoKr7rZVVZdWFN2MBmBYrdJr6MsmntrKIKpLgWO401F2rlKJ8p2h4MGaWsu7sMgIWW4iGAItS7lumRKyhmNWiSb7GjKRHRStifznuLaDrBmMSdYGZsK8QJWGK5zo6dKZnRXI73wnl7Ei1ijPFNWobwnPN2PQAgwREcKcnFsKaTeDHPbRo2E3hB7cyubJjkPQ3MoUVaCCyTF1CsgmKlq0aUdIV7rwWL+fRSaI6i/QkGpMQEfIrDR4B02y0NGqqz1ZtBeZP1YSm82zJ1Aobp++4uqxAtoqCq9gNtpw4PDesFsqjVhOyyriWYeIUUtZZ3POtq8nPTiBht4ARgPst2xyaCMuHDKE+no7A3cWdhshfFdlPZAlaFYQG8DGAZtMst32TYOM8mwqrBsqhN59HD08miN8Jw7WRyoobaMFPGuTYcbtVhdrPRnXC+iKDlhHM9NOWGlt1Wy20AMhrTZRxay3k8ncPkK3bVhHdBg7B8N4BSOz5gaV+wScuhCagZOPh5Ks/EUuBtLGgT6kWPPUwJheXUAa01yGfRkHVIHDEDoI1UnFzd7MCupvNGNJ8TA6nC8iaglAzAxuF74DVbpFFGpRcfKNM1LHh6oESmb5LNW6ln0WtuAyXOeTaVMuhQYXgVigAK9pXZdL44rtIFnE9wmohOtN6KBIHTieeXCaJm0zqAMeq9o+lysT2PBopIUWl5TuIZg4ZS+kI2xustFuF8gib0cjxWWHhB9oaS93O5mPphHD0M0qmImB2WTMqHTCFYydEoDEK9KOyJH7jax7Rsk7ZeWlAbpQQIo3BONS3yyYWW3fBc3+QQqpiQgZQWYSqiE64aoEwcLabu9S+p/UmZrcHJXYTYmAOJMwYRAsOqNysspjshNiUrowztIVMGXOAB1nQJhuZ63NrjjYM8tdQLZrtFMVcxR6rEpM4t40U0PELT41LxTMvuwsZV/Kc4CNRusB8DEvFe4Fy0uy0XroPlsYKA8mCznIaHwAk1akEftXhvGkfkIxAiAqX5FGYZUm6rEBPSn8BO0EdtQCkRK+zP9rGtXYrQUZdtn4VaxoGDsmDVXQ5Fig5Jq5cjcdptdmE83E2YVZDptpyGDT+Lumy4CPG7LA5DwaqhgFE1ChEAF1UDTj3qVlI1jq3W0MvD8kmPEdUzqxsV39xGuYm2HftCMuwUqh1XBZNbrXlvokSheLwd/h+hWKsLD4mTQMcSouIEEE3HBiiruAegNBCQIpCs+m4ajRVyqMRTFnM45RNLOUzqFNe8dlBTOE1sPcMktDYylCK1mSFSSqfoDqBwmtJWhkkonc5QitKZDJFSOqsYxTagU0LsmhVkQu/aFawied0KLqV6Pc+ksZroDXlcQvPGPFKRvCmPSineDC/gWF1qQ+0WhCm46JlNOAdW5VsRiLoIXDLMbXYvhuarHd/A3dBqlx0LDYJIJxWJoDFXNciCVcyHEaTtaVOR+q1gSmrsCm5NOb+0vh7059PRqBLNlZ2Bjlbcf8B1YdHsWtRYGOmCTCwcwKoXIdrt8x7cs3IPFijQOc81ud2G/5RGjMslJgO8LuRoisOaQYRZI5yGsjgXm0Lu44+xhz+FHv4U1YGJwVdQk0f4Y/hAoXeGuIw/hQP8KTKlYDGdYUCfYHFeyJl2OOhgNHqLeXRFyLXxHXegLsd33InCGN9xF4rC+E5CFsd3ErI0vpOQa15vjqPAmQxCjDP2l9FAdHJEt5KAEo2HvdEyxBi55ODydmFUIaVmbxwKWRj2xtHoCP1lTKcMAANEFnF/Hs0WqBWob6c3j3oYshyH86hfjfaXc4gW54q+FwlogsOnvMSFijMNgHma1aHBrNeHnq2M9RDTuNhPfTJKXN30VeIqBKq0ubTAPAVEkLgvM4wjHhrG+5sfbfVmMfQrGwKT4MuFRNFNKoZnI9An1gtAdNMaRY3IThBYAgqL3Qa4lqPvJXLPs4WoEn8RXOLcB8D8BCxkbE7ay4FOs/ZLxKnsc6thb8EC/nPp4W6BJmHd5XEXzYVheQHhC8QNSmYQZUnnNNYCp0nR1brrV5ooN8yqT+2blSb7h1PNdoNY2kIMSPf60ziEaElnKqo8S8EhymtwXaHyWtPkePQ6S5XX+xaXNwSqfqPf4cvuTWSYKG8OdjkjdIsV7FJ5KzaH8LdZFicUbg9UPPCEmsM5nyfqo/hrXL9J/D2JhILya3Hk0FY+udLiW9DXVesmreMpjW2fzsyvD6BrKJ+KAJfm/4Yq4jGUT6up8htrat6nt1T9mx5Q5TM8VX4zBe0on1mvlqn+La7H5bf6LS6/zVPj7/B2miSnO+twHyjvQkl83u236lS/ByXVn2WW/Q7Ke81yh+r3oSS+7+8oOs/ugCGUzynXd2l/vh0l9XsuSur3HeZOjdbxPOscX0a+06qyITzf8rhuWm2f+pVx+lLdgnOjslJV9O0qrrAoqyjvQrmN8m6UNUxL8zkoif65mloPZtsmfuo19xzpDWIvDpuaDs52lO457777UXrnvPuJzgPnvGffgdI/591xD8qgfq5B41rIHVH/Ng4a2pcOJYxQ7qIkPs43dhqEv9Csc6xzsdneaaH8LgQoxNeDKAOU392BwFG+wAtahO+iJPwL/R2f6j3fq1G557fLtO/9ALEcykFL8RG2mhxVD7FNtH/7HeQ/UB50VHvUUet+qLPD+nKp47d8lCOUd6EcBwE8rxATlFSforwb5QzlPShfhPJZKOco70UZo7wP5QIlyWmJ8tkoD4MAPluIyyiJ3hWURO8IJdF7GCXR+x6URO/FKIne96Ikei9BSfS+DyXRe6kMgruI4Muk1WEOX04Akfx+AojmIwQQ0R8ggKj+IAFE9ocIILqvIIAI/zABRPlRAMzqjxBAlF9JAFF+FQFE+dUEEOXXEECUX0sAUX4dAUT59QQQ5TcQQJTfCIB5fhMBRPnNBBDltxBAlH+UAKL8jwggym8lgCj/GAFE+W0EEOV/TABRfjuAu4nyPyGAKL+DAKL84wQQ5XcSQJT/KQFE+V0EEOV/RgBR/gkCiPJPEkCU3w3gHqL8UwQQ5fcQQJR/mgCi/F4CiPI/J4AoP0YAUf4ZAojy+wggyj9LAFH+OQDPIso/TwBRfj8BRPkXCCDKHyCAKP8iAUT5gwQQ5V8igCh/iACi/C8IIMofBnAvUf5lAojyrxBAlH+VAKL8EQKI8q8RQJQ/SgBR/pcEEOWPEUCU/xUBRPnjAO4jyr9OAFH+BAFE+TcIIMqfJIAo/yYBRPlTBBDl3yKAKH+aAKL82wQQ5c8AuJ8o/w4BRPmzBBDl3yWAKH+OAKL8ewQQ5d8ngCj/AQFE+fMEEOU/JIAofwEAu6g/IoAof5EAovzHBBDlLxFAlP+EAKL8ZQKI8p8SQJS/QgBR/jMCiPJX5fFUBUKrBY5rcZeQSYhlUEzZ6M1mFORIYzifjiksW0zx1yiPpntCyr2jRRiLglQ5EmEU8GxxQPUJRWSIvwa9RY/7riP6ika4M1oUNJqDh3BJFnJjQXMjnIsPeoPp5RigcRDtH+AWfoDwDgHjIFz0ohGgYgiWY4olEDge4pYeIscBeG0RjjkppprWD6M93Pr6BG9wNlhNq1+jhHHq/++UfQRG8x7Wtik29+ZEc4KZUTvFzAjjOpbztUL2SRCIno0pBZILirMLh1Ec7SGokqKIQifxz4pSjIA7Fi+Qa6A9iYfT+Vi8UKxHLPQXiw0GWgcIkifE+YvFZm8CHG4ODrUAca1CIKxD1ImtWRfXoZ7PWl8vTs2nuGegCzjZiqkBwOkhi88iZvWuvUScmdFaqtwChy7OhuPpQ5EFMh4SmZDiuryGIsQGJFmBBgijdCk8EkMhh8DWo0lYC0k0oG8QphLthyBcQAiPmoor56JIlV3VsYQEL2ocojKLRqGHt7VWbx9LkQQ2aVnQuER9OW+pJj/bP+hRrB3OY/SQaY0ncirErhET7B6Gc6TPwlYP0hd/IWVhxDk1Ts1cxJ4gvz4C9zFOFlnaHx3NDmIcKXJtkObIYxwocl0N62BCoMDhxhDMp9J4RMrNYW802kOupoqGWAzlqQOoxRzEL5WnVzDBo1JuoQbolYY8vZgvJ32mj6vgXF+VSuKMxoeDVJ5nazk6wijuIa81iMWDuDHNR1h9cr0qHCT9ED2WkMXSSxPGOnReXQAuCnk5Gizo3mdQ2wUABQLS2YpUM+M+rm+orQ+jebywEvFi3SXocL6+tk0yE8Zafzoe98CY9g3ZZe+iUFsBruAyhpAOCx9TnSTeGxxqs1urpBsgDGOO6yuWLGVGyVC3XBa/UTjkSjNcXJ7OLyUsTGBVvREmG/CMCSMndYL8IjKsWIYkYcaiI2VwNN6bjjT5mCuYF+5SwQmRmAgYuLuSCQdkYlWsBm4Agk3IJi7XMHij5Aw4RCC4Z8G+tsMJOR6sU80lp3nKsoJ75SFZ/Xi5IH7Z2FVPY7UnKlo3jQAyxaKZUT8chriMQ6jG5jAahTswW5hMzI28IkOPrPXg6XGnJhF4YFGzHSMQksXkXCiNIrjG+RGtrTUNlnt0F99DN0KIK5L0YDadQH3UROvLyXBEyWvKXeYpbkRxO2kKB0KKTcW1lYxv9GJohVpqoZ9gFVU5W+6NovgAxGhe4rY1bYW9cT3jjiYxjk9ScHA+koq5WDTJLljQqo3CVNeJlDsMLoNTSF13ps2Cd19hYVX6V6fbuev/iTKndYLchiRDFGn1siiMDT5nbiRO4Lr5nBkO43ABxS7Me4NoSYdSMTtwSijSA2ctns3D3gA91uOD6WXIGkdlOYQEB6SF6L7RopOIbdaZDKfQL56vKeRgqRQUgw0PR8qUGirhYdRPHlGSRBjdlPihR1q4u/Jt3mAccmOUQ0G9oAb6yckEK9CDLWu3y9GRPDYJnB5VEO5Cb7UlYzVYujPAfkTDCN4DiotRiuZ7cdq6kCGctqfdUIsI4CkbnHC+QyBDmaQzJcFpi0G1JKlZQAIP60h6FnU17VzSiKQ/3rOabb4lrmsGyjgS9ufks50swY5Z0lVT/r2LHDeyHMg+Ig2pXzHlCQJqDelI3IKdSjd5Nj/Z3YSiwbeSlhnGXopmKu+HKDOUlShUs4egiGXIvfCKYHaQhOE8k0C+Vr/7y2CXMz8GlfSlDnfAMy4nbvlxomgj0povAgRYMNIYzideDodII8J4OU7hCe4QSDnCFFTEeigK8eE+WTwf/dhEVBGxkn5+GPqMmrtc0AFFkQDa4WwgUxy37gRZQgnVPtyvTud9WB+9wcKDXIqB3ljGobkXT0fLRVim9RJyUzPY2dYzCMOpdpu2rbOxZn3XvBAAkHU++ukVDqtYENv3CA5QhAHfmZpbYbIcBzBUCC8WOH+1cSLQjBU2INXFyba/hDua69p6X8t+Y0ZeCk9894rNbXhgbBoHRJhEpqTSs96DM0GHyzBfiJc/G9oQcAwrZ7A67uBScO4GBLaIeUo0KgWiB2wUyEr67g5hDP0BTsGuVtXjcxE5HNcnqKRfG9fgOuCmmV7ubFFzKdeYHEX6QEmOI+qALcEiaYvBfUwYPQSPy1meEmOyo0rnzuGroJwQFeixntHeYAl4W+vu1mzYT82pV7puFa+y1Iw0KN5H1DdQ0pz30zkRbUFk5mQfMsOlAS4yVzUiPKPN/cSbFpRXriOowtjlPAI/chDFs1HviHV0CxciVWWVBLfeaLkf6bO8MOMK5IZhKozFgEtqWR63+eGoh4jvQA0ozhipBoxxzYChAISR8MYCLERxJRyFCBChckVrCnYp3Gj06C6D3Un2Vr8RkmtDYWj/pd0ZoGLisUopDXsymFGwD75DDdLRAGYoZkn2Br53rCb7HHQ+HQwANjfyaBS0IdddmQqGoYvqS6IKAFE7nhecSgXv93ghgiNhVUOmL0GpLwaT1001tBEp5jBNDCRR+QLcWWYkaW/sG1wBlAzT2PWyu6tMG/pu6tVLHTA0poehPvWmo8EO7xDiNChrNVVEYzca7IfQUsyNA8dAfAnpDEg69iDCdMq8jApedbebIC52a0jRl13Tp2n5Gz5EuxNsqfGWxJI54FSXnmfNDhCyizVhMKCQ985gO8lTyp4o5Kqqw30LmvWU4CNSoe6f9Fg1S1Qq1LMzP7WmQdXwHAQfl1iZ1hWk0N+eXWE3NKganouRaVCxmVZU43f04V0XAE4xoJDPi8nTXcQFFKVCfSccfnrpxVVIV1Tj8wdwG/BvkPFEbMozuarqYPb4WwdaHNg+m9VUczk71+wJhcy0uGtOIFVna4wzAu3XUqlQlZAPBihR/mi57iRWdbdppBO76mBCz+tXEKpTNZveVdKEYG84gVSdt3HxyTuhG/N11aWWu0bdlMCqyYGG9PbnvdkBKQl2Y1PcfAylOp5Lscm716a45ThOdd0hr+nAqOZ8w0HHW1cxqlt9HGGX6hEKdLkNha6p5kYMD3Ep1Pf/TXF7vq66NBew7xaCpEuYG12ekK+rLu5B+skTNgMkOHR4onji1fBqiIcaJjKREJqIJ4mvyVVVhwcUxurNxJPFk9KKavRVnT/oeor42qymmgNikWnVUgbE08STr4JWA1ppSyf5/Orp4utOIFXnNuEteANxs3hKAqumDlVzt+RbxdevYlS33b3j35k9VTz1OE51PX+o584ECMF+w0ms6n5hGI1GHtVjZPzl07Kqar+I3hCVQlGPb8wjVJ/vIhvRyYeBeHpWU80Pkm43YdrINH1TAqum7+bF0qn5CimekVRU2wtCvjLFSKLLb9awaunC/w4QhvDHZNAp8UzxzGMo1fGFyt6DJH79kJTfsopS/Xo0s8kuKIYNivvFt65iVLc9RAhTFUTGSIHLb8vVVY++SmHQIvBeIe7Iqqp9ENNBhsN4XdypQdUQZm7E0rHkXcdQquOQNmg7nI7DxfwIOXZ5dx6h+uyrLUqQ1OueVZTqdwD7119wPU9EaUU1PsR17UFgxZfyddVlxCivN6DgC13G+brqMqGTEY6fUyXTpKLaZjHHZSQdPNyIF2VV1T4fUpqkAUdciWJ293DM8Qmk6ryYq42aVuG3pEAKOK2qDodq48vgUAk1GY/el5lxC1g4OzZgURZXGHkOqVX6aqwijmIVATOXWdD8dikejmKF9VRCg8iC6vcASgfksyYvHqh8kGqhBVOK4Hvz3Tsq+Mb5/xKyGE6wTnBwjcfTSZ1ud7RAzPF9K61g/8pi2UOom/V4KSd3dResuT8PyVkgXMr3elm+Vw26ACuCt8h3eXm+izvHHsPpSbwO5tDBCOd8OLgYzqdoeiTf1NRfV6gvOw7whniyUWuXeAgPiydbqzhCiHUxwnNjrhlOPhYTeJAczktC1xkeIkntsISPSPmohO/T+RGK5GCJHbxLzpB04FRFgAMxi5dfmTVkasO2CPN8lYQDRDjTG1EYgdW+Okn64XRWm8hEXqOzdJUQoo9mNDN29bWSsqEII3HsTmf1cIjdy+ID2NLrVjr45E2P9Xh91qM8XSym46tQecPxPlcj9MasU9YSUZQxQ2CIUAOLe9PxPi0cPqtd3kzSIhPDCmPoIjxODycB2ddbpNJt6K/KvsF+ITvW/HdImAS66l3h+P3dEs+1Ga6FDUAK6605VCXLZv2YDHvpl2UeHnMhZ1w1s0+8fLzi9pnpYDydLpAtI2f1DhlNDqBW9F4yCpQvxna9PUEH7DCzhncmDS3YWIb+yQRts3vJGt6dNvDRlTX8VNJA50aGfk+CzvFTpW+6iA20/5KM4rRJSLxVw+twY4L5cRkTxHL4mMSzNFdX9e5X5TJJpUIMeaf0LokLKTYlscEBXrExEpJ01Z3sIg5iKLh2Sz+ttzSgOXLb+QmJxF2uKXOUH5d4z47iVR/5mAxZbiRUM0YehwDgfwY9g+kQgRC40qSAfh/QzemkPRvgyNYkflazCZWDfvS5N1pFCy/i/QyH0wBL+HmJ9BUU8SAaDcBWJTqEa6C84/tzyuXB4YXzQ7zCEV1M8QtEaIJdRCOL9xxe0jMUfYy7JX6R9F95C53xfEzieT1mImni45MSUQh7DrCFsS10F3W8tWfTt6JxiLACOvrhfM9GDxX8zxb1yxKVpCVnDL8iByEOrAnXcX/BhiFIwYCPyL3UhanYDQ5d/pq8qtKV065QvI/Knk68fEriLR/iWj276hwEdbRmlKB6EywV5waqvLoPSjz4Tw+Zk8Qvc8P7JJRCN1AKZQHCSQfs1a8nbRk7TrZo7C6U7UQPM8uXfkCK31BnguZtC9JfQL/a2N36Ctfr4jelytrQisRnpPwUXtT34e0G7sRtVdXncrFYyN9K8cPhSsOnczsYHEyXo0EwxmFi8gMv6elvy5gCChVePB9zcDW7WOi4CZv4O6oJzHHInjV8VjUghYGAqip+V1VVrI3651gc8Cqc6+iI30teWLC7lEr4/aTODucPoMHaHVP3LfF5GJd1Fzj9w6RfOOhoAW0hO6MERBuV5ro+K+UfgQzYh17Og+WMbFm7KXJNJp2X5HkpgPiiYleHWTBIWlRV/HFGINYUHofAl2T6Oirebog/kZfCo9Y82t+HBb/NEF8G/wGZ/jY0YYb+f5pZZE5xYvF6Q35FHk5hovYhVu8dzHEfwxL/DNqCvHP7cTzkVxX/3hw7Oj9K+f/zFTRvr7MIxzFCxr9QTXrFuabni3+tm8gR6aFgmz7o/UvVonfd573dFP9mBasOc6D/rSRVp3CN4upyiAXA+8BnYqF4AP13ahTPwtMH4WiI2PavdFBShyhj8Wkp/z111JLzcIxD9Y46lOtEoEfCf4Uh/1qS7dQRG/LWP2qI/8DJs2Nvn2+V4j/SAXDsd5unxX+ifSaPSYcaLAPqKP5zhrPhbID5LxkGzOmz7UtS/E2G59EI+nDN/68ZFuMV7r+p2cnItWVsiv+eWgYGI5/9Tin/NlMO4GBpk31OCoofNcT/WO2OF8B3Sfl3Eq0c8NmT5biKCxnkLh4xxP+UsGFYhrVqTn+f8WZBwXEKMP0Ydib/V+JGr/Ik/DYp/nc2lASY5kq/KMX/kaNjyc4vI8ZHxluxRhQS1n7QEC8zlvHJV5OXG33sG94X+pfqCOmWlJ9+uSG+nz/64ACadjNGEC4fMeizm/6BiwACrghKD06nWD1ifcAg9gPGZc6oNtBvgNnF30nMrHBsXrH4Wyl/yBhBcZLYYhP6pHp4Wtca4WSpTOOlhvxh8KdFSe2VcBhDU+Sjq2hEFrH4ayl/ZBVtxjH0fIxaDEWUr8SbBiwgOVZo9pp4lRGO98JBhdh9hyFerfr4ITY9Di9SWHsFK3uNgUvHQSMcROr7kC8Y4rWa7eAIVjcIyGRgguJ1ObSlfmO3Di+jkBW103hlxx01+QneX0rxBt1uQbzhwARBMmPxFSneaCA0GSBswikLdDbPmyDFCTwNwovwMvP0TkO82VhAR8rRIOqAfawRc79Fp7krV5ubMu4QEuIDykNA1dg7ATQay9EioneQEG8RM2HgXWUxj3C8/ZWUcrXRRssRSF1iXc/eRaz8XmCL8A5BTqIahaMBpoDeDzEtnscfno73orCqv7ehlBCGF1aGZ1uJiZKBeqq/kcfmqtBcayodP1HUYBXY9N6ok4woYPnZ1XBLFJEpzYY7NLZEDgE+RKytUFckjALl3BSMxwqSu6q8AtzQLVPV8LS3MrhFJOnZmb94Fvp9TiaPvob6+ZNld+klFoiC2jybrAfN6hdX+odUgl+YUUrVKTW71XcqBWuFYJTWtqYSjZ6CuMubn+K0ZFr6nV8ENv0EXv2IP2OYfiOq+SkwshvYdbw1cmvxJGmcOuzMyItA8HieUQAYXUCgUCuAWmXz44glbOpMozTv+TERejDTf4/djeA1gSwq6jHcqCzFPDXCNcahFft63PeJs60Lno0XR4c/dReWR7sg9RfghhXQK2XhnNkx0z7FWqtBm1k6F7Cg1rbpX594gFDr3oVWjZEb2/R6txkw+lSw6/Dz3daOS7/vAHTabweEOeOQAcJ727mDRdDvXNAok8YKdjlpNKB7McIkGJWJkFuyh3icwxvinmkklq/MJxZb0mhBfevwykQYr5YjgNAUUNtbjhBBsFhfjdfxCL4IARrJrx4ehiN04c/Nmks40TlqRUVpos4vg5yUuoW+Fs/eVxltlLMJRNH1K7av3vTazawinWbF5l+cGk23W1e/RijUE9J4eq2bLEWhxyR9ZEolwWTfu7AsVRiIFUdk8BJMwczeiIWqhhgeVa6+0Kbjbe4LN5PRaQGNCxzWmaJWbmoQX9qQu6gV4DhbCBt07Fq8Sjhayi4U2ZVwLeXFZJLCOJN1a0K1sYVYVIZroSuSJ0aGyXOxkjopZn2yCXNcXPVaQ59vUKiCdiZzjr6GSDDqZryBUIVuaXR1OHbH2zx5VzyVTYiTDlFc7iK+pfit4gJC7XhZPA3Vm/dUB1zJVKLiTCokGEYutMNZpF0Ibsm5rEj20g3PqHelgkO2Dz0r7dgXktdfKOhOE36vy7/yc+t1/nxIni+757vqyd7wgntQFGDsLavW9fi3UsWdbK/5xCQXFIuSxDYxVs/1VuhgDUyrG45hqE9DOX2JPTVsmJuKWYzTuime99sMGYtogUAZ7C+S741VQ/EyXxaxjwdJMLwWEqEWJkL7etrfGcMX1hDuArsxxLZgG/O4zdl8mmRLTqmIFw9cED/qW1hPTp6n61gANi8NU4yNJXMjEzbJJSXECquDi1flqHQVjtZWe+7qlR5fUrLujQ7YoeslTL/fmxz2YopHk7D4QRyaSA2NNNtQNoPrlZCUkZ56C2rQttqOIv+LCkRKRVXPEFK1M9H6tN/j9VwURg4dwKew5tJXwA8ep2iNov4lIQ3UECnNWGUxPmDl9hIVlcYE6oP+OrWUar3RwqZAm3DYKXsTkr9bBKRnkAfTRTybLnTViC/3ZhpO1D4drPatNFU13esfIoAdVTbnZA5PtxX1sDKOnhme5xbOAFlnUYKsY3g8BKg4ICBLYw+eL8ALRUgxC6bTs8fiMQPnVeoXstyuMKquv6ut07c7th+QGUrkzPm08TB6D/Fl8snG+hQOjCd7H86mSXg5rRgneKwQjwVAyWqAwVqiuKZ6OpNmePnYErCoQcrczxkCJ0WMtDl2nm95dEknqutOhl6k35OUYqrxLPL4tAl7wQodcBcndHLoIn97Ij5oQMQrAvAYLwr0IzzHVD9SFmbZ9RWICK/RcFqqYqwO3QmPhnRHhROdMRVQpyv0PgRArwjwQOMwXvTGM1QKAa0E1wRKnsBG4hX2JF6JFskOKeri/diBk+gAZPBG8SEDfi1Hvggdgean9At7q5uW6I2D2OMKbMmIuX9qKYVkaSqRDLU4OTVxdBVGg5QjTVQzgQdhRA0rTLIBI9OYuYJSFCfUqiRLRRJKs4ZBqbxi8WFDrqMNwb36eIzCPfazskNhQhbz4/LGRy0y2rhIwarQpY0jE4OJsHHLsZue7owZDX0SFvr6PasYkbNUB3aJPCB7yndBhcfs6H7CEOtx4r6QWtqY7mGiQ/Ar1uXmIIR3DpuK5ikYAGyC3Vks3m3ILSWqxIXF4j0G/Xhi1eHE4r2GPIOp5uB2S5xl2Sd9akr7YQjXrOC9qzgdDO+IaxdJl4R8hSQGP3LdDLVs8/EuaMjr+zlpf9QQNxyuyPljhrgRrnoXiXLarZvoh0lVBDIBdg3KIMXNOTtM7DkWHzDkLQEkgci8Nzt4YBnyjTnWIUlTe3G8ocEsoKSE0EPTmQ25N4KgOdLX6ouNtPjI8UO1XnRSe6eO2BZ0cM6ZIQP65vUgUdpwuQDeD8c9XIqR14xBx4DocIQDz9XCAhAJf10UMVGZrgslbCK2sjyf9gZ9CB62tqpSq5x8CmbBVMSnYbKJQI0n0A7Bpcj8WANbwAAnCPTCkTKVRXCsNTgWHzdkiUUgHpZrlA7ojbSWrff6SJnEoig2YsoSBunldjOpt2ja54hTSd1C2gqrYfRzxRZ/GggWSuI0g1rAiB+5iiw0eT0QPKsm9npHI8gBiGvilW2lFMknDHltbiHpDn7SENcNQamj7uJY7/VM3cHWQA9gtkfuchFHg9Ce9EewEIS35BuwZTdwRw8ihGV3xI1IzyMkh/6N4FJG7clgGlDeSnzWkDczyg9zqFv2kk2LxWcMeSuMUtl/EL5oGUJX9f1tXdzG85RxvPYPgukSKfAqGFZLv53b7OzTyK9K8YRKNBxaB0sKUjdza4YjkOpsWEu/qG2iGZsKP8OhDi+kqGC9WyVVc2I2YYgZK1zrE/XY5KdTSKR1gLUTClOsI0iISHjYyVoEo5/3D44whdyYncRtEqvJvhnFCbhJmEWrMi5oFrjVK4rF5+DHqVqmaahX0U/SgCwAIfU/alLpouB/CkmkPSq05YYxJrimolQ5Txp5+OdhIv8XtRYAAL1ZaXgVVbY9VTmpMAYkIcxwCfMok4hw61QQcGCGIN1tO0U6rSiziKDkmjCKA5MDoC1GERAFREVBCDEoIJN0GB6IgKCIIoiiSCPQ6Ftr101RvE+/7733o/k+WItaZ59xn332OdeybJWgyh08MH9GhfKPqyPTH1dFFZM73NC2R99bH8weNuD6EV1HPtCuS4f72gzurVJUqrIqqxpKa0spW2krsevwQQ8OzR42WjlWqUeVUqVVRVVJKUtJvaqu0nZi36x7siOtL5coR8AfgQoWDVLI28S2b9tW8pcfHmJFtlSUzopuHjY6e9SwrCGRPsOGjIt0yRo2JusB5aj/e7XTLXQw4XBZVm2hj+UTi2dHduYWryheJf++VVy4c0LxmuJ3I8Wrd+YVf1BcWLx255PFq4BvQ15bvLpj5Mvc11r2zh7dPNI5s2/L3t0GNI/0yoxk9uvZPNJl1LgRo4f3HTW8eaR71piszEGjBo8Y3TyS2Tkzs3mkf3bWoNEtMRlJJf0uO1UpPVmpDv4AHld3zZIxPK4yUsqrZBlI5Yn4UC0P/1SnVEPVVLXs2qqOimCKG6iGGI89Pr1u3fG2ZY0vU7o0CyXwHyyRpRqpxhMzrplvNUGfxg4emhXpPXxMlrp++JC/qfgXfmghH5pa/+mpsAein3/8x/r//kn4H+Ptn33Pg0OyRl0x5JJvra2tFiarZCUSEyw1sf/q2vYUtXlVwr1vjbpXcwKTJihVlKicmnDLSZvH3AH5plMJE80180NyTcdAnrxycxrkuf0TJl0pG2egcm7BckkDCUpzZVFnrHB0JsZqT1C5mWHFcnI+r+9gO1HZG1ZsJxaZ3Ax+bOO/eWElwYlV12nK0vYklZEYVrSTM6TgZ9Y2SR3pElYSg9omqaLpYcWJ15YIJWNPWElyYgOONlCWY09WR5LDSqm4kgQlv21YKe3ktL9jjbJKQcnoE1bKOLEpJ69SVmkokRFhpawT25Veg7MzWeU+HVbKxWenDJQjC8JKeSe24WxjZZWForaElWQn5+D5X5VVDsrp42GlQtzGwcqVSgorFePjKQ9FVQsrV8VtkqHMbBZWKsV7raE0dsNKSnwV2E5xz7CSGm+nApRWd4aVyk4s45raXJ8pquLIsJIWXx/2bcSEsFIl3rcyUNSzYaVqXKkIZebisFLNyWnoIDpaUOa+GVaqx+f6Klucv+RzzfjnSnaeUo4olq/UcmIXYvcpK4Wueyqs1HZij3eOKCuVrjs1rNRxcgYmt8ApAyVjV1iJOONNmX3s2CSVf0U7dZ2cxq1LKSuNSqOwku7E7j7WV1lVoEQeDiv1nFibUs2VVZXKxrBS34l1fQJKNbhHxA4rDeI9qATlSMWw0jA+0upQWpmw0siJ/ZJZT1k1oOTfHVYaO7Fy+6BUhtIqL6w0ibdDdz89I6w0jY+0JpQR+WGlGd1jPkeK2vaElebxkbK2FefDSot4bVWw1FUTw0rLuE0tKJ9WCStXO7G05VOVVRtK31ZhpZUTW1M7keOZovIzwkrrYDxww5vCSpt4D+pAyegbVto6seU1b1VWBMqR7LDSzsmZcrIfjm0oI0aElWucnJkfnlVWOpRIblhpH99WqVByZ4eVa+P+Vg/K8RfCSgcn1upQfXrIFNVheVi5Lu4h7JtaH1Y6xvvG2mZuCyud4rVxdl47FFaiodkpdSysuPHZqW/LcVLy2Tg59/79a2U14Ib7Oqx4TuynXeWV1RCbJ/cKm4z41DSAomJhpXPchlsk1w4r18edoBGVXmGli5PT/YsLChOAU+TJsNI1PgGNoURWhZVuzvgd27dzcWCzO6zcECwOHDQ5rNwYXxxukdy6YeWmYNJwirQKKzfHJ40boSgjrHSPjycNSn52WOkRhAls7OlhpWfchspdK8NKr7jCvh3ZH1Z6h/qWfzys9In3rQmUyPmw0teJbe5xLUMlonuFsNIvHiobQKl6xRz0j69cIyi/tA4rmfH1obsXdw4rA+IzWg1Khx5h5Ra/16VKl7ateIZ0Zdqk7Ec/23FtQuqgAbsXPl+mzXdpaRfT6o/8+HCPh1Lu1yox31FX2kk2WWKUvnRsvQO/pU874KY+cmjUiWWHbv90OYx+KaPKMXVVqryV/KiFfjRXLe1HrVzLyrPUBCRhSLSQTFlqiqWmWuoxS02z1BxLLYQRMrZtVsInltoBQ6fpahtpTbOpLipR9q70Awao9COpyR5QZXeq45Xdt8Alftevg9EkKG72LajoXYi9bmaf+rfZGFlh9PQ5yd67m98zQ7+p4a0bvVtwy5hfjSapptO857qU9SYVNfWS8v7LEG1U4wYEbSll/XxpgFl783Zjk7y2qaxnb3t5oxCdcc3nQgbPOmXynk0QrNDiJ6NJ/tX4oGEB2tKCKHWQ+NV+tuOcK58SB043duPWm4XoVoe+EvKX635GkYcEP9ne02iSrxbWMGX3HYVwzqUFUeogQbb6NObu9hnXm9z7ooU2yaozOa6+GLvPLHqha7T33TOJBYNnLRPUf0o+JWTwrPLegKMLXSLbxBDKe4kDdxgWWDjikqEFUTe5bYYQZNKY5dOGbQyq+KmRxj7ucc7YDZw8NyBBP0iU1e+pfegp6idZv7Wu2TKm0FTZv8N9LG2eoH6m6iQhgyr+2TRwLKn/ocI6Rip5cshio6l83GOVYckJz35kaErUrIuEdd/z90WCbEydw6TcX7BS/MhG9LxMHip8yWiSh7/92nQv96EM7c410wT1tpe7CXnnxR/cEw1/xCQMdZtP3Wvsx9L2u+XtN4xuNjVNhlB5+Y2GyzH71HhBOOVLQtjsZztWCfZfPd/YJL/tGWt0rVtfNVwPuJr54KXnZYmJ8M6LLsnwSgnutpcnC/Z9qorRJGX31XNZgItGC6I+vXiKEGwLeEu7KNuA6EpjGCrcmAxu6erjF5egzEo3Ke9Z0/epOW7KxFxB/dOuXkLQAoy3C375cKrRJKjdsEB2pzsNLYiaVZCwyqxjfWWMaN4fIxtTX2Hin+vyRPT92pNdTXf4auEL0cSByayv4NMFIwS1pYqEXIydILrERq1LGbjtCfPGj/0xAx+Z+gfGyaLCn7kwG2X5bzl6zDw/b57gVX9+3+jr7zpmzmcehbcVyMrR8RkP9Nqbywk50ucpt02p79DOhmjxud3GRqSA1y8zuv6B85iMIvNIakt4wBazd+xgQR09PEPI7l6vmIPnCwXfefFNo0mQqpnXf5yNmXoG3nmPoN377oqXyZ1rbjY2JRLNzyTjvl1k2t/RUXDd6BSjSdB7rPQcTOJK950XhwtqxjiSVWcuuW/e+IXLbUq3s0smVr2OWaZvcD3ESRAzXe4dTGYBO0eUqSGZVFTG+/nSHsS5Mt7MDx80mmToN2tlErmj/7EhXxAzMk4ITkeDlulJ2JLrjX7g3qtEqKYHYk0cr13bd1ConGcv6PYvA9En+dWv9mxO7d6xTTy9d+y3mN6Ix/59P/43rKnfYWXNHbZLVleTHL/YxPz1b2slBLDrRM34RjL/h0ZSgCgWJFwFFuDOpwVRswoSVskCRFqoQ7gQsRRnQiItSXm7rEwJkQFDkzAasADdiBZEzq4QoMsCRLEgYRVAqZIWRL81dv53RyG2JOwkC7DTtCD+7ijEgoRVsACrpAVR4eGBJwRWStmM1ECfMEjZXz685zKREE0fCohINA8IrPnIZnFfgCn7o7Ol5BC2/5S8TCIXPDvJkxq4NYQwUPe8dppP5At3fkBgrUQC+oSebXNfbxljjF3SlsqLu7WMmKRCi7fducMqybxyHxH1TV+sEbJ+6xfYJu2i7e+4AGfNcu2Wbx/CWVvOILB9Yrgj6q5427zS7T3GIEF9PnOQkBMNW5smt1UwH51tLEHOxi3YCwhDiCb5vP4ms6zmZ7L+DNxEPdItI4T941IR2WFlsQjDhqwiyZJN2wzzkyN9PpEltsd921AITuEWps7kN0z0cB8pWWKqspUVTNmrI1yZF7vy8o8l7AjBB2XXulX7q0IiE53Q7GN/6jm/tBQiX1hhQGCk1DHsiZJ+y0Rj/d2SKL1u9NOCmIJNQrgnsGLRmHcW2cgLrj2paKspvbSm0fQApiH0DXpjs6nPCSJRukMIB8xDnyiNkTDwsQBnjxZEzMgyIawSj0zIzrZieV4zNlvNOlbsZ0lPDvnGsFtcAPaTqNlxEg6EM0RkY9wb/D8G7E8U0CfBbAQEiu+aQJ9gSvwJDwgUxXzWQstRnDmuTcIZ0gz7JMtq3spNgvNlKBKpZcbmkRdUEBDU43cE6BPpSPdytr9iN7x3xp19qsBoDNzFMw6GNNFli2yQqNajG+ylFOcAAoIalY3jQxrR41O/FzLgaKKHUxtnSaJHr9ck3IGM6pxnWhBl7AFhrX5D19+VbWw6M4n+fvwHQnpeuwUr1V1QqiXpeW1pwwLcgrQgSm0Boali0h90mGc5UOl2bc8IGfetg/R6KDyI+9Ch5zheh2mdEdTPm/QVo0zm6s/hLDE/mfu8/hTDaVxW83lBJmDIt7SHvA3H0g8yEN4MiDJNAUFbyJZOL96EBAZJAcn6rS/D4dchy51rps9ZLij9Dgg91aZEolmWhLb0XSIrYyq0DSlWFaNJ0FG3w7T1sjFONHxLUGoLSMeVNxmbEonmcUNCW0YsIiuTIy1lYob7wL07jSZhSGxTaikOmsVwlQQcNMiaN0ZaCeGZzQJEsSCZ/8M3WPpWEC6IBVGzChJWyQJEWvit4VBxpTWcelEWRfAtoC1RWiNh5SxAFAsSpgIs8MFL1aU1orRGwipZgEgLNfw/3B5i7ifby/l78c0b614mcjFkmhMQHhoSxeUL7hJIquIERsrGO5F4r5A715T27JKa5XBjk58hMsmw4Cnu8/OqSdyopp8TlBsNyUOFh7lLot/1+wWumOPazNW48yUTQBhwZ374LrL2nqhinqCmq5DYzZKQtFnyl2FW4ktALi0Z6e8Mptillx6UyDnl5CxBud2QsH/0aCI7rKwH7p1leMBqHlMke3p9CQ9aYb4u/hKe+QQ3kyVEv187Ef76FvLz66Rkiak6AL9lKswB6nc3jxHCxAHhrSPPRZwuUQTIqUzxXX37jAlUXMZQHvC70v8qqFkxCSMOk2Mib2xIVhobXu1t3o8CIludUkBeHVHLs7/rt9oNiEi49/i5EYmYUwoItymS89WI7qeiHC27XzIe9ToGh0wGSaJdiDtzBcxd0Tp4KLesIC8guNG3k9VLyquMxdru4kBzibylCUGCziUVxA3aRXh7EDnmxCiuerihLVhb4+pDgpqmJAwrKLAWgZGXxLX60pIfcVCkrGOmg6rW4V4DYcM6JlrSPTVWWXwqgVcqZDwNfXL7jA99t/5p11M+QSVRKMrmyIGKE8PxMPf71Scl9SjrrVGv4Yyv4tl8EWGmZaP/PimR1BZsAqSZ2HtFLn0dHU9wX+nWHpPTtYC5AFGnr/hJCFItjykgkXUx9+KjBTc8FnOVqXH1iwj9m4wkdlNO7sQdLFXeYYjy8EOCxfCq7O+N0FzdY6JFxLS+K+T5efvNP8+l4EZzBr6U6Nm83mB1PESY0+hFfY8H9pE+LfCg9LSg/seGiBBsJXdZzeqCuKEbTPxI97c9q5FitkcIWoIezTI701/w86Qq+6fjCeU43o0mCuZ41xhNQk/igLjNecAQcQXtI4RHH1ec08B2maTL7EkG8PtxhxtIThESfX/Bz0L4msYTkDh9zvdGntfatU3BlfCsLDctiBLNAoJKsbacCzEi4SsH7xM84hBUBaXhgHCtES+XCsEa7BFC2wuxMoKsjIGe3o37ru/m+Bt9JHU5vLpeQZ3JJwVhnYr3r3oFvKX7BVoasSCBe7sswJ1DCyKE5UJQmv4vSAvea0qGBE9OEL8Vgiu4Kx0PCCKR5GNeQDrg5BYpIByTmAckmLWAoAXFPJQPQGAKh8eiy0QMeUwERAy5KQIiEs0DAmulcrH8eHr3x7AzvdNlIpZIz32CrYsQnW5Q+81/sLwyGKBP6BYICpv8L3xRAyqbbYlEgg9KbcRebj61vbzAapLKy5O8v1yXirSthcfDg6i5b0nwXITkPElQLEjwHIuHmyi2WdcCWhA1H+ZIMHgPYavTxkhFrEINF+ErgpT1UoHd9Lar8QVHBR+CuTOw5C29B5+uatgNHhdEtqIsVsuNhPfNoUJ4Q+QGJbKIPBTxDskCyA+k60Q9/4ckj4TtsgBRLEgWvTAJSVN17/TiG3A9qejx5LQRedmGsfnQtGRTD2Pv7mWj6AZXMyjSu3jkooicrkTVOeSUfHIE+oSlZUUCEqxaQFDWv81xT3LSeJtDg10LEJyxGO2Q8DfgDndxp0jx6Ag4aUpjFYpxrJ6WHtCUiDQ2RwgnpF3btlfOEAMcRJkZWhA1qyBhlVwmtrF+q8UX8wYeH8rxdFvVO3i+NrINvpa3EFOiZkAmoRvQ8YnSGAlKI172lhHRgqiexDC5nTFiZTNxAvokvzre5pjvMafxl38vrtYzBJEQPieEL6zV9F48YL4k8Rbe8xK8798GLwoPC+H1Apkhoko10/S2fxqpXBICthsQNKvUKvSGgQXX33U2+ofMvnMhpxAvuN0K6ZTIxwrf+HGXIN6XmiEK31hY4+rbETObF7LJjis3r8PF57zfBBsUQon2DKB+o6i+kxD8PodYuGAt/KM1X7LXaT6Uw+vW8c71TFVdiO3uEjUPfxIkX3wZLCzpq/xewHFh3xViONWQJz3ravSeMS/K52w0V/B453xBzWdAEmSVWOIVzC4RrZDCkvCXDRZgykgLoswmyat4hEBMltlk0iqNyTA4iQEJ+kGiLOa5Uj8Jzns5bZjsMTsgwun8dBDejX3r59B8PJZKbnjvHf5s0s7wIsqSuHPKIwNRsy4S1s3HISIbkxvV3GGzZaSauSoJMwFuFCJLaRLuWxbgCGlBDF4gmC6zAFEsSFgFC7BKWhD91jgKPBZ1EgKfQoWV6NXSJ02CowxPfp2k07Qgaj71kNS69SspQBQLElbBAqySFkT1NIaHSYny8RjvsoM5d1F4OtLCrgVcJ6LG+gvhPRN3D0Tnbf7rGImEHD4UB4QbFLlQPub8DPKUKQwPPGcF8ZR8Hg/YOS7z2i1I9OD4sq3xNOH3Q36j4eMyxqnwqPjNZQIbw/RW1ocP1Zxb5jBEpI1GCI4CXPJOSzrNFIM/HLr1DrxvNB2B91YeecwGeZEgYgEXCWGzdBAir8i4u6zH88AY/xmK05Z1bKZhdpmBexORqacQTBDGMVEQMdZoEsQeJqn8WEALIt6EZgrp+sRS3lRxY1gvqyGNYahIq8joHjgd3sZ4/PwP4cHlyzURQhshKM3bliCPGvEOXnVZoMO0PDyLjBNExJ0rhFVOnzNMxoiQ5I+RjanuykKQlS7YHCuQDzDn/c35v4lDJeZy9NDHxf1IOq7czLuHDBwLIwihSAgWCLghykcpiK68SiN68TfADYgT81xGcs4RYpKgxCUStCXRgCiNkXALswDrpQVRswoSVkknYBt8/rDZKuOQplrePoldWiSOhK4IanachAN5v/ZGQTamXsQw8WuKi2c+T+52JHwGeKVbmiDvkXihaojh1ZdHgpFuU48WRGQny4VwhVmAKBYkrIIFWCUtiIzQ/jkjQQ3oE5l8SgGBotRBdA93Ur9c9HAFyc9sBiK5jzP1wEMHYkWyJPlE5t/oF68EaR7uzrKtKRIltQgI6vIzQ6BPuBXxyvmcT0pa/oNbAncUPEhQrAMiCS0lEuT5f3BLUP8N(/figma)--&gt;"></span><span><strong>В разработке использовали</strong> .Net, ASP.NET, MS&nbsp;SQL, КриптоПро, JavaScript, SASS, React.</span></p>
<p><span><strong>Интегрировались с</strong> порталом «Госуслуги» и&nbsp;собственным API&nbsp;банка.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/d0d813b2015e319d088f29a91d3d4214"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/33d899f283f04a409e11facf4eeefeb0"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Работали двухнедельным спринтами. Раз&nbsp;в&nbsp;2-3 спринта проводили демо клиенту — показывали, что&nbsp;уже&nbsp;готово, и&nbsp;за&nbsp;что&nbsp;мы&nbsp;возьмемся дальше.</p>
<p>Отметим, что&nbsp;изначально у&nbsp;нас&nbsp;был&nbsp;один план разработки, но&nbsp;жизнь внесла свои коррективы. В&nbsp;какой&#8209;то&nbsp;момент половина нашей команды слегла с&nbsp;ковидом (сейчас, к&nbsp;счастью, со&nbsp;всеми всё&nbsp;в&nbsp;порядке). В&nbsp;итоге пришлось экстренно менять планы.</p>
<p>Мы пересмотрели приоритеты по&nbsp;задачам и&nbsp;скорректировали общий план работ так, чтобы не&nbsp;блокировать оставшихся в&nbsp;строю программистов и&nbsp;не&nbsp;растягивать сроки проекта.</p>
<p>Завершили этап разработки традиционно — тестированием, SEO-оптимизацией и&nbsp;запуском нового сайта.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/4a0d0d6ac4ac4182b1929b79778bf918"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/09a904cc085448b68c47756f893b0c77"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Обучение сотрудников</h2>
<p>Старая версия сайта «Уралпромбанка» была на&nbsp;самописной CMS. Поэтому административная панель Umbraco была для&nbsp;сотрудников отдела маркетинга в&nbsp;новинку.</p>
<p>Мы провели для&nbsp;них&nbsp;серию тренингов, на&nbsp;которых показали, как&nbsp;работать с&nbsp;сайтом — добавлять новые продукты и&nbsp;услуги в&nbsp;каталог, прикреплять документы и&nbsp;формировать новые контентные страницы по&nbsp;готовому шаблону.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/73618f65268452c218d14d216e61a2a1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/29c191eed04f4fd9a891b576d102daf5"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Результат</h2>
<p>Результатом всех наших работ стал запуск нового адаптивного сайта «Уралпромбанка».</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3c05f64beb687ee5fc9e68c412ecaa86"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/4f45dc64375b4db0b381bab75c0901df"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2597/final.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/e3f0c54c05acfaac94debf4c78f731e4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ecb6b5590847440085d1fad390dbe009"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Мы выстроили новую структуру главной страницы сайта с&nbsp;учетом анализа поведения пользователей, изменили логику каталога продуктов и&nbsp;услуг банка, а&nbsp;также добавили на&nbsp;главную страницу несколько полезных инструментов.</p>
<h3>Умный калькулятор</h3>
<p>Калькуляторы на&nbsp;главной странице теперь не&nbsp;только рассчитывают стравки по&nbsp;кредитами и&nbsp;проценты по&nbsp;вкладам, но&nbsp;и&nbsp;предлагают конкретные банковские продукты под&nbsp;запрос пользователя.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/bf7c58fe7eb6fdba1ba042bb70fa9b82"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ff4b42019ca0437cb000e1b7e966ca0a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2593/calculator.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/159f80469b31a3da02acfb09a17c64fc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9706dcfe1143421996bb6c6537e38d25"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Конвертер курсов валют</h3>
<p>Дополнили блок с&nbsp;курсом валют конвертером: пользователь указывает сумму, которую он&nbsp;хочет купить или&nbsp;продать в&nbsp;валюте, и&nbsp;сразу видит, сколько это&nbsp;будет в&nbsp;рублях.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5bfce553b080790e65dacd5acf1f1889"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/0240f8448fec4179a210e1fcb34be8a3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2595/converter.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/78d6eb615f6ad1c98c6201748f980bfc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ef062742fbb2479989a9bb73828f5670"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Анкеты и&nbsp;заявки</h3>
<p>Оптимизировали и&nbsp;разбили на&nbsp;шаги анкеты для&nbsp;физических и&nbsp;юридических лиц. Некоторые поля теперь можно заполнить автоматически через «Госуслуги».</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/da9d53813a577fa1677f2ccdd06e8cf8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/7f357392ec904e38a5b69525d895ff73"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2589/anketa.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/83174f669b2954f72b7a84f5c2158505"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/81ad1b7af37e429b885fcf26e7a6ae23"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>После заполнения и&nbsp;отправки анкеты клиент попадает на&nbsp;страницу благодарности. На&nbsp;ней&nbsp;есть подтверждение удачной отправки заявки и&nbsp;блок потенциально-полезных предложений и&nbsp;продуктов.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ec3b1e9f65a1d55e5821feb5a1161227"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/37c6974593d54c6190adb4f62f89d992"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2602/last-page.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/2ae4c9051f5940c0e1f81087824d2c7f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fa7342a2183f4837a335c55ab934d777"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Карта банкоматов</h3>
<p>Обновили карту подразделений банка. С&nbsp;помощью фильтров можно, например, выбрать только банкоматы с&nbsp;круглосуточным доступом, и&nbsp;убрать из&nbsp;списка те, что&nbsp;находятся на&nbsp;техническом обслуживании.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/36c44307db55bd460594a7001eab2e1e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/f0e7199f198c4cfdab45ce0fb96a97ec"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2609/ats.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/00d1cab87fd58f2115909af8ed60e605"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/deda1dbac7304f4baf78fe697f4f1d1d"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Раскрытие информации</h3>
<p>Спроектировали удобный раздел с&nbsp;раскрытием информации для&nbsp;акционеров и&nbsp;регуляторов. В&nbsp;нем&nbsp;можно быстро найти нужные документы с&nbsp;помощью фильтров по&nbsp;году и&nbsp;виду раскрываемой информации.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ecd03d67a4c55f49cc55a57870c5b8ca"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6f451fce3ecf416db47fe014b9704dbb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2601/information.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/cae4e5ab1695199362992f5894a0c1da"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f9dffd60e7454e9a8e21fb6387a25271"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Дизайн-система</h3>
<p>В процессе работы над&nbsp;новым сайтом «Уралпромбанка» серьезно изменился брендбук компании. Клиент дал&nbsp;нам&nbsp;полный карт-бланш в&nbsp;этом вопросе, поэтому мы&nbsp;собрали новую дизайн-систему для&nbsp;сайта. В&nbsp;ней&nbsp;мы&nbsp;полностью переработали типографику и&nbsp;палитру — выбрали более светлую цветовую гамму, немного изменили логотип, добавили градиенты и&nbsp;выработали стилистику для&nbsp;оформления всех иллюстраций.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e440d944dab5bbbfb20e002958a4f30d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/29e5cbc902fc4c4db48a4ab22151eb13"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2610/&#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;-&#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x430;-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/34f5302b157a409da825d77c917f1df3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/474cd9aa38354136b2719fb57fe58782"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
        <h2 class="blockquote-new__title">Отзыв клиента</h2>
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Мы&nbsp;выражаем благодарность компании fuse8 за&nbsp;плодотворное сотрудничество в&nbsp;рамках проекта по&nbsp;разработке нового корпоративного сайта «Уралпромбанка». Хотим отметить высокоорганизованную работу коллектива fuse8 на&nbsp;всех этапах выполнения проекта. Между нашими командами установились дружеские отношения и&nbsp;полное взаимопонимание.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Михаил Парфентьев
                </cite>
                <p class="blockquote-new__author-position">
                    Председатель правления АО «Уралпромбанк»
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Редизайн интернет-магазина сантехники
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/47-redesign/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/47-redesign/</guid>

                <pubDate>Thu, 22 Jan 2026 06:37:55 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Редизайн интернет-магазина сантехники</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/ef86ee1e27f750e69414aed689df61bf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e4422c39418c44c7b84e3d4ba2dd6038"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--47588751 case-logo">
    


    <img src="/Media/2482/mask-group.png"
         alt=""
         itemprop="">


</div>


<h1>Редизайн интернет-магазина сантехники</h1>






<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2538/&#x43E;&#x431;&#x43B;&#x43E;&#x436;&#x43A;&#x430;-&#x43A;&#x435;&#x439;&#x441;&#x430;-47ru.png"
         alt=""
         itemprop="">


        <a class="button button--contured button--project" href='https://47.ru/' target="_blank">ПЕРЕЙТИ НА&nbsp;САЙТ 47.RU</a>
</div>

<p>Компания FORS продаёт сантехнику и&nbsp;комплектующие для&nbsp;монтажа инженерных систем, связанных с&nbsp;водоснабжением и&nbsp;водоотведением через интернет-магазин 47.ru. В&nbsp;ассортименте — собственная продукция и&nbsp;товары партнёров.</p>
<p>Нашей задачей было обновить дизайн интернет-магазина 47.ru. Сделать его&nbsp;современным, удобным и&nbsp;понятным для&nbsp;всех сегментов целевой аудитории 47.ru.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/0d82759eb18b4c47836239e85641ded0"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2538/&#x43E;&#x431;&#x43B;&#x43E;&#x436;&#x43A;&#x430;-&#x43A;&#x435;&#x439;&#x441;&#x430;-47ru.png"
         alt=""
         itemprop="">


        <a class="button button--contured button--project" href='https://47.ru/' target="_blank">ПЕРЕЙТИ НА САЙТ 47.RU</a>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/c1081ab57cfeaca7a3b77bfd99706ec0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4c80584652354cf5b45e55b216788c11"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>О проекте</h2>

<div class="timeframe">
    <div class="timeframe__item">
        <strong>&#x421;&#x442;&#x430;&#x440;&#x442; &#x440;&#x430;&#x431;&#x43E;&#x442;:</strong> декабрь 2019
    </div>
    <div class="timeframe__item">
        <strong>&#x424;&#x438;&#x43D;&#x430;&#x43B; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;:</strong>  ноябрь 2020
    </div>
</div>

<p>В течение 2020 года страница за&nbsp;страницей мы&nbsp;обновляли дизайн интернет-магазина. Активное участие в&nbsp;работе над&nbsp;проектом принимали маркетологи&nbsp;FORS. Главной целью было сделать интернет-магазин удобным для&nbsp;розничных и&nbsp;оптовых закупок.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="threeColumns"
            data-content-element-type-key="c9b72d31-8ab3-38f4-b5fb-a9a9814ae17a"
            data-element-udi="umb://element/0fba3c455ccccc5b79f0c5d1697a83d1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b1ba4fe876124b27a6a49705b594848a"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<h3 class="team__title" style='border-bottom-color: #FFD541'>
    Команда fuse8
</h3>

<p><strong>Руководитель проекта<br></strong>Вениамин Мустафин</p>
<p><strong>Дизайнеры<br></strong>Алексей Пилишков<br>Валентин Кротов</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f30020c554904a618920b244b539a92a"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<h3 class="team__title" style='border-bottom-color: #FF0000'>
    Команда «47.ru»
</h3>

<p><strong>Директор по&nbsp;маркетингу</strong><br>Тимур Кушаков</p>
<p><strong>Разработчик</strong><br>Артём Ванат</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/012769e6fa04f80a51d0d1e7fd068063"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/40c816b67c484fae947bcd80d3a734fd"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Процесс</h2>
<p><span>Мы начали работу над&nbsp;проектом с&nbsp;изучения целевой аудитории интернет-магазина 47.ru. Это&nbsp;физические лица, юридические лица и&nbsp;специалисты. </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/904cc1856a99024f2bf874a31f683358"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9b4f212c86fb4b95aad3b625743bcdfa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2519/&#x446;&#x430;.png"
         alt=""
         itemprop="">


        <figcaption>
            Целевая аудитория интернет-магазина 47.ru
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/61bcda685368ccbf31a485c614575968"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d834ba0b0e564d3b931f94f6d0cf5337"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Затем мы&nbsp;провели аудит ключевых страниц интернет-магазина. Маркетологи FORS предоставили нам&nbsp;данные Яндекс.Метрики и&nbsp;карту кликов. С&nbsp;их&nbsp;помощью мы&nbsp;выявили поведенческие паттерны на&nbsp;сайте и&nbsp;увидели, где&nbsp;интерфейс ведет себя не&nbsp;так, как&nbsp;того ожидает пользователь.</p>
<p>Мы также изучили сайты конкурентов FORS и&nbsp;популярные интернет-магазины — «Леруа-Мерлен», «Ситилинк», OZON, DNS, AliExpress и&nbsp;другие. Последние формируют пользовательский опыт — то, как&nbsp;люди привыкли взаимодействовать с&nbsp;коммерческими площадками в&nbsp;сети. Поэтому изучать их&nbsp;интерфейсные решения — всегда хорошая идея.</p>
<p>Собрав этот багаж знаний и&nbsp;идей, мы&nbsp;предложили свое видение дизайна интернет-магазина 47.ru в&nbsp;виде прототипов. Затем обсудили их&nbsp;с&nbsp;заказчиком, внесли коррективы и&nbsp;начали, страница за&nbsp;страницей, создавать дизайн-макеты обновленного сайта 47.ru.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium legend legend-flex spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4fe2815c0b594127b8f56d1473836f3c"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><img src="/Media/2484/google-docs-1.png" alt=""> <a rel="noopener" href="/media/2305/%D0%BE%D1%82%D1%87%D0%B5%D1%82-%D0%BF%D0%BE-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0%D0%BC-ui_ux-%D0%B0%D1%83%D0%B4%D0%B8%D1%82%D0%B0-%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B8-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%BC%D0%B0%D0%B3%D0%B0%D0%B7%D0%B8%D0%BD%D0%B0-forsarmru.pdf" target="_blank" title="Пример UX/UI- аудита: страница товара  интернет-магазина 47.ru">Пример UX/UI- аудита: страница товара интернет-магазина 47.ru </a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/99baf1c80f4c98ef7a27efb40baa2dd0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1bcb1fff6849454592ac29b06e167e83"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Результат</h2>
<h3>Главная страница</h3>
<p>Самый заметный объект на&nbsp;главной странице — блок с&nbsp;категориями товаров. Он&nbsp;выполняет сразу две&nbsp;задачи:</p>
<ul>
<li>привлекает внимание пользователя, дает понять, что&nbsp;продает магазин, и&nbsp;помогает сориентироваться — в&nbsp;какой раздел идти;</li>
<li>разделяет целевые аудитории: профессиональные монтажники обращаются к&nbsp;разделам «Отопление», «Водоснабжение» и&nbsp;«Канализация», а&nbsp;обычные покупатели, которые делают ремонт в&nbsp;ванной, — к&nbsp;разделу с&nbsp;сантехникой.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2dae13faf0de6023c148cc24c18c5361"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/14ff97215c40486a97584f2341a4a985"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2543/&#x433;&#x43B;&#x430;&#x432;&#x43D;&#x430;&#x44F;-&#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x430;.png"
         alt=""
         itemprop="">


        <figcaption>
            Интерфейс главной страницы интернет-магазина 47.ru
        </figcaption>
</figure>

<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/e5629a8c4a27ae6946f772d9bd936552"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5d8a522effc34e5a85afc478d0834ae4"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Каталог</h3>
<p>Сверху страницы есть раскрывающееся навигационное меню с&nbsp;разбивкой на&nbsp;категории товаров.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a0fe83736f77b46d201984e0a9c8095d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/81c1b92af7ad48e3b0c5a57c7af04788"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2521/&#x432;&#x435;&#x440;&#x445;&#x43D;&#x435;&#x435;-&#x43D;&#x430;&#x432;&#x438;&#x433;&#x430;&#x446;&#x438;&#x43E;&#x43D;&#x43D;&#x43E;&#x435;-&#x43C;&#x435;&#x43D;&#x44E;.png"
         alt=""
         itemprop="">


        <figcaption>
            Верхнее навигационное меню
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/dc370a6b03becf837a071b7c49c5e190"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6e55ef2245144f1eb3d2502eeb51ca79"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Слева — дополнительное меню с&nbsp;товарами, относящимися к&nbsp;выбранной категории.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b255791d276015c18c8999a898b9baba"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fe07e1d123384ae0bdffbe3b646bf862"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2522/&#x431;&#x43E;&#x43A;&#x43E;&#x432;&#x43E;&#x435;-&#x43C;&#x435;&#x43D;&#x44E;.png"
         alt=""
         itemprop="">


        <figcaption>
            Боковое меню облегчает доступ к&nbsp;каталогу
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/fa529fe7febc2f5559f9c057a6703d58"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/89c4def3292a47e1acb0fcea551ab526"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Пользователь может переключаться между двумя видами отображения товаров в&nbsp;каталоге: плиткой или&nbsp;таблицей.</p>
<p><strong> Плитка</strong> удобна для&nbsp;сравнения товаров визуально. При&nbsp;наведении на&nbsp;карточку появляется дополнительная информация и&nbsp;кнопка «В корзину».</p>
<p><strong>Таблица</strong> удобна для&nbsp;крупных закупок. На&nbsp;странице помещается больше товаров. В&nbsp;правой колонке — кнопка для&nbsp;моментального добавления в&nbsp;корзину.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a8e9d11b31659c387b2f5a312216792a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/acb37c7842574f21b696176c06eba480"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2523/gif-&#x43E;&#x442;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;-&#x43A;&#x430;&#x440;&#x442;&#x43E;&#x447;&#x435;&#x43A;-&#x432;-&#x43A;&#x430;&#x442;&#x430;&#x43B;&#x43E;&#x433;&#x435;.gif"
         alt=""
         itemprop="">


        <figcaption>
            Переключение отображения товаров в&nbsp;каталоге
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/78fa778abf9b93176a3d4ea7ce2110bb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b709345c9e0c4baba95ff58400c8f600"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Страница товара</h3>
<p>На первом экране страницы товара мы&nbsp;показываем пользователю всю&nbsp;основную информацию о&nbsp;товаре — характеристики, страну-производителя, цену, условия акции или&nbsp;скидку, наличие и&nbsp;ориентировочную дату доставки. Всё&nbsp;то, что&nbsp;помогает принять решение о&nbsp;покупке.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/142f444534cbdaf5fa7dba001ec53716"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6305a140fd7b4875a1e995915b8b27d4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2524/&#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x430;-&#x442;&#x43E;&#x432;&#x430;&#x440;&#x430;.png"
         alt=""
         itemprop="">


        <figcaption>
            Страница товара
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/6d7c9e13684d37258346b75dbbeb1586"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/df9c99a18a5e4607a9a3a658f7590768"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Чтобы пользователь мог&nbsp;рассмотреть товар перед покупкой, мы&nbsp;добавили под&nbsp;основное изображение галерею с&nbsp;миниатюрами других фото и&nbsp;навигационные стрелки. Покупатель может сам&nbsp;выбрать фото, которое ему&nbsp;хочется рассмотреть поближе.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/94ad855c055cd50341e0d1cafa20a6b8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e848d1f892fc44d7ba8f710b3105f9ac"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2525/&#x433;&#x430;&#x43B;&#x435;&#x440;&#x435;&#x44F;-&#x441;-&#x43C;&#x438;&#x43D;&#x438;&#x430;&#x442;&#x44E;&#x440;&#x430;&#x43C;&#x438;.png"
         alt=""
         itemprop="">


        <figcaption>
            Галерея с миниатюрами товара
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/8d6b3eaac3fdb4c29d6259a4f18de6ee"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f857e0cfffff4deb8402aa45f1dcee71"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Ниже на&nbsp;странице товара — информация о&nbsp;доставке, адресах пунктов самовывоза, и&nbsp;раздел «С этим товаром покупают». Его&nbsp;мы&nbsp;дополнили тэгами, которые помогут покупателю найти сопутствующие товары.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1ad200908bb076b68b958cd2146cdb05"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ca8d4dd894ef46caabd5dbe4ab0182a8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2526/&#x442;&#x435;&#x433;&#x438;.png"
         alt=""
         itemprop="">


        <figcaption>
            Теги внизу страницы помогают найти сопутствующие товары
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/1e640f8853243f73f3f1fe1d8ad53c3d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ec2b35c94ab94fbfa7044574d58e746c"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Сравнение товаров</h3>
<p>На этой странице покупатели сравнивают несколько товаров по&nbsp;основным характеристикам — цене, наличию, весу, стране-производителю и&nbsp;т.д. Есть возможность показать в&nbsp;таблице только отличающиеся параметры.</p>
<p>Сравнив товары и&nbsp;выбрав из&nbsp;списка подходящую модель, покупатель может сразу добавить её&nbsp;в&nbsp;корзину.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2397cc2accfa0910d6935ed58a30f95d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/d5b4cccc1a324c63b20db6a6c29bab29"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2527/&#x441;&#x440;&#x430;&#x432;&#x43D;&#x435;&#x43D;&#x438;&#x435;-&#x442;&#x43E;&#x432;&#x430;&#x440;&#x43E;&#x432;.png"
         alt=""
         itemprop="">


        <figcaption>
            Страница сравнения товаров — десктопная и мобильная версии
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/58c25c48405ffc2a36a3ef0de00142e4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b29b7324908b4e3ea6b6c2b15a8148e2"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Корзина</h3>
<p>Корзина на&nbsp;сайте 47.ru — это&nbsp;инструмент управления заказом. Здесь можно добавить единицу товара, заменить его&nbsp;на&nbsp;аналог, удалить ненужное, поделиться списком с&nbsp;кем&#8209;то&nbsp;еще&nbsp;или&nbsp;распечатать его.</p>
<p>Снизу на&nbsp;странице есть список удаленных товаров. Если покупатель случайно убрал из&nbsp;корзины нужный товар, он&nbsp;может вернуть его&nbsp;обратно в&nbsp;один клик.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/de7357154a04c091cbd9930a795b3752"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/cab70654e8404a4fb65dd3cdffdaba92"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2528/&#x43A;&#x43E;&#x440;&#x437;&#x438;&#x43D;&#x430;.png"
         alt=""
         itemprop="">


        <figcaption>
            Корзина и сценарий оформления заказа в один клик
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/569dfea95830d0dcd304e077ad4bbd20"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e774d7c70d8c4c3db4a3dc2c8e412217"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Из корзины можно купить товар в&nbsp;один клик. Для&nbsp;этого нужно ввести только номер телефона и&nbsp;электронную почту. Менеджеры 47.ru свяжутся с&nbsp;покупателем, чтобы подтвердить заказ и&nbsp;уточнить способы его&nbsp;получения и&nbsp;оплаты.</p>
<h3>Оформление заказа</h3>
<p>На странице оформления заказа мы&nbsp;сразу показываем покупателю все&nbsp;шаги, через которые ему&nbsp;нужно будет пройти — регистрация, выбор способов доставки и&nbsp;оплаты, комментарий к&nbsp;заказу.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/0329e9d436be411752ad85823e8d7ae4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6d98f2575b364f08a75c3b3ce22ecbae"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2529/&#x43E;&#x444;&#x43E;&#x440;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x435;-&#x437;&#x430;&#x43A;&#x430;&#x437;&#x430;.png"
         alt=""
         itemprop="">


        <figcaption>
            Страница оформления заказа
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/5ce88789f64d6ff00bbb349167273708"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7c5f505dd2bc43aaa923e9179043cce4"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Личный кабинет</h3>
<p>В личном кабинете можно отслеживать статусы заказов, делиться списками покупок, оплачивать и&nbsp;распечатывать счета, формировать шаблоны заказов. Здесь сохраняется вся&nbsp;история покупок и&nbsp;выбранные ранее адреса доставки и&nbsp;пункты выдачи.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ed0603bd82414344b548164488bc9155"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="slider"
            data-content-element-type-key="fe4b1c5b-697c-4ddf-b617-5f55c38c8017"
            data-element-udi="umb://element/11c922ed39174b899ae1ab816187e051"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">




    <div data-cp="carousel"
         style="background-color:#ffffff;"
         class="swiper-container carousel typography__ignore-offset"
         data-settings='{&quot;pagination&quot;: {&quot;el&quot;: &quot;.swiper-pagination&quot;, &quot;clickable&quot;: true}}'>
        <div class="swiper-wrapper">
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2545/&#x43B;&#x43A;-1.png"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2546/&#x43B;&#x43A;-2.png"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2547/&#x43B;&#x43A;-3.png"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2548/&#x43B;&#x43A;-4.png"
         alt=""
         itemprop="">

                        </div>
                </div>
        </div>
            <div class="swiper-pagination" data-carousel-ref="pagination"></div>
            <button
                type="button"
                class="carousel__navigation carousel__navigation--prev swiper-button-prev"
                data-carousel-ref="prev"
                style="color:#C4C4C4;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--l">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&lt;</span>
                </span>
            </button>
            <button type="button"
                    class="carousel__navigation carousel__navigation--next swiper-button-next"
                    data-carousel-ref="next"
                    style="color:#C4C4C4;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--r">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&gt;</span>
                </span>
            </button>
    </div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/4deeffb4c309e487e6f88c4b4d5f41a6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6a43f38739754af8a30eda6e5770f988"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Дизайн-система</h3>
<p>Мы создали для&nbsp;заказчика большую библиотеку компонентов. В&nbsp;ней&nbsp;собраны все&nbsp;визаульные элементы сайта в&nbsp;разных состояниях. Теперь, если заказчику потребуется создать новую страницу на&nbsp;47.ru, у&nbsp;дизайнера это&nbsp;не&nbsp;займет много времени.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/29f42d1877d5ac64a9f3d5eae5e9c970"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/fd36490b9662425bb7caada513332f70"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2501/group-7054.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/507ce2cbbec041b5636fe6a29764b418"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4c04e4a629ee4c9da8b0338e930cb493"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>

<div class="typography">
        <h2 class="blockquote-new__title">Отзыв клиента</h2>
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Сайт выглядит свежо. Он&nbsp;соответствует современным тенденциям дизайна — строгие формы, понятная навигация, крупные блоки категорий товаров на&nbsp;главной странице и&nbsp;в&nbsp;каталоге. Пользователи изменениями тоже довольны — отмечают, что&nbsp;в&nbsp;интернет-магазине теперь легко ориентироваться и&nbsp;находить  нужные товары.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Тимур Кушакаев,
                </cite>
                <p class="blockquote-new__author-position">
                    директор по&nbsp;маркетингу FORS
                </p>
            </div>
        </footer>
    </blockquote>
</div>

</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a8fd564bd5b845baaa3fe91c2e26c8a8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="awards"
            data-content-element-type-key="82cdbbd8-0baa-4271-a5b0-0f1aae3d3bed"
            data-element-udi="umb://element/d82e0963552b428c9f8e27468f383c8e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Индивидуальная ERP вместо Excel для бизнеса по взысканию долгов
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/assignot-new/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/assignot-new/</guid>

                <pubDate>Thu, 22 Jan 2026 06:36:37 GMT</pubDate>

                            <category>&#x424;&#x438;&#x43D;&#x430;&#x43D;&#x441;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x44B;</category>
                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Индивидуальная ERP вместо Excel для бизнеса по взысканию долгов</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/d9bbf30968449fb7876e890a11d35bca"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f0c358513d804a87911e74edcd66a41a"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<div class="umb-macro-image-with-offset umb-macro-image-with-offset--28894527 case-logo">
    


    <img src="/Media/2915/logo.png" alt="" itemprop="">


</div>


<h1 class="content-title"><span>Цессионарий 2.0: и</span>ндивидуальная ERP&nbsp;вместо Excel для&nbsp;бизнеса по&nbsp;взысканию долгов</h1>





<p>Более 10 лет&nbsp;мы&nbsp;работаем с&nbsp;крупной российской МФК&nbsp;«Лайм-Займ», которая с&nbsp;нашей помощью расширялась и&nbsp;выходила на&nbsp;зарубежный рынок. Вместе мы&nbsp;создали сервисы для&nbsp;работы с&nbsp;клиентами, а&nbsp;после разработали систему для&nbsp;департамента судебного взыскания. Сейчас она&nbsp;помогает вести одновременно несколько тысяч дел&nbsp;и&nbsp;предостерегает компанию от&nbsp;регуляторных рисков.</p>
<p>Ранее мы&nbsp;уже&nbsp;<a href="/projects/assignot/" title="assignot">рассказывали о&nbsp;том, как&nbsp;создавали MVP&nbsp; «Цессионария»</a>. В&nbsp;этом кейсе говорим о&nbsp;том, как&nbsp;продукт развился за&nbsp;время использования.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/8969521c04fc4dcb990849958f682f01"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2917/screenshot-2023-01-30-141226.jpg"
         alt=""
         itemprop="">


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/cee70e38fe46f1c599695e87bd95da25"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/42512c1e9b0c4adba7b4ed7201cc1938"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Взыскание долгов: сложности и&nbsp;риски</h2>
<div class="l-island-a">
<p>Должников у&nbsp;микрофинансовой компании более 200 тысяч по&nbsp;всей стране. Если долг не&nbsp;погашен вовремя, дело передается в&nbsp;суд&nbsp;для&nbsp;взыскания задолженности. Для&nbsp;этого нужно правильно собрать пакет документов по&nbsp;каждому должнику, чтобы подать судебный иск, а&nbsp;потом каждый раз&nbsp;«подшивать» к&nbsp;делу новые бумажки, пока долг не&nbsp;будет погашен.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/adf5732e6b53474b9f918a2634e45124"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Путь от&nbsp;подачи иска до&nbsp;погашения долга</strong>
    – это&nbsp;50 стадий, среди которых определение подсудности, распределение, обжалование, валидации, возвраты, списания, исполнительные производства и&nbsp;другие.
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/41424c7a793f68a9619b42480c272150"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0885d9522c184500b6ffae4f45749dba"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p>По ходу продвижения любого дела ответственные за&nbsp;него сотрудники внутри департамента сменяют друг друга. Сменяются и&nbsp;внешние инстанции, взаимодействующие с&nbsp;делами на&nbsp;этом пути: суды, банки, пенсионный фонд, служба судебных приставов, почтовая служба, БКИ. Все&nbsp;эти&nbsp;«точки соприкосновения» нужно отслеживать.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/ae3cb6e9763c487aa7557b3a674f3fe4"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Если дела будут регулярно теряться,</strong>
    а&nbsp;задолженности не&nbsp;«доживут» до&nbsp;погашения и&nbsp;подачи отчетности, контролирующие органы обязательно обратят на&nbsp;это&nbsp;внимание и&nbsp;могут отозвать у&nbsp;компании лицензию.
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/57f1ff600c5ee979c4a6c211c51e064e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/558113a315dd4196b9518d65cbf193e2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Задачи продукта</h2>
<div class="l-island-a">
<p>Болью заказчика была огромная Еxcel-таблица на&nbsp;100 тысяч строк, в&nbsp;которой нужно было контролировать процесс работы с&nbsp;документами. Она&nbsp;хранилась на&nbsp;корпоративном диске. Все&nbsp;данные и&nbsp;статусы вводились и&nbsp;обновлялись вручную, но&nbsp;редактировать таблицу нескольким специалистам одновременно было нельзя. При&nbsp;таких условиях держать в&nbsp;фокусе весь объем дел, находящихся в&nbsp;работе – уже&nbsp;сверхзадача.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6010e81d76f930ed1bafb49a54bed554"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/13e9aad0dd4f417ea722750f1de49499"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2907/group-877.png"
         alt=""
         itemprop="">


        <figcaption>
            Скроллить таблицу можно было очень долго...
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="fourEight"
            data-content-element-type-key="ca282c47-86be-3881-a738-38a85635f98f"
            data-element-udi="umb://element/7a18015020ee5861d4b1a532d2387072"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1dbe781bd4f141508ae1a946c704cd4d"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p>Нужно было избавиться от&nbsp;этого неповоротливого и&nbsp;негибкого инструмента, переведя работу в&nbsp;систему, которая автоматизировала бы&nbsp;сбор документов и&nbsp;продвижение их&nbsp;по&nbsp;стадиям обработки, исключая возможность потери. Исходя из&nbsp;этого, мы&nbsp;определили задачи.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3ef572ee8da346369657b5de3400bba9"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li>Создать единое хранилище для&nbsp;всех имеющихся дел</li>
<li>Реализовать сортировку и&nbsp;быстрый поиск по&nbsp;базе дел&nbsp;с&nbsp;возможностью создания выборки</li>
<li>Уменьшить количество ручных операций специалистов департамента судебного взыскания и&nbsp;помочь им&nbsp;быстрее ориентироваться в&nbsp;потоке документов</li>
<li>Автоматизировать переход дел&nbsp;по&nbsp;стадиям</li>
<li>Автоматизировать отправку отчетов в&nbsp;БКИ</li>
<li>Автоматизировать отслеживание доставки документов из&nbsp;одной инстанции в&nbsp;другую</li>
<li>Реализовать генерацию документов: выписок из&nbsp;договоров цессии, заявлений на&nbsp;выдачу судебных постановлений</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2c0d90bd90b2b006fe8fe67dd5aa9aab"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4f1664e3d3044291b04413b02d47eef8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Объединение экспертизы</h2>
<div class="l-island-a">
<p>Продукт создавался в&nbsp;партнерстве с&nbsp;командой заказчика. Мы&nbsp;совместно принимали решения по&nbsp;функциональности будущего продукта и&nbsp;регулярно синхронизировались с&nbsp;заказчиком на&nbsp;демо.</p>

<div class="umb-macro-highlights">
    <strong>Для погружения в&nbsp;бизнес-процессы,</strong>
    с&nbsp;которыми предстояло работать, мы&nbsp;взаимодействовали с&nbsp;аналитиками «Лайм-Займ». Они&nbsp;провели глубокий анализ работы департамента судебного взыскания и&nbsp;отразили процессы на&nbsp;схемах.
</div>
</div>
<div class="l-island-a"></div>
<div class="l-island-a">С нашей стороны – комплексная разработка системы. Опираясь на&nbsp;результаты проведенного анализа, мы&nbsp;спроектировали архитектуру «Цессионария», определили технологии для&nbsp;реализации и&nbsp;границы первой версии продукта. Воркфлоу системы выстроили на&nbsp;основе статусов судопроизводства – стадий, о&nbsp;которых было сказано выше. Интерфейс нового инструмента был&nbsp;разработан так, чтобы многочисленные формы и&nbsp;таблицы стали легкими в&nbsp;восприятии.</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/cd395bad4ccae497987d8f37a30d1713"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/76f24262439d4fc69e21b69e91e9408c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2910/result.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/fc59ae0031cfd4bedd726cbc638e744f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4158d3e3a863473d809784cc6d7096fd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>Получилась система «Цессионарий», которая автоматизировала работу департамента судебного взыскания МФК&nbsp;«Лайм-Займ». Теперь ручного труда во&nbsp;всем цикле работ от&nbsp;подачи заявления на&nbsp;взыскание до&nbsp;погашения долга всего 10-15%. Система сама генерирует ряд&nbsp;документов и&nbsp;готовит их&nbsp;к&nbsp;отправке в&nbsp;суды. Регулярную отчетность в&nbsp;БКИ&nbsp;«Цессионарий» отправляет автоматически, а&nbsp;продвижение документов по&nbsp;стадиям происходит по&nbsp;нажатию кнопки. Ну&nbsp;и, конечно, никаких монструозных таблиц.</span><span></span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8327c2af1c3efbce21d219dceb7fd389"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/170f51a3ac3245f1ae5ef3f00c74564b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Подготовка и&nbsp;отправка дел&nbsp;в&nbsp;суды</h2>
<div class="l-island-a">
<p>Теперь о&nbsp;процессах подробнее. «Цессионарий» делает выборку по&nbsp;делам на&nbsp;одной стадии и&nbsp;«склеивает» весь пакет документов по&nbsp;ним&nbsp;в&nbsp;один файл, а&nbsp;еще&nbsp;автоматически генерирует документы, необходимые для&nbsp;отправки в&nbsp;суд. Менеджеру системы для&nbsp;этого достаточно нажать на&nbsp;кнопку.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/59b59c680b4d1018eb35da8ce11afdb9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e913adcf62fb4e999c39aec5367ac6ee"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2908/&#x433;&#x43E;&#x442;&#x43E;&#x432;&#x44B;-&#x43A;-&#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43A;&#x435;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/1dfa8f8d334970f8953fc83a3319db80"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7cad586195e24805b5ceccea5ccf0ba5"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p>За раз&nbsp;система готовит к&nbsp;печати пакеты документов сразу по&nbsp;нескольким делам. Раньше пакеты документов по&nbsp;каждому делу приходилось собирать и&nbsp;печатать отдельно.</p>
</div>
<div class="l-island-a">
<p>После печати сотрудники рассортировывают документы по&nbsp;конвертам и&nbsp;рассылают их&nbsp;по&nbsp;судам почтой, после чего заносят трек-номера отправлений в&nbsp;«Цессионарий».</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/fc49c78ddd184343af081924c8efa627"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Интеграция с&nbsp;Почтой России</strong>
    «Цессионарий» самостоятельно отслеживает доставку писем до&nbsp;нужных инстанций. Внутри системы есть обработчик, который взаимодействует с&nbsp;API&nbsp;Почты России. Раз&nbsp;в&nbsp;сутки он&nbsp;создает запрос по&nbsp;имеющимся трек-номерам, и, если письма доставлены, фиксирует это&nbsp;в&nbsp;системе, тем&nbsp;самым автоматически переводя доставленные документы на&nbsp;новую стадию обработки.
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/aa4ff1c68b129efe3a77a1ffd5b8295c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/65e84b383d55441195833a5716c0889c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Взаимодействие с&nbsp;судами</h2>
<div class="l-island-a">
<p>Суд может может удовлетворить иск&nbsp;или&nbsp;отклонить его. В&nbsp;обоих случаях приходит ответный документ: судебный приказ о&nbsp;взыскании задолженности или&nbsp;отказ. «Цессионарий» предоставляет возможность считывания содержимого таких судебных документов с&nbsp;помощью парсинга через Яндекс.Vision. Данные из&nbsp;документов сотрудники заносят в&nbsp;систему, после чего дело переходит на&nbsp;новую стадию.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b39df642f4d28575d12df58c460772b3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/d53448f7abc846c580f5ffe7cca373f9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2909/&#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x442;-&#x440;&#x430;&#x441;&#x43F;&#x43E;&#x437;&#x43D;.png"
         alt=""
         itemprop="">


        <figcaption>
            Бывают случаи, когда суд возвращает документы и просит перенаправить их в другую инстанцию. Для таких документов в «Цессионарии» также существует отдельная стадия.
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/00cbd0724850632446947d50a4372c37"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3b4ec1cb840e4aa0b015d6c151397c73"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как взыскиваются долги</h2>
<div class="l-island-a">
<p>Для передачи дела в&nbsp;суд&nbsp;нужно оплатить госпошлину. Ее&nbsp;размер в&nbsp;случае удовлетворения иска определяется судом и&nbsp;прибавляется к&nbsp;основной сумме долга. «Цессионарий» фиксирует данные о&nbsp;сумме долга, включая основной долг, пени и&nbsp;добавляющиеся в&nbsp;ходе истребования пошлины. В&nbsp;системе видно, сколько всего денег должнику нужно оплатить.</p>
<p> </p>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/02c4aeadfe554c95b2e875215ba01e90"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2911/screenshot-2023-01-30-141310.jpg"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4e5f3fc1f982c8bcf08038aca4cb88ce"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0cf6880ddd81456a92106675a4ba953c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p>После удовлетворения иска судом специалисты департамента судебного взыскания отправляют требования в&nbsp;банки, пенсионный фонд или&nbsp;судебным приставам, и&nbsp;так, пока должник самостоятельно или&nbsp;через приставов не&nbsp;внесет нужную сумму. Все&nbsp;отправления сотрудники заносят в&nbsp;“Цессионарий”, тем&nbsp;самым продвигая дело по&nbsp;стадиям.</p>

<div class="umb-macro-highlights">
    <strong>Интеграция с&nbsp;БКИ&nbsp;для&nbsp;отчетности</strong>
    Когда статус кредита изменился, что&#8209;то&nbsp;происходит с&nbsp;кредитом (покупка долга, добавление платежа, получение судебного приказа, признание мошенником/жертвой мошенника и&nbsp;другие изменения), «Цессионарий» передает отчет об&nbsp;этом событии в&nbsp;БКИ. Система сама генерирует отчет в&nbsp;нужном формате для&nbsp;электронной передачи в&nbsp;бюро по&nbsp;API. Подобным же&nbsp;образом «Цессионарий» отчитывается о&nbsp;делах, статус которых в&nbsp;течение длительного периода не&nbsp;меняется – это&nbsp;еще&nbsp;одно регуляторное требование.
</div>

<p>«Цессионарий» передает данные в&nbsp;БКИ&nbsp;на&nbsp;следующий день после изменения статуса каждого дела (или, если в&nbsp;течение 30 дней с&nbsp;делом ничего не&nbsp;происходит). Раньше, когда специалисты департамента судебного взыскания работали с&nbsp;делами в&nbsp;огромной таблице, отчетные данные могли потеряться и&nbsp;не&nbsp;дойти до&nbsp;БКИ. Это&nbsp;грозило бы&nbsp;компании потерей лицензии – ее&nbsp;могут отозвать, если информация по&nbsp;кредитам перестанет поступать в&nbsp;БКИ&nbsp;в&nbsp;нужные сроки. Теперь такие риски исключены.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e90baa7bb37f19d20105db99da082e7a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f07fdde907c64165a59c0128e2233ca6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>«Цессионарий»: резюме по&nbsp;функциональности</h2>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/a67695ad26ce06ab45132664d807b05b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b1274d9670594e13ab476f12efee517d"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li>Генерирует ряд&nbsp;документов: выписки из&nbsp;договоров цессии, заявления на&nbsp;выдачу судебных постановлений.</li>
<li>Позволяет вручную прикрепить к&nbsp;делу корреспонденцию: сотрудник подгружает в&nbsp;дело сканы писем и&nbsp;документов, которые есть исключительно на&nbsp;бумаге.</li>
<li>Позволяет парсить данные из&nbsp;отсканированных документов и&nbsp;заносит их&nbsp;в&nbsp;базу.</li>
<li>Отслеживает доставку документов по&nbsp;почте в&nbsp;суды и&nbsp;другие инстанции.</li>
<li>Назначает нового ответственного сотрудника при&nbsp;переходе с&nbsp;этапа на&nbsp;этап.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/684675d8b6474910857be8ac32a2d3b3"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<ul>
<li>Сортирует и&nbsp;ищет дела в&nbsp;общей базе по&nbsp;нескольким параметрам: внутреннему ID, номеру договора, кредитору, статусу иска и&nbsp;другим.</li>
<li>За раз&nbsp;готовит к&nbsp;печати пакеты документов сразу по&nbsp;нескольким делам.</li>
<li>Контролирует размеры задолженностей и&nbsp;их&nbsp;погашение, а&nbsp;также переплаты по&nbsp;долгам.</li>
<li>Уведомляет Бюро кредитных историй о&nbsp;заключении договора цессии, поступлении платежей, полном погашении долга или&nbsp;его&nbsp;списании.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7fb50b35ab968c27552c454a7da6ce25"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/4c7221d4b6af4c0fbb65afc3ced45609"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2912/screenshot-2023-01-30-141138.jpg"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/1286dcc8c6a1adea39fc19205e9cce60"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/600950fd2a794908a2d8ce8b452832f3"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Технологии</h2>
<div class="l-island-a">
<p>Для разработки «Цессионария» мы&nbsp;использовали следующий стек:</p>
</div>
<div class="l-island-a">
<ul>
<li>.Net Core</li>
<li>MSSQL Server</li>
<li>EF Core</li>
<li>Docker</li>
<li>VueJS</li>
<li>gRPC</li>
<li>Hangfire</li>
</ul>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7c16361ee865437aae708bce62f5765f"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Результаты</h2>
<div class="l-island-a">
<p>До запуска «Цессионария» в&nbsp;рамках первичной подачи отдел готовил 8-10 тысяч заявлений в&nbsp;месяц, а&nbsp;после запуска — на&nbsp;20% больше.</p>
</div>
<div class="l-island-a">
<p>«Цессионарий» автоматизировал часть бизнес-процессов отдела судебного взыскания. Поэтому значительно увеличилась скорость работы сотрудников.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/9282d80ddf0c8205594de31809554908"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e9d68bce925e4716a28d43263b2b9a11"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2914/frame-270.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9367506303f0452c9f8742c06299f7ff"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>И еще&nbsp;несколько слов от&nbsp;Екатерины о&nbsp;работе нашей команды: «Хочу отдельно отметить работу команды fuse8 — ребята занимают проактивную позицию в&nbsp;проекте, озвучивают предложения по&nbsp;улучшению работы системы. За&nbsp;прошедшие полгода были выполнены технические задачи, которые позволили обрабатывать больший объем портфеля без&nbsp;снижения скорости работы программного обеспечения»</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6b1b3b7b0e09493abecb388873e08dd6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/f0701b1daa7c4f43987352f1a6a5ff2f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="awards"
            data-content-element-type-key="82cdbbd8-0baa-4271-a5b0-0f1aae3d3bed"
            data-element-udi="umb://element/a85f7e1e0c0d431fbf0521540d3a7d36"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Проектирование личного кабинета для поставщиков маркетплейса Emex DWC
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/emex-seller-drive-system-design/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/emex-seller-drive-system-design/</guid>

                <pubDate>Thu, 22 Jan 2026 06:24:35 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Проектирование личного кабинета для поставщиков маркетплейса Emex DWC</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/711045841286e01ee9bdebcafcfb9ae4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8fe2476a1b8a41dfa89be549a4545b4a"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<div class="umb-macro-image-with-offset umb-macro-image-with-offset--30620489 case-logo">
    


    <img src="/Media/2764/logo-1-1.png"
         alt=""
         itemprop="">


</div>


<p> </p>
<h1><span>Проектирование личного кабинета для&nbsp;поставщиков маркетплейса Emex DWC</span></h1>






<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2766/rectangle-10.jpg"
         alt=""
         itemprop="">


</div>

<p><strong>EMEX</strong><span> — международный холдинг, который включает торговый, доставочный и&nbsp;информационный бизнесы: </span>торговая площадка Emex DWC&nbsp;в&nbsp;ОАЭ, логистический оператор HWC&nbsp;и&nbsp;EMEX.ru — первый профессиональный маркетплейс автозапчастей в&nbsp;России. В&nbsp;рамках этой задачи мы&nbsp;работали с&nbsp;командой Emex DWC.</p>
<p><strong>К нам&nbsp;Emex DWC&nbsp;пришли с&nbsp;очень масштабной и&nbsp;крутой задачей:</strong> спроектировать новую версию Seller Drive — системы для&nbsp;работы с&nbsp;поставщиками.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/a37ea77036fa4ef3a0366d0208d7a00e"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2766/rectangle-10.jpg"
         alt=""
         itemprop="">


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/965843e7994e8c3bbd38668ec1200477"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a8b5b0a02b7b4ea8ba73c0d60bc66a14"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>О проекте<ins></ins></h2>

<div class="timeframe">
    <div class="timeframe__item">
        <strong>&#x421;&#x442;&#x430;&#x440;&#x442; &#x440;&#x430;&#x431;&#x43E;&#x442;:</strong> июль 2021
    </div>
    <div class="timeframe__item">
        <strong>&#x424;&#x438;&#x43D;&#x430;&#x43B; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;:</strong> август 2021
    </div>
</div>

<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="threeColumns"
            data-content-element-type-key="c9b72d31-8ab3-38f4-b5fb-a9a9814ae17a"
            data-element-udi="umb://element/8a974edc06fffea17dfc848582c1672a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/59ddc8815e3b4ea5b8f2aeaf6d35708d"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<h3 class="team__title" style='border-bottom-color:  #FFD541'>
    Команда fuse8
</h3>

<p><strong>Технический директор</strong> <br>Андрей Степанов</p>
<p><strong>Руководитель проекта</strong> <br>Вениамин Мустафин</p>
<p><strong>Бизнес-аналитик</strong> <br>Юрий Торопчин</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/45fbbc913c0d49faa97c43a22386c16c"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<h3 class="team__title" style='border-bottom-color: #FD5A21'>
    Команда Emex DWC&nbsp;
</h3>

<p><strong>Менеджер продукта</strong><br>Александр Крашенин</p>
<p><strong>Руководитель проекта</strong> <br><span>Кузнецов Юрий</span></p>
<p><span><strong>Технический директор</strong><br>Дмитрий Шнипов</span></p>
<p><strong>Архитектор и&nbsp;разработчик</strong><br><span>Евгений Рикунов</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/fde6d0ce69d2344ce0fe87ebd97d0790"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ec3e330b9e964dad9d3dc1d8e4881ba3"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Предыстория</h2>
<p>Раньше мы&nbsp;уже&nbsp;встречались с&nbsp;компанией Emex. В&nbsp;2020 году мы&nbsp;вместе поработали над&nbsp;проектом для&nbsp;команды HWC. Спустя год, когда у&nbsp;Emex возникла потребность в&nbsp;обновлении внутренней системы для&nbsp;поставщиков на&nbsp;зарубежном рынке, они&nbsp;вновь обратились к&nbsp;нам.</p>
<h3>Что такое Seller Drive</h3>
<p><strong>Seller Drive</strong> — это&nbsp;внутренняя система Emex DWC&nbsp;для&nbsp;работы с&nbsp;поставщиками. Если кратко, взаимодействие между поставщиками, менеджерами Emex DWC&nbsp;и&nbsp;конечными клиентами, заказывающими запчасти, устроено так:</p>
<ol>
<li><span style="font-weight: 400;">поставщики регистрируются в&nbsp;Seller Drive и&nbsp;загружают туда прайс-листы со&nbsp;своими товарами → </span></li>
<li><span style="font-weight: 400;">эти товары попадают в&nbsp;каталог интернет-магазина Emex DWC&nbsp;→</span></li>
<li><span style="font-weight: 400;">покупатель выбирает нужный товар по&nbsp;подходящей цене в&nbsp;интернет-магазине и&nbsp;оформляет заказ →</span></li>
<li><span style="font-weight: 400;">этот заказ появляется в&nbsp;системе Seller Drive у&nbsp;поставщика →</span></li>
<li><span style="font-weight: 400;">поставщик обрабатывает заказ и&nbsp;отгружает товар покупателю.</span></li>
</ol>
<p>В этой схеме Emex, как&nbsp;посредник/менеджер, помогает состояться сделке между покупателем и&nbsp;поставщиком и, если на&nbsp;каком&#8209;то&nbsp;из&nbsp;этапов что&#8209;то&nbsp;идёт не&nbsp;так, вникает в&nbsp;ситуацию и&nbsp;помогает разрешить проблему.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/102d5c3ead857989aff2fd5d9ffbdfae"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/017bcf09a79f4fb5aa7c93cc821564e9"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Что не&nbsp;так&nbsp;с&nbsp;Seller Drive</h3>
<p>В 2021 году системе для&nbsp;поставщиков исполнилось 10 лет. И&nbsp;последние 7 из&nbsp;них&nbsp;она&nbsp;никак не&nbsp;менялась и&nbsp;не&nbsp;развивалась. Seller Drive попросту устарела — с&nbsp;точки зрения бизнес-процессов компании, архитектуры и&nbsp;технологий.</p>
<p>Основная проблема Seller Drive — это&nbsp;большие трудозатраты на&nbsp;её&nbsp;использование. Из&#8209;за&nbsp;того, что&nbsp;она&nbsp;не&nbsp;соответствовала бизнес-процессам Emex, многое в&nbsp;ней&nbsp;приходилось делать/решать/исправлять вручную вне&nbsp;системы. Например, если поставщики совершали какую-либо ошибку при&nbsp;загрузке списка товаров, при&nbsp;обработке заказов или&nbsp;работе с&nbsp;претензиями покупателей, справиться самостоятельно с&nbsp;ней&nbsp;они&nbsp;не&nbsp;могли. Приходилось подключаться специалистам со&nbsp;стороны Emex.</p>
<p>Ещё одна проблема, от&nbsp;которой нам&nbsp;предстояло избавиться в&nbsp;ходе проекта — это&nbsp;обилие технологий в&nbsp;портфеле Emex. Часть внутренних сервисов компании был&nbsp;написаны на&nbsp;разных стеках. И&nbsp;потому развивать и&nbsp;поддерживать их&nbsp;было сложно и&nbsp;дорого — приходилось подключать разные команды на&nbsp;разные проекты. Начиная с&nbsp;новой версии Seller Drive компания хотела прийти к&nbsp;унификации всех своих сервисов и&nbsp;продуктов — сделать так, чтобы обслуживать и&nbsp;развивать их&nbsp;могла одна внутренняя команда.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium legend spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/273ce8c7ada34a2a92cd1bcaa0c8fd86"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>Seller Drive создавалась 10 лет&nbsp;назад.</strong> <br>И последние 7 из&nbsp;них&nbsp;она&nbsp;никак не&nbsp;менялась и&nbsp;не&nbsp;развивалась.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/4e4b4b541a9725b6e37161c945817bb2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f6dc505b773f4b20ba2e86eb29ea918f"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Цели и&nbsp;задачи</h2>
<p>Итак, мы&nbsp;должны были спроектировать новую версию Seller Drive — современную, масштабируемую и&nbsp;соответствующую всем ныне существующим бизнес-процессам Emex.</p>
<h3>Основные цели на&nbsp;проекте:</h3>
<ol>
<li>снизить затраты на&nbsp;пользование системой: фактически, уменьшить количество вмешательств со&nbsp;стороны менеджеров Emex в&nbsp;процесс работы поставщиков с&nbsp;системой;</li>
<li><span>снизить затраты на&nbsp;IT: мы&nbsp;должны были подобрать такие технологический стек и&nbsp;архитектуру, которые позволили бы&nbsp;разработчикам Emex самостоятельно поддерживать и&nbsp;развивать систему, а&nbsp;возможно даже использовать её&nbsp;как&nbsp;основу для&nbsp;разработки аналогичных продуктов.</span></li>
</ol>
<p>Еще один важный момент: новая Seller Drive должна будет создаваться на&nbsp;фундаменте уже&nbsp;существующей. Вариант «всё снести и&nbsp;сделать заново» не&nbsp;рассматривался — это&nbsp;было бы&nbsp;дорого, долго и&nbsp;нерационально. Нам&nbsp;предстояло сохранить удачные решения и&nbsp;улучшить их, а&nbsp;также найти всё&nbsp;неудачное/устаревшее и&nbsp;отказаться от&nbsp;этого в&nbsp;новой версии Seller Drive.</p>
<p><strong>Чтобы добиться всего этого, мы&nbsp;должны были:</strong></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">собрать максимум информации об&nbsp;уже&nbsp;существующей версии Seller Drive;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">провести анализ и&nbsp;зафиксировать все&nbsp;актуальные бизнес-процессы Emex, затрагивающие систему Seller Drive и&nbsp;работающих с&nbsp;ней&nbsp;людей — поставщиков и&nbsp;менеджеров;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">прояснить и&nbsp;описать сценарии, по&nbsp;которым должна будет работать новая версия Seller Drive; </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;"><span>найти в&nbsp;российских системах Emex решения, которые можно переиспользовать в&nbsp;новой Seller Drive</span>;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">провести технический аудит, сформировать архитектуру новой системы и&nbsp;подобрать технологии;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">прояснить, какой у&nbsp;нас&nbsp;в&nbsp;итоге должен получиться MVP&nbsp;новой версии Seller Drive и&nbsp;создать план его&nbsp;разработки.</span><span style="font-weight: 400;"></span></li>
</ul>

<div class="umb-macro-highlights">
    <strong>Результатом нашей работы</strong>
    должен был&nbsp;стать подробный план-проект по&nbsp;разработке новой версии Seller Drive, который включает в&nbsp;себя:
<ul>
<li>полное описание системы с&nbsp;точки зрения пользователей (функциональность, разделы, сценарии и&nbsp;т.д.);</li>
<li>технологическое описание системы (архитектура и&nbsp;стек);</li>
<li>выделенная MVP-версия системы;</li>
<li>зафиксированные метрики успеха проекта; </li>
<li>оценки на&nbsp;разработку MVP-версии.</li>
</ul>
</div>

</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/2274e2766e3482045fe2ab641705c209"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2465a6d8872f44068e2617dc6283e1d3"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Процесс</h2>
<p>Проектирование новой системы для&nbsp;поставщиков Seller Drive заняло у&nbsp;нас&nbsp;пять недель. И&nbsp;это&nbsp;— с&nbsp;учетом всех встреч с&nbsp;командой заказчика, которая охотно делилась своими знаниями о&nbsp;старой версии Seller Drive и&nbsp;рабочих процессах в&nbsp;компании.</p>
<p>Ну а&nbsp;начали мы, как&nbsp;и&nbsp;всегда, со&nbsp;сбора информации, уточнения всех требований и&nbsp;определения границ проекта.</p>
<h2>1 неделя</h2>

<div class="umb-macro-highlights">
    <strong>План спринта:</strong>
    составляем Impact Mapping → обсуждаем с&nbsp;клиентом бизнес-процессы Seller Drive и&nbsp;Emex  DWC&nbsp;→ изучаем текущую систему Seller Drive и&nbsp;Emex RU.
</div>

<h3>Составляем Impact Mapping</h3>
<p>Первое, что&nbsp;мы&nbsp;сделали, это&nbsp;уточнили и&nbsp;подтвердили цели проекта и&nbsp;обозначили его&nbsp;границы. В&nbsp;этом нам&nbsp;помог Impact Mapping.</p>
<p>Impact Mapping — это&nbsp;ментальная карта, которая определяет цели проекта и&nbsp;влияния, которые должны помочь достичь этих целей. Подробнее о&nbsp;том, как&nbsp;составить такую карту, читайте в&nbsp;нашей статье <a rel="noopener" href="/articles/impact-mapping" target="_blank" title="Impact Mapping: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех">«Impact Mapping: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех»</a>.</p>
<p><strong>Общей целью проекта </strong>в Impact Mapping мы&nbsp;обозначили снижение затрат на&nbsp;пользование новой версией системы. Напомним, по&nbsp;требованиям от&nbsp;заказчика она&nbsp;должна стать современной, соответствующей всем действующим бизнес-процессам компании.</p>
<p><strong>Действующими лицами</strong>, оказывающими влияние на&nbsp;достижение нашей цели, стали поставщики, которые размещаются в&nbsp;Seller Drive, а&nbsp;также менеджеры бэк-офиса Emex DWC&nbsp;— те&nbsp;самые сотрудники, которые решают все&nbsp;возникающие в&nbsp;Seller Drive проблемы.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d48097215e495495466079abaf882dc8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/f3f3ad4793bb46708a2b36c14561d702"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2767/group-7099.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/34f5fa01869daf47e5cb3dd1e1a7f3ba"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/db6b0e30f8494229a62ddf92da7f40d8"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Затем мы&nbsp;расписали, как&nbsp;наши действующие лица могут способствовать достижению поставленной нами цели, и&nbsp;что&nbsp;мы&nbsp;можем сделать, чтобы помочь им. Это&nbsp;и&nbsp;помогло нам&nbsp;определить границы проекта.</p>
<h3>Обсуждаем бизнес-процессы Seller Drive и&nbsp;Emex</h3>
<p>Дальше были созвоны с&nbsp;заказчиком. Представители Emex подробно рассказывали, как&nbsp;устроен их&nbsp;бизнес — на&nbsp;Среднем Востоке и&nbsp;в&nbsp;России. Мы&nbsp;обсуждали, какие рабочие процессы и&nbsp;инструменты у&nbsp;них&nbsp;есть, чего в&nbsp;этих процессах и&nbsp;инструментах не&nbsp;хватает. Задавали много вопросов о&nbsp;том, как&nbsp;работают Seller Drive и&nbsp;аналогичная система для&nbsp;поставщиков на&nbsp;российском рынке.</p>
<h3>Изучаем текущую систему Seller Drive и&nbsp;Emex RU</h3>
<p>Затем клиент дал&nbsp;нам&nbsp;доступ к&nbsp;действующей системе Seller Drive и&nbsp;познакомил с&nbsp;хранителем знаний о&nbsp;ней&nbsp;— разработчиком и&nbsp;проектировщиком Евгением.</p>
<p>Евгений помог нам&nbsp;досконально изучить Seller Drive — вместе мы&nbsp;буквально разложили систему по&nbsp;кирпичикам-разделам и&nbsp;начали фиксировать проблемы, которые возникали у&nbsp;поставщиков и&nbsp;менеджеров Emex DWC&nbsp;в&nbsp;процессе её&nbsp;использования.</p>
<p>Всё, что&nbsp;нам&nbsp;удалось обнаружить, фиксировали в&nbsp;специальной таблице — у&nbsp;кого возникает проблема, в&nbsp;какой момент, в&nbsp;каком разделе и&nbsp;чем&nbsp;будет ценно устранение этой проблемы:</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6bc2a4f3cf60b10ad333174dd67e8ab0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/f07c9c92bcc74c97b3c2565f9620f1bb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2768/&#x43E;&#x448;&#x438;&#x431;&#x43A;&#x438;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/2a498140c2bf7df9780ec67ac1fd21ce"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9d045075cff34f08b059eb0209040fff"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Дополнительно мы&nbsp;сразу же&nbsp;накидывали и&nbsp;векторы улучшения или&nbsp;способы избавления от&nbsp;найденных проблем.</p>
<p>Этот документ стал нашим первым сборником гипотез — что&nbsp;мы&nbsp;можем изменить/добавить/сделать, чтобы новая версия Seller Drive работала лучше.</p>
<h2>2-3 неделя</h2>

<div class="umb-macro-highlights">
    <strong>План спринта:</strong>
    описываем компоненты новой версии Seller Drive → визуализируем интерфейс новой версии Seller Drive
</div>

<h3>Описываем компоненты новой версии Seller Drive</h3>
<p>Это был&nbsp;один из&nbsp;самых интенсивных спринтов проекта, на&nbsp;котором мы&nbsp;<a rel="noopener" href="https://www.artlebedev.ru/kovodstvo/sections/167/" target="_blank" title="§ 167. Метод прогрессивного джипега — Артемий Ле">методом прогрессивного джипега</a> создавали подробное описание новой версии Seller Drive.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/64e94275ab2ba11f1da444eeac07845e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ebdd2eea7d5a4be5a1692d613779fa34"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2769/&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;-&#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium legend spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/44644ad75987400b9c43d885853e13b5"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>В описание новой версии Seller Drive входит:</strong></p>
<ul>
<li>глоссарий;</li>
<li>общие требования;</li>
<li>процессы по&nbsp;разным разделам системы;</li>
<li>метрики успеха проекта и&nbsp;т.д.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/8120ecef9247e7000a8dd81f3f4c2515"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a3ccff2ac1e24cf1acedb596c5377db3"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Мы шли&nbsp;от&nbsp;общего к&nbsp;частному и&nbsp;проводили по&nbsp;два&nbsp;созвона в&nbsp;неделю с&nbsp;клиентом. На&nbsp;первый мы&nbsp;приходили с&nbsp;нашим видением определённых модулей новой Seller Drive — верхнеуровневым, без&nbsp;лишней детализации. Затем вместе с&nbsp;клиентом мы&nbsp;обсуждали всё&nbsp;это, проясняли появившиеся вопросы, испытывали заложенные нами сценарии на&nbsp;прочность реальными бизнес-процессами Emex DWC, а&nbsp;после уходили работать дальше.</p>
<p>Ко второму созвону мы&nbsp;погружались в&nbsp;процессы и&nbsp;сценарии глубже — детализировали и&nbsp;досконально описывали логику работы каждого из&nbsp;модулей с&nbsp;учётом всех возможных сценариев и&nbsp;задействованных действующих лиц.</p>
<p>Так постепенно в&nbsp;течение двух недель мы&nbsp;описали, а&nbsp;затем детализировали с&nbsp;учётом фидбека заказчика все&nbsp;модули и&nbsp;компоненты новой версии системы.</p>
<h3>Визуализируем интерфейс новой версии Seller Drive</h3>
<p>На третьей неделе проекта к&nbsp;нам&nbsp;пришло понимание, что&nbsp;описывать интерфейс исключительно в&nbsp;формате текста, без&nbsp;какой-либо визуализации, очень непросто. Равно, как&nbsp;и&nbsp;презентовать его&nbsp;заказчику. В&nbsp;итоге мы&nbsp;начали создавать первые прототипы Seller Drive. А&nbsp;чтобы не&nbsp;погрузиться в&nbsp;излишнюю детализацию и&nbsp;дизайн, в&nbsp;качестве инструмента выбрали Google-таблицы.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8e0d7667d3bd908eec4bc38f32c9a676"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/58a25c9c9dd74e908bb9595fe98b7974"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2770/image-722.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/0885f0444f203c7cf641f614f47e1d22"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e138b84aee2e46eca70a8c49c1fbac34"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Это оказалось решением на&nbsp;миллион! Табличные прототипы справлялись с&nbsp;поставленной задачей на&nbsp;все&nbsp;100% — теперь мы&nbsp;не&nbsp;просто представляли интерфейс в&nbsp;голове, а&nbsp;реально видели его&nbsp;своими глазами. И&nbsp;при&nbsp;этом на&nbsp;создание прототипов уходило минимум времени.</p>
<p>Дизайнер, который позже присоединился к&nbsp;проекту, был&nbsp;рад&nbsp;узнать о&nbsp;существовании прототипов. Конечно, это&nbsp;были скорее верхнеуровневые черновики, которые в&nbsp;итоге довольно сильно трансформировались. Но&nbsp;даже в&nbsp;таком виде они&nbsp;принесли ему&nbsp;немало пользы: как&nbsp;минимум, было от&nbsp;чего отталкиваться при&nbsp;оценке проекта.</p>
<h2>4 неделя</h2>

<div class="umb-macro-highlights">
    <strong>План спринта:</strong>
    финализируем описание новой версии Seller Drive → подбираем технологии, формируем архитектуру
</div>

<h3>Финализируем описание новой версии Seller Drive</h3>
<p>На четвёртой неделе мы&nbsp;завершили описывать новую версию системы Seller Drive. Мы&nbsp;убедились, что&nbsp;зафиксировали в&nbsp;нём&nbsp;абсолютно все&nbsp;внутренние процессы и&nbsp;закрыли все&nbsp;оставшиеся вопросы.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/77a533afc128dfef45542f28acc98611"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/307cdf972ee34809ab6aeae7738d0a14"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2771/&#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x435;-&#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;-&#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/c8231c61765f1a1a9772ec4b90898a73"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cb4a4480fc024ceebd2c569dcaf091cf"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>На этом этапе финальная версия описания Seller Drive включала в&nbsp;себя:</p>
<ul>
<li>общее описание системы;</li>
<li>глоссарий, который помогает ориентироваться в&nbsp;документе и&nbsp;знакомит с&nbsp;внутренней терминологией проекта;</li>
<li>общие требования к&nbsp;системе;</li>
<li>подробные описания каждого конкретного процесса внутри Seller Drive (от&nbsp;входа и&nbsp;регистрации до&nbsp;изменения оферты поставщиков и&nbsp;работы с&nbsp;заказами);</li>
<li>список возможных проблем/сложностей, которые могут возникать у&nbsp;пользователей системы, и&nbsp;сценарии/варианты их&nbsp;решений.</li>
</ul>
<h3>Подбираем технологии, формируем архитектуру</h3>
<p>Затем у&nbsp;нас&nbsp;были созвоны с&nbsp;ведущим разработчиком из&nbsp;команды заказчика. Вместе мы&nbsp;обсуждали архитектуру новой версии Seller Drive и&nbsp;формировали стек. Важно было подобрать те&nbsp;решения и&nbsp;технологии, которые совпадали бы&nbsp;с&nbsp;другими продуктами Emex, чтобы после запуска внутренняя команда разработки клиента могла работать с&nbsp;Seller Drive и&nbsp;дальше — поддерживать и&nbsp;развивать систему.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2855/&#x430;&#x440;&#x445;&#x438;&#x442;&#x435;&#x43A;&#x442;&#x443;&#x440;&#x430;-&#x441;&#x435;&#x43B;&#x43B;&#x435;&#x440;&#x434;&#x440;&#x430;&#x439;&#x432;.png"
         alt=""
         itemprop="">


</figure>

<p>С учётом всех пожеланий наших коллег-разработчиков из&nbsp;Emex, мы&nbsp;сформировали архитектуру новой Seller Drive и&nbsp;подробно прописали стек для&nbsp;бэкенд- и&nbsp;фронтенд-частей проекта. А&nbsp;также зафиксировали, какие библиотеки можно использовать для&nbsp;упрощения разработки фронтенда и&nbsp;предложили конкретное решение по&nbsp;хостингу.</p>
<p>Дополнительно мы&nbsp;просчитали нормы производительности Seller Drive, а&nbsp;именно — показатели нагрузки и&nbsp;количества данных, с&nbsp;которыми новая версия системы должна работать без&nbsp;ухудшения производительности:</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2773/&#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x441;&#x442;&#x44C;.png"
         alt=""
         itemprop="">


</figure>

<figure></figure>
<h2>5 неделя</h2>

<div class="umb-macro-highlights">
    <strong>План спринта:</strong>
    выделяем функциональность для&nbsp;MVP&nbsp;→ оцениваем разработку новой версии Seller Drive и&nbsp;определяем метрики успеха
</div>

<h3>Выделяем функциональность для&nbsp;MVP</h3>
<p>В конце проекта мы&nbsp;вновь вернулись к&nbsp;нашей карте влияний. Вместе с&nbsp;клиентом мы&nbsp;прошлись по&nbsp;всем фичам, которые зафиксировали в&nbsp;ней&nbsp;ещё&nbsp;на&nbsp;первой неделе, и&nbsp;расставили приоритеты. Фактически — решили, что&nbsp;у&nbsp;нас&nbsp;будет реализовано уже&nbsp;в&nbsp;первой версии системы, а&nbsp;что&nbsp;останется на&nbsp;следующие итерации.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/507779eabc6253d58d822e15158acf81"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/0a13b993dcb44943bcf2ea4f0ae645d0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2774/frame-204.png"
         alt=""
         itemprop="">


        <figcaption>
            Вот так выглядела финальная версия карты влияний: зелёным выделено то, что войдёт в MVP, жёлтым — то, что будет реализовано позже. 
        </figcaption>
</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/39fa5ed84c3b75470fec3ab90497dc5f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/23fd298d9a404360ab831d006f8c7818"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Всё это&nbsp;было сделано ради оптимизации трудозатрат и&nbsp;скорости разработки без&nbsp;потери полезного действия MVP. Проще говоря — помогло нам&nbsp;понять, как&nbsp;за&nbsp;минимальное количество времени сделать и&nbsp;запустить в&nbsp;работу максимально полезную новую версию Seller Drive.</p>
<h3>Оцениваем разработку новой версии Seller Drive и&nbsp;определяем метрики успеха</h3>
<p>Затем мы&nbsp;оценили, сколько по&nbsp;времени займёт разработка MVP&nbsp;Seller Drive — с&nbsp;учётом наших архитектурных решений, выбранного технологического стека и&nbsp;всей заложенной в&nbsp;MVP&nbsp;функциональности. А&nbsp;также прописали метрики, по&nbsp;которым заказчик мог&nbsp;бы&nbsp;оценить эффективность новой Seller Drive после запуска:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2775/&#x43C;&#x435;&#x442;&#x440;&#x438;&#x43A;&#x438;-&#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;.png"
         alt=""
         itemprop="">


</figure>

<p>Фактически, это&nbsp;список показателей, которые клиент будет отслеживать, чтобы понять, успешна ли&nbsp;новая система, удобна ли&nbsp;она&nbsp;для&nbsp;поставщиков и&nbsp;менеджеров.</p>
<h2>Результат</h2>
<p>Результатом нашей работы стал чёткий план по&nbsp;разработке новой версии системы для&nbsp;поставщиков Emex DWC&nbsp;— Seller Drive. В&nbsp;него вошли:</p>
<p><strong>Подробное описание всей системы</strong> — со&nbsp;сценариями, разделами, процессами и&nbsp;метриками для&nbsp;определения её&nbsp;эффективности.</p>
<p><strong>Первые прототипы экранов системы,</strong> которые дизайнеру остается только преобразовать в&nbsp;макеты с&nbsp;учётом дизайн-кода и&nbsp;стайл-гайда Emex.</p>
<p><strong>Сформированная архитектура</strong> и&nbsp;согласованный технологический стек с&nbsp;учётом всех пожеланий команды разработки заказчика</p>
<p><strong>Оценки на&nbsp;разработку MVP&nbsp;Seller Drive</strong> с&nbsp;учётом всего вышеперечисленного.</p>
<h2>Что дальше</h2>
<p>В мае&nbsp;2022 года Emex запустили новую версию Seller Drive, созданную по&nbsp;нашим планам и&nbsp;оценкам. Она&nbsp;уже&nbsp;используется поставщиками в&nbsp;странах Среднего Востока. <span>На проекте работали бэкенд-разработчики из&nbsp;Emex и&nbsp;наши ребята-фронтендеры</span>.</p>
<p>В планах — продолжать совершенствовать и&nbsp;улучшать систему Seller Drive, масштабировать её&nbsp;и&nbsp;активно использовать для&nbsp;развития бизнеса Emex.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/64805e410daa495ca41f6390361acccf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/73be0bb594504f208de87f75e750eb89"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Работая в&nbsp;команде с&nbsp;fuse8 мы&nbsp;смогли, наконец, понять и&nbsp;зафиксировать, какой должна быть новая Seller Drive, как&nbsp;мы&nbsp;можем её&nbsp;улучшить и&nbsp;сократить при&nbsp;этом затраты на&nbsp;пользование системой и&nbsp;её&nbsp;дальнейшее развитие. А&nbsp;ещё&nbsp;у&nbsp;нас&nbsp;появился конкретный план разработки новой Seller Drive, который мы&nbsp;быстро воплотили в&nbsp;жизнь — система уже&nbsp;работает, мы&nbsp;перевели на&nbsp;неё&nbsp;часть поставщиков.

Что&nbsp;касаемо работы с&nbsp;командой fuse8, то&nbsp;и&nbsp;тут&nbsp;опыт мы&nbsp;получили очень позитивный. Все&nbsp;ребята самостоятельные, быстро вникают в&nbsp;процессы, умеют слушать и&nbsp;слышать. Соблюдают наши внутренние требования к&nbsp;работе. 
Отдельно хочу выделить аналитика проекта Юрия. Он&nbsp;отлично собирал информацию, правильно её&nbsp;интерпретировал и&nbsp;постоянно сверялся с&nbsp;нами — точно ли&nbsp;всё&nbsp;так, как&nbsp;он&nbsp;понял. У&nbsp;нас&nbsp;когда в&nbsp;штат приходит новый сотрудник, ему&nbsp;на&nbsp;знакомство с&nbsp;Seller Drive требуется месяца два. А&nbsp;тут&nbsp;Юрий, как&nbsp;человек со&nbsp;стороны, за&nbsp;5 недель во&nbsp;всё&nbsp;вник, описал и&nbsp;спроектировал что&#8209;то&nbsp;новое, более совершенное. 

Единственное, что&nbsp;хотелось бы&nbsp;поменять, это, пожалуй, формат встреч. Иногда казалось, что&nbsp;мы&nbsp;их&nbsp;немного перегрузили — слишком много людей участвовали и&nbsp;озвучивали свои пожелания и&nbsp;требования. Это&nbsp;приводило к&nbsp;тому, что&nbsp;иногда часть информации терялась. Думаю, тут&nbsp;помогла бы&nbsp;более жесткая модерация встреч или&nbsp;их&nbsp;разделение на&nbsp;бизнесовые и&nbsp;технические.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Александр Крашенин
                </cite>
                <p class="blockquote-new__author-position">
                    менеджер продукта Seller Drive
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Emex Seller Drive: модернизация логистической системы, которая не развивалась 7 лет
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/emex-seller-drive-system-development/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/emex-seller-drive-system-development/</guid>

                <pubDate>Thu, 22 Jan 2026 06:23:47 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Emex Seller Drive: модернизация логистической системы, которая не развивалась 7 лет</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/b439367a82e7fcb210523960ca88db82"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d6dadcdf916842afbd0046f7b5a11c1d"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--63312044 case-logo">
    


    <img src="/Media/2764/logo-1-1.png"
         alt=""
         itemprop="">


</div>


<h1>Emex Seller Drive: модернизация логистической системы, которая не&nbsp;развивалась 7 лет</h1>





<p><span style="font-weight: 400;">Интеграция в&nbsp;команду заказчика, встраивание продукта в&nbsp;технологическую экосистему Emex и&nbsp;запуск через 6 месяцев.</span></p>
<p>&nbsp;</p>
<h2>Немного о&nbsp;задаче</h2>
<p><span style="font-weight: 400;">Seller Drive — это&nbsp;система Emex DWC&nbsp;для&nbsp;работы с&nbsp;поставщиками – их&nbsp;личный кабинет. Он&nbsp;выступает своеобразным мостиком между поставщиком автозапчастей и&nbsp;их&nbsp;заказчиком. Вот&nbsp;как&nbsp;устроено их&nbsp;взаимодействие в&nbsp;системе:&nbsp;</span></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Поставщики регистрируются в&nbsp;Seller Drive и&nbsp;загружают туда прайс-листы со&nbsp;своими товарами →&nbsp;&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Товары попадают в&nbsp;каталог интернет-магазина Emex DWC&nbsp;→</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Покупатели выбирают нужные товары по&nbsp;подходящей цене в&nbsp;интернет-магазине и&nbsp;оформляют заказы →&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Заказы появляется в&nbsp;системе Seller Drive у&nbsp;поставщиков →&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Поставщики обрабатывают заказы и&nbsp;отгружают товары.</span></li>
</ol>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/8628c5c20329462c819af0e6221eed6a"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2872/1209.png"
         alt=""
         itemprop="">


</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/240159abb908461884f6a535132613c4"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Компания Emex DWC&nbsp;</strong>
    занимается продажей запчастей и&nbsp;оборудования для&nbsp;автомобилей. Клиенты – представители B2B-сектора на&nbsp;рынке Среднего Востока, Америки и&nbsp;Европы.
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneTenOne"
            data-content-element-type-key="26b8f5c4-7fe9-353c-b684-1f2efda25f90"
            data-element-udi="umb://element/d88f08aa8b6c9e19eebcd4c475263608"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--1">
							
<div class="umb-block-grid__area"
     data-area-col-span="1"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 1;--umb-block-grid--area-column-span: 1; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
						<div class="umb-grid__col umb-grid__col--10">
							
<div class="umb-block-grid__area"
     data-area-col-span="10"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 10;--umb-block-grid--area-column-span: 10; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/fb6e5482c66c4cf481583f982ebf6903"
            data-col-span="10"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 10; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2860/frame-195.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--1">
							
<div class="umb-block-grid__area"
     data-area-col-span="1"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 1;--umb-block-grid--area-column-span: 1; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/dbc346b5bddd56a348149c6c106621d1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d646268eb85e48f297bb14d4d4c269f1"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Нам предстояло создать новую версию Seller Drive взамен той, что&nbsp;существовала в&nbsp;компании последние 10 лет&nbsp;и&nbsp;никак не&nbsp;обновлялась 7 из&nbsp;них. Нужно было подстроить Seller Drive под&nbsp;актуальные бизнес-процессы Emex DWC&nbsp;и&nbsp;их&nbsp;технологическую экосистему. </span></p>
<p><span style="font-weight: 400;">Разработку Seller Drive мы&nbsp;начали после проектирования системы. Этот этап длился 5 недель и&nbsp;стал основой для&nbsp;следующего за&nbsp;ним&nbsp;этапа разработки, о&nbsp;котором мы&nbsp;рассказываем в&nbsp;этом материале. О&nbsp;том, как&nbsp;проходил процесс проектирования, мы&nbsp;рассказали <a href="/projects/emex-seller-drive-system-design/" title="Emex Seller Drive Analytics">в отдельном кейсе</a>. </span></p>
<p><span style="font-weight: 400;">Новая Seller Drive базировалась на&nbsp;фундаменте уже&nbsp;существующей системы. Мы&nbsp;сохранили удачные решения и&nbsp;улучшили их, а&nbsp;также добавили системе новых возможностей, удалив устаревшую и&nbsp;бесполезную функциональность.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/50b9b8652de2d08578ca0c02518509d1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ca082898f53d4b88996a42e2e1e42f7e"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как устроена работа в&nbsp;системе Seller Drive </h2>
<p><span style="font-weight: 400;">Стартовая страница содержит общую информацию о&nbsp;возможностях системы.  Это&nbsp;единственная индексируемая общедоступная страница Seller Drive – здесь мы&nbsp;настроили SEO-оптимизацию. <br /><br /></span><span style="font-weight: 400;"></span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c42f27ec826c45dbbe865ba6021ee0d8"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Взаимодействие поставщиков с&nbsp;системой начинается со&nbsp;входа или&nbsp;регистрации. <br /><br /></span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/007f599dcd084e8ab1bd8c8e6e89f81a"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2866/opera-&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;_2023-03-22_140207_docsgooglecom.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/00b902dd930442f89f5f6b0dbc78b4d7"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2871/214.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b1296e5b5219672a74d344d9f82ce77c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7d3fda62ddc642e78f6b0d3a003d8903"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">После регистрации система предлагает поставщику загрузить прайс-листы с&nbsp;товарами, чтобы начать работу.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneTenOne"
            data-content-element-type-key="26b8f5c4-7fe9-353c-b684-1f2efda25f90"
            data-element-udi="umb://element/b72465e1e677594809fa4d304dc62539"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--1">
							
<div class="umb-block-grid__area"
     data-area-col-span="1"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 1;--umb-block-grid--area-column-span: 1; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
						<div class="umb-grid__col umb-grid__col--10">
							
<div class="umb-block-grid__area"
     data-area-col-span="10"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 10;--umb-block-grid--area-column-span: 10; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/b76ceb6f13344a6dad766d6df81e2c1d"
            data-col-span="10"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 10; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2858/frame-193.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--1">
							
<div class="umb-block-grid__area"
     data-area-col-span="1"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 1;--umb-block-grid--area-column-span: 1; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/11a8f8756db340d053871b0435ae5926"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/89d02aad9f3e4ae4bf23de668a955258"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Seller Drive автоматически парсит данные из&nbsp;прайс-листов, но&nbsp;даёт пользователю возможность настроить парсинг, выставив нужные значения табличных колонок для&nbsp;извлечения данных. Например можно выбрать, с&nbsp;какой строки в&nbsp;таблице начинаются необходимые данные, чтобы система не&nbsp;включила в&nbsp;парсинг названия колонок вместо товарных данных.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/51893403710348dcb048d15d55dcd7aa"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2857/columns-orser.png"
         alt=""
         itemprop="">


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d58d305cb166ca9022d611fa3e871ed7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/34757f3b9a8149818265cbeba4df4953"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">После загрузки все&nbsp;прайс-листы отображаются на&nbsp;соответствующей вкладке, где&nbsp;организована работа с&nbsp;ними: обновление, отслеживание, рейтинг и&nbsp;количество товаров в&nbsp;продаже. Поставщик настраивает время доставки товаров, собранных в&nbsp;прайс-листе, валюту для&nbsp;их&nbsp;покупки.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/0d2ea33ded3a4ec482e2efb691163914"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2859/frame-194.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/81759144001a41ac9b485c1fbc285ec1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Товары из&nbsp;загруженных в&nbsp;Seller Drive прайс-листов попадают на&nbsp;маркетплейс, где&nbsp;покупатели могут их&nbsp;заказывать. Заказы после оформления отображаются в&nbsp;ЛК&nbsp;поставщика. Там&nbsp;их&nbsp;можно обрабатывать и&nbsp;процессить. Чем&nbsp;быстрее поставщик обрабатывает заказы, тем&nbsp;выше становится его&nbsp;рейтинг, который видят покупатели на&nbsp;маркетплейсе. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6ee7c1cd93c34591b4474a37548b4f89"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2861/frame-196.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/364ff0b8aa2a409a89eceb61000358f3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Поставщик группирует заказы и&nbsp;создаёт файлы поставок, которые аккумулируются на&nbsp;соответствующей вкладке. По&nbsp;мере осуществления поставок их&nbsp;статус обновляется. Интерфейс этой вкладки, как&nbsp;и&nbsp;предыдущих, визуально напоминает таблицу и&nbsp;предоставляет возможности фильтрации и&nbsp;перехода к&nbsp;конкретным поставкам. Это&nbsp;удобство для&nbsp;пользователя: в&nbsp;случае неполадок с&nbsp;поставками, легко выявить, в&nbsp;чём&nbsp;именно дело. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/5dce565b78c745fdb37343682a84b68c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2862/frame-197.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/4f09b095550f2ec357b201b4f2de73df"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/71c94400f726483d8ab13a023ddcc920"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Когда товары отгружены, поставка переходит в&nbsp;категорию исполняющихся (pending). Дойдя до&nbsp;склада, она&nbsp;проверяется складскими работниками. Они&nbsp;работают в&nbsp;одной из&nbsp;связанных с&nbsp;Seller Drive систем и&nbsp;отмечают приход товара, а&nbsp;также недочеты, выявленные на&nbsp;стадии приёмки. Например, пришёл товар с&nbsp;неверным номером. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/51ed03b9fb8741799076cf37114c0f5d"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;"><br />Как только обнаруживается, что&nbsp;с&nbsp;товаром в&nbsp;поставке что&#8209;то&nbsp;не&nbsp;так, поставщик в&nbsp;своём ЛК&nbsp;узнаёт об&nbsp;этом и&nbsp;может принять меры по&nbsp;устранению неурядицы. </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/f9b489c0389142c9bceea751f141f5da"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/2856/&#x43D;&#x435;&#x432;&#x435;&#x440;&#x43D;&#x44B;&#x439;-&#x43D;&#x43E;&#x43C;&#x435;&#x440;.png"
         alt=""
         itemprop="">


</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/4994f7f3d8cb4689874d1396373daea1"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Например, можно принять решение о&nbsp;возврате товара.</strong>
    Тогда информация об&nbsp;этой поставке перенесётся во&nbsp;вкладку Returns. Потом этот товар можно будет доставить заново, уже&nbsp;без&nbsp;ошибок.
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/352ea822cfd5a47925f4546138af7328"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b4264cf9682b4cfe934e69616958beb0"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Немного о&nbsp;процессах</h2>
<p><span style="font-weight: 400;">Сначала мы&nbsp;спроектировали систему по&nbsp;аутсорс-модели, а&nbsp;после подобрали выделенную команду во&nbsp;главе с&nbsp;тимлидом, которую внедрили в&nbsp;процессы клиента. Наша команда полностью взяла на&nbsp;себя разработку фронтенда. </span></p>
<p><span style="font-weight: 400;">За проектированием следовала разработка в&nbsp;тандеме с&nbsp;бекенд-командой Emex. Мы&nbsp;согласовали архитектурные паттерны и&nbsp;сценарии взаимодействия команд и&nbsp;далее синхронизировались по&nbsp;ходу разработки еженедельно. </span></p>
<p><span style="font-weight: 400;">Первые несколько недель разработки проходили в&nbsp;тесной связке с&nbsp;руководителем фронтенд-направления Emex. Сверяли архитектурные паттерны и&nbsp;закрепляли их. После в&nbsp;созданной архитектуре продолжили автономную разработку, проводя еженедельные демо и&nbsp;сессии планирования. </span></p>
<p><span style="font-weight: 400;">Требования мы&nbsp;получали от&nbsp;Emex в&nbsp;Notion, потом переводили их&nbsp;в&nbsp;Azure DevOps, где&nbsp;продолжали работу с&nbsp;ними.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/58eff7f0c78244de895cfdc15d68aee2"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>

<div class="text-highlight">
  <p>1. Проектирование</p> <p>2. Подбор команды</p> <p>3. Синхронизация с&nbsp;командой заказчика</p> <p>4. Сверка и&nbsp;закрепление архитектурных паттернов</p> <p>5. Автономная разработка с&nbsp;регулярными демо</p>
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e72e234d2f734d6caf67f8e4ff7681f6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/cda9001a807c476683d75ce26c3923d5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/7eedd56551b7906f0482c47343a512cb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7667bca2b4df4f738c47e1e862f37fef"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Технологический стек</h2>
<p><span style="font-weight: 400;">Стек технологий Seller Drive согласован со&nbsp;стеком российского подразделения Emex, чтобы поддерживать и&nbsp;дорабатывать системы одной командой.</span></p>
<p><span style="font-weight: 400;">Ещё один важный момент – консистентная дизайн-система Emex. Обновлённый продукт мы&nbsp;подстраивали под&nbsp;заданные визуальные паттерны – опять же, чтобы остаться верными экосистеме, в&nbsp;которой продукт будет существовать. </span></p>
<p><span style="font-weight: 400;">Требования к&nbsp;архитектурной структуре Seller Drive также были продиктованы экосистемой программных продуктов Emex. Нужно было, чтобы разработчики из&nbsp;внутренней команды заказчика могли быстро переключаться между ними без&nbsp;долгого онбординга.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9d0d40e6c6b24fa08e36bb4a9272bf30"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">React</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">TypeScript</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">State management: Redux, Redux Sagas</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Testing: Jest, React Testing Library</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Webpack</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">CSS: Styled Components</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e26cfc39bbeec0b981aa8dcf44e894f4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/08684e25698d4a858250abb9535a4ed8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2867/frame-212-&#x431;&#x43B;&#x44E;&#x440;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/7ef551a08f857e472568c29771b01396"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/dd1843d8a77748e384e3f2386249cb4c"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Результаты</h2>
<p><span style="font-weight: 400;">Через 6 месяцев после начала разработки новая версия Seller Drive вошла в&nbsp;эксплуатацию, после чего стала непрерывно совершенствоваться.</span></p>
<p><span style="font-weight: 400;">Мы продолжаем работать над&nbsp;Seller Drive и&nbsp;сейчас, дополняя функциональность системы, чтобы пользователям было ещё&nbsp;удобнее взаимодействовать с&nbsp;кабинетом поставщика. </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/35b7c7baa5a3414fb507cb4db387c8cd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="awards"
            data-content-element-type-key="82cdbbd8-0baa-4271-a5b0-0f1aae3d3bed"
            data-element-udi="umb://element/eb73e45436aa48c18e59e85073b4a16e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Когда бизнесу нужен Headless CMS: кейсы и эффекты
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Между идеей и релизом — долгий путь. Как Headless CMS помогает ускорить разработку, упростить поддержку и масштабирование IT-продукта?
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/headless-cms/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/headless-cms/</guid>

                <pubDate>Tue, 20 Jan 2026 11:40:59 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Когда бизнесу нужен Headless CMS: кейсы и эффекты</h1>
                                <figure>
                                    <img src="/Media/3021/slide-16_9-70.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/98114fff70cafba5c5d57c5379ea3001"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d8ca476bd8714c72b65aa8e7e590fc5d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Что такое Headless CMS?</h2>
<p>Headless CMS&nbsp;– это&nbsp;гибкая система управления контентом с&nbsp;удобным интерфейсом редактирования. Headless CMS&nbsp;позволяет отображать контент омниканально через API. Например, на&nbsp;сайте, в&nbsp;мобильном приложении, емейл рассылке и&nbsp;голосовом помощнике.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/676fb993ef5d41f9a37135472a6e44d5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3021/slide-16_9-70.png"
         alt=""
         itemprop="">


        <figcaption>
            Как работает Headless CMS
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/327fb76b7f314603820416837b7c92ff"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>От стандартных CMS&nbsp;Headless отличается тем, что&nbsp;работает с&nbsp;разными типами фронтендов и&nbsp;любыми типами интерфейсов и&nbsp;устройств. Так&nbsp;получаем единый источник «правды» и&nbsp;не&nbsp;занимаемся переносом контента между разными системами.</p>
<p>В Headless CMS&nbsp;мы&nbsp;создаем только интерфейс для&nbsp;редактирования контента. Система по&nbsp;умолчанию ориентирована на&nbsp;хорошо структурированный контент, поэтому в&nbsp;результате получаем удобные для&nbsp;восприятия форматы на&nbsp;любых типах устройств.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6ce15809ec0e46f39fb8b306bef7cf27"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3026/slide-16_9-75.png"
         alt=""
         itemprop="">


        <figcaption>
            Как работает традиционная CMS
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fb734401f97a4c00816a20160b2b5a60"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>В традиционной CMS&nbsp;мы&nbsp;редактируем контент, который потом отображается только на&nbsp;сайте. Чтобы отобразить его&nbsp;где&#8209;то&nbsp;ещё&nbsp;– например, в&nbsp;мобильном приложении – нужно попросить разработчиков сделать дополнительную автоматическую процедуру экспорта данных или&nbsp;написать дополнительный API. Часто оказывается, что&nbsp;формат, в&nbsp;котором структурированы данные, недоступен для&nbsp;легкого переиспользования. Проще будет написать все&nbsp;заново или&nbsp;перенести руками.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/0f550b7edfc143f9bcd2dc78d1d69d67"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3025/slide-16_9-74.png"
         alt=""
         itemprop="">


        <figcaption>
            Известные Headless CMS и их типизация
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ef19e3ea3ea04c7d9aaa7e2110dcdf1e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Headless CMS&nbsp;бывают облачные и&nbsp;on&nbsp;premise – те, которые можно поставить на&nbsp;свою инфраструктуру (сервера и&nbsp;БД). Если CMS&nbsp;облачная, получаем масштабируемую систему для&nbsp;редактирования и&nbsp;выдачи контента – не&nbsp;нужно заниматься поддержкой и&nbsp;администрированием ее&nbsp;инфраструктуры. Это&nbsp;очень удобно.</p>
<p>On premise CMS&nbsp;подойдет, если по&nbsp;каким&#8209;то&nbsp;причинам не&nbsp;хочется или&nbsp;нельзя использовать облако — например, из&#8209;за&nbsp;внутренней политики хранения данных в&nbsp;организации. </p>
<h2>Похожие на&nbsp;Headless CMS&nbsp;решения</h2>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/8041bad9220b4fa6917b13251230dcb6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3022/slide-16_9-71.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/412b2b9a0b6e4f09a6b6623600ad4b97"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Первое и&nbsp;наиболее близкое к&nbsp;Headless CMS&nbsp;– генераторы админок для&nbsp;различных языков программирования и&nbsp;платформ разработки. Например, для&nbsp;Python есть Django, а&nbsp;на&nbsp;языке PHP&nbsp;есть Laravel Nova. Они&nbsp;подойдут для&nbsp;случая, когда вы&nbsp;уже&nbsp;разрабатываете приложение на&nbsp;этом языке, и&nbsp;нужно быстро добавить возможность администрирования для&nbsp;отдельных частей. Они&nbsp;не&nbsp;такие удобные для&nbsp;редактора, как&nbsp;Headless CMS.&nbsp;</p>
<p>Второе – Backend-as-service. Например, Firebase, Supabase ли&nbsp;Amazon Amplify – они&nbsp;обычно используются для&nbsp;мобильной разработки, чтобы не&nbsp;писать отдельно бэкенд, а&nbsp;брать платформу. Они&nbsp;выдают API&nbsp;для&nbsp;типовых операций: сохранение и&nbsp;управление данными пользователей, логина, регистрации и&nbsp;отправки push-уведомлений, но&nbsp;не&nbsp;дают интерфейса для&nbsp;администрирования.&nbsp;</p>
<p>Backend-as-service подойдет, например, если мы&nbsp;делаем приложение для&nbsp;ведения задач (to&#8209;do&nbsp;лист) и&nbsp;хотим, чтобы пользователи могли регистрироваться и&nbsp;синхронизировать свои задачи на&nbsp;разных девайсах. То&nbsp;есть для&nbsp;сервиса не&nbsp;требуется какой&#8209;то&nbsp;сложный интерфейс администратора, ведь все&nbsp;данные создают сами пользователи.</p>
<p>Третье – это&nbsp;полноценные no-code/low-code платформы для&nbsp;создания приложений. В&nbsp;них&nbsp;можно визуально создавать админки, веб-, и&nbsp;мобильные приложения. Некоторые такие платформы (например, Retool) похожи на&nbsp;Headless CMS&nbsp;тем, что&nbsp;позволяют создать произвольный интерфейс админки и&nbsp;отдавать данные через API&nbsp;для&nbsp;других потребителей.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d7d960abdb8644fd9a867444790b7b6f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Создаем свой сервис: варианты реализации</h2>
<p>Представим, что&nbsp;у&nbsp;нас&nbsp;есть идея для&nbsp;стартапа. Пусть это&nbsp;будет сервис для&nbsp;изучения иностранных языков.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ca563293656b4e799945501eeddd140c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3023/slide-16_9-72.png"
         alt=""
         itemprop="">


        <figcaption>
            Все совпадения с реальными проектами случайны!
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/63a4785e13b24fa781f5c25a78b624fa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Нам нужно реализовать landing page с&nbsp;основной информацией о&nbsp;нашем сервисе, где&nbsp;будет публиковаться и&nbsp;изменяться контент, помогающий продавать наш&nbsp;продукт. </p>
<p>Сервис будет работать в&nbsp;виде мобильного приложения на&nbsp;iOS&nbsp;и&nbsp;Android. </p>
<p>Кроме того, в&nbsp;самом сервисе нужно будет сделать уроки, которые будут постоянно добавляться и&nbsp;меняться, реализовать возможность выполнения домашних заданий, отслеживать активность учеников. Все&nbsp;это&nbsp;должно быть на&nbsp;разных языках – проект у&nbsp;нас&nbsp;международный. У&nbsp;каждого пользователя сервиса в&nbsp;базе данных будет сохраняться прогресс изучения, уровень доступа и&nbsp;прочие важные параметры </p>
<h3>Традиционный путь </h3>
<p>Можно создавать сервис с&nbsp;нуля. И&nbsp;тогда мы&nbsp;все&nbsp;пишем сами: нанимаем мобильных разработчиков, бекенд разработчиков для&nbsp;создания платформы, фронтенд разработчиков для&nbsp;создания интерфейса администратора, тестировщиков для&nbsp;проверки всего этого. Но&nbsp;прежде нужно также нанять UX&nbsp;дизайнера, который спроектирует удобный интерфейс для&nbsp;админки, ведь разработчикам иначе будет не&nbsp;очень понятно, как&nbsp;все&nbsp;должно выглядеть и&nbsp;работать. </p>
<p>Когда подойдет время запуска, потребуется арендовать сервера и&nbsp;нанять администратора, который настроит сервера и&nbsp;базы данных, займется их&nbsp;поддержкой и&nbsp;обновлением.</p>
<p>Такой подход получится довольно долгим и&nbsp;дорогим, учитывая, что&nbsp;пользователям нужно только мобильное приложение, а&nbsp;все&nbsp;остальное – по&nbsp;сути инфраструктура для&nbsp;него.</p>
<h3>Путь с&nbsp;Headless</h3>
<p>Мобильных разработчиков все&nbsp;еще&nbsp;придется нанять, ведь наш&nbsp;основной продукт – приложение. Остальной процесс будет другим: ускоряем time-to-market.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/cd20925ea10245bcb2edef98870743f2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3029/slide-16_9-80.png"
         alt=""
         itemprop="">


        <figcaption>
            Как выглядит админка Headless CMS на примере Kontent.ai
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0fd42524845943aa8882c442f2f76fef"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Нужно будет зарегистрироваться на&nbsp;Headless платформе, спроектировать структуру нашего контента — уроков, домашних заданий, данных пользователей, landing страницы на&nbsp;сайте.</p>
<p>Все – API&nbsp;готово – мобильные разработчики могут его&nbsp;использовать, чтобы получать данные уроков и&nbsp;заданий, редакторы-учителя могут эти&nbsp;уроки создавать, переводчики – переводить тексты на&nbsp;другие языки в&nbsp;удобной админке. </p>
<p>Понадобится нанять дизайнера, чтобы оформить лендинг, и&nbsp;фронтенд разработчика, чтобы он&nbsp;этот лендинг запрограммировал.</p>
<p>Про временные разницы. Собрать структуру контента и&nbsp;админку для&nbsp;такого продукта получается быстро. У&nbsp;меня это&nbsp;заняло это&nbsp;1.5 часа. </p>
<p>В случае с&nbsp;полной разработкой без&nbsp;применения Headless, процесс может растянуться на&nbsp;месяцы работы бекенд- и&nbsp;фронтенд-разработчиков.</p>
<h2>Преимущества Headless CMS</h2>
<p>Про ускорение time to&nbsp;market поговорили, теперь – о&nbsp;других преимуществах.</p>
<p>Та самая<span> </span><strong>омниканальность</strong>. Представим, что&nbsp;  для&nbsp;привлечения новых пользователей мы&nbsp;хотим добавить на&nbsp;сайт открытые уроки, а&nbsp;чтобы сохранить текущих пользователей – рассылать домашку по&nbsp;емейлу. С&nbsp;Headless это&nbsp;потребует минимального количества времени, так&nbsp;как&nbsp;весь контент уже&nbsp;хорошо структурирован и&nbsp;доступен для&nbsp;других приложений. </p>
<p>Для разработчиков — более<span> </span><strong>чистая архитектура<span> </span></strong>за счет разделения ответственности в&nbsp;частях. Разработчикам удобно отделять  бэкенд (контент)  от&nbsp;фронтенда (того, как&nbsp;контент отображается). Можно сконцентрироваться на&nbsp;своей части и&nbsp;не&nbsp;вникать в&nbsp;другие части продукта.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/602a2ed75a584e76af435ee630709e46"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3027/slide-16_9-76.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/40d09246fe3a4031ac334cf9bea555dd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Для руководителей плюс организационный:<strong><span> </span>нужно меньше людей и&nbsp;нет&nbsp;потребности нанимать ребят-единорогов, которые могут все&nbsp;и&nbsp;сразу.</strong><span> </span>Когда продукту нужно сделать MVP, обычно нанимают суперфуллстека, который разрабатывает все: бекенд, фронтенд, мобилку. Такие ребята есть, но&nbsp;их&nbsp;тяжело найти, и&nbsp;чем&nbsp;больше растет проект, тем&nbsp;тяжелее его&nbsp;поддерживать. А&nbsp;если использовать хэдлесс, всезнающего человека искать не&nbsp;нужно. Чтобы сделать сайт на&nbsp;headless, достаточно компетентного фронтенд разработчика со&nbsp;знанием CSS/JS. </p>
<p><strong>Headless CMS&nbsp;легко можно интегрировать с&nbsp;другими платформами</strong><span> </span>и пользоваться лучшими из&nbsp;них&nbsp;в&nbsp;своем классе. Например, когда мы&nbsp;разрабатывали ecommerce проект на&nbsp;headless CMS, часть проекта, включающая каталог и&nbsp;продажи использовала Shopify – ведущую ecommerce платформу с&nbsp;удобными интерфейсом. В&nbsp;итоге наш&nbsp;заказчик получил лучший интерфейс для&nbsp;управления контентом и&nbsp;лучший интерфейс для&nbsp;обработки заказов и&nbsp;управления каталогом.</p>
<p>И финальное –<strong><span> </span>удобство редактирования контента.</strong><span> </span>Многие headless CMS&nbsp;(например, Ghost или&nbsp;Kontent.ai) предоставляют крутой UX&nbsp;для&nbsp;скорости и&nbsp;удобства редактирования — хорошо подходит для&nbsp;онлайн-медиа или&nbsp;если вы&nbsp;пишете и&nbsp;публикуете много статей и&nbsp;делаете визуал.</p>
<h2>Для чего не&nbsp;подойдет Headless CMS</h2>
<p>Во-первых,<span> </span><strong>для реализации сложных бизнес-процессов, воркфлоу и&nbsp;  интерфейса за&nbsp;рамками публикации контента</strong>. Headless CMS&nbsp;хорошо реализуют сценарии создания и&nbsp;редактирования контента, его&nbsp;публикации (а&nbsp;еще&nbsp;утверждения и&nbsp;перевода), различные права доступа к&nbsp;разному типу контента. Но&nbsp;они&nbsp;не&nbsp;помогут сделать, например, свою CRM&nbsp;систему заточенную под&nbsp;ваш&nbsp;бизнес. Для&nbsp;такой задачи лучше посмотреть в&nbsp;сторону no-code платформ или&nbsp;пойти по&nbsp;традиционному пути, и&nbsp;сделать большую самописную систему, если пророчите проекту большое развитие.</p>
<p>Headless CMS&nbsp;не&nbsp;подойдут<span> </span><strong>для хранения и&nbsp;управления огромными массивами данных</strong>. Например, у&nbsp;нас&nbsp;был&nbsp;проект, где&nbsp;в&nbsp;headless CMS&nbsp;был&nbsp;архив из&nbsp;600+ тысяч статей — это&nbsp;реально. Но&nbsp;не&nbsp;стоит рассматривать headless CMS, как&nbsp;замену обычной базе данных и&nbsp;пытаться хранить там&nbsp;какие&#8209;то&nbsp;транзакции пользователей или&nbsp;что-то, что&nbsp;очень часто обновляется — например, биржевые котировки. </p>
<h2>Риски Headless CMS</h2>
<p>Главный —<span> </span><strong>вы зависите от&nbsp;вендора CMS, и&nbsp;того, как&nbsp;он&nbsp;будет развивать продукт</strong>. Это&nbsp;особенно актуально для&nbsp;облачных CMS: могут поменять интерфейс и&nbsp;сделать его&nbsp;перегруженным и&nbsp;неудобным, поменять тарифы, или&nbsp;вообще закрыться.</p>
<p>Как защищаться от&nbsp;этого риска? Поскольку все&nbsp;ваши данные предоставляются через API, вы&nbsp;в&nbsp;любое время можете их&nbsp;выгрузить в&nbsp;структурированном виде и&nbsp;сохранить в&nbsp;надежном месте. Также можно настроить регулярные бекапы данных, если беспокоитесь за&nbsp;сохранность.</p>
<p>Этот же&nbsp;способ помогает ответить на&nbsp;вопрос: «А что, если мне&nbsp;в&nbsp;будущем станет недостаточно возможностей CMS, и&nbsp;я&nbsp;захочу перейти на&nbsp;свою платформу?». Можно разработать свою платформу, перенести структурированные данные из&nbsp;API&nbsp;в&nbsp;нее&nbsp;и&nbsp;даже сохранить структуру API! То&nbsp;есть не&nbsp;придется переделывать приложения, которые использовали контент.</p>
<p>Защитится от&nbsp;изменений в&nbsp;функциональности продукта можно, используя не&nbsp;облачные, а&nbsp;on&nbsp;premise платформы. Однако и&nbsp;тут&nbsp;будут свои минусы —<span> </span><strong>нужно будет самостоятельно поддерживать инфраструктуру для&nbsp;них.</strong><span> </span>Также есть платформы Strapi, Ghost и&nbsp;Umbraco, которые позволяют начать работать на&nbsp;облачной версии, но&nbsp;при&nbsp;желании переехать на&nbsp;open source версию, которую можно будет развернуть на&nbsp;своей инфраструктуре.</p>
<h2>Полезные ссылки</h2>
<p>Подробнее ознакомиться с&nbsp;изобилием различных CMS&nbsp;поможет<span> </span><a rel="noopener noreferrer nofollow" href="https://jamstack.org/headless-cms"><u>этот список</u></a>. В&nbsp;нем&nbsp;можно настроить фильтрацию по&nbsp;типу CMS&nbsp;и&nbsp;типу ее&nbsp;доступности. Внутри – описание каждой CMS&nbsp;с&nbsp;примерами интерфейсов и&nbsp;оценкой. </p>
<p>Есть и&nbsp;другой<span> </span><a rel="noopener noreferrer nofollow" href="https://www.g2.com/categories/headless-cms"><u>список</u></a>, но&nbsp;уже&nbsp;с&nbsp;более детальной фильтрацией: по&nbsp;бизнес-сегментам, рейтингу, доступным языкам, ценам и&nbsp;функциям.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Feature Creep: как хорошие идеи убивают продукты
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Разбираем, как Feature Creep появляется на разных этапах разработки цифрового продукта и какие инструменты помогают держать его под контролем.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/feature-creep/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/feature-creep/</guid>

                <pubDate>Fri, 16 Jan 2026 09:15:40 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Feature Creep: как хорошие идеи убивают продукты</h1>
                                <figure>
                                    <img src="/Media/1ctn5ru1/chatgpt-image-19-&#x434;&#x435;&#x43A;-2025-&#x433;-11_37_19-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/98a30ce426f046cb93049618b2dbf9a4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Есть во&nbsp;всех продуктовых проектах один главный злодей. Абсолютный антагонист, который никогда не&nbsp;работает в&nbsp;открытую. Он&nbsp;действует тоньше: прячется под&nbsp;личинами милых мелких неприятелей — лёгкого срыва сроков, безобидных правочек, внезапных озарений и&nbsp;новых искромётных идей.</p>
<p dir="ltr">Кажется, что&nbsp;всё&nbsp;под&nbsp;контролем. Ну&nbsp;подумаешь, тайминги слегка поехали, зато какая классная фича появилась! В&nbsp;этом и&nbsp;коварство антигероя: медленно и&nbsp;почти незаметно он&nbsp;крадёт у&nbsp;проекта время и&nbsp;бюджет, а&nbsp;у&nbsp;команды — энергию и&nbsp;запал.</p>
<p dir="ltr">Вы еще&nbsp;об&nbsp;этом не&nbsp;знаете, но&nbsp;ваш&nbsp;продукт уже&nbsp;начал умирать. А&nbsp;ведь он&nbsp;еще&nbsp;даже не&nbsp;релизнулся…&nbsp;</p>
<p dir="ltr">И имя&nbsp;этому злодею — <strong>Feature Creep.</strong></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/16b02f8ccb814b628ef516a92df5dc7b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5f401bdc060649f49092454e916ebc7a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Что такое Feature Creep</h2>
<p dir="ltr">Feature Creep — это&nbsp;неконтролируемое разрастание функциональности, которое размывает фокус, срывает сроки, раздувает бюджет и&nbsp;превращает продукт в&nbsp;переусложнённую конструкцию, с&nbsp;которой тяжело жить и&nbsp;команде, и&nbsp;пользователям.</p>
<p dir="ltr">Проще говоря, это&nbsp;когда вместо понятного инструмента на&nbsp;выходе получается монстр-франкенштейн: дорогой, громоздкий, украшенный красивым бантиком сбоку и&nbsp;обвешанный фичами, которые никому не&nbsp;нужны. Или&nbsp;вообще тот&nbsp;самый <a href="https://bureau.ru/books/fff/36">летающий асфальтоукладчик</a>, как&nbsp;в&nbsp;примере от&nbsp;Бюро Горбунова: придумать легко, нарисовать можно, а&nbsp;вот&nbsp;реализовать — ну&nbsp;никак. </p>
<p dir="ltr">А теперь серьезно. Почти каждый третий проект разваливается не&nbsp;из&#8209;за&nbsp;плохого кода, а&nbsp;из&#8209;за&nbsp;разбухания функциональности. Это&nbsp;не&nbsp;преувеличение, а&nbsp;реальный масштаб угрозы. </p>
<p dir="ltr">Но есть и&nbsp;хорошая новость: при&nbsp;должном внимании и&nbsp;желании Feature Creep можно законтролить. Важно просто хорошо изучить своего врага — <strong>где он&nbsp;прячется, какие маски носит, когда атакует и&nbsp;как&nbsp;именно наносит удар.</strong></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3bd1dc72986545bfa81e450a87f5a74d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Где прячется Feature Creep</h2>
<p dir="ltr">Есть кратко — везде. Нет&nbsp;ни&nbsp;одного этапа разработки цифрового продукта, где&nbsp;нас&nbsp;бы&nbsp;не&nbsp;подстерегал Feature Creep. Да, неприятно. Но&nbsp;зато теперь мы&nbsp;готовы к&nbsp;этой встрече. Итак, пойдем по-порядку</p>
<p dir="ltr">Мы условно делим проект на&nbsp;пять ключевых этапов: <strong>пресейл, аналитика и&nbsp;проектирование, дизайн, разработка, тестирование</strong>. И&nbsp;на&nbsp;каждом из&nbsp;них&nbsp;есть своё пространство для&nbsp;зарождения Feature Creep — благодатная почва, в&nbsp;которой он&nbsp;легко прорастает, стоит лишь немного ослабить внимание.</p>
<h3 dir="ltr"><span class="highlighter">Пресейл</span></h3>
<p dir="ltr">Момент, когда мы&nbsp;только начинаем говорить о&nbsp;будущем продукте: изучаем бизнес клиента, понимаем его&nbsp;цели и&nbsp;предлагаем первые решения. Это&nbsp;этап вдохновения и&nbsp;широких жестов — хочется же&nbsp;заключить договор! </p>
<p dir="ltr">Именно здесь проще всего наобещать лишнего. Всё&nbsp;кажется выполнимым в&nbsp;любые сроки и&nbsp;при&nbsp;любом бюджете. Но&nbsp;если дело дойдет до&nbsp;проекта, мы…</p>
<ul>
<li>либо попытаемся сделать все, что&nbsp;наобещали, и&nbsp;неминуемо раздуем сроки и&nbsp;бюджет,</li>
<li>либо откажемся от&nbsp;части договорённостей, и&nbsp;клиент получает меньше, чем&nbsp;ожидал.</li>
</ul>
<p dir="ltr">Так всего несколько необдуманных обещаний дают Feature Creep возможность войти в&nbsp;проект ещё&nbsp;до&nbsp;его&nbsp;начала.</p>
<h3 dir="ltr"><span class="highlighter">Аналитика и&nbsp;проектирование</span></h3>
<p dir="ltr">Проект официально стартовал: команда погружается в&nbsp;задачу, изучает пользователей, разбирает сценарии, формирует бэклог и&nbsp;очерчивает границы будущего продукта. Это&nbsp;этап глубокого погружения, инсайтов и&nbsp;десятков вариантов, как&nbsp;может работать будущая система.</p>
<p dir="ltr">И именно здесь Feature Creep чувствует себя особенно комфортно. По&nbsp;мере того, как&nbsp;мы&nbsp;разбираемся в&nbsp;предметной области, открывается неиссякаемый поток идей:</p>
<p dir="ltr"><em>«Давайте добавим…»</em></p>
<p dir="ltr"><em>«А я&nbsp;видел у&nbsp;конкурентов прикольное решение… »</em></p>
<p dir="ltr"><em>«Пользователю точно пригодится…»</em></p>
<p dir="ltr">Каждая идея сама по&nbsp;себе звучит разумно. И&nbsp;каждая может оказаться первым шагом к&nbsp;Feature Creep. </p>
<h3 dir="ltr"><span class="highlighter">Дизайн</span></h3>
<p dir="ltr">Продукт начинает приобретать форму: появляются макеты, понятные пользовательские сценарии, визуальные решения. Команда начинает видеть будущую систему, и&nbsp;это&nbsp;вдохновляет.  </p>
<p dir="ltr">Но вместе с&nbsp;макетами появляются новые уточнения, детали и&nbsp;даже элементы, которых раньше в&nbsp;планах и&nbsp;не&nbsp;было. Например:</p>
<ul>
<li>дополнительные состояния экранов;</li>
<li>расширенные или&nbsp;новые сценарии;</li>
<li>мелкие визуальные улучшения, требующие доработки логики и&nbsp;т.д.</li>
</ul>
<p dir="ltr">Все эти&nbsp;дополнения кажутся небольшими по&nbsp;трудозатратам, но&nbsp;крайне важными для&nbsp;качества финального продукта. Пока не&nbsp;съедают все&nbsp;возможные сроки.</p>
<h3 dir="ltr"><span class="highlighter">Разработка</span></h3>
<p dir="ltr">Этап, когда продукт из&nbsp;макетов превращается в&nbsp;работающую систему. Команда собирает логику, интеграции, интерфейсы, и&nbsp;видит, как&nbsp;всё&nbsp;буквально оживает. </p>
<p dir="ltr">И именно в&nbsp;этот момент появляется особый тип&nbsp;Feature Creep — тот, который рождается не&nbsp;из&nbsp;новых идей клиента, а&nbsp;из&nbsp;стремления команды сделать лучше. На&nbsp;практике это&nbsp;может выглядеть так: </p>
<p dir="ltr"><em>«Раз уж&nbsp;делаем фильтр, давай сразу добавим сортировку, это&nbsp;же&nbsp;почти то&nbsp;же&nbsp;самое».</em></p>
<p dir="ltr"><em>«Мы сделали простую форму, но&nbsp;с&nbsp;автосохранением будет круче! Давайте добавим!».</em></p>
<p dir="ltr"><em>«О, а&nbsp;давайте еще&nbsp;анимацию открытия меню сделаем!»</em></p>
<p dir="ltr">И так&nbsp;далее, и&nbsp;тому подобному. Нет&nbsp;предела совершенству и&nbsp;конца тому, что&nbsp;еще&nbsp;можно добавить/изменить/улучшить. Слышите? Это&nbsp;ваш&nbsp;проект уже&nbsp;начинает трещать по&nbsp;швам… </p>
<h3 dir="ltr"><span class="highlighter">Тестирование</span></h3>
<p dir="ltr">Мы уже&nbsp;на&nbsp;финишной прямой: продукт собран, основная логика работает, команда вылавливает и&nbsp;правит баги, проверяет, что&nbsp;всё&nbsp;функционирует так, как&nbsp;должно.</p>
<p dir="ltr">Именно здесь неизбежно появляются идеи, которые кажутся логичными и&nbsp;будто сами напрашиваются. Например:</p>
<ul>
<li>уточнить текст или&nbsp;подсказку, чтобы пользователь точно понял, что&nbsp;происходит;</li>
<li>добавить недостающее состояние — пустое, ошибочное, граничное;</li>
<li>предусмотреть редкий кейс на&nbsp;всякий случай;</li>
<li>усилить визуальную обратную связь, чтобы взаимодействие было понятнее и&nbsp;прозрачнее.</li>
</ul>
<p dir="ltr">Всё это&nbsp;выглядит как&nbsp;простая доработка, а&nbsp;не&nbsp;как&nbsp;новая функция. Но&nbsp;осторожно: за&nbsp;одним из&nbsp;этих предложений вполне может скрываться последний удар в&nbsp;спину от&nbsp;Feature Creep.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ec2192fce39842d6833f145775f19f2a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Три личины Feature Creep</h2>
<h3 dir="ltr"><span class="highlighter">Идея</span>&nbsp;</h3>
<p dir="ltr">Самая обаятельная личина Feature Creep. Это&nbsp;вспышка вдохновения, которая нашептывает: «реализуй меня, и&nbsp;твой продукт взорвет рынок!». Идея обещает рост, усиление конечного результата, победу над&nbsp;конкурентами. И&nbsp;всё&nbsp;это&nbsp;как&nbsp;будто малыми усилиями.&nbsp;</p>
<p dir="ltr"><strong>В какой форме встречается:&nbsp;</strong></p>
<ul>
<li aria-level="1">
<p dir="ltr">любые предложения формата «<em>А давайте добавим…</em>», «<em>Было бы&nbsp;круто, если бы…</em>», «<em>У конкурентов есть, и&nbsp;нам&nbsp;нужно</em>» — это&nbsp;идеи.&nbsp;</p>
</li>
</ul>
<p dir="ltr"><strong>На каких этапах появляется:</strong> на&nbsp;всех — от&nbsp;пресейла до&nbsp;самой даты релиза. Идеи разной степени гениальности и&nbsp;трудозатратности возникают спонтанно у&nbsp;всех членов команды.&nbsp;</p>
<h3 dir="ltr"><span class="highlighter">Улучшение</span></h3>
<p dir="ltr">Маскируется под&nbsp;здравый смысл: это&nbsp;не&nbsp;новая фича, а&nbsp;логичное развитие того, что&nbsp;уже&nbsp;есть. Улучшение редко выглядит лишним. Наоборот, кажется необходимым шагом, чтобы продукт был&nbsp;удобнее, понятнее и/или современнее.&nbsp;</p>
<p dir="ltr"><strong>В какой форме встречается:</strong></p>
<ul>
<li aria-level="1">
<p dir="ltr">предложения «сделать удобнее», «добавить ещё&nbsp;одно состояние», «расширить сценарий», «дополнить маленькую деталь — иначе нелогично».</p>
</li>
</ul>
<p dir="ltr"><strong>На каких этапах появляется: </strong>Чаще всего — во&nbsp;время дизайна, разработки и&nbsp;тестирования, когда продукт уже&nbsp;можно потрогать руками и&nbsp;любые улучшения будто бы&nbsp;сами просятся в&nbsp;работу.</p>
<h3 dir="ltr"><span class="highlighter">Доработка / устранение ошибки</span></h3>
<p dir="ltr">Если идея — обаятельна, то&nbsp;доработка — очень коварна. Под&nbsp;видом фикса бага в&nbsp;проект попадает&nbsp;кусочек новой логики. Вроде бы&nbsp;поправили одну ошибку, а&nbsp;в&nbsp;бэклоге появилось еще&nbsp;+3 задачи.&nbsp;</p>
<p dir="ltr"><strong>В какой форме встречается:</strong></p>
<ul>
<li>устраняли ошибку при&nbsp;загрузке файла, и&nbsp;заодно решили прикрутить ограничение по&nbsp;типу/размеру;</li>
<li>правили отображение списка и&nbsp;придумали добавить к&nbsp;нему сортировку и&nbsp;группировку;</li>
<li>нашли дыру в&nbsp;сценарии — не&nbsp;просто закрыли ее, но&nbsp;и&nbsp;значительно расширили сам&nbsp;сценарий, чтобы пользователь точно не&nbsp;запутался.&nbsp;</li>
</ul>
<p dir="ltr"><strong>На каких этапах появляется: </strong>Обычно, в&nbsp;разработке и&nbsp;тестировании, когда найденный баг&nbsp;заставляет увидеть ещё&nbsp;пару недочётов, которые хочется учесть, поправить или&nbsp;вообще переделать.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b794cc9c677b401ea0713e4f7b72aa0c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Чем отразить удар</h2>
<h3 dir="ltr"><span class="highlighter">FFF (Fix&nbsp;Time, Fix&nbsp;Budget, Flex Scope)</span></h3>
<p dir="ltr">База. Правильно выбранная для&nbsp;разработки цифрового продукта методология — это&nbsp;первичный фаервол от&nbsp;Feature Creep.</p>
<p dir="ltr">В &nbsp;FFF мы&nbsp;сразу задаем жесткие рамки проекту по&nbsp;сроку и&nbsp;бюджету, но&nbsp;оставляем гибкость в&nbsp;скоупе. &nbsp;Это сразу меняет отношение ко&nbsp;всем новых хотелкам, идеям и&nbsp;фичам, которые приходят в&nbsp;голову клиенту и&nbsp;команде. Понимание, что&nbsp;не&nbsp;все&nbsp;влезет в&nbsp;оговоренные сроки и&nbsp;бюджет, повышает повышает критичность и&nbsp;снижает риск бесконтрольного разрастания продукта.</p>
<p dir="ltr"><strong>На каких этапах проекта работает</strong>: дизайн, разработка и&nbsp;тестирование.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/36a659d96e68474397f3c5220bdae01a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/fff/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/ycqltuen/chatgpt-image-jun-17-2025-from-&#x43D;&#x430;&#x441;&#x442;&#x44F;-1.png"
         alt=""
         itemprop="">

    
            <span>FFF: методология, которая принимает реальность и&nbsp;помогает делать цифровой продукт</span>
                <p>&#x410;&#x43D;&#x430;&#x441;&#x442;&#x430;&#x441;&#x438;&#x44F; &#x41C;&#x430;&#x440;&#x442;&#x44B;&#x43D;&#x43E;&#x432;&#x430;, &#x420;&#x435;&#x434;&#x430;&#x43A;&#x442;&#x43E;&#x440;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b7f9d5a99edd41e8b61d0fe0ee153354"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr"><span class="highlighter">Карта влияний</span></h3>
<p dir="ltr">Тоже мощное оружие против Feature Creep. Карта влияний на&nbsp;самых ранних этапах проекта помогает нам&nbsp;определить цель будущего продукта и&nbsp;выделить действия и&nbsp;изменения, которые напрямую влияют на&nbsp;достижение этой цели.</p>
<p dir="ltr">И в&nbsp;этом вся&nbsp;суть: карта влияний работает как&nbsp;смысловой фильтр: если идея приближает продукт к&nbsp;цели — мы&nbsp;ищем ей&nbsp;место. Если нет&nbsp;— откладываем или&nbsp;выбрасываем.</p>
<p><strong>На каких этапах проекта работает: </strong>на всех, но&nbsp;особенно часто применяется на&nbsp;пресейле, во&nbsp;время аналитики и&nbsp;проектирования.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/38de811827854d0a8b3d1c185d3d5a73"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/impact-mapping/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/niwpclnv/ay-20-2025-1.png"
         alt=""
         itemprop="">

    
            <span>Карта влияний: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/15daa64a5618441aa1b7eac4d42f1eff"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr"><span class="highlighter">USM</span></h3>
<p dir="ltr">Инструмент, который помогает удерживать фокус на&nbsp;том, что&nbsp;именно должно попасть в&nbsp;продукт. Когда мы&nbsp;составляем User Story Mapp, мы, по&nbsp;сути, фиксируем набор фич, которые действительно нужны продукту, и&nbsp;сразу расставляем приоритеты. Всё&nbsp;это&nbsp;делается с&nbsp;опорой на&nbsp;реальные потребности пользователей и&nbsp;цели бизнеса.</p>
<p dir="ltr">И в&nbsp;этом сила USM&nbsp;— это&nbsp;практический фильтр от&nbsp;Feature Creep. Если фича не&nbsp;поддерживает конкретное действие пользователя и&nbsp;не&nbsp;имеет понятного места в&nbsp;сценарии, значит, сейчас ей&nbsp;не&nbsp;место в&nbsp;продукте.</p>
<p dir="ltr"><strong>На каких этапах проекта работает</strong>: дискавери и&nbsp;проектирование, при&nbsp;формировании MVP&nbsp;и&nbsp;во&nbsp;время планирования релизов и&nbsp;спринтов.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/c56563655fc24522af5bfe53b2e1bd5d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/how-to-use-usm/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/gjznoga4/frame-5009624.png"
         alt=""
         itemprop="">

    
            <span>Как&nbsp;использовать User Story mapping при&nbsp;создании цифрового продукта</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/594f7931d0ec40319a07d7513f6d3d84"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr"><span class="highlighter">Roadmap</span></h3>
<p dir="ltr">Roadmap проекта фиксирует, что&nbsp;и&nbsp;когда должно быть сделано, и&nbsp;показывает общую траекторию развития продукта. Этот инструмент помогает держать курс и&nbsp;вовремя замечать, когда что&#8209;то&nbsp;идет не&nbsp;так.</p>
<p dir="ltr">Если мы&nbsp;видим, что&nbsp;сроки по&nbsp;roadmap начинают плыть, одной из&nbsp;причин часто оказывается фича, которая прокралась в&nbsp;спринт вне&nbsp;очереди и&nbsp;без&nbsp;фильтров. В&nbsp;таком случае её&nbsp;стоит найти, провалидировать с&nbsp;помощью инструментов, о&nbsp;которых мы&nbsp;говорили выше, и&nbsp;осознанно решить, что&nbsp;с&nbsp;ней&nbsp;делать дальше.</p>
<p><strong>На каких этапах проекта работает: </strong>на всех этапах, начиная с&nbsp;разработки и&nbsp;до&nbsp;самого релиза.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/910490046db34c56bd3c1c272d74dc2e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong></strong>
    Всё&nbsp;это&nbsp;— FFF, Карта влияний, USM&nbsp;и&nbsp;Roadmap — комплексная защита от&nbsp;Feature Creep. Любые новые идеи и&nbsp;фичи на&nbsp;проекте должны проходить через эту&nbsp;связку фильтров, прежде чем&nbsp;попасть в&nbsp;работу. И&nbsp;тогда удерживать продукт в&nbsp;рамках целей, сроков и&nbsp;реальной ценности для&nbsp;конечных пользователей будет значительно проще.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6395eff6eeab4705a57a47f4b30ebfc5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">А герои кто?</h2>
<p dir="ltr">Все. Понимаем, хочется, чтобы на&nbsp;проекте был&nbsp;один Гендальф, который бы&nbsp;на&nbsp;каждую подозрительную идею, доработку или&nbsp;фичу кричал «You shall not&nbsp;pass», но&nbsp;так&nbsp;не&nbsp;работает. Ответственность за&nbsp;то, чтобы не&nbsp;допустить разбухания продукта, лежит на&nbsp;всех.&nbsp;</p>
<p dir="ltr"><strong>Продюсер проекта</strong> — главный «плохой полицейский» и&nbsp;первый фильтр на&nbsp;пути фичей. Его&nbsp;задача — держать рамки: сроки, бюджет, ресурсы. Именно продюсер ставит под&nbsp;сомнение каждую новую хотелку.</p>
<p dir="ltr"><strong>Владелец продукта</strong> — следит за&nbsp;стратегической ценностью каждой новой идеи. Он&nbsp;может сказать: «Да, мы&nbsp;можем это&nbsp;сделать, но&nbsp;ценности для&nbsp;пользователя нет», — и&nbsp;забанить идею ещё&nbsp;до&nbsp;того, как&nbsp;команда начнёт думать о&nbsp;реализации.</p>
<p dir="ltr"><strong>Дизайнеры</strong> — отвечают за&nbsp;то, чтобы макеты не&nbsp;уводили продукт в&nbsp;сторону. Замечают, когда в&nbsp;интерфейсе появляется функциональность, которой не&nbsp;было в&nbsp;проектировании.</p>
<p dir="ltr"><strong>Разработчики </strong>— прежде, чем&nbsp;начать кодить, ревьюют макеты и&nbsp;задачи, сигналят, если красивое решение может стоит неоправданно долгой разработки.&nbsp;</p>
<p dir="ltr"><strong>Тестировщики</strong> — отличают реальный баг&nbsp;от&nbsp;скрытой новой фичи, которая пытается попасть в&nbsp;релиз под&nbsp;видом логичного улучшения. И&nbsp;возвращают ее&nbsp;туда, где&nbsp;ей&nbsp;место — в&nbsp;бэклог (а&nbsp;то&nbsp;и&nbsp;в&nbsp;мусорку, если там&nbsp;вообще не&nbsp;критично, не&nbsp;важно и&nbsp;не&nbsp;сильно нужно).</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c3c45c922c734ccabd9ae555672148cb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Вывод</h2>
<p dir="ltr">Feature Creep появляется в&nbsp;проекте, не&nbsp;потому что&nbsp;мы&nbsp;плохие, или&nbsp;продукт, или&nbsp;что-то/что-то еще. Это&nbsp;просто неизбежность. И&nbsp;если ее&nbsp;принять, с&nbsp;ней&nbsp;будет сильно легче справиться. Ведь создание и&nbsp;развитие цифрового продукта — это&nbsp;последовательность осознанных выборов. В&nbsp;том&nbsp;числе и&nbsp;в&nbsp;вопросах что&nbsp;делать сейчас, что&nbsp;отложить, а&nbsp;от&nbsp;чего отказаться совсем.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/fcbf266fe41744b28d5fb217c5dee441"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Исследование рынка .NET разработки: Анализ текущих тенденций и прогнозы
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Мы любим .NET и решили узнать, как к нему относятся другие. Опросили 300 разработчиков и тимлидов — делимся инсайтами о стеке и настроениях в сообществе.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/dotnet-research-2025/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/dotnet-research-2025/</guid>

                <pubDate>Thu, 15 Jan 2026 16:07:46 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Исследование рынка .NET разработки: Анализ текущих тенденций и прогнозы</h1>
                                <figure>
                                    <img src="/Media/qrwdm51x/group-50&#x430;&#x430;09508.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2c2c899d7596458eb7e710ebb70c0a8d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">NET остается одной из&nbsp;ведущих платформ для&nbsp;разработки корпоративных приложений, особенно в&nbsp;России, где&nbsp;она&nbsp;используется как&nbsp;в&nbsp;крупных корпорациях, так&nbsp;и&nbsp;в&nbsp;малом бизнесе. Но&nbsp;как&nbsp;на&nbsp;самом деле чувствует себя сообщество разработчиков? Для&nbsp;того чтобы понять это, мы&nbsp;решили опросить 300 российских .NET разработчиков и&nbsp;руководителей разработки. И&nbsp;вот&nbsp;что&nbsp;из&nbsp;этого получилось.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d7de519c62a64b2eaed2aa2b09002019"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2aaa6c25c17b4f78abb4bb5e47d73c11"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Небольшой дисклеймер в&nbsp;начале. Один из&nbsp;участников нашего исследования рассказал, что&nbsp;опрос показался ему&nbsp;предвзятым: «Авторы чётко пытались навязать мнение что&nbsp;с&nbsp;.NET что&#8209;то&nbsp;не&nbsp;так. Это&nbsp;довольно странно. Наверное, авторы из&nbsp;тех, кто&nbsp;до&nbsp;сих&nbsp;пор&nbsp;считают, что&nbsp;всё&nbsp;закрыто в&nbsp;Микрософте, а&nbsp;.NET работает только на&nbsp;Windows».</p>
<p>Каждое мнение имеет право на&nbsp;существование, но&nbsp;тут&nbsp;считаем уместным предупредить, что&nbsp;это&nbsp;мнение неверно и&nbsp;ничего подобного мы&nbsp;в&nbsp;своих взглядах не&nbsp;преследуем. Напротив – наша позиция зиждется на&nbsp;уверенности в&nbsp;успехе и&nbsp;процветании платформы. Для&nbsp;нас&nbsp;как&nbsp;компании разработчика .NET – одно из&nbsp;ключевых направлений, поэтому глупо было бы&nbsp;с&nbsp;нашей стороны надеяться на&nbsp;его&nbsp;деградацию и&nbsp;скорую смерть, но&nbsp;некоторые провокационные вопросы мы&nbsp;все&nbsp;же&nbsp;вставили.&nbsp;</p>
<p>А теперь к&nbsp;сути 🙂</p>
<h2>Профиль участников исследования</h2>
<p>Итак, кто&nbsp;все&nbsp;эти&nbsp;люди, о&nbsp;мнениях которых мы&nbsp;сегодня поговорим? Судя по&nbsp;результатам,&nbsp;<strong>48.3% участников имеют более 7 лет&nbsp;опыта работы с&nbsp;платформой</strong>, а&nbsp;это&nbsp;значит, что&nbsp;многие из&nbsp;них&nbsp;видели взлеты и&nbsp;падения .NET, начиная от&nbsp;старого доброго .NET Framework и&nbsp;до&nbsp;его&nbsp;молодого и&nbsp;дерзкого наследника —&nbsp;<strong>.NET Core</strong>.</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/048/845/b0a/048845b0aad30ed306f68708a14bf22f.png" alt="Диаграмма"></p>
<p>Остальные респонденты распределились следующим образом:</p>
<ul>
<li><strong>От 1 до&nbsp;3 лет&nbsp;опыта</strong>:&nbsp;<strong>15.8%</strong>;</li>
<li><strong>От 3 до&nbsp;5 лет</strong>:&nbsp;<strong>15.8%</strong>;</li>
<li><strong>От 5 до&nbsp;7 лет</strong>:&nbsp;<strong>15.4%</strong>.</li>
</ul>
<p>Доля новичков с&nbsp;опытом менее года — всего&nbsp;<strong>4.7%</strong>.&nbsp;</p>
<p>Около половины (43%) респондентов трудится на&nbsp;благо финтеха, корпораций и&nbsp;среднего бизнеса. Также существенная часть (17,6%) прошедших опрос работает над&nbsp;проектами в&nbsp;госсекторе и&nbsp;малом бизнесе. Среди участвовавших в&nbsp;исследовании были сотрудники известных компаний: Т-Банк, Ozon, Dodo, Ак&nbsp;Барс Диджитал, Контур, РТК, БКС.</p>
<p><img src="https://habrastorage.org/getpro/habr/upload_files/e12/3af/0f8/e123af0f8ffb71c11d74d65c9f0a69d2.png" alt=""></p>
<p>Компании, в&nbsp;которых работают наши респонденты, тоже оказались разнообразными: много тех, кто&nbsp;работает в&nbsp;больших организациях со&nbsp;штатом более 500 человек, но&nbsp;не&nbsp;меньше и&nbsp;тех, кто&nbsp;работает в&nbsp;компаниях более камерных. Как&nbsp;видим, расхожее мнение о&nbsp;том, что&nbsp;на&nbsp;.NET пишут только в&nbsp;крупных корпорациях, не&nbsp;всегда на&nbsp;сто&nbsp;процентов правдив.&nbsp;</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/822/050/983/822050983f4ae1dcb16dd7db29165f91.png" alt="Диаграмма"></p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/682/69d/499/68269d499d07f8591e42be298c65c60f.png" alt="Диаграмма"></p>
<h3>Высшее образование и&nbsp;альтернативные пути в&nbsp;IT</h3>
<p>Теперь поговорим об&nbsp;образовании. Казалось бы, без&nbsp;профильного образования нельзя стать полноценным разработчиком, но, как&nbsp;показывают данные,&nbsp;<strong>73.8% разработчиков имеют высшее образование</strong>&nbsp;в области компьютерных наук или&nbsp;программной инженерии, тогда как&nbsp;<strong>26.2% пришли в&nbsp;IT&nbsp;через самообучение, онлайн-курсы и&nbsp;другие нестандартные пути</strong>. То&nbsp;есть, четверть респондентов опровергают миф&nbsp;о&nbsp;том, что&nbsp;без&nbsp;диплома вы&nbsp;не&nbsp;можете достичь успеха в&nbsp;программировании.</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/eae/94d/37a/eae94d37a57dcce26cb75c039f3afde0.png" alt="Диаграмма"></p>
<p>Те респонденты, которые использовали для&nbsp;вхождения в&nbsp;профессию курсы, поделились ресурсами, которые оказались им&nbsp;полезны. Лидируют в&nbsp;этом списке курсы ITVDN и&nbsp;Ulearn.me. Также среди ответов нескольких разработчиков нашлись FoxMinded, Rubius, OTUS, MSD, CodeMasters, курсы Иосифа Дзеранова. Еще&nbsp;респонденты выделяли следующие ютуб-каналы: DotNext, Dev&nbsp;jungles, Nick Chapsas, Derek Comartin.&nbsp;</p>
<h2>Найм</h2>
<p>Большинство респондентов отметили, что&nbsp;сложностей с&nbsp;наймом .NET специалистов в&nbsp;их&nbsp;компаниях не&nbsp;наблюдается. Однако перевес не&nbsp;слишком велик:&nbsp;<strong>об отсутствии сложностей сказали 58,1% опрашиваемых, а&nbsp;об&nbsp;их&nbsp;наличии – 41,9%.</strong></p>
<p>Среди причин сложностей с&nbsp;наймом лидируют низкий уровень подготовки специалистов и&nbsp;нехватка специалистов с&nbsp;нужным опытом. Самая редкая причина невыдачи оффера, кажется,&nbsp;за&nbsp;низким уровнем софт-скиллов. Получается, эта&nbsp;компетенция у&nbsp;большинства все-таки на&nbsp;нужном уровне.<img class="image persona__image" alt=""></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/3763b7bef0ed438094e65adf39c51fc4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Учитывая сферу, в&nbsp;которой мы&nbsp;работаем, большинство сотрудников наиболее мотивировано на&nbsp;развитие технических скиллов, так&nbsp;как&nbsp;это&nbsp;практически напрямую повышает рыночную ценность сотрудника. 

Если посмотреть на&nbsp;вакансии, подавляющее большинство требований касается именно технических навыков. Если говорить о&nbsp;неруководящих ролях и&nbsp;младших грейдах – предпочтение будет отдаваться кандидатам, обладающим более высокой технической подготовкой, при&nbsp;условии, что&nbsp;уровень софтов кандидата достаточен для&nbsp;взаимодействия с&nbsp;командой. Однако если рассматривать сеньорных специалистов, которые часто привлекаются для&nbsp;трансляции своей высокой технической экспертизы, социальная адаптация и&nbsp;коммуникативные навыки будут играть куда более важную роль
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Кирилл Кодин
                </cite>
                <p class="blockquote-new__author-position">
                    руководитель отдела бэкенд разработки, компания IBS
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/fc25e695629244098036067d1fd05cbf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/73bfdc559213447ba1d1c5e7aadc966c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/236/acd/e4a/236acde4a84f14505a30ddd6ed3c932c.png" alt="Диаграмма"></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/ef97f9df359d41b6ad67e88a25366daa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Не&nbsp;обязательно небольшая доля ответов про&nbsp;низкий уровень софт скиллов говорит о&nbsp;том, что&nbsp;большинство в&nbsp;них&nbsp;не&nbsp;испытывают недостатка. Вероятно также, что&nbsp;на&nbsp;собеседовании не&nbsp;смотрят на&nbsp;софт скиллы или&nbsp;смотрят на&nbsp;них&nbsp;в&nbsp;последнюю очередь


    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Антон Бевзюк, Head of Engineering, компания Mindbox
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c82ff1ace2d4489199992f3f3bc2eccb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5e3331cce39f434bb21012433fc49e54"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>И немного о&nbsp;том, как&nbsp;все-таки попасть в&nbsp;.NET команду. Меньше всего респондентов ответили, что&nbsp;получают разработчиков из&nbsp;тех&nbsp;ребят, что&nbsp;оказываются выпускниками школ и&nbsp;курсов программирования. Чаще всего найм происходит с&nbsp;рынка, причем количество таких ответов лидирует с&nbsp;большим отрывом.&nbsp;</p>
<p>Для начинающих специалистов, кажется, есть 2 рабочих пути закрепиться в&nbsp;индустрии: искать или&nbsp;стажировку или&nbsp;знакомых в&nbsp;нужной компании.</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/ea5/660/029/ea5660029cb597fc083e6b94d5d0a444.png" alt="Диаграмма"></p>
<p>Что касается предпочтительных технологий, на&nbsp;диаграмме ниже можно ознакомиться с&nbsp;тенденциями среди наших респондентов. Из&nbsp;этого списка легко понять, что&nbsp;сейчас нужно знать специалистам, чтобы быть востребованными.</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/4f2/7c3/42e/4f27c342ee82900de2e47df5b960030f.png" alt="Chart"></p>
<p>Итак, загибаем пальцы. Среднестатистический .NET разработчик, чтобы быть востребованным, должен знать, как&nbsp;проектировать и&nbsp;разрабатывать REST API&nbsp;на&nbsp;Web&nbsp;API&nbsp;и&nbsp;описывать его&nbsp;в&nbsp;Swagger, как&nbsp;общаться через ORM&nbsp;EF.Core с&nbsp;БД&nbsp;PosgreSQL или&nbsp;MS&nbsp;SQL&nbsp;и&nbsp;немного Redis, уметь работать с&nbsp;очередями RabbitMQ, Kafka, полнотекстовым индексом Elasticsearch, отслеживать метрики через Kibana или&nbsp;Grafana/Prometheus, использовать для&nbsp;деплоя Docker и&nbsp;Kubernetes.&nbsp;</p>
<p><span class="highlighter"><strong>Важный вывод из&nbsp;опроса: </strong>современный кроссплатформенный .NET Core / .NET 5+ в&nbsp;России победил старый добрый .NET Framework. Только 27% респондентов ответили, что&nbsp;.NET Framework остается востребованным.&nbsp;</span></p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/b52/2ff/9ec/b522ff9eceed0ebd1845e63477d292b5.png" alt="Диаграмма"></p>
<p>В отличие от&nbsp;других стеков (например, фронтенда), список необходимых технологий в&nbsp;.NET не&nbsp;так&nbsp;широк, достаточно унифицирован и&nbsp;не&nbsp;меняется слишком часто. То&nbsp;есть, освоить его&nbsp;довольно просто: границы очерчены – нужна только ваша усидчивость.&nbsp;</p>
<h2>Зарплаты: то, что&nbsp;интересует всех</h2>
<p>Как выяснилось,&nbsp;<strong>78.2% разработчиков отметили, что&nbsp;их&nbsp;зарплата выросла за&nbsp;последние два&nbsp;года</strong>. Этот факт сам&nbsp;по&nbsp;себе уже&nbsp;является отличной новостью для&nbsp;тех, кто&nbsp;планирует оставаться на&nbsp;.NET и&nbsp;дальше. Но, как&nbsp;всегда, есть и&nbsp;ложка дегтя —&nbsp;<strong>3.1% респондентов сообщили, что&nbsp;их&nbsp;зарплата снизилась</strong>. Причем это&nbsp;не&nbsp;связано с&nbsp;падением производительности (надеемся), скорее всего, тут&nbsp;сработали макроэкономические факторы.&nbsp;<strong>У 18,8% респондентов зарплата не&nbsp;менялась.</strong></p>
<p><strong><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/805/77c/655/80577c65575fb6ff0b90df08fe230a9a.png" alt="Диаграмма"></strong></p>
<p>&nbsp;</p>
<p>Насколько же&nbsp;выросли зарплаты у&nbsp;счастливчиков?&nbsp;</p>
<ul>
<li>
<p><strong>25.3% разработчиков сообщили, что&nbsp;их&nbsp;зарплата увеличилась более чем&nbsp;на&nbsp;60%</strong>. Джекпот! На&nbsp;самом деле, рост зарплат начинающих специалистов в&nbsp;разработке за&nbsp;2 года более 60% является частым явлением, но&nbsp;опрос показывает, что&nbsp;это&nbsp;не&nbsp;только новички.&nbsp;</p>
</li>
<li>
<p><strong>19.3% заявили о&nbsp;росте на&nbsp;20-30%</strong>. Это&nbsp;уже&nbsp;не&nbsp;такой феерический результат, но&nbsp;все&nbsp;еще&nbsp;вполне достойный.</p>
</li>
<li>
<p><strong>17.2% респондентов</strong>&nbsp;отметили увеличение на&nbsp;<strong>10-20%</strong>, что&nbsp;также неплохо, если учесть текущие экономические реалии.</p>
</li>
</ul>
<p>Снижение уровня заработной платы, которое отметили всего 11 человек, чаще всего находилось в&nbsp;пределах 10-20% (у&nbsp;5 человек) и&nbsp;20-30% (тоже 5 человек).&nbsp;<strong>Лишь 1 респондент указал, что&nbsp;его&nbsp;доход упал более чем&nbsp;на&nbsp;50%.</strong></p>
<p><strong><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/f6b/274/cf3/f6b274cf377caef336103fdb54cb53ad.png" alt="Диаграмма"></strong></p>
<p>Одним из&nbsp;важных вопросов нашего исследования было сравнение зарплат .NET-разработчиков с&nbsp;их&nbsp;коллегами, работающими на&nbsp;других стеках. И&nbsp;вот&nbsp;что&nbsp;показали результаты:&nbsp;<strong>59.9% респондентов считают, что&nbsp;их&nbsp;зарплаты примерно равны зарплатам других бэкенд-специалистов</strong>. Похоже, что&nbsp;в&nbsp;среднем .NET-разработчики не&nbsp;чувствуют себя ущемленными в&nbsp;финансовом плане по&nbsp;сравнению с&nbsp;коллегами на&nbsp;других технологиях.</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/bab/121/277/bab1212779f6065b1766339eafab0d38.png" alt="Диаграмма"></p>
<p>Однако&nbsp;<strong>29.1% участников</strong>&nbsp;(около 90 человек) всё&nbsp;же&nbsp;считают, что&nbsp;их&nbsp;зарплаты ниже. Причем это&nbsp;может быть связано не&nbsp;столько с&nbsp;самой платформой .NET, сколько с&nbsp;восприятием рынка. Например, Java исторически рассматривается как&nbsp;«корпоративная» технология, а&nbsp;Python — как&nbsp;«язык будущего», особенно в&nbsp;свете его&nbsp;популярности в&nbsp;<strong>Data Science</strong>&nbsp;и&nbsp;<strong>AI-разработке</strong>. По&nbsp;нашим данным, больше всего респондентов с&nbsp;таким мнением работает в&nbsp;корпорациях (29 человек) и&nbsp;на&nbsp;проектах для&nbsp;среднего бизнеса (23 человека). Респондентов, пишущих код&nbsp;для&nbsp;малого бизнеса, госсектора, промышленности и&nbsp;e-com, полагающих, что&nbsp;их&nbsp;зарплаты ниже, тоже нашлось достаточно: &gt; 14&nbsp;человек в&nbsp;каждом секторе.</p>
<p><strong>Только 11% респондентов (чуть больше 30 человек) считают, что&nbsp;их&nbsp;зарплаты выше</strong>, чем&nbsp;у&nbsp;разработчиков на&nbsp;других стеках. Больше всего разработчиков с&nbsp;таким мнением работает корпорациях, среднем бизнесе и&nbsp;промышленности. <img class="image persona__image" alt=""></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/9d071761932f427a9e90fd48ef97a7c9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Зарплаты – думаю, что&nbsp;лавинообразный рост сейчас перейдёт в&nbsp;плато, в&nbsp;силу ситуации в&nbsp;стране. В&nbsp;остальном, перспективы у&nbsp;языка огромные. Все, кто&nbsp;хоть раз&nbsp;на&nbsp;нем&nbsp;писал, в&nbsp;восторге от&nbsp;него. Многие не&nbsp;заходят в&nbsp;.NET, потому что&nbsp;боятся сложности, хотя на&nbsp;самом деле сложным это&nbsp;дело кажется только по&nbsp;первости
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Дмитрий Шмайлов
                </cite>
                <p class="blockquote-new__author-position">
                    руководитель отдела бэкенд разработки, компания Fun & Sun
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7add243e79564608b411284262acff89"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/27ef91ae7f024abe98f444493a6b6a09"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Почему зарплаты не&nbsp;растут у&nbsp;всех?</h3>
<p><span class="highlighter">Хоть многие .NET-разработчики считают свои зарплаты на&nbsp;уровне с&nbsp;коллегами, возникает вопрос: почему некоторые всё&nbsp;же&nbsp;жалуются на&nbsp;их&nbsp;стагнацию?</span> Возможно, дело в&nbsp;том, что&nbsp;рынок .NET в&nbsp;России часто фокусируется на&nbsp;крупных корпоративных заказчиках, которые не&nbsp;всегда готовы поднимать зарплаты так&nbsp;же&nbsp;быстро, как&nbsp;стартапы или&nbsp;бутиковые IT-агентства.</p>
<p>В отличие от&nbsp;гибких компаний, где&nbsp;разработчики могут себе позволить быстро переключаться между проектами с&nbsp;высокими доходами, .NET-разработчики нередко остаются в&nbsp;стабильных корпорациях на&nbsp;долгосрочной основе.&nbsp;</p>
<h2>Карьерные планы&nbsp;</h2>
<p>Зарплаты, конечно, играют важную роль в&nbsp;мотивации разработчиков, но&nbsp;они&nbsp;не&nbsp;единственный фактор. Как&nbsp;показывает наше исследование, карьерные планы у&nbsp;разработчиков на&nbsp;платформе .NET могут варьироваться:&nbsp;<strong>58.6% участников сообщили, что&nbsp;довольны своей текущей работой и&nbsp;не&nbsp;планируют её&nbsp;менять</strong>. Это&nbsp;довольно высокий показатель стабильности, особенно в&nbsp;условиях, когда IT-рынок постоянно трансформируется. <img class="image persona__image" alt=""></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/0699cbc6904e4cec9f3a6d1e83838c06"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Думаю, для&nbsp;большинства сотрудников интересных задач и&nbsp;достойной оплаты труда достаточно. Касательно соцпакета – мне&nbsp;кажется в&nbsp;современном мире это&nbsp;«дефолтное условие» в&nbsp;любой уважающей себя компании. Уникальные плюшки определенно могут завлечь/удержать некоторую аудиторию, но&nbsp;думаю, что&nbsp;ее&nbsp;размер невелик
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Кирилл Кодин, руководитель отдела бэкенд разработки, компания IBS
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/90ee9fffaf9c4f25a1469d286b57205c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e9c7da2863344c3d9dc6ea4dcb81f7a5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Однако <strong>37.3% респондентов рассматривают возможность смены работы</strong>. Это&nbsp;вполне типичная ситуация для&nbsp;разработчиков, ведь мы&nbsp;все&nbsp;знаем, что&nbsp;IT-рынок предлагает множество возможностей, и&nbsp;иногда смена компании может дать тот&nbsp;самый нужный толчок для&nbsp;роста. Остальные <strong>4.1% активно ищут новую работу</strong>, и&nbsp;им&nbsp;можно только пожелать удачи — с&nbsp;их&nbsp;опытом и&nbsp;навыками они&nbsp;наверняка найдут что&#8209;то&nbsp;стоящее.</p>
<h2>Фуллстек-разработка: кто&nbsp;эти&nbsp;универсальные солдаты?</h2>
<p><strong>31.7% респондентов отметили, что&nbsp;работают как&nbsp;фуллстек-разработчики</strong>. Рынок все&nbsp;еще&nbsp;требует специалистов, которые могут закрывать как&nbsp;бэкенд, так&nbsp;и&nbsp;фронтенд задачи.</p>
<p><em>Примечание: мы&nbsp;явно не&nbsp;очень удачно сформулировали варианты ответов тут. Загадочный «бекенд+другой стек» возможно было интерпретировать по-разному.</em></p>
<p><em><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/5cc/bf5/911/5ccbf591108f20bc308892e9107fcb85.png" alt="Диаграмма"></em></p>
<p> </p>
<p>Почему фуллстек-разработчики так&nbsp;востребованы? Ответ очевиден: они&nbsp;могут сэкономить массу ресурсов компании, ведь им&nbsp;не&nbsp;нужно переключаться между разными людьми или&nbsp;командами. Они&nbsp;закрывают сразу оба&nbsp;фланга: и&nbsp;серверную логику, и&nbsp;пользовательский интерфейс. </p>
<p>А с&nbsp;появлением таких инструментов, как&nbsp; <strong>Blazor</strong> (который позволяет писать фронтенд на&nbsp;C#), всё&nbsp;становится еще&nbsp;проще для&nbsp;тех, кто&nbsp;уже&nbsp;работает с&nbsp;.NET. Для&nbsp;нас&nbsp;неожиданностью стало, что&nbsp;около 40 респондентов отметили, что&nbsp;Blazor является востребованной технологией. </p>
<p>Но что&nbsp;с&nbsp;бэкендерами? Неужели все&nbsp;хотят быть фуллстек-разработчиками? Не&nbsp;совсем. <strong>61.7% респондентов предпочитают оставаться в&nbsp;бэкенде</strong>. Им&nbsp;вполне комфортно сосредоточиться на&nbsp;своей специализации и&nbsp;не&nbsp;лезть в&nbsp;хаос фронтенда, где&nbsp;каждый второй фреймворк меняется чуть ли&nbsp;не&nbsp;каждый год. «Фронтенд — это&nbsp;боль», — скажет вам&nbsp;любой опытный бэкенд-разработчик, сталкивающийся с&nbsp;новыми версиями <strong>React</strong>, <strong>Angular</strong> или, упаси боже, старого доброго <strong>jQuery</strong>.</p>
<h2>Стоит ли&nbsp;идти в&nbsp;.NET начинающим?</h2>
<p>На фоне огромного разнообразия технологий и&nbsp;фреймворков, выбор первой платформы может стать нелегким испытанием. Однако наши респонденты практически единодушны: <strong>84.6% из&nbsp;них&nbsp;считают, что&nbsp;начинающим разработчикам стоит идти в&nbsp;.NET</strong>. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/2095bd94326e4643bb15de764bc08714"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Я&nbsp;считаю, что&nbsp;.NET / C# отлично подходит, если не&nbsp;для&nbsp;первого языка, то&nbsp;для&nbsp;первого профессионального языка точно. Мы&nbsp;в&nbsp;компании проводим школы разработки С# и&nbsp;набираем стажеров. Одна из&nbsp;причин, почему C# хорош для&nbsp;новичков, парадоксальна: в&nbsp;разработке .NET нет&nbsp;такого разнообразия фреймворков и&nbsp;библиотек. Это&nbsp;и&nbsp;минус, но&nbsp;для&nbsp;новичков это&nbsp;плюс – освоив один набор, ты&nbsp;уже&nbsp;становишься хорошим востребованным профи. Другие причины: отличная документация, отличные инструменты разработчика, относительное отсутствие проблем с&nbsp;окружением для&nbsp;разработки: не&nbsp;приходится как&nbsp;во&nbsp;многих стеках сначала днями разбираться с&nbsp;конфликтами версий пакетов и&nbsp;инструментов, а&nbsp;можно сразу заниматься собственно полезным. Кроме того, перейти с&nbsp;С# с&nbsp;его&nbsp;хорошим ООП&nbsp;на&nbsp;Java, Go&nbsp;или&nbsp;TypeScript по&nbsp;опыту не&nbsp;сложно
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Андрей Степанов
                </cite>
                <p class="blockquote-new__author-position">
                    техдиректор fuse8
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/998d7c137ef94bd784c44eac63b8e996"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/81f35633195842b0b4e07282410a14df"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>.NET — это&nbsp;действительно многофункциональная платформа, которая охватывает широкий спектр задач. На&nbsp;ней&nbsp;можно разрабатывать как&nbsp;веб-приложения, микросервисы, так&nbsp;и&nbsp;десктопные программы, мобильные приложения . <span class="highlighter">Таким образом, новичок, который выберет .NET, может научиться работать в&nbsp;различных направлениях и&nbsp;не&nbsp;ограничивать себя чем&#8209;то&nbsp;одним.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/a78e9230741c42d78e2b6e2aba172256"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Как&nbsp;по&nbsp;мне, у&nbsp;.NET - большие перспективы, все&nbsp;больше команд и&nbsp;проектов начинают выбирать его&nbsp;в&nbsp;качестве основного стека,  за&nbsp;счет его&nbsp;активного и&nbsp;стабильного развития от&nbsp;Майкрософт и&nbsp;кроссплатформенности. Также могу отметить, что&nbsp;у&nbsp;меня много знакомых, которые перешли с&nbsp;Джавы на&nbsp;.NET, а&nbsp;вот&nbsp;обратных случаев я&nbsp;почти не&nbsp;знаю
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Мнение респондента, опыт 3-5 лет, компания Иннотех
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/636fd6d586a245048ef7cb2f60da6473"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b33fb9380bfe4c5e859f0bbac63407eb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Перспективы .NET в&nbsp;российских компаниях</h2>
<p>Нам было интересно, что&nbsp;сейчас происходит с&nbsp;.NET командами в&nbsp;компаниях. Оказалось, в&nbsp;большинстве случаев команды либо остаются прежнего размера, либо растут.&nbsp;</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/2de/3f8/b3f/2de3f8b3fbd1544c634d626a9cd79b72.png" alt="Диаграмма"></p>
<p>Рост в&nbsp;командах более заметный. У&nbsp;более половины респондентов команды за&nbsp;последние два&nbsp;года расширились. Существенная часть из&nbsp;них&nbsp;увеличилась не&nbsp;на&nbsp;много, но&nbsp;тенденция получается все&nbsp;равно положительная.&nbsp;</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/740/643/521/7406435211a444b9d1f0a7b5fc0a3b78.png" alt="Диаграмма"></p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/f08/8e5/3e0/f088e53e025189b3a2aa52b25d5896e1.png" alt="Chart"></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/3d06e93e66374d5db5868866a6726ffd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Экосистема .NET растёт и&nbsp;развивается. Вакансий на&nbsp;рынке в&nbsp;РФ&nbsp;по&nbsp;данному стеку много, среди них&nbsp;почти каждый крупный банк или&nbsp;крупное предприятие. Не&nbsp;вижу предпосылок, что&nbsp;этот технологический стек станет ненужным в&nbsp;РФ. Тем&nbsp;не&nbsp;менее, продолжаю следить за&nbsp;развитием как&nbsp;самого стека, так&nbsp;и&nbsp;предложений о&nbsp;работе по&nbsp;нему
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Мнение респондента
                </cite>
                <p class="blockquote-new__author-position">
                    опыт более 7 лет
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/22174635bc7547229b6a0b664473e833"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/44692b81511545a0970d9589f9a86b34"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>К слову, ограничения на&nbsp;продажи Microsoft, кажется, по&nbsp;большей части разработчикам не&nbsp;мешают.&nbsp;А&nbsp;те&nbsp;сложности, которые есть, согласно результатам нашего опроса, похоже, погоды не&nbsp;делают.&nbsp;</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/01b/83b/897/01b83b897073b719caa6ab50c9004e15.png" alt="Диаграмма"></p>
<p>Если говорить о&nbsp;той&nbsp;доле голосов, которая все&nbsp;же&nbsp;отмечает неудобства, то&nbsp;вместо описаний, лучше приведем мнения респондентов.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/17c96cbdff294f50903a5b853735bb43"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Перспектив нет. Конкурента Спрингу нет, c# лишь усложняется и&nbsp;становится более вербозным, рантайм не&nbsp;ускоряется, тулинга недостаточно и&nbsp;он&nbsp;преимущественно под&nbsp;виндоус
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Мнение респондента, опыт более 7 лет, Додо Инжиниринг
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/243c25229d2d487eb30347cbfb335a2a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Microsoft активно топит за&nbsp;облака, а&nbsp;самые популярные облака недоступны :)
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Мнение респондента, опыт более 7 лет
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/58cc80b5e5784aaab6e61b62e43bace5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Полноценных IDE, которые можно приобрести официально, больше нет. Кажется, что&nbsp;.NET будет постепенно умирать
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Мнение респондента, опыт более 7 лет
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/06ff15858c7742ddbfcc591dc97fdf6d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Согласен с&nbsp;мнением респондента выше. Райдер ушел полностью, блокирует лицензии, если видит заходы из&nbsp;РФ. VS&nbsp;в&nbsp;РФ&nbsp;не&nbsp;купить. Остается VS&nbsp;Code, но&nbsp;в&nbsp;сравнении с&nbsp;Райдером нельзя сказать, что&nbsp;это&nbsp;полноценная альтернатива
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Антон Бевзюк, 
                </cite>
                <p class="blockquote-new__author-position">
                    Head of Engineering, компания Mindbox
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/43b1703fd66041df8e2aff0caeb04ec3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/dcebf6415ed44865aa3103f13a07fde8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Фактором оптимистичных прогнозов можно считать количество запускаемых с&nbsp;нуля фичей на&nbsp;.NET в&nbsp;командах разработки, в&nbsp;которых работают наши респонденты. Большинство релизят регулярно: проекты не&nbsp;стагнируют, а&nbsp;значит будут расширяться.</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/ded/ff7/7f6/dedff77f61ab8c31a7d615088efb8b24.png" alt="Диаграмма"></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/e22abe171bc54c10834aefaa19a93171"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            На&nbsp;данный момент 90% высокоуровневых задач можно решить с&nbsp;помощью С#. Да, написать низкоуровневый код&nbsp;для&nbsp;микроконтроллера не&nbsp;получится, хотя и&nbsp;тут&nbsp;все&nbsp;зависит от&nbsp;производителя того самого чипа. Важно и&nbsp;то, что&nbsp;развитие языка – развитие официальными источниками, а&nbsp;не&nbsp;кем‑то на&nbsp;коленках дома. По&nbsp;моим наблюдениям, доля С# растет с&nbsp;каждым годом
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Дмитрий Шмайлов
                </cite>
                <p class="blockquote-new__author-position">
                    руководитель отдела бэкенд разработки, компания Fun & Sun
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a3839d7b589e47b39c1ce0eb665fc1ed"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/36711b5356744f39b8df62f0fe29fefc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Миграция с&nbsp;.NET на&nbsp;другие стеки</h2>
<p>Примерно одинаковое количество проектов на&nbsp;.NET находятся на&nbsp;поддержке и&nbsp;пишутся с&nbsp;нуля в&nbsp;командах, в&nbsp;которых работают наши респонденты.&nbsp;</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/80f/f14/ff9/80ff14ff99e9b5e19d67fbe6922a2b01.png" alt="Диаграмма"></p>
<p>Большинство респондентов<span>&nbsp;</span><strong>не сталкиваются</strong><span>&nbsp;с необходимостью переводить .NET проекты на&nbsp;новый стек.&nbsp;</span></p>
<p><span><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/089/285/fa0/089285fa014e16fd097bd4a61ba8231d.png" alt="Диаграмма"></span></p>
<p><span>Из тех, кто&nbsp;проекты все&nbsp;же&nbsp;переводит,&nbsp;<strong>большинство голосует за&nbsp;Go,&nbsp;</strong>на втором месте – Java, за&nbsp;ним&nbsp;– JS&nbsp;и&nbsp;Node.&nbsp;</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/3c230011ffe743d99c284f4c4b54e494"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Ажур прикрыли, что&nbsp;будет с&nbsp;поддержкой .net непонятно, покупаем тулы прикидываясь казахами. Знакомые дотнетчики перелезают в&nbsp;джаву. Там&nbsp;и&nbsp;сбер активно вкладывает, еще&nbsp;amplicode есть, и&nbsp;для&nbsp;самой джавы есть компании, которые продвигают свои форки (например bell soft). Легаси на&nbsp;джаве на&nbsp;порядок больше чем&nbsp;в&nbsp;.net – без&nbsp;работы джависты никогда не&nbsp;останутся. ЗП&nbsp;на&nbsp;джаве на&nbsp;10-15 % выше чем&nbsp;у&nbsp;дотнетчиков
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Мнение респондента
                </cite>
                <p class="blockquote-new__author-position">
                    опыт более 7 лет, аутсорс-подрядчик госсектора
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d23738e378c94f1e9bdae702eea55cc6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5c9d51abca42419daeba83fcc1745e56"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fd/8d1/0b8/8fd8d10b83f890f6021a42f72522f9f3.png" alt="Диаграмма"></p>
<p>Такое распределение сил, кажется, появляется неспроста: большинство респондентов, говоря о&nbsp;языке, на&nbsp;котором стали бы&nbsp;писать, если бы&nbsp;не&nbsp;выбрали .NET, голосуют за&nbsp;Gо. На&nbsp;втором месте Python, за&nbsp;ним&nbsp;Java.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/5397655da96a49a59bfd317a28554f82"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            NET&nbsp;привели к&nbsp;тому, что&nbsp;писать можно и&nbsp;в&nbsp;блокноте – проблем нет. Развитие языка намного быстрее , нежели у&nbsp;Java. Сам&nbsp;по&nbsp;себе язык красивее и&nbsp;лаконичнее, нежели та&nbsp;же&nbsp;Java. Многим нравится Питон, но&nbsp;Питон – язык для&nbsp;решения математических задач, прежде всего, потому его&nbsp;использование – лишь попытка людей, знающих только его, писать на&nbsp;одном языке все. У&nbsp;С# , наоборот, развитие идет не&nbsp;только в&nbsp;сторону математики (туда тоже, кстати)
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Дмитрий Шмайлов
                </cite>
                <p class="blockquote-new__author-position">
                    руководитель отдела бэкенд разработки, компания Fun & Sun
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4a6fe9c87af24ba19255ef841f0b36da"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/781a7b0c473240b1bdafc6ae47482e7e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/2c3/1eb/4df/2c31eb4df300a5417f7cefe5174a3a16.png" alt="Диаграмма"></p>
<p>Мнения в&nbsp;целом, конечно, разнятся. Вот, например, мнение одного из&nbsp;респондентов на&nbsp;эту&nbsp;тему:&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/ed6bb574ffe747b99994775278b5da7a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        По&nbsp;опыту C# существенно лучше, чем&nbsp;java и&nbsp;python. Писать на&nbsp;нём&nbsp;одно удовольствие, код&nbsp;более качественный за&nbsp;счет мощной поддержки экосистемы Microsoft
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Мнение респондента, опыт более 7 лет, Ex Big4
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f3e813b107ec40309f3ee69cad30ceee"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/516305c410074ec8ba220bf278fdfe80"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Опрашивая только .NET разработчиков о&nbsp;миграции на&nbsp;другие стеки, мы&nbsp;не&nbsp;ждали, что&nbsp;будет много таких случаев – все&nbsp;таки для&nbsp;этого надо опрашивать разработчиков в&nbsp;целом.</p>
<p>Хотя доля<strong>&nbsp;миграции на&nbsp;Java и&nbsp;Python&nbsp;</strong>небольшая, это&nbsp;всё&nbsp;же&nbsp;определенный сигнал. Он&nbsp;указывает на&nbsp;то, что&nbsp;некоторые компании продолжают экспериментировать с&nbsp;переходом на&nbsp;другие платформы. Но&nbsp;и&nbsp;это&nbsp;не&nbsp;значит, что&nbsp;.NET теряет свои позиции. Наоборот,&nbsp;<strong>большинство компаний остаются верны платформе</strong>, особенно если она&nbsp;уже&nbsp;интегрирована в&nbsp;корпоративные процессы и&nbsp;хорошо себя показывает многие годы.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/7267e7049a83441c9ab3d81000a90019"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Со&nbsp;стороны кажется, что&nbsp;компании от&nbsp;.Net уходят, хотя на&nbsp;hh.ru я&nbsp;чаще стал видеть вакансии по&nbsp;Шарпам в&nbsp;билайне, МТС, Теле2. Но&nbsp;джунов там&nbsp;я&nbsp;не&nbsp;видел, только спецов. Но&nbsp;все&nbsp;равно тревожно от&nbsp;того, что&nbsp;шарпы где‑то рядом и&nbsp;всегда в&nbsp;обсосе. Я&nbsp;постоянный гость мероприятия Найти IT, который уже&nbsp;4 раза проходил в&nbsp;СПб. За&nbsp;все&nbsp;время там&nbsp;не&nbsp;было стажировок на&nbsp;C#. Только были от&nbsp;Интерфакс, от&nbsp;других я&nbsp;не&nbsp;слышал. Чего уж&nbsp;там&nbsp;говорить, если у&nbsp;некоторых из&nbsp;разработчиков в&nbsp;голове миф, что&nbsp;на&nbsp;шарпах пишут те, кто&nbsp;что‑то под&nbsp;Винду делает... Среди моих знакомых в&nbsp;вузе есть один челик, который пишет на&nbsp;шарпах именно бэк. Видел только, что&nbsp;на&nbsp;юнити ребята есть, но&nbsp;вот&nbsp;на&nbsp;бэке почти никого
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Мнение респондента
                </cite>
                <p class="blockquote-new__author-position">
                    опыт 1-3 года, ABC Moscow
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/bbde1ccac5904b59ab7e539512e87f60"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cab6349216b641aba867ea1506cd3ca2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Перспективы для&nbsp;начинающих и&nbsp;будущее .NET</h3>
<p>Когда вы&nbsp;только начинаете свою карьеру в&nbsp;программировании, выбор первого стека — важное решение, определяющее ваш&nbsp;вектор развития на&nbsp;ближайшие (как&nbsp;минимум) пару лет. Ситуация с&nbsp;.NET такова, что&nbsp;его&nbsp;часто недооценивают начинающие программисты. Но&nbsp;вот&nbsp;что&nbsp;говорят опытные разработчики:&nbsp;<strong>84.6% респондентов уверены, что&nbsp;.NET — это&nbsp;отличный выбор для&nbsp;новичков</strong>. Причем это&nbsp;мнение не&nbsp;просто сформировано на&nbsp;основе симпатий, а&nbsp;базируется на&nbsp;реальных возможностях и&nbsp;многофункциональности платформы.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/a168776325c34970bdb9e6332ef0bb24"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            .NET великолепный стек, омраченный провальной маркетинговой компанией Майкрософт. Из‑за чего многие до&nbsp;сих&nbsp;пор&nbsp;считают .Net windows only. Надеюсь, что&nbsp;это&nbsp;скоро пройдет. Я&nbsp;больше пяти лет&nbsp;пишу на&nbsp;.Net хотя и&nbsp;пробовал другие стеки. Но&nbsp;если бы&nbsp;у&nbsp;меня был&nbsp;выбор, то&nbsp;выбрал бы&nbsp;.Net снова. Если, конечно, альтернативой не&nbsp;был&nbsp;бы&nbsp;какой-нибудь стек с&nbsp;функциональным ЯП. Не&nbsp;люблю наследование :)
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Мнение респондента
                </cite>
                <p class="blockquote-new__author-position">
                    опыт 5-7 лет, БеллИнтегратор, UpTime24
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e2944cae472f4028b939134e9bb89fa7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f1e67cbafb254885ac6d1c2cf04ef71c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Еще одно важное замечание: <strong>.NET давно перестал быть исключительно бэкенд-платформой</strong>. В&nbsp;прошлом он&nbsp;действительно был&nbsp;больше ориентирован на&nbsp;серверную разработку, но&nbsp;сегодня ситуация изменилась. С&nbsp;появлением таких технологий, как&nbsp;<strong>Blazor</strong>, разработчики могут писать полноценные клиентские приложения на&nbsp;C#, избегая зависимости от&nbsp;JavaScript. Это&nbsp;отличная новость для&nbsp;тех, кто&nbsp;всегда хотел разрабатывать как&nbsp;бэкенд, так&nbsp;и&nbsp;фронтенд, но&nbsp;не&nbsp;был&nbsp;готов осваивать новые языки.</p>
<p>С другой стороны, это&nbsp;не&nbsp;значит, что&nbsp;фуллстек-разработчики на&nbsp;.NET вытеснят бэкенд-разработчиков. Как&nbsp;показали результаты опроса,&nbsp;<strong>61.7% участников предпочитают работать исключительно с&nbsp;бэкендом</strong>. Для&nbsp;них&nbsp;это&nbsp;проверенная и&nbsp;удобная ниша, где&nbsp;они&nbsp;чувствуют себя комфортно, и&nbsp;их&nbsp;ничто не&nbsp;заставляет покидать её&nbsp;ради новых горизонтов. В&nbsp;то&nbsp;время как&nbsp;<strong>31.7% респондентов работают как&nbsp;фуллстек-разработчики</strong>, совмещая бэкенд и&nbsp;фронтенд задачи, остальные просто не&nbsp;хотят заниматься тем, что&nbsp;их&nbsp;не&nbsp;интересует.<img class="image persona__image" alt=""></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/b4b262e80d2541d3bf82fadd68a3b743"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Мощный язык, в&nbsp;котором есть строгая типизация, сильная поддержка со&nbsp;стороны разработчика и&nbsp;огромное комьюнити. Писать на&nbsp;C# можно практически все&nbsp;и&nbsp;на&nbsp;все&nbsp;есть ответ в&nbsp;интернете (для&nbsp;начинающих – одно из&nbsp;главных преимуществ). Комьюнити развивается и&nbsp;приумножается семимильными шагами
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Дмитрий Шмайлов, руководитель отдела бэкенд разработки, компания Fun & Sun
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3ac373c0246c498587b71a59da929f6b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d9a19f2a314f4d7e858d07e18892c662"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Перспективы и&nbsp;вызовы .NET-разработки в&nbsp;ближайшие годы</h2>
<p>Как показывает наш&nbsp;опрос, большинство разработчиков и&nbsp;компаний, работающих с&nbsp;.NET, не&nbsp;собираются радикально менять свою стратегию в&nbsp;ближайшие годы.&nbsp;<strong>.NET остается одной из&nbsp;ведущих платформ для&nbsp;разработки в&nbsp;корпоративном сегменте</strong> и, несмотря на&nbsp;все&nbsp;разговоры о&nbsp;переходе на&nbsp;другие языки, многие компании по-прежнему видят в&nbsp;.NET стабильное и&nbsp;проверенное решение. Однако это&nbsp;не&nbsp;значит, что&nbsp;рынок не&nbsp;претерпит изменений.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/e6d14a315c2241cdb08c7e8a5b378dc0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        .NET не&nbsp;переживает какой то&nbsp;бурный рост или&nbsp;резкое падение. В&nbsp;перспективе будет выпущено ещё&nbsp;несколько версий .NET, но&nbsp;что&nbsp;то&nbsp;придумывать революционное сложно. Думаю, если Microsoft приложит достаточно усилий для&nbsp;развития платформы, то&nbsp;мы&nbsp;сможем увидеть .NET как&nbsp;доминанта для&nbsp;разработки чего угодно
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Мнение респондента, опыт более 7 лет, iiko
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/95a94862a56948f68b36518ca5a00135"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ec933570694746c2a5974bc2acb3dd5e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Практикующие опытные разработчики по&nbsp;большей части если и&nbsp;видят сложности в&nbsp;работе с&nbsp;.NET, то&nbsp;в&nbsp;контексте развития и&nbsp;адаптивности. То&nbsp;есть, суть вопроса не&nbsp;в&nbsp;абсолютной неприменимости или&nbsp;бесперспективности стека, а&nbsp;скорее в&nbsp;векторе его&nbsp;развития.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/1ca65143d6cd4251b86372897b230b3d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            На&nbsp;дотнексте на&nbsp;круглом столе обсуждали эту&nbsp;тему. Вкратце - гуру дотнета из&nbsp;комьюнити недовольны, что&nbsp;майкрософт не&nbsp;слышит (полагаю, на&nbsp;гитхабе) и&nbsp;делают неочевидные решения и&nbsp;поступки. Слышал про&nbsp;некоторый срач про&nbsp;выбор реализации UUIDv7. Меня больше беспокоит, как&nbsp;будет развиваться дотнет и&nbsp;по&nbsp;пути ли&nbsp;мне&nbsp;будет с&nbsp;ним&nbsp;или&nbsp;нет. Например, Aspire - прикольно, но&nbsp;ажур онли. То&nbsp;есть не&nbsp;для&nbsp;меня. По&nbsp;работе не&nbsp;переживаю, на&nbsp;чем&nbsp;только не&nbsp;делают проекты, и&nbsp;куда худшие инструменты используются в&nbsp;проде, скала, привет. Дотнет ❤️
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Мнение респондента
                </cite>
                <p class="blockquote-new__author-position">
                    опыт 5-7 лет
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/3b515197339d4a238f1ff29fc362b37f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Надеюсь, что&nbsp;язык будет адаптивным и&nbsp;не&nbsp;надо переходить на&nbsp;другие языки, чтобы написать более производительный код&nbsp;


    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Мнение респондента, опыт более 7 лет, Ак Барс Диджитал
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/21a6a0b1ffae4165a56f9530d7250385"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9bc5ebc345e341e5af5552b17dcb6bf4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Суммируя все&nbsp;вышеописанные пункты и&nbsp;мнения, можно говорить довольно уверенно о&nbsp;том, что&nbsp;направление, конечно, не&nbsp;умирает. Зарплаты растут, проекты развиваются, разработчики преимущественно положением дел&nbsp;довольны, сообщество живет. Тем, кто&nbsp;думал (ну&nbsp;вдруг) о&nbsp;смене стека, похоже, можно расслабиться: даже в&nbsp;госсекторе продолжается работа над&nbsp;.NET проектами, хотя многим кажется, что&nbsp;после отключения возможности свободно поддерживать доступ к&nbsp;необходимым ресурсам дела идут так&nbsp;себе.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Формализуем процесс создания нового API в микросервисах на .NET
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как устроить синхронное и асинхронное взаимодействие микросервисов в большом ИТ-продукте? Разбираем подходы на примере e-commerce и логистики.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/new-api-creating-process/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/new-api-creating-process/</guid>

                <pubDate>Mon, 12 Jan 2026 04:03:10 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Формализуем процесс создания нового API в микросервисах на .NET</h1>
                                <figure>
                                    <img src="/Media/km2cblne/chatgpt-image-may-7-2025-6.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/02a0c947c9ada6022cb8ea8c53262b24"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--59811382 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--59811382 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8e39a2850fc44ae6922148c7a9d364b8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Мы работаем с&nbsp;ИТ-продуктами в&nbsp;сфере логистики и&nbsp;e-commerce. Большинство таких проектов крупные с&nbsp;точки зрения архитектуры – включают в&nbsp;себя множество сервисов, необходимых для&nbsp;исправной работы целостных систем. </p>
<p>Поговорим о&nbsp;том, как&nbsp;организовать взаимодействие микросервисов в&nbsp;большом продукте-долгожителе синхронно и&nbsp;асинхронно. </p>
<p>Микросервисный подход предполагает создание микросервиса под&nbsp;каждую фичу внутри большого продукта. Например, микросервис, отвечающий отдельную функцию в&nbsp;логистических процессах: </p>
<ul>
<li>складское хранение (сбор/размещение/перемещение товарных единиц)</li>
<li>сортировка грузомест </li>
<li>стикеровка грузомест </li>
<li>консолидация грузомест</li>
<li>прочее</li>
</ul>
<p>Каждый  микросервис имеет собственную кодовую базу, базу данных и&nbsp;API&nbsp;для&nbsp;взаимодействия с&nbsp;другими сервисами. Это&nbsp;позволяет писать их&nbsp;на&nbsp;разных языках программирования и&nbsp;использовать различные технологии. Все&nbsp;новые микросервисы пишутся на&nbsp;новых версиях фреймворков, все&nbsp;старые – постепенно мигрируются. Цель: обеспечить максимально эффективный и&nbsp;стандартизованный подход к&nbsp;обеспечению взаимодействия между микросервисами. Создание нового микросервиса и&nbsp;интеграция его&nbsp;в&nbsp;общую систему должна происходить максимально быстро и&nbsp;безболезненно, как&nbsp;для&nbsp;его&nbsp;разработчика, так&nbsp;и&nbsp;для&nbsp;разработчиков клиентов этого микросервиса.</p>
<h2>Синхронное взаимодействие микросервисов</h2>
<p>Синхронное взаимодействие – это&nbsp;взаимодействие, при&nbsp;котором одна система отправляет сообщение другой и&nbsp;ожидает подтверждения или&nbsp;ответа, прежде чем&nbsp;продолжить. Этот тип&nbsp;взаимодействия является обычным, когда первой запрашивающей системе требуется информация для&nbsp;того, чтобы продолжить выполнять какое-либо свое действие. Для&nbsp;организации такого взаимодействия есть множество протоколов, таких как&nbsp;(g)RPC, SOAP, также широко применяется архитектурный стиль REST.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3096/slide-16_9-101.png"
         alt=""
         itemprop="">


</figure>

<p>На схеме крупными мазками изображен подход к&nbsp;разработке API&nbsp;нового микросервиса. Сначала мы&nbsp;создаем спецификацию API&nbsp;в&nbsp;формате OpenAPI, утверждаем её&nbsp;с&nbsp;отделом архитектуры, а&nbsp;на&nbsp;ее&nbsp;основе создаем библиотеку контрактов, содержащую интерфейсы и&nbsp;структуры данных API&nbsp;. После этого на&nbsp;ее&nbsp;основе можно создавать API&nbsp;и&nbsp;клиентов, которые будут пользоваться этим API. Для&nbsp;разработки клиентов мы&nbsp;применяем библиотеку Refit.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2a11b0a485bfb509d068eacf46b6e35d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--27618561 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--27618561 {
                    /* manual inline */
                    padding: 0px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/b435de0eb2c344388df8804496ce9c27"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--5996484">
    


    <img src="/Media/3097/slide-16_9-102.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--5996484 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6602c8362171821e0c939c708b3bca2b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--55600209 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--55600209 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3f7d37d941664f6993c53bf60a434024"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Вот так&nbsp;выглядит OpenAPI спецификация. В&nbsp;IDE&nbsp;Rider есть плагин, который позволяет ее&nbsp;редактировать и&nbsp;как&nbsp;Swagger генерирует описание спецификации. Тут&nbsp;описаны все&nbsp;методы этого API, структуры запросов и&nbsp;ответов. Когда эта&nbsp;спецификация утверждена, приступаем к&nbsp;разработке библиотеки контрактов. </p>
<h3>Библиотека контрактов</h3>
<p>Библиотека контрактов – это&nbsp;Nuget пакет на&nbsp;основе спецификации. Он&nbsp;содержит:</p>
<ul>
<li>Интерфейсы каждого API&nbsp;контроллера</li>
<li>Интерфейс клиента, который по&nbsp;сути является объединением всех интерфейсов контроллеров</li>
<li>Модели запросов/ответов, используемые в&nbsp;контроллерах</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/308665dcbad70798c89ae04c1624955a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--22867575 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--22867575 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/093076ef4f8840fcb46dc7fb91f97e50"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--64183864">
    


    <img src="/Media/3098/slide-16_9-103.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--64183864 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0;margin-bottom:0;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a6423af2b6870ea3c928164f6f564ed1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--5400852 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--5400852 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fb22927753ee4ed48655fce3eb7285f0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>Например, в&nbsp;одной из&nbsp;библиотек у&nbsp;нас&nbsp;есть два&nbsp;интерфейса - ITaskController и&nbsp;IConsolidationCargoUnitsController. В&nbsp;них&nbsp;определены все&nbsp;необходимые методы, которые в&nbsp;дальнейшем будут реализованы как&nbsp;соответствующими контроллерами, так&nbsp;и&nbsp;клиентами. Поскольку для&nbsp;генерации клиентов мы&nbsp;используем библиотеку Refit, то&nbsp;здесь мы&nbsp;дополнительно определяем типы запросов и&nbsp;их&nbsp;маршруты с&nbsp;помощью атрибутов [Get(...)], [Post(...)] и&nbsp;т.д. Важно заметить, что&nbsp;это&nbsp;не&nbsp;ASP.NET атрибуты, а&nbsp;Refit. Соответственно, наша библиотека контрактов вообще может не&nbsp;иметь зависимости от&nbsp;ASP.NET.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9442e74ba87a5babd06635f940b2aa10"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--44010412 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--44010412 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/60f139c291c844ae9ed2f4dfea5699f5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--45637066">
    


    <img src="/Media/3099/slide-16_9-104.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--45637066 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/786b8930a6f748fea372787e5f5c03d1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--40705918">
    


    <img src="/Media/3100/slide-16_9-105.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--40705918 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f215049ec9cc2cff1e60208b074ef532"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--47587157 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--47587157 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/28af6b21d0dd4738a58591c836fc83ef"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>Далее описываем интерфейс клиента, который не&nbsp;содержит своих методов, а&nbsp;просто наследует все&nbsp;интерфейсы контроллеров, и&nbsp;помечаем его&nbsp;специальным атрибутом, реализующим версионность. Имплементация этого интерфейса (с&nbsp;помощью библиотеки Refit) и&nbsp;будет являться клиентом, которым пользуются внешние системы, чтобы взаимодействовать с&nbsp;ним.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e500a3b66d4319a12d13574c2945fcf0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--26872335 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--26872335 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/6b8e1e78512847649985c25358ab8b47"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--63887000">
    


    <img src="/Media/3101/slide-16_9-106.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--63887000 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9416de128f36a274931b6b2207c1868f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--4508451 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--4508451 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/58c7ce996121494894ec5702caa4f15d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Вот так&nbsp;в&nbsp;итоге выглядит библиотека контрактов: один интерфейс клиента, несколько интерфейсов контроллеров, модели данных. Все&nbsp;это&nbsp;полностью основано на&nbsp;спецификации. По&nbsp;завершении разработки библиотеки контрактов мы&nbsp;публикуем nuget-пакет. Как&nbsp;только пакет опубликован, можно приступать к&nbsp;реализации непосредственно API, а&nbsp;также клиента к&nbsp;этому API. Поскольку спецификация уже&nbsp;утверждена, а&nbsp;библиотека контрактов опубликована, разработку API&nbsp;и&nbsp;клиента можно выполнять параллельно.</p>
<h3>Разработка API</h3>
<p>Вот так&nbsp;выглядит класс API-контроллера, в&nbsp;котором мы&nbsp;реализуем интерфейс контроллера с&nbsp;необходимой бизнес-логикой. Здесь стоит заметить, что&nbsp;используются ASP.NET атрибуты, и&nbsp;это&nbsp;один из&nbsp;недостатков подхода – приходится дублировать маршруты как&nbsp;в&nbsp;библиотеке контрактов, так&nbsp;и&nbsp;в&nbsp;самих контроллерах. Для&nbsp;простых случаев, когда это&nbsp;маршруты без&nbsp;ограничений (например,<span> </span><code>{id}/{sortingCenterId}</code>), их&nbsp;можно вынести в&nbsp;константы и&nbsp;переиспользовать, но&nbsp;когда в&nbsp;маршруты закладываются ограничения (например,<span> </span><code>{id:int}/{sortingCenterId}</code>),а т.к. семантика, заложенная в&nbsp;ASP.NET не&nbsp;поддерживается Refit’ом (и&nbsp;наоборот), то&nbsp;такие маршруты приходится дублировать.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b6463427b0777ca9de07f849e9f4017a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--14561182 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--14561182 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/5aa6f001f6e241dea95212a28a4d2687"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--2591901">
    


    <img src="/Media/3102/slide-16_9-107.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--2591901 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6f2df4d6e0e195796009325b2025da75"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--19436230 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--19436230 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9ab37e6bcdf64d5ba5cfe35842989340"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Разработка клиента</h3>
<p>Клиент для&nbsp;API&nbsp;реализуется с&nbsp;помощью библиотеки<span> </span><a href="https://github.com/reactiveui/refit"><u>Refit</u></a>. Мы&nbsp;написали следующий extension-метод для&nbsp;регистрации API-клиента. В&nbsp;этот метод передаем интерфейс клиента из&nbsp;библиотеки контрактов, а&nbsp;также конфигурационные аргументы, в&nbsp;результате чего в&nbsp;DI&nbsp;контейнере для&nbsp;этого интерфейса регистрируется динамически сгенерированный Refit&#8209;ом&nbsp;класс, содержащий вызовы HTTP-клиента.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/344dfb74e1ea092231e0603bd6ac37cc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--37415826 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--37415826 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/dcbf52a231dd4b1eb020362eff5b8c2b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--40281424">
    


    <img src="/Media/3103/slide-16_9-108.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--40281424 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d31701c9ebf5f6583b1fc32e442104d6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--10755053 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--10755053 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b1e075bea9514c039211ad85bbd5bf5c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Соответственно,  все&nbsp;что&nbsp;нам&nbsp;нужно сделать, это&nbsp;в&nbsp;одну строчку зарегистрировать интерфейс клиента из&nbsp;библиотеки контрактов. Дальше внедряем этот интерфейс с&nbsp;помощью DI&nbsp;в&nbsp;необходимые классы и&nbsp;обращаемся к&nbsp;внешним сервисам. Также, такой подход позволяет легко тестировать код, в&nbsp;котором имеются зависимости от&nbsp;API-клиента. </p>
<h2>Асинхронное взаимодействие микросервисов</h2>
<p>Асинхронное взаимодействие – это&nbsp;взаимодействие, при&nbsp;котором одна система отправляет сообщение другой и&nbsp;продолжает выполнять свою работу, не&nbsp;ожидая подтверждения или&nbsp;ответа. Ответ может быть получен позже через сообщения, или&nbsp;функции обратного вызова (callback). Этот тип&nbsp;взаимодействия является обычным, когда первой запрашивающей системе не&nbsp;требуется информация для&nbsp;того, чтобы продолжить выполнять какое-либо свое действие. </p>
<p>Асинхронная коммуникация микросервисов в&nbsp;нашем случае реализуется через Kafka (брокер сообщений). Здесь мы&nbsp;пишем спецификацию Async API. Это&nbsp;аналогичный стандарт как&nbsp;и&nbsp;OpenAPI, но&nbsp;для&nbsp;описания асинхронного протокола взаимодействия.</p>
<p><img src="/Media/3104/slide-16_9-109.png" alt=""></p>
<p>Принцип похожий. Описываем спецификацию, утверждаем, создаем библиотеку асинхронных контрактов, а&nbsp;дальше пишем producers, которые будут сообщения публиковать в&nbsp;очередь, и&nbsp;consumers, которые будут их&nbsp;читать и&nbsp;принимать в&nbsp;работу.</p>
<p>Спецификация немного другая — описываем не&nbsp;методы, а&nbsp;типы сообщений и&nbsp;каналы. В&nbsp;канал описываем типы сообщений, которые отправляются в&nbsp;соответствующие каналы.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/811b0fe59a0ea1138e5f70ea40432256"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--19372443 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--19372443 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/960c177eb61e450caeaae1e1ae70bb21"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--2335413">
    


    <img src="/Media/3105/slide-16_9-110.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--2335413 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/65af1a0f5492d62870a48105924d55c8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--24407624 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--24407624 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/655e17b749ee471e86075e5e8d4e5c24"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Библиотека Async контрактов</h3>
<p>Библиотека Async контрактов – nuget-пакет на&nbsp;основе спецификации. Внутри содержатся модели сообщений, которые отправляются или&nbsp;читаются в&nbsp;очередь или&nbsp;из&nbsp;нее. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a211d80caba30696d6c8801af27a268d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--145256 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--145256 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/b4e5b6e23d8b4ec2843f9a28793c2fb8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--3090705">
    


    <img src="/Media/3095/slide-16_9-113.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--3090705 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7531da51108a3b2bcfe9e763ccc9cc12"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--23966601 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--23966601 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b405611ff7a04e3a9e39b47cd057a85c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В нашем случае, все&nbsp;сообщения являются событиями. Событие хранит  это&nbsp;обертка для&nbsp;какого&#8209;то&nbsp;объекта данных. Внутри события определяются необходимые параметры.  Например, событие “Поставка создана” помимо информации о&nbsp;самом событии (идентификатор, тип, дата и&nbsp;время) будет содержать информацию о&nbsp;поставке. Получается вот&nbsp;такой процесс: создали библиотеку контрактов, накидали все&nbsp;события, которые предусмотрели спецификацией, и&nbsp;создаем продюсера, который будет генерировать события. </p>
<p>На скрине представлен кусок кода из&nbsp;бизнес-логики, который завершает выполнение таска. Начиная с&nbsp;5 строки открывается транзакция, в&nbsp;рамках которой в&nbsp;БД&nbsp;микросервиса записываются данные, и&nbsp;дальше три&nbsp;строки отвечают за&nbsp;отправку сообщения в&nbsp;очередь.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3c29ccb45c8aaadbbd7bd5070ec68c46"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--52700330 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--52700330 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/67c578edee324a129b88430bfb7fb000"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--45499111">
    


    <img src="/Media/3106/slide-16_9-111.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--45499111 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/d16cc73fbd854eb1b9c120bf457a9c1a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--20702459">
    


    <img src="/Media/3107/slide-16_9-112.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--20702459 {
                    /* manual inline */
                    max-width:1400px;left:300px;margin-top:0px;margin-bottom:0px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3ea630c159ba2d8d99d8bf397e3662db"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--12509968 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--12509968 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/26315b3d5a2f40689ad016c7c8793f32"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>На скрине выше показан консьюмер. Это&nbsp;обработчик, в&nbsp;который приходят все&nbsp;сообщения: в&nbsp;нем&nbsp;есть фильтрация и&nbsp;обычно тут&nbsp;идет обработка бизнес-логики, которая должна срабатывать при&nbsp;получении сообщения.</p>
<p>При появлении нового микросервиса, подход уже&nbsp;отработан, и&nbsp;все&nbsp;процессы создания библиотеки контрактов и&nbsp;процесс работы с&nbsp;Kafka отлажен, поэтому все&nbsp;эффективно и&nbsp;нет&nbsp;разночтений в&nbsp;разработке, все&nbsp;единообразно. </p>
<p>Конечно, описанные в&nbsp;этой статье способы организации взаимодействия микросервисов – не&nbsp;единственно возможные. Например, еще&nbsp;есть gRPC, но&nbsp;это&nbsp;как&nbsp;говорится, уже&nbsp;другая история. Может, расскажем ее&nbsp;в&nbsp;другой статье на&nbsp;примере другого нашего проекта. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    События в .NET: стандартная реализация, альтернативы, и причем тут сахар
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    События в .NET — это способ реагировать на действия в приложении. Что это такое, как с ними работать и зачем нужны обработчики — разбираем в статье.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/events-dotnet/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/events-dotnet/</guid>

                <pubDate>Mon, 12 Jan 2026 04:02:21 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>События в .NET: стандартная реализация, альтернативы, и причем тут сахар</h1>
                                <figure>
                                    <img src="/Media/3147/frame-517.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7c4ba9bee4551b3b7d3d111b5e1b50cf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fec3b474f7634cda89c94a97b98ace9a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>События – это&nbsp;объекты, которые получают уведомления о&nbsp;некотором действии в&nbsp;разрабатываемом ПО&nbsp;и&nbsp;могут запускать реакции на&nbsp;это&nbsp;действие. Разработчик может определить эти&nbsp;действия, добавив к&nbsp;событию обработчик. Разберем в&nbsp;этом материале само понятие событий в&nbsp;.NET и&nbsp;разные способы работы с&nbsp;ними.</p>
<h3>Объясним на&nbsp;сахаре</h3>
<p>Если говорить простым языком, то&nbsp;можно провести аналогию с&nbsp;просыпанным сахаром. Например, у&nbsp;нас&nbsp;в&nbsp;руках была сахарница, и&nbsp;мы&nbsp;сахар из&nbsp;нее&nbsp;рассыпали – это&nbsp;событие. Что&nbsp;делать, если рассыпался сахар? Идти за&nbsp;веником, чтобы убрать – это&nbsp;и&nbsp;есть обработчик события. Этот обработчик с&nbsp;предназначенным для&nbsp;него действием «сидит у&nbsp;нас&nbsp;в&nbsp;голове». Даже если сахар мы&nbsp;никогда не&nbsp;просыпали, мы&nbsp;все&nbsp;равно знаем, что&nbsp;веником его&nbsp;можно будет убрать. </p>
<p>Обработчик может меняться. Например, мы&nbsp;покупаем пылесос – теперь у&nbsp;нас&nbsp;в&nbsp;голове меняется обработчик для&nbsp;того же&nbsp;события: мы&nbsp;пойдем не&nbsp;за&nbsp;веником, а&nbsp;за&nbsp;пылесосом (один обработчик мы&nbsp;удалили, другой добавили). Изменение обработчика не&nbsp;влияет на&nbsp;событие. Обработчика может и&nbsp;не&nbsp;быть вовсе – тогда человек будет просто ходить по&nbsp;просыпанному сахару.</p>
<h3>О событиях в&nbsp;C#</h3>
<p>В C# события существуют с&nbsp;самого начала. Например, при&nbsp;создании элементарного приложения Web&nbsp;Forms, для&nbsp;обработки нажатия на&nbsp;кнопку нужно добавить конструкцию вида</p>
<p> </p>
<pre>
<code class="language-csharp">
MyButton.Click += new&nbsp;EventHandler(this.MyBtn_Click);
</code>
</pre>

<p> </p>
<p><code>Сlick</code><span> </span>– это&nbsp;и&nbsp;есть событие, которое уже&nbsp;было добавлено разработчиками в&nbsp;класс Button, а<span> </span><code>MyBtn_Click</code><span> </span>– это&nbsp;обработчик, написанный программистом. </p>
<p>Сейчас события используются реже, но&nbsp;возможность создавать и&nbsp;использовать их&nbsp;сохранилась. Так&nbsp;как&nbsp;же&nbsp;это&nbsp;устроено изнутри?</p>
<p>Первое, что&nbsp;хочется отметить: такой физической сущности как&nbsp;событие нет. Потому что&nbsp;событие будет являться делегатом, ссылкой на&nbsp;метод, который мы&nbsp;можем определить, а&nbsp;можем и&nbsp;не&nbsp;определить в&nbsp;дальнейшем. То&nbsp;есть по&nbsp;сути существует лишь обработчик события, и&nbsp;это&nbsp;вызывает некоторую путаницу в&nbsp;формулировках.</p>
<p>Основная суть добавления событий – внести возможность различной обработки события для&nbsp;объекта в&nbsp;разных частях программы, а&nbsp;также – возможность добавить обработчик к&nbsp;объекту. Потом можно изменить, добавить новый или&nbsp;убрать текущий обработчик в&nbsp;другом месте при&nbsp;работе с&nbsp;тем&nbsp;же&nbsp;объектом.</p>
<p><strong>В C# события – это&nbsp;отдельный тип&nbsp;членов класса, обозначаемый ключевым словом event. Наряду со&nbsp;свойствами и&nbsp;параметрами</strong>.</p>
<p>Класс, который реализует событие, должен содержать следующую конструкцию:</p>
<pre>
<code class="language-csharp">
event тип_делегата имя_события;
</code>
</pre>

<ul>
<li>тип_делегата указывает на&nbsp;прототип вызываемого метода (или&nbsp;методов);</li>
<li>имя_события – конкретный объект объявляемого события.</li>
</ul>
<p>Добавление обработчика события производится с&nbsp;помощью операции += :</p>
<pre>
<code class="language-csharp">
имя_события += обработчик_события;
</code>
</pre>

<p>Разберем добавление обработки событий на&nbsp;примере логирования. Здесь, и&nbsp;в&nbsp;дальнейшем, мы&nbsp;будем использовать консольное приложение .Net 7.0, C# 11.</p>
<pre>
<code class="language-csharp">
class Program
{
    static void Main()
    {
        EmailService emailService = new&nbsp;EmailService(emailFrom: "hr@disney.com");

        // Добавляем обработчик события
        emailService.MailSent += LogToConsole;

        emailService.SendMail(emailTo: "Milo.Murphy@disney.com", subject: "Welcome to&nbsp;Disney", body: "Today is&nbsp;your first day...");
    }

    // Обработчик, который логирует в&nbsp;консоль отправленное сообщение
    static void LogToConsole(MailSentEventArgs eventArgs)
        => Console.WriteLine(
            $"[Консоль] Письмо с&nbsp;темой '{eventArgs.Subject}' отправлено с&nbsp;адреса '{eventArgs.EmailFrom}' на&nbsp;адрес '{eventArgs.EmailTo}': {eventArgs.Body}");
}

// Класс в&nbsp;котором реализовано событие
class EmailService
{
    private readonly string _emailFrom;

    public EmailService(string emailFrom)
    {
        _emailFrom = emailFrom;
    }

    // Объявляем событие
    public event MailSentEventHandler? MailSent;

    public void SendMail(string emailTo, string subject, string body)
    {
        // Отправляем письмо пользователю...
        // Send(_emailFrom, emailTo, subject, body);

        // Вызываем метод запуска события
        var&nbsp;eventArgs = new&nbsp;MailSentEventArgs
        {
            EmailFrom = _emailFrom,
            EmailTo = emailTo,
            Subject = subject,
            Body = body
        };
        OnMailSent(eventArgs);
    }

    // Используем метод для&nbsp;запуска события
    protected virtual void OnMailSent(MailSentEventArgs eventArgs)
    {
        MailSentEventHandler? mailSentHandler = MailSent;
        if&nbsp;(mailSentHandler != null)
        {
            mailSentHandler(eventArgs);
        }
    }
}

// Объявляем тип&nbsp;события
public delegate void MailSentEventHandler(MailSentEventArgs eventArgs);

public record MailSentEventArgs
{
    public string? EmailFrom { get; init; }
    public string? EmailTo { get; init; }
    public string? Subject { get; init; }
    public string? Body { get; init; }
}
</code>
</pre>

<p>Мы добавили событие<span> </span><code>MailSent</code><span> </span>в класс<span> </span><code>EmailService</code><span> </span>и добавили обработчик этого события<span> </span><code>LogToConsole</code>.</p>
<p>Результат:</p>
<pre>
<code class="language-csharp">
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
</code>
</pre>

<h3>Добавление и&nbsp;удаление обработчиков</h3>
<p>Можно добавить несколько обработчиков, они&nbsp;будут выполняться последовательно. Несколько обработчиков могут понадобиться, например, чтобы записывать одни и&nbsp;те&nbsp;же&nbsp;логи в&nbsp;разные места. </p>
<p>Цепочка обработчиков реализуется через<span> </span><code>Delegate.Combine</code>. То&nbsp;есть физически каждый делегат содержит ссылку на&nbsp;реализацию, внутри которой ссылка на&nbsp;следующую реализацию. Обработчик можно удалить в&nbsp;процессе.</p>
<pre>
<code class="language-csharp">
static void Main()
    {
        EmailService emailService = new&nbsp;EmailService(emailFrom: "hr@disney.com");

        // Добавляем обработчик события
        emailService.MailSent += LogToConsole;
        emailService.MailSent += LogToFile;

        emailService.SendMail(emailTo: "Milo.Murphy@disney.com", subject: "Welcome to&nbsp;Disney", body: "Today is&nbsp;your first day...");

        emailService.MailSent -= LogToFile;
        emailService.SendMail(emailTo: "Milo.Murphy@disney.com", subject: "Welcome to&nbsp;Disney", body: "Today is&nbsp;your first day...");
    }

    // Обработчик, который логирует в&nbsp;консоль отправленное сообщение
    static void LogToConsole(MailSentEventArgs eventArgs)
        => Console.WriteLine(
            $"[Консоль] Письмо с&nbsp;темой '{eventArgs.Subject}' отправлено с&nbsp;адреса '{eventArgs.EmailFrom}' на&nbsp;адрес '{eventArgs.EmailTo}': {eventArgs.Body}");

    // Обработчик, который логирует в&nbsp;файл отправленное сообщение
    static void LogToFile(MailSentEventArgs eventArgs)
        => Console.WriteLine(
            $"[Файл] Письмо с&nbsp;темой '{eventArgs.Subject}' отправлено с&nbsp;адреса '{eventArgs.EmailFrom}' на&nbsp;адрес '{eventArgs.EmailTo}': {eventArgs.Body}");
</code>
</pre>

<p><span>Результат:</span></p>
<pre>
<code class="language-csharp">
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
[Файл] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
</code>
</pre>

<p><span>Если нужно выполнить какие&#8209;то&nbsp;действия при&nbsp;добавлении или&nbsp;удалении обработчика, можно переписать функции <code>add/remove</code> у&nbsp;делегата. Мы&nbsp;добавим логирование к&nbsp;действиям добавления/удаления обработчика.</span></p>
<pre>
<code class="language-csharp">
private MailSentEventHandler? mailSent;
	public event MailSentEventHandler MailSent
{
		add&nbsp;
		{
			mailSent += value;
			Console.WriteLine($"Обработчик {value.Method.Name} добавлен");
		}
		remove
		{
			Console.WriteLine($"Обработчик {value.Method.Name} удален");
			mailSent -= value;
		}
	}
</code>
</pre>

<p>Результат:</p>
<pre>
<code class="language-csharp">
Обработчик LogToConsole добавлен
Обработчик LogToFile добавлен
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
[Файл] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
Обработчик LogToFile удален
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day..
</code>
</pre>

<p><span>Если в&nbsp;обработчике произойдет ошибка – ошибка будет на&nbsp;уровне приложения. Если добавить </span><code>try catch</code><span> при&nbsp;вызове обработчика, то&nbsp;в&nbsp;случае, если произойдет ошибка в&nbsp;первом обработчике, последующие обработчики выполняться не&nbsp;будут. Поэтому следует предусмотреть это&nbsp;в&nbsp;каждом обработчике.</span></p>
<pre>
<code class="language-csharp">
static void LogToConsole(MailSentEventArgs eventArgs)
	{
		try&nbsp;
		{
			throw new&nbsp;Exception("Ошибка записи");
		}
		catch (Exception e)
		{
			Console.WriteLine(e);
		}
	}
</code>
</pre>

<h3>EventHandler</h3>
<p>В .NET существует делегат EventHandler, предназначенный как&nbsp;раз&nbsp;для&nbsp;объявления события и&nbsp;принимающий определенный тип&nbsp;входных параметров.</p>
<p>Классы, которые мы&nbsp;собираемся использовать для&nbsp;хранения информации, передаваемой обработчику события, должны наследоваться от&nbsp;типа System.EventArgs. При&nbsp;этом имя&nbsp;типа желательно заканчивать словом EventArgs.</p>
<p>Начиная с&nbsp;.NET Framework 4.5 наследованиe аргументов от&nbsp;System.EventArgs стало не&nbsp;обязательным, но&nbsp;в&nbsp;примере мы&nbsp;его&nbsp;оставим, это&nbsp;никак не&nbsp;повлияет на&nbsp;результат.</p>
<p>Создадим тип&nbsp;параметров, используемых обработчиками:</p>
<pre>
<code class="language-csharp">
public class MailSentEventArgs : EventArgs
{
	public string? EmailFrom { get; init; }
	public string? EmailTo { get; init; }
	public string? Subject { get; init; }
	public string? Body { get; init; }
}
</code>
</pre>

<p><span>И тогда событие может быть объявлено как</span></p>
<pre>
<code class="language-csharp">
public event EventHandler<MailSentEventArgs>? MailSent;
</code>
</pre>

<p>При этом обработчик должен принимать параметры<span> </span><strong>object sender</strong><span> </span>и<span> </span><strong>MailSentEventArgs args</strong>. Где<span> </span><code>sender</code><span> </span>– текущий элемент класса, в&nbsp;котором определен event, a<span> </span><code>args</code><span> </span>– передаваемые обработчику данные. Обработчик может быть использован для&nbsp;событий в&nbsp;разных классах, поэтому разумнее принимать экземпляр типа<span> </span><code>object</code>, а&nbsp;не&nbsp;конкретного типа. Так&nbsp;как&nbsp;в&nbsp;этом случае в&nbsp;метод обработчика могут приходить данные от&nbsp;разных событий, но&nbsp;с&nbsp;одинаковыми параметрами.</p>
<p>То есть обработчики будут выглядеть так:</p>
<pre>
<code class="language-csharp">
public static void LogToConsole(object? sender, MailSentEventArgs args)
        => Console.WriteLine(
            $"[Консоль] Письмо с&nbsp;темой '{args.Subject}' отправлено с&nbsp;адреса '{args.EmailFrom}' на&nbsp;адрес '{args.EmailTo}': {args.Body}");

 
    	public static void LogToFile(object? sender, MailSentEventArgs args)
        => Console.WriteLine(
            $"[Файл] Письмо с&nbsp;темой '{args.Subject}' отправлено с&nbsp;адреса '{args.EmailFrom}' на&nbsp;адрес '{args.EmailTo}': {args.Body}")
</code>
</pre>

<p><span>А вызов, поскольку событие представляет собой делегат, например, так:</span></p>
<pre>
<code class="language-csharp">
MailSent?.Invoke(this, eventArgs);
</code>
</pre>

<p><span>Порой необходимо передать внутрь функции какие&#8209;то&nbsp;данные, а&nbsp;порой действие будет выполняться независимо от&nbsp;внешних данных – тогда передавать внутрь функции ничего не&nbsp;нужно. В&nbsp;случаях, когда не&nbsp;нужно передавать в&nbsp;обработчик никаких данных, мы&nbsp;можем воспользоваться EventArgs.Empty.  То&nbsp;есть объявление события не&nbsp;будет указывать тип&nbsp;аргумента:</span></p>
<pre>
<code class="language-csharp">
public event EventHandler? MailSent;
</code>
</pre>

<p><span>Обработчик при&nbsp;этом должен принимать <code>object sender</code> и&nbsp; <code>EventArgs</code>:</span></p>
<pre>
<code class="language-csharp">
static void LogToConsole(object? sender, EventArgs eventArgs)
	=> Console.WriteLine("[Консоль] Отправлено письмо");
</code>
</pre>

<p><span>а вызов будет выглядеть так:</span></p>
<pre>
<code class="language-csharp">
MailSent?.Invoke(this, EventArgs.Empty);
</code>
</pre>

<h3>AsyncEventHandler</h3>
<p>Обработка делегатов может быть асинхронной. С&nbsp;ее&nbsp;помощью получается лучше распределить ресурсы компьютера и&nbsp;потоки обработки данных – это&nbsp;полезно в&nbsp;случаях, когда операция находится в&nbsp;режиме ожидания достаточно длительное время и&nbsp;мы&nbsp;выигрываем в&nbsp;скорости от&nbsp;перераспределения потоков.</p>
<p>Подключив к&nbsp;проекту<span> </span><code>Microsoft.VisualStudio.Threading</code>, получаем возможность сделать обработку делегатов асинхронной.</p>
<p>Тогда объявлять событие мы&nbsp;будем так:</p>
<pre>
<code class="language-csharp">
public event AsyncEventHandler<MailSentEventArgs>? MailSent;
</code>
</pre>

<p>Обработчик будет выглядеть так:</p>
<pre>
<code class="language-csharp">
static Task LogToConsoleAsync(object? sender, MailSentEventArgs args)
	{
		Console.WriteLine(
			$"[Консоль] Письмо с&nbsp;темой '{args.Subject}' отправлено с&nbsp;адреса '{args.EmailFrom}' на&nbsp;адрес '{args.EmailTo}': {args.Body}");
		return Task.CompletedTask;
	}
</code>
</pre>

<p><span>а вызываться так:</span></p>
<pre>
<code class="language-csharp">
await MailSent?.InvokeAsync(this, new&nbsp;MailSentEventArgs());
</code>
</pre>

<h3>Реализация событий компилятором</h3>
<p>Несколько слов о&nbsp;представлении событий в&nbsp;IL-кодe. При&nbsp;компиляции кроме объявления события также создаются два&nbsp;метода add&nbsp;и&nbsp;remove: они&nbsp;реализуют конструкции += и&nbsp;–=.  </p>
<p>Для наглядности можно скомпилировать и&nbsp;декомпилировать обратно наш&nbsp;код. Тогда станет видно, что&nbsp;добавляет компилятор. Прогнав таким образом наш&nbsp;первоначальный код<span> </span><a href="https://sharplab.io/#v2:CYLg1APgAgTABFAjAdgLACgDeG64YgNgQBY4BZAQwEsA7ACgEoc9t0924BRAW2oBsAygFMATgDcqAYyFwhvKoNETpcALxwaQgO5d5i8VKF05/AGIiA9txBwARAAsRUKMCoBnTQE8AdJKu2GAG4MZg44AHpwuEAUEEA+EEBGEEAGEEAmEEBuEEB5EEBWEEAeEDgEwAEQRPjYwCEQQHEQQA4QQC4QOEBBEATAaRASivTQjhMFYQNpb0pOoRoAFzgwdQAZCwBzABULAGELGjcLPiFg9Db2Dv1lIW9hGmA+vmM9WZtbMgULXoBXEQAHe09nVw8hHz9uWwAaODdbgAjABWQkkgwuAHUhHwvjJBhY4AARdxeX5wQEWYCeC6zYAUTxwdxwTwWe5wABmVBEbmG+J83m8AXW7AAviE2HhInBAHgg8UKxXK1T+VVKsXyDUAnCBwVKxQDMIBV8oBhEEyJTgyTgosAvCD1VKAGRA8iVAPwghTSmS1WtimTqsQSgEkQc0VTJtJBEKCkCYzeaLZarOjHA6DThiAaDACCIkmblkIaGEajTE5uFYYVwUGQLLw7PQ2Yw3MAWCCpRK1WrqzVi/KxXL5TKJVIVQDsILFkolLTb4k0nRhYLp+F1dhgU3gHiIqGIKIMZCIhBRgIs+ISkAAGOAAfW25is6xdAGZe/1ukZl7I9JvuIn2EOwuvT5ZuGoT2Y75ncLmkxEonzAFIg6TSWVy9Qds0zrvlAe5CLGwwBqGwahgAEhQhyrCIAD85B9qG26gXu7pwAcRz8HQx7bLMfzHgCIJgoMZGICumLYheLCbFyn7GqaGQ5HARoVLUerZLEXGxPqTYtiUmSpIAciCMt4zG4Ny+F0DeT5WH8JEWH8FGguCfzcEIbhuBQkxCEEHKph+cCAEggDQNg0LacdkqqxIALCBwA2iRGkqtRVIk7adq077sOOIgxqG8bRuomg6NBQywXGkZuLJcBXmZ+58GeD5KQoZ4/Il7A8PwswPmpOUBamAhAlpwzqJpVElSleAAEJYoS6j0Z4iWsi+HAAPI0NFgzGJBYUme+b7sNygAYILURpCXqDYqrkDklM5cBORkrnuZ53m+c0/nsCOFiTuCQjAHAEgiIMtwUHwJBwL1/X+hhMVDfFIVxQmbTJew/WxYMCFIaIaF6IG/3AMhD79V17BUBScB0MD8GIWDohwAAhBFtx8HwjFhF9qYI0MoPIYNoXxSNZnZmyGBvty36/hxuTNEaO0tN2e7ADCQiTBOMi4T9kFE6Ij39M9pNRm94Zk1hYFwNOfgiKd/NiwlWC7vgK75Vld5JXARmDIERI0FQ+twGNeAy8emt8IVmC60IJu0MbBtm2mOG0XhFVUTresG47Jsuwgbsrk12Le/bvtG/71NAA"><u>здесь</u></a><span> </span>мы получим следующий код&nbsp;в&nbsp;месте создания события.</p>
<pre>
<code class="language-csharp">
public event MailSentEventHandler MailSent
{
    [NullableContext(2)]
    [CompilerGenerated]
    add&nbsp;
    {
        MailSentEventHandler mailSentEventHandler = this.MailSent;
        while (true)
        {
            // берем текущий делегат
            MailSentEventHandler mailSentEventHandler2 = mailSentEventHandler;

            // добавляем к&nbsp;текущему делегату новый
            MailSentEventHandler value2 = (MailSentEventHandler)Delegate
                                         .Combine(mailSentEventHandler2, value);

            // сравниваем MailSent и&nbsp;mailSentEventHandler2
            // и, если они&nbsp;равны, заменяем MailSent на&nbsp;value2
            // а&nbsp;в&nbsp;mailSentEventHandler записываем исходное значение MailSent
            mailSentEventHandler = Interlocked
             .CompareExchange(ref this.MailSent, value2, mailSentEventHandler2);

            // если предыдущая операция выполнилась успешно - заканчиваем
            // это&nbsp;нужно для&nbsp;безопасной многопоточной работы - если в&nbsp;
           // параллельном потоке у&nbsp;события изменится список делегатов, 
           // то&nbsp;while запустится повторно и&nbsp;добавит новый делегат к&nbsp;уже&nbsp;
           // обновленной цепочке делегатов
            if&nbsp;((object)mailSentEventHandler == mailSentEventHandler2)
            {
                break;
            }
        }
    }
    [NullableContext(2)]
    [CompilerGenerated]
    remove
    {
        MailSentEventHandler mailSentEventHandler = this.MailSent;
        while (true)
        {
            // берем текущий делегат
            MailSentEventHandler mailSentEventHandler2 = mailSentEventHandler;

            // удаляем из&nbsp;него value
            MailSentEventHandler value2 = (MailSentEventHandler)Delegate
                                          .Remove(mailSentEventHandler2, value);

            // сравниваем MailSent и&nbsp;mailSentEventHandler2
            // и, если они&nbsp;равны, заменяем MailSent на&nbsp;value2
            // а&nbsp;в&nbsp;mailSentEventHandler записываем исходное значение MailSent            
            mailSentEventHandler = Interlocked
             .CompareExchange(ref this.MailSent, value2, mailSentEventHandler2);

            // если предыдущая операция выполнилась успешно - заканчиваем
            if&nbsp;((object)mailSentEventHandler == mailSentEventHandler2)
            {
                break;
            }
        }
    }
}
</code>
</pre>

<h2>Паттерн «Наблюдатель»</h2>
<p>Реализация событий укладывается в&nbsp;паттерн «Наблюдатель», суть которого в&nbsp;наличии одного наблюдаемого объекта и&nbsp;нескольких наблюдателей. Если возвращаться к&nbsp;аналогии с&nbsp;сахаром, в&nbsp;рамках паттерна сахарница будет наблюдаемым объектом, а&nbsp;человек, который рассыпал сахар или&nbsp;просто находился рядом – наблюдателем. Наблюдателей может быть больше одного (кто&#8209;то&nbsp;с&nbsp;веником, а&nbsp;кто&#8209;то&nbsp;с&nbsp;пылесосом). Далее, когда рассыпается сахар, сначала один наблюдатель делает свои действия, а&nbsp;другой следом – свои.</p>
<p>Паттерн «Наблюдатель» можно реализовать через добавления наблюдателей как&nbsp;реализаций делегата, а&nbsp;можно – через добавление наблюдателей в&nbsp;список, хранящийся в&nbsp;наблюдаемом объекте.</p>
<p>Ниже приведен пример реализации этого паттерна без&nbsp;использования событий.</p>
<pre>
<code class="language-csharp">
class Program
{
    static void Main()
    {
        EmailService emailService = new&nbsp;EmailService("hr@disney.com");

        // Добавляем обработчик события
        var&nbsp;consoleObserver = new&nbsp;ConsoleObserver(emailService);
        var&nbsp;fileObserver = new&nbsp;FileObserver(emailService);

        emailService.SendMail(
            emailTo: "Milo.Murphy@disney.com",
            subject: "Welcome to&nbsp;Disney",
            body: "Today is&nbsp;your first day...");

        fileObserver.StopObserve();

        emailService.SendMail(
            emailTo: "Milo.Murphy@disney.com",
            subject: "Welcome to&nbsp;Disney",
            body: "Today is&nbsp;your first day...");
    }
}

interface IObserver
{
    void Update(string emailFrom, string emailTo, string subject, string body);
}

interface IObservable
{
    void RegisterObserver(IObserver o);
    void RemoveObserver(IObserver o);
}

class EmailService : IObservable
{
    private readonly List<IObserver> _observers;
    private readonly string _emailFrom;

    public EmailService(string emailFrom)
    {
        _emailFrom = emailFrom;
        _observers = new&nbsp;List<IObserver>();
    }

    public void RegisterObserver(IObserver o)
    {
        _observers.Add(o);
    }

    public void RemoveObserver(IObserver o)
    {
        _observers.Remove(o);
    }

    protected void MailSent(string emailTo, string subject, string body)
    {
        foreach (IObserver o&nbsp;in&nbsp;_observers)
        {
            o.Update(_emailFrom, emailTo, subject, body);
        }
    }

    public void SendMail(string emailTo, string subject, string body)
    {
        // Отправить письмо пользователю
        //Send(_emailFrom, emailTo, subject, body);

        // Запускаем методы наблюдателей
        MailSent(emailTo, subject, body);
    }
}

class ConsoleObserver : IObserver
{
    IObservable? _stock;
    public ConsoleObserver(IObservable obs)
    {
        _stock = obs;
        _stock.RegisterObserver(this);
    }
    public void Update(
        string emailFrom,
        string emailTo,
        string subject,
        string body)
    {
        Console.WriteLine($"[Консоль] Письмо с&nbsp;темой '{subject}' отправлено с&nbsp;адреса '{emailFrom}' на&nbsp;адрес '{emailTo}': {body}");
    }

    public void StopObserve()
    {
        if&nbsp;(_stock is&nbsp;null)
        {
            return;
        }
        _stock.RemoveObserver(this);
        _stock = null;
    }
}

class FileObserver : IObserver
{
    IObservable? _stock;
    public FileObserver(IObservable obs)
    {
        _stock = obs;
        _stock.RegisterObserver(this);
    }

    public void Update(
        string emailFrom,
        string emailTo,
        string subject,
        string body)
    {
        Console.WriteLine($"[Файл] Письмо с&nbsp;темой '{subject}' отправлено с&nbsp;адреса '{emailFrom}' на&nbsp;адрес '{emailTo}': {body}");
    }

    public void StopObserve()
    {
        if&nbsp;(_stock is&nbsp;null)
        {
            return;
        }
        _stock.RemoveObserver(this);
        _stock = null;
    }
}
</code>
</pre>

<p>Результат:</p>
<pre>
<code class="language-csharp">
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
[Файл] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
</code>
</pre>

<h3>Минусы и&nbsp;плюсы такой реализации паттерна «Наблюдатель»</h3>
<h4>Минусы</h4>
<ul>
<li>в этой реализации нам&nbsp;пришлось самим писать интерфейсы, а&nbsp;для&nbsp;событий есть прописанные интерфейсы и&nbsp;классы, которыми остается только воспользоваться;</li>
<li>более высокий порог вхождения – нужно разобраться с&nbsp;работой паттерна;</li>
<li>под каждое событие придется писать свой набор интерфейсов из&#8209;за&nbsp;различий данных события, передаваемых в&nbsp;метод IObserver.Update (либо аналогично событиям использовать тип&nbsp;object, но&nbsp;тогда теряется наглядность);</li>
<li>при этом код&nbsp;стал более отлаживаемым – весь код&nbsp;доступен для&nbsp;редактирования, и&nbsp;более прозрачным – можно пройтись по&nbsp;реализации и&nbsp;в&nbsp;точности посмотреть работу (в&nbsp;событиях, например, не&nbsp;очевидно, что&nbsp;будет, если случится эксепшен в&nbsp;одном из&nbsp;цепочки делегатов).</li>
</ul>
<h4>Плюсы</h4>
<ul>
<li>подобную реализацию можно использовать также в&nbsp;языках, где&nbsp;нет&nbsp;делегатов – например, С++;</li>
<li>можно обеспечить распараллеливание реакции наблюдателей;</li>
<li>можно отловить случившийся эксепшн в&nbsp;цепочке и&nbsp;обработать в&nbsp;зависимости от&nbsp;логики задачи;</li>
<li>точные контракты: есть конкретные методы с&nbsp;конкретным набором параметров под&nbsp;нужное событие, а&nbsp;не&nbsp;набор параметров вида "<code>object sender</code>, EventArgs e".</li>
</ul>
<h2>MediatR</h2>
<p>В библиотеке<span> </span><a href="https://www.nuget.org/packages/MediatR/"><u>MediatR</u></a><span> </span>из коробки есть своя реализация событий. Это&nbsp;не&nbsp;существующие в&nbsp;C# события, но&nbsp;есть некоторое сходство.<br><br>Как следует из&nbsp;названия, MediatR – это&nbsp;реализация паттерна «Посредник». Суть паттерна в&nbsp;создании прослойки между частями кода. Это&nbsp;нужно в&nbsp;случае наличия большого количества связей между объектами – есть вероятность запутать логику реализации. </p>
<p>«Посредник» ограничивает объекты от&nbsp;явных ссылок друг на&nbsp;друга, уменьшая количество взаимосвязей. Основной принцип реализации в&nbsp;том, что&nbsp;мы&nbsp;создаем объект и&nbsp;можем добавить обработчики для&nbsp;него. При&nbsp;этом достаточно использовать у&nbsp;типа отправляемого объекта интерфейс<span> </span><code>IRequest</code>  или<span> </span><code>INotification</code><span> </span>и указать у&nbsp;обработчика интерфейс, связанный с&nbsp;типом объекта. Тогда MediatR вызовет нужный обработчик при&nbsp;выполнении команды<span> </span><code>Send</code><span> </span>для интерфейса<span> </span><code>IRequest</code><span> </span>и<span> </span><code>Publish</code><span> </span>для интерфейса<span> </span><code>INotification</code>, в&nbsp;который будет передан объект.</p>
<p>Обычно при&nbsp;работе с&nbsp;библиотекой MediatR используются интерфейсы<span> </span><code>IRequest</code><span> </span>и<span> </span><code>IRequestHandler</code>. Тип, используемый медиатором, должен быть унаследован от<span> </span><code>IRequest&lt;TResponse&gt;</code>, где<span> </span><code>TResponse</code><span> </span>– результат обработки запроса, а&nbsp;обработчик должен поддерживать интерфейс<span> </span><code>IRequestHandler&lt;TRequest</code>,<span> </span><code>TResponse&gt;</code>, где<span> </span><code>TRequest</code><span> </span>– созданный нами тип&nbsp;с&nbsp;интерфейсом<span> </span><code>IRequest</code>. Но&nbsp;нужно помнить, что&nbsp;обработчик здесь может быть только один.</p>
<p>Для случая множества обработчиков в&nbsp;MediatR был&nbsp;создан интерфейс<span> </span><code>INotification</code>. И, соответственно, обработчики должны поддерживать интерфейс<span> </span><code>INotificationHandler&lt;TRequest&gt;</code>.</p>
<p>Рассмотрим пример (необходимо установить nuget-пакет<span> </span><a href="https://www.nuget.org/packages/MediatR/"><u>MediatR</u></a><span> </span>и nuget-пакет<span> </span><a href="https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection/"><u>Microsoft.Extensions.DependencyInjection</u></a>):</p>
<pre>
<code class="language-csharp">
using System.Reflection;
using MediatR;
using Microsoft.Extensions.DependencyInjection;

class Program
{
    static async Task Main()
    {
        var&nbsp;serviceCollection = new&nbsp;ServiceCollection()
            .AddMediatR(cfg =>
         cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()))
            .BuildServiceProvider();

        var&nbsp;mediator = serviceCollection.GetRequiredService<IMediator>();
        EmailService emailService = new&nbsp;EmailService(mediator, "hr@disney.com");

        await emailService.SendMailToUserAsync(
            emailTo: "Milo.Murphy@disney.com",
            subject: "Welcome to&nbsp;Disney",
            body: "Today is&nbsp;your first day...");
    }
}

class MailSentRequest : INotification
{
    public string? EmailFrom { get; init; }
    public string? EmailTo { get; init; }
    public string? Subject { get; init; }
    public string? Body { get; init; }
}

class ConsoleHandler : INotificationHandler<MailSentRequest>
{
    public Task Handle(
        MailSentRequest request,
        CancellationToken cancellationToken)
	{
		Console.WriteLine(
			$"[Консоль] Письмо с&nbsp;темой '{request.Subject}' отправлено с&nbsp;адреса '{request.EmailFrom}' на&nbsp;адрес '{request.EmailTo}': {request.Body}");
		return Task.CompletedTask;
	}
}

class FileHandler : INotificationHandler<MailSentRequest>
{
    public Task Handle(
        MailSentRequest request,
        CancellationToken cancellationToken)
	{
		Console.WriteLine(
			$"[Файл] Письмо с&nbsp;темой '{request.Subject}' отправлено с&nbsp;адреса '{request.EmailFrom}' на&nbsp;адрес '{request.EmailTo}': {request.Body}");
		return Task.CompletedTask;
	}
}

class EmailService
{
    private readonly string _emailFrom;
    private readonly IMediator _mediator;

    public EmailService(IMediator mediator, string emailFrom)
    {
        _mediator = mediator;
        _emailFrom = emailFrom;
    }

    public async Task SendMailToUserAsync(
        string emailTo,
        string subject,
        string body)
    {
        // Отправить письмо пользователю
        //Send(_emailFrom, emailTo, subject, body);
        // Вызываем метод запуска события
        await MailSentAsync(_emailFrom, emailTo, subject, body);
    }

    protected async Task MailSentAsync(string emailFrom, string emailTo, string subject, string body)
    {
        var&nbsp;request = new&nbsp;MailSentRequest
        {
            EmailFrom = emailFrom,
            EmailTo = emailTo,
            Subject = subject,
            Body = body
        };
        await _mediator.Publish(request);
    }
}
</code>
</pre>

<p>Результат:</p>
<pre>
<code class="language-csharp">
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
[Файл] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
</code>
</pre>

<h3>Плюсы и&nbsp;минусы использования MediatR:</h3>
<h4>Плюс</h4>
<ul>
<li>использование MediatR уменьшает количество зависимостей, что&nbsp;будет плюсом при&nbsp;большом количестве объектов и&nbsp;связей между ними.</li>
</ul>
<h4>Минусы</h4>
<ul>
<li>классы хэндлеров помечаются не&nbsp;используемыми (это&nbsp;можно исправить, навесив атрибут [<code>UsedImplicitly]</code>);</li>
<li>нельзя «по щелчку» перейти к&nbsp;реализации;</li>
<li>не всегда очевидно, какие хэндлеры будут вызваны при&nbsp;вызове медиатора;</li>
<li>не получится во&nbsp;время выполнения программы добавить/удалить обработчик;</li>
<li>невозможно (или&nbsp;сложно) установить четкий порядок вызова обработчика. Он&nbsp;больше подходит для&nbsp;вызова независимых друг от&nbsp;друга обработчиков.</li>
</ul>
<p>Есть способ обойти второй минус из&nbsp;перечисленных. Нужно реализацию запроса и&nbsp;обработчик поместить в&nbsp;один partial-класс:</p>
<pre>
<code class="language-csharp">
public partial class MailSent
{
  public class Request : INotification
  {
	public string? EmailFrom { get; init; }
	public string? EmailTo { get; init; }
	public string? Subject { get; init; }
	public string? Body { get; init; }
  }
}

public partial class MailSent
{
  public class ConsoleHandler : INotificationHandler<Request>
  {
    public Task Handle(
		Request request,
		CancellationToken cancellationToken)
	{
		Console.WriteLine(
			$"[Консоль] Письмо с&nbsp;темой '{request.Subject}' отправлено с&nbsp;адреса '{request.EmailFrom}' на&nbsp;адрес '{request.EmailTo}': {request.Body}");
		return Task.CompletedTask;
	}
  }
}

public partial class MailSent
{
  public class FileHandler : INotificationHandler<Request>
  {
    public Task Handle(
		Request request,
		CancellationToken cancellationToken)
	{
		Console.WriteLine(
			$"[Файл] Письмо с&nbsp;темой '{request.Subject}' отправлено с&nbsp;адреса '{request.EmailFrom}' на&nbsp;адрес '{request.EmailTo}': {request.Body}");
		return Task.CompletedTask;
	}
  }
}
</code>
</pre>

<p><span>тогда при&nbsp;создании запроса нужно указывать оба&nbsp;класса:</span></p>
<pre>
<code class="language-csharp">
protected async Task MailSentAsync(
		string emailFrom,
		string emailTo,
		string subject,
		string body)
	{
		var&nbsp;request = new&nbsp;MailSent.Request
		{
			EmailFrom = emailFrom,
			EmailTo = emailTo,
			Subject = subject,
			Body = body
		};
		await _mediator.Publish(request);
	}
</code>
</pre>

<p>При попытке перейти «по щелчку» к&nbsp;классу<span> </span><code>MailSent</code><span> </span>нам будет предложен выбор перейти к&nbsp;запросу или&nbsp;к&nbsp;реализации.</p>
<h3>Дополнительные возможности</h3>
<p>В MediatR есть удобная реализация поведения конвейера (pipeline behavior). Для&nbsp;этого используется интерфейс<span> </span><code>IPipelineBehavior&lt;TRequest, TResponse&gt;</code>.</p>
<pre>
<code class="language-csharp">
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(MailSentBehavior<,>));
 
 
class MailSentBehavior<TRequest, TResponse> 
    : IPipelineBehavior<TRequest, TResponse> 
{
      	public async Task<TResponse> Handle(
            TRequest request,
            RequestHandlerDelegate<TResponse> next,
            CancellationToken cancellationToken)
      	{
            	try&nbsp;
            	{
                  	Console.WriteLine($"Перед запуском {typeof(TRequest).Name}");
                  	return await next();
            	}
            	finally
            	{
                  	Console.WriteLine($"После запуска {typeof(TRequest).Name}");
            	}
    	}
  }
</code>
</pre>

<p>Так, можно добавить какую&#8209;то&nbsp;обработку для&nbsp;каждого вызова Handle из&nbsp;классов унаследованных от<span> </span><code>IRequestHandler</code>. Например, логирование, на&nbsp;примере которого мы&nbsp;рассматривали реализацию обработки событий.</p>
<p>К сожалению, мы&nbsp;можем использовать<span> </span><code>PipelineBehavior</code><span> </span>только для&nbsp; <span> </span><code>IRequest</code><span> </span>и не&nbsp;можем для<span> </span><code>INotification</code>.</p>
<p>Чтобы реализовать подобную функциональность для&nbsp;событий нужно переопределить<span> </span><code>NotificationPublisher</code>.</p>
<pre>
<code class="language-csharp">
class Program
{
    static async Task Main()
    {
        var&nbsp;serviceCollection = new&nbsp;ServiceCollection()
            .AddMediatR(config =>
        {
           config.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
           config.NotificationPublisher = new&nbsp;MailSentPublisher();
           config.NotificationPublisherType = typeof(MailSentPublisher);
        })
            .BuildServiceProvider();

        var&nbsp;mediator = serviceCollection.GetRequiredService<IMediator>();
        EmailService emailService = 
               new&nbsp;EmailService(mediator: mediator, emailFrom: "hr@disney.com");

        await emailService.SendMailToUserAsync(
			emailTo: "Milo.Murphy@disney.com",
			subject: "Welcome to&nbsp;Disney",
			body: "Today is&nbsp;your first day...");
    }
}

class MailSentPublisher : INotificationPublisher
{
    public async Task Publish(
		IEnumerable<NotificationHandlerExecutor> handlerExecutors,
		INotification notification,
		CancellationToken cancellationToken)
    {
        foreach (var&nbsp;handler in&nbsp;handlerExecutors)
        {
            try&nbsp;
            {
                Console.WriteLine(
			$"Перед запуском {handler.HandlerInstance.GetType().Name}");
                await handler.HandlerCallback(notification, cancellationToken)
					.ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Console.WriteLine($"Произошла ошибка {e.Message}");
            }
            finally
            {
                Console.WriteLine(
			$"После запуска {handler.HandlerInstance.GetType().Name}");
            }
        }
    }
}
</code>
</pre>

<p>Результат:</p>
<pre>
<code class="language-csharp">
Перед запуском ConsoleHandler
[Консоль] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
После запуска ConsoleHandler
Перед запуском FileHandler
[Файл] Письмо с&nbsp;темой 'Welcome to&nbsp;Disney' отправлено с&nbsp;адреса 'hr@disney.com' на&nbsp;адрес 'Milo.Murphy@disney.com': Today is&nbsp;your first day...
После запуска FileHandler
</code>
</pre>

<p>Так, мы&nbsp;добавили некую обработку до&nbsp;и&nbsp;после запуска каждого обработчика события, а&nbsp;еще&nbsp;обеспечили выполнение следующих, даже если в&nbsp;предыдущем возникла ошибка.</p>
<h2>Вместо заключения</h2>
<p>Мы рассмотрели несколько вариантов реализации обработчиков Событий: с&nbsp;помощью стандартных средств C#, с&nbsp;помощью средств библиотеки MediatR и&nbsp;написали самостоятельно, реализовав паттерн Наблюдатель. В&nbsp;разных ситуациях может быть удобно использовать разные варианты, но&nbsp;полезно знать и&nbsp;об&nbsp;альтернативных возможностях.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Типы или интерфейсы в TypeScript: что и когда использовать
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Типы или интерфейсы в TypeScript? Разбираемся, в чём разница, когда что использовать и как выбрать лучший вариант под реальные задачи.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/types-or-interfaces-in-typescript/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/types-or-interfaces-in-typescript/</guid>

                <pubDate>Mon, 12 Jan 2026 04:01:17 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Типы или интерфейсы в TypeScript: что и когда использовать</h1>
                                <figure>
                                    <img src="/Media/2888/frame-240.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b55c1798b25b4e82ad36a9996a6ae7a0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0c6f72e995b04dc6910753aab2057fa1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><em>Меня зовут Дима. Я&nbsp;Frontend разработчик в&nbsp;компании fuse8. Работая с&nbsp;TypeScript, рано или&nbsp;поздно сталкиваешься с&nbsp;вопросом:&nbsp;<strong>что выбрать — типы или&nbsp;интерфейсы?</strong>&nbsp;В нашей команде мы&nbsp;активно используем TypeScript, уделяя особое внимание типам. В&nbsp;статье я&nbsp;хотел бы&nbsp;поделиться особенностями работы с&nbsp;типами и&nbsp;интерфейсами, которые могут быть полезны в&nbsp;вашей практике.</em></p>
<h2>Основные отличия типов и&nbsp;интерфейсов</h2>
<p><strong>Типы</strong>&nbsp;используются для&nbsp;задания именованных типов данных, включая примитивы, объекты, функции и&nbsp;массивы. Они&nbsp;позволяют объединять или&nbsp;пересекать типы и&nbsp;поддерживают использование ключевых слов typeof, keyof при&nbsp;присвоении.</p>
<p><strong>Интерфейсы</strong>&nbsp;служат для&nbsp;описания структуры объектов. Интерфейсы поддерживают декларативное объединение и&nbsp;могут быть расширены другими интерфейсами или&nbsp;классами.</p>
<p>И&nbsp;<strong>типы</strong>, и&nbsp;<strong>интерфейсы</strong>&nbsp;позволяют описывать структуры данных в&nbsp;TypeScript, что&nbsp;помогает предотвратить ошибки на&nbsp;этапе компиляции и&nbsp;делать код&nbsp;более предсказуемым.</p>
<h3>Для примитивов и&nbsp;кортежей используйте типы</h3>
<p>Создать строковый, числовой или&nbsp;другой примитивный тип&nbsp;с&nbsp;помощью интерфейса просто не&nbsp;получится.</p>
<p>Пример с&nbsp;примитивами:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/643e641fe0b343d094c542c2f9a985b4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
type UserId = string;
type ColumnHeight = number;
type isActive = boolean;
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5e06e17f12274d0b91078e7f0ed7e13d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В интерфейсах примитивные типы можно использовать в&nbsp;описании свойств объектов:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/d5fb40a1dc354cd794d3cfbe81727432"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
interface User {
  id: string;
  age: number;
  isActive: boolean;
}
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6d76f4f7f7444d1fa73e0cc38c38f40f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Пример с&nbsp;кортежем:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/733ba33017a240fa8f0535511d798381"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
type Coordinates = [number, number];
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c518e23418a4438084741f2b821fdf0d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Добиться похожего поведения можно и&nbsp;с&nbsp;помощью интерфейса, но&nbsp;так&nbsp;не&nbsp;рекомендуется делать:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/40241e15c2e94f7e9b5e88fbc3fda4c2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
interface Coordinates {
     0: number;
     1: number;
     length: 2; // фиксированная длина
 }
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2200f06bcff243c58968c83a22297d48"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Интерфейсы с&nbsp;одинаковыми именами объединяются</h2>
<p>Интерфейсы обладают особенностью, которая отсутствует у&nbsp;типов: если у&nbsp;вас&nbsp;есть несколько интерфейсов с&nbsp;одинаковыми именами, они&nbsp;могут&nbsp;<strong>объединяться</strong>. Это&nbsp;особенно полезно, когда вы&nbsp;работаете с&nbsp;внешними библиотеками или&nbsp;проектами, где&nbsp;структуру объекта нужно расширять.</p>
<p>Рассмотрим пример:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/ec96a6c2c1ef4bb583831365c9040908"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
interface User {
  id: number;
}

interface User {
  name: string;
}

const user: User = {
  id: 100,
  name: 'John Doe'
};
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a25e7ad1ce5d4006bff349573e754a17"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В этом примере два&nbsp;интерфейса User сливаются в&nbsp;один, который содержит оба&nbsp;свойства: id&nbsp; и&nbsp; name. Это&nbsp;позволяет гибко добавлять новые поля к&nbsp;уже&nbsp;существующим структурам, не&nbsp;трогая оригинальный код. Если бы&nbsp;вы&nbsp;пытались сделать то&nbsp;же&nbsp;самое с&nbsp;типами, TypeScript выдал бы&nbsp;ошибку — названия типов должны быть уникальными, даже если типы находились бы&nbsp;в&nbsp;разных файлах.</p>
<p>Объединение происходит не&nbsp;на&nbsp;уровне одного файла, а&nbsp;на&nbsp;уровне всего проекта. Поэтому важно помнить, особенно, если проект большой, что&nbsp;есть возможность случайно расширить уже&nbsp;существующий интерфейс. Также это&nbsp;правило работает для&nbsp;предустановленных интерфейсов, например, если нужно затипизировать комментарий с&nbsp;помощью интерфейса, выбрав название Comment, то&nbsp;мы&nbsp;расширим интерфейс Comment, который находится в&nbsp;lib.dom.d.ts.</p>
<p>Для большего погружения можно ознакомиться с&nbsp; <a rel="noopener noreferrer nofollow" href="https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces" target="_blank">документацией по&nbsp;объединению интерфейсов</a>.</p>
<h3>Типы можно пересекать и&nbsp;объединять, интерфейсы – наследовать</h3>
<p>Пересечение типов осуществляется с&nbsp;помощью оператора &amp;:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/9fee89988da448aeb122ec1061a23d75"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
type User = { id: string; };
type Article = { title: string; };

type UserArticle = User & Article;
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/745c14d5cdcf4d0a96a000815b58e16b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Здесь&nbsp;UserArticle&nbsp;объединяет свойства как&nbsp;пользователя, так&nbsp;и&nbsp;статьи.</p>
<p>Похожего поведения в&nbsp;интерфейсах можно добиться с&nbsp;помощью ключевого слова extends:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/52c0404b46994fb0ad241f7430929b9e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
interface User {
 id: string;
}

interface Article {
 title: string;
}

interface UserArticle extends User, Article {}

</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/12d360a1f3d1464a9923ef036d735c8e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Но это&nbsp;не&nbsp;одно и&nbsp;тоже,&nbsp;extends&nbsp;используется только для&nbsp;интерфейсов и&nbsp;подразумевает наследование, тогда как&nbsp;пересечение типов с&nbsp;помощью&nbsp;&amp;&nbsp;может использоваться как&nbsp;для&nbsp;интерфейсов, так&nbsp;и&nbsp;для&nbsp;любых других типов.</p>
<p>Существует мнение, что&nbsp;наследование интерфейсов&nbsp;<strong>работает быстрее</strong>, чем&nbsp;пересечение типов. Это&nbsp;связано с&nbsp;тем, что&nbsp;операции расширения требуют меньше ресурсов на&nbsp;этапе компиляции, чем&nbsp;пересечения типов. В<a rel="noopener noreferrer nofollow" href="https://github.com/microsoft/TypeScript/wiki/Performance#preferring-interfaces-over-intersections" target="_blank">&nbsp;<u>гайде по&nbsp;производительности TypeScript</u></a>&nbsp;также рекомендуется отдавать предпочтение наследованию интерфейсам, если важна скорость компиляции.</p>
<p>Однако реальные тесты показывают, что&nbsp;разница незначительна. Например, проверка 10 тысяч одинаковых конструкций для&nbsp;интерфейсов и&nbsp;типов не&nbsp;выявила существенной разницы в&nbsp;скорости компиляции. Эксперимент можно найти<a rel="noopener noreferrer nofollow" href="https://github.com/DmitryBerdnikov/knowledge-base/tree/19768546f9ef622d71a801912c05b26c2c74016f/typescript-extends-vs-intersections" target="_blank">&nbsp;<u>здесь</u></a>.</p>
<p>Другое отличие заключается в&nbsp;том, что&nbsp;если оба&nbsp;типа являются объектами, и&nbsp;в&nbsp;этих объектах содержатся поля с&nbsp;одинаковыми названиями, но&nbsp;разными типами, то&nbsp;extends выдаст ошибку, а&nbsp;при&nbsp;использовании&amp; ошибки не&nbsp;будет. Рассмотрим пример:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/e369364ab6ef4b9982cf8b648667a346"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
type User = {
 id: string;
}

type Article = {
 id: number;
}

type UserArticle = User & Article;
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ef5d78625ceb4738ac8c2621221afd69"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В&nbsp;UserArticle&nbsp;ошибки нет, но&nbsp;id&nbsp;имеет тип&nbsp;never, так&nbsp;как&nbsp;id&nbsp;не может быть одновременно и&nbsp;строкой и&nbsp;числом. А&nbsp;при&nbsp;использовании&nbsp;extends&nbsp;получаем ошибку:</p>
<p>Типы также поддерживают объединение с&nbsp;помощью оператора |. Это&nbsp;удобно, когда тип&nbsp;может быть один из&nbsp;нескольких вариантов:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/ee6ef34afab14c998ca511d9b7e5813c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
type User = {
 id: string;
}

interface Article {
 title: string;
}

type ProductId = string;

type Payload = User | Article | ProductId;
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5e2a28a6648c475788f36e467da47cf4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Лаконичность типов при&nbsp;использовании Utility Types</h2>
<p>Типы имеют более более&nbsp;<strong>лаконичный синтаксис</strong>&nbsp;при использовании&nbsp;<strong>Utility Types,&nbsp;</strong>чем интерфейсы. Например, для&nbsp;создания типа с&nbsp;необязательными полями можно воспользоваться утилитой Partial.</p>
<p>Вот как&nbsp;это&nbsp;выглядит для&nbsp;типов:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/9a0cc0579c0749ce9d52a05d60837f80"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
type User = {
  id: string;
}

type UserPartial = Partial<User>;
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/904d876271d345169b5b3028a7a9b492"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Теперь давайте посмотрим, как&nbsp;это&nbsp;будет выглядеть с&nbsp;интерфейсом:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/05d899bfce284fa18cc2a1a981f7f280"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
interface User {
  id: string;
}

interface UserPartial extends Partial<User> {}
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/43adfbf71bd7437ab76eb0543616d914"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В случае с&nbsp;интерфейсом нам&nbsp;приходится добавлять дополнительные конструкции extends и&nbsp;пустые фигурные скобки {}, что&nbsp;делает код&nbsp;менее читабельным. Это&nbsp;не&nbsp;критично, но&nbsp;может добавлять лишний «шум», особенно если часто используются такие утилиты как&nbsp;Partial, Pick, Omit и&nbsp;другие.</p>
<h2>Свойства интерфейсов сохраняют источник</h2>
<p>Ещё одна интересная особенность интерфейсов заключается в&nbsp;том, что&nbsp;их&nbsp;свойства сохраняют информацию о&nbsp;том, откуда они&nbsp;были взяты. Это&nbsp;может быть полезно при&nbsp;отладке кода.</p>
<p>Пример:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/0a180dc7fcba42d580da721d19c49c58"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
interface User {
  id: string;
}

interface Article {
  name: string;
}

interface UserArticle extends User, Article {};

const userArticle: UserArticle = {
  id: 'test',
  name: 'test'
};
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/54aadcbafa574781b9b327f820028efd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Если вы&nbsp;посмотрите на&nbsp;объект&nbsp;userArticle, поле&nbsp;id&nbsp;будет связано с&nbsp;User.id: string, а&nbsp;name — с&nbsp;Article.name: string. Это&nbsp;может помочь лучше понять, откуда взято конкретное свойство при&nbsp;сложных наследованиях.</p>
<p>Теперь давайте перепишем тот&nbsp;же&nbsp;пример на&nbsp;типах:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="code"
            data-content-element-type-key="bca9c195-a64e-4781-964c-2edf3cf2472e"
            data-element-udi="umb://element/dd5ca0cde7cb40b69cd9b837d790475b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<pre>
<code class="language-javascript">
type User = {
  id: string;
}

type Article = {
  name: string;
}

type UserArticle = User & Article;

const userArticle: UserArticle = {
  id: 'test',
  name: 'test'
};
</code>
</pre>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c8c346e5f2e64bd897507751e7e7b969"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В случае с&nbsp;типами при&nbsp;отладке оба&nbsp;поля&nbsp;id&nbsp;и&nbsp;name&nbsp;будут просто строками (string), и&nbsp;информация о&nbsp;том, откуда они&nbsp;взяты, будет потеряна.</p>
<h2>Когда использовать типы, а&nbsp;когда интерфейсы?</h2>
<p>Можно взять за&nbsp;основу правило: использовать типы по&nbsp;умолчанию, а&nbsp;интерфейсы, когда это&nbsp;необходимо.</p>
<p>Использование интерфейсов можно рассмотреть в&nbsp;библиотеках, которые будут ставиться в&nbsp;проекты, чтобы дать возможность расширить типы при&nbsp;необходимости. Либо в&nbsp;проектах, которые используют подход ООП.</p>
<p><strong>Полезные ссылки:</strong></p>
<ul>
<li><a rel="noopener noreferrer nofollow" href="https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces" target="_blank">Merging Interfaces в&nbsp;TypeScript</a></li>
<li><a rel="noopener noreferrer nofollow" href="https://github.com/microsoft/TypeScript/wiki/Performance#preferring-interfaces-over-intersections" target="_blank">Преподчитайте наследование над&nbsp;пересечением из&nbsp;Гайда по&nbsp;производительности TypeScript</a></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как использовать User Story mapping при создании цифрового продукта
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Декомпозиция и приоритезация фич — must-have. Как с помощью USM связать цели бизнеса и нужды пользователей так, чтобы каждая функция была полезна?
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-use-usm/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-use-usm/</guid>

                <pubDate>Mon, 12 Jan 2026 04:00:11 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как использовать User Story mapping при создании цифрового продукта</h1>
                                <figure>
                                    <img src="/Media/e5unpj4e/frame-5009624.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2601ba022ced47ae99a7660494d5fdeb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Декомпозиция фич&nbsp;и&nbsp;их&nbsp;приоритезация — это&nbsp;обязательные этапы проектирования продукта. USM&nbsp;– инструмент, который нам&nbsp;в&nbsp;этом помогает. С&nbsp;ним&nbsp;получается работать над&nbsp;продуктом, опираясь на&nbsp;реальные потребности пользователей и&nbsp;цели бизнеса. Как&nbsp;итог – строим разработку так, чтобы каждая функция, которую создает команда, приносила максимальную пользу.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b33866f482854a1ca0cd6945cb238ad9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/81c0bfc4f8ba43e2b7d4c6e32308a904"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Возможно, вся&nbsp;эта&nbsp;работа покажется простой и&nbsp;быстрой, но&nbsp;чтобы создать продукт, нужный бизнесу и&nbsp;клиентам, имеет смысл выстроить систему и&nbsp;подход, универсальные с&nbsp;точки зрения применения и&nbsp;гибкие с&nbsp;точки зрения адаптации под&nbsp;конкретный запрос.</p>
<p dir="ltr"><span class="highlighter">User Story Mapping — это&nbsp;метод, который помогает организовать задачи разработки продукта в&nbsp;виде карты, основанной на&nbsp;сценариях пользователей.</span> В&nbsp;отличие от&nbsp;традиционного списка задач, USM&nbsp;описывает фичи с&nbsp;точки зрения ценности для&nbsp;пользователя, а&nbsp;не&nbsp;на&nbsp;уровне технической реализации. Поэтому команде проще отсюда понять, какие действия пользователь выполняет, и&nbsp;как&nbsp;каждая функция продукта поддерживает эти&nbsp;действия. Так&nbsp;получается сосредоточиться на&nbsp;создании полезной функциональности.</p>
<h2 dir="ltr">Из чего получается User Story Mapping</h2>
<ol>
<li><strong>Роли пользователей</strong> — это&nbsp;конкретные группы пользователей, которые взаимодействуют с&nbsp;продуктом. </li>
<li><strong>Истории пользователей (User Stories)</strong> — это&nbsp;краткие описания того, что&nbsp;пользователь хочет достичь с&nbsp;помощью продукта. Например: «Как тренер, я&nbsp;хочу создавать тренировочные планы, чтобы эффективно отслеживать прогресс моих клиентов».</li>
<li><strong>Карточки задач</strong> — конкретные задачи, которые нужны для&nbsp;выполнения пользовательских историй. Эти&nbsp;задачи помогают команде понять, что&nbsp;именно нужно разработать, и&nbsp;как&nbsp;это&nbsp;связано с&nbsp;потребностями пользователей.</li>
</ol>
<h2 dir="ltr">Проблемы классического подхода к&nbsp;планированию</h2>
<p dir="ltr">Многие всё&nbsp;ещё&nbsp;используют техническое задание (ТЗ) в&nbsp;качестве основы для&nbsp;планирования продукта. Мы&nbsp;в&nbsp;таком подходе видим парочку проблем:</p>
<ul style="list-style-type: circle;">
<li><strong>Сложность для&nbsp;клиента. </strong>Техническое задание часто превращается в&nbsp;сложный и&nbsp;непонятный документ, который сложно интерпретировать. Там&nbsp;появляется огромное множество описанных мелочей и&nbsp;деталей, которые отвлекают от&nbsp;фокуса на&nbsp;самом важном – что&nbsp;за&nbsp;продукт мы&nbsp;делаем и&nbsp;зачем.</li>
<li><strong>Узконаправленное видение у&nbsp;команды. </strong>Разработчики часто погружены в&nbsp;технические детали и&nbsp;упускают из&nbsp;виду общую картину продукта и&nbsp;потребности пользователей.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b6616ac417454efa92bfe1fa71542b27"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/b07849a969cf48e28ee609aa7ee0a673"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Пример из&nbsp;практики: </strong>
    в&nbsp;ТЗ&nbsp;написано, что&nbsp;кнопка Х&nbsp;должна выглядеть и&nbsp;отрабатывать определенным утвержденным образом. Заказчик за&nbsp;это&nbsp;цепляется, говорит, мол, нет, должно быть по-другому. В&nbsp;то&nbsp;же&nbsp;время далее по&nbsp;списку есть неточность в&nbsp;описании бизнес-логики. На&nbsp;нее&nbsp;заказчик внимание не&nbsp;обратил, потому что&nbsp;сфокусировался на&nbsp;кнопке, которая ему&nbsp;может и&nbsp;не&nbsp;понравилась, но&nbsp;влияние на&nbsp;результат имеет куда меньшее. Вот&nbsp;и&nbsp;получилось, что&nbsp;кнопку мы&nbsp;сделали красивой на&nbsp;разработке, а&nbsp;бизнес-логика сломалась — нужно будет больше времени потратить на&nbsp;исправление, и, возможно, уже&nbsp;после релиза. Минус деньги, минус время, минус хорошее настроение.
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b2a8572ff5944230a051aba52b833310"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f7b62639404242f0962b1806995d40eb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Вместо составления спецификаций и&nbsp;ТЗ&nbsp;мы&nbsp;делаем информативную и&nbsp;комплексную документацию. Ее&nbsp;мы&nbsp;составляем в&nbsp;ходе тщательного анализа запроса заказчика и&nbsp;описываем продукт так, чтобы было понятно и&nbsp;бизнесу, и&nbsp;разработке.</p>


    <div class="article-block">
        <a href="/articles/how-to-stop-writing-huge-documentation-and-start-development-faster/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/stfntzyi/frame-11.png"
         alt=""
         itemprop="">

    
            <span>Почему продуктовое проектиро&shy;вание лучше формального ТЗ&nbsp;</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>


<p>Для того чтобы оценить проект и&nbsp;создать дорожную карту, мы&nbsp;используем эту&nbsp;документацию. Она&nbsp;помогает понять, как&nbsp;система будет использоваться людьми, и&nbsp;сформировать видение ее&nbsp;будущего развития.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/2313c6377022499597f8c9da20469200"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3d24a3de0ab94e3c9184011fbf9cbe98"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b7715d954f684e63b9eecdf99d39810d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Формируем USM&nbsp;шаг&nbsp;за&nbsp;шагом</h2>
<p dir="ltr">Давайте для&nbsp;начала верхнеуровнево зафиксируем, как&nbsp;получается целостная USM&nbsp;для&nbsp;продукта, и&nbsp;из&nbsp;чего она&nbsp;состоит.</p>
<p dir="ltr">Начинаем с&nbsp;того, что&nbsp;определяем роли пользователей в&nbsp;продукте и&nbsp;описываем, что&nbsp;каждая роль может делать: какие разделы доступны, какие действия можно выполнить, и&nbsp;как&nbsp;взаимодействовать с&nbsp;элементами системы.&nbsp;</p>
<p dir="ltr">Это помогает команде понять, какие задачи необходимо решить для&nbsp;каждого типа пользователей, и&nbsp;как&nbsp;продукт будет поддерживать их&nbsp;работу.</p>
<ol>
<li>Определение ролей пользователей. Важно понимать, кто&nbsp;ваши конечные пользователи. Например, в&nbsp;системе управления футбольной лигой это&nbsp;могут быть тренеры, администраторы и&nbsp;менеджеры лиги. Каждая роль должна быть описана максимально конкретно.</li>
<li>Создание сценариев взаимодействия. Описываем пошагово, как&nbsp;каждый пользователь будет использовать продукт. Например, тренер может создавать тренировочные планы, следить за&nbsp;прогрессом игроков и&nbsp;корректировать их&nbsp;тренировки, в&nbsp;зависимости от&nbsp;целей.</li>
<li>Создание карточек задач. Разбиваем каждый сценарий на&nbsp;задачи, которые описываем в&nbsp;карточках – каждую по&nbsp;отдельности. Их&nbsp;соединяем с&nbsp;пользовательскими ролями.</li>
</ol>
<p dir="ltr">Так у&nbsp;нас&nbsp;получается наглядная карта функциональности системы.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/083561a69f3947b4a185ab9bcd5dc1f4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/fzebgt5x/9f3ce466b575ee684f2fa9b5dbfef6bf.png"
         alt="&#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; USM"
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6a97868799c44e5ebec6a171c3580895"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8892adafcd2b4f8aa5bb7932ccbb151f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">На этом этапе мы&nbsp;не&nbsp;разделяем продукт на&nbsp;версии, чтобы сохранить ясность как&nbsp;для&nbsp;разработчиков, так&nbsp;и&nbsp;для&nbsp;бизнеса. Разработчики видят четкие задачи, а&nbsp;бизнес понимает, что&nbsp;получит в&nbsp;итоге и&nbsp;как&nbsp;это&nbsp;повлияет на&nbsp;успешность продукта.</p>
<h2 dir="ltr">Пример из&nbsp;проекта</h2>
<p dir="ltr">Покажем, как&nbsp;все&nbsp;это&nbsp;работает. Возьмем карточки из&nbsp;проектирования продукта для&nbsp;одного из&nbsp;наших проектов – Freedom Football Manager. Это&nbsp;сервис для&nbsp;управления футбольной лигой Казахстана.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneProjectBlock"
            data-content-element-type-key="fbd4d025-d11c-4282-949f-91bea47ced9d"
            data-element-udi="umb://element/5c9e6d8965c846e4b7f23857577d2b0d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

	<a href="/projects/ffm-development/">
		


    <img src="/Media/tlxhm550/image-481.png"
         alt=""
         itemprop="">

		<div class="project-block__content">
			<p>&#x421;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43D;&#x430;&#x448; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;</p>
			<span>Freedom Football Manager: автоматизация тренировочного процесса для футбольной лиги Казахстана</span>
		</div>
	</a>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/31ee974dbe924dacaf630975ed59e5b0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/g3ggmudf/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;-&#x43E;&#x442;-habrastorage.png"
         alt="&#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; USM"
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/aec51c6659124738a8433b695ad08930"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0df94417b23a416484d51724cd98c8ed"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><strong>Пользовательская роль:</strong> главный тренер.</p>
<p dir="ltr"><strong>Функциональные блоки:</strong> аккаунт, команда, тренировки.</p>
<p dir="ltr"><strong>Сценарии:</strong> авторизация, выбор команды, управление тренерами, управление игроками, управление инфраструктурой, мои&nbsp;тренировки, база тренировок, создание тренировки, редактирование тренировки, удаление тренировки.</p>

<div class="umb-macro-highlights">
    <strong>Детализация помогает не&nbsp;только разработчикам, но&nbsp;и&nbsp;клиентам видеть связь каждой функции с&nbsp;задачами бизнеса и&nbsp;ожиданиями пользователей.</strong>
    
</div>

<p dir="ltr">Однако, такая стройная карта не&nbsp;появляется сама собой. Чтобы сделать ее&nbsp;действительно отражающей функциональность достаточно полно, в&nbsp;соответствии с&nbsp;целями продукта и&nbsp;без&nbsp;излишеств детализации, нужно пройти пару «подготовительных» этапов, сформировать карту влияний и&nbsp;описать фичи в&nbsp;документации.</p>
<h2 dir="ltr">Связь «Карта влияний→Документация→USM»</h2>
<p dir="ltr">Показываем все&nbsp;на&nbsp;том&nbsp;же&nbsp;примере – сервисе для&nbsp;управления футбольной лигой Казахстана. Возьмем функциональность создания тренировок в&nbsp;системе.</p>
<p dir="ltr">Сначала делаем карту влияний. Формируем цель продукта и&nbsp;метрики успеха в&nbsp;нем: затем выделяем пользовательскую роль – тренера команды – и&nbsp;описываем, что&nbsp;ему&nbsp;хочется делать лучше с&nbsp;помощью сервиса.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/8155d361ba8847d5b60d4d04692fbe55"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/kgjbezbw/ec6330b353097c5594444a4ac9e4153b.png"
         alt="&#x43F;&#x43E;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43A;&#x430; &#x446;&#x435;&#x43B;&#x435;&#x439; &#x43F;&#x440;&#x438; &#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x430;"
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/bc3899e7b5084fa7891f7b2f7fffd691"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c9c362a7050e4c14b00bf87b4971d26f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Далее формируем гипотезы относительно функционирования сервиса, которые одновременно будут и&nbsp;работать на&nbsp;цель продукта, и&nbsp;будут закрывать боли нашего пользователя. Исходя из&nbsp;этих гипотез, выводим функциональные блоки сервиса, которые в&nbsp;дальнейшем отразим в&nbsp;документации и&nbsp;реализуем.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/5d5be7b8ff654cd7b4b63d2894844de3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/enbl33bu/ff05d53c9235a5bae45622505c2a5c00.png"
         alt="&#x446;&#x435;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x430;"
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d59a1d9576714afa8fd75cc3b1558d0a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1cfce15dd1644a22bc4fb208cfd93b7f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Теперь эти&nbsp;схемки нужно преобразовать в&nbsp;блоки документации. Покажем, как&nbsp;это&nbsp;будет выглядеть для&nbsp;первой схемы, в&nbsp;которой отражена функциональность создания тренировок.</p>
<p><img src="/Media/oywfrlj3/изображение-от-habrastorage-1.png?rmode=max&amp;width=680&amp;height=536" alt="функциональность продукта" width="680" height="536"></p>
<p dir="ltr">Тут стоит отметить, что&nbsp;в&nbsp;документации таким описанием мы, конечно, не&nbsp;ограничимся. Каждую из&nbsp;семи фаз&nbsp;тренировочного процесса мы&nbsp;отдельно опишем и&nbsp;сформулируем до&nbsp;предельной понятности. Делаем это&nbsp;так, чтобы после просмотра документа разработчики понимали, как&nbsp;реализовывать описанную функциональность, а&nbsp;заказчику было ясно, как&nbsp;все&nbsp;будет работать и&nbsp;влиять на&nbsp;основную цель продукта.&nbsp;</p>
<p dir="ltr">Теперь у&nbsp;нас&nbsp;есть необходимый набор артефактов, чтобы сделать USM&nbsp;не&nbsp;ориентировочной и&nbsp;примерной, а&nbsp;отражающей ровно те&nbsp;функции сервиса, которые нам&nbsp;необходимы на&nbsp;текущем этапе. Текущий этап здесь – это, например, период разработки первой (или&nbsp;очередной) версии системы, которая может быть по-своему функционально ограничена, но&nbsp;все&nbsp;равно должна работать на&nbsp;определенную цель.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ed43623fa2f4465591d8d4998b959f69"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/0elfkgue/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;-&#x43E;&#x442;-habr.png"
         alt="&#x43A;&#x430;&#x43A; &#x441;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C; USM "
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/84f3ff130d6049ac8d1662d9b22ff0b0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5a0450773b8641f3ac818c00aa3e1675"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Приоритизация USM: не&nbsp;растягиваем фазу проектирования бесконечной детализацией</h2>
<p dir="ltr">Всегда нужно в&nbsp;чем&#8209;то&nbsp;себя ограничивать, проектируя функциональность сервиса. Создавая продукт с&nbsp;нуля, как&nbsp;в&nbsp;нашем примере, легко напихать сходу миллион возможностей, и, если не&nbsp;разделить их&nbsp;на&nbsp;версии, никогда не&nbsp;дойти до&nbsp;релиза. «Резать» нужно в&nbsp;двух направлениях: в&nbsp;количестве фич&nbsp;и&nbsp;их&nbsp;детализации по&nbsp;ходу проектирования. </p>
<p dir="ltr">Карта влияний, которую мы&nbsp;упомянули выше, связывает задачи с&nbsp;целями бизнеса, чтобы понять, какое влияние каждая функция оказывает на&nbsp;достижение этих целей. Она&nbsp;и&nbsp;служит своеобразным ограничителем, который помогает не&nbsp;переборщить с&nbsp;количеством фич&nbsp;в&nbsp;рамках определенной версии продукта. </p>


    <div class="article-block">
        <a href="/articles/impact-mapping/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/niwpclnv/ay-20-2025-1.png"
         alt=""
         itemprop="">

    
            <span>Карта влияний: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/25bbfaa7a73f498b87a379c5fc7df970"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2242ac026cc74897b43716d2eafea8ec"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlight"
            data-content-element-type-key="c44ca899-4d83-4746-bf21-bdd1f8a25ccf"
            data-element-udi="umb://element/93406911f4744cfea0d34899a82d41e7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="text-highlight">
  Относительно детализации описания отдельных фич или функциональных блоков, совет такой: детализировать нужно до минимально оценимой пользы.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5cb240751ebc47a2a406bfa4ea3570b8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Вернемся к&nbsp;нашему примеру с&nbsp;футбольным менеджером. Вот&nbsp;хороший сценарий: «я создаю тренировку». Другой хороший сценарий: «я заполняю данные тренировки». Здесь бизнес понимает, что&nbsp;тренер может создать тренировку и&nbsp;загрузить ее&nbsp;нужными параметрами. Если начинаем раскладывать и&nbsp;дробить дальше, можем получить что&#8209;то&nbsp;вроде «я заполняю название тренировки», «я заполняю дату тренировки», «я заполняю учебную программу тренировки» – это&nbsp;уже&nbsp;примеры плохих сценариев, просто не&nbsp;имеющие смысла.&nbsp;&nbsp;</p>
<p dir="ltr">Нужно приоритезировать сценарии, работая совместно с&nbsp;бизнесом и&nbsp;опираясь на&nbsp;методику карты влияний. Мы&nbsp;определяем цели продукта, рассматриваем идеи и&nbsp;гипотезы, а&nbsp;затем распределяем их&nbsp;по&nbsp;приоритету, поскольку невозможно охватить все&nbsp;сразу.&nbsp;</p>
<p dir="ltr">Когда USM&nbsp;согласован с&nbsp;бизнесом, он&nbsp;передается разработчикам для&nbsp;оценки трудозатрат. Затем вся&nbsp;информация преобразуется в&nbsp;таблицы, и&nbsp;создается дорожная карта, которая разбивается на&nbsp;спринты и&nbsp;конкретные задачи для&nbsp;команды. Таким образом, с&nbsp;самого начала работы над&nbsp;продуктом обеспечивается синхронность действий между бизнесом и&nbsp;предполагаемыми пользователями.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Постановка целей в digital-разработке: как не провалить запуск цифрового продукта
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Проекты срываются не из-за сроков или бюджета, а из-за размытых целей. Почему чёткая постановка задач на старте — основа успеха? Разбираем в статье.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/development-goals-at-project-start/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/development-goals-at-project-start/</guid>

                <pubDate>Mon, 12 Jan 2026 03:49:00 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Постановка целей в digital-разработке: как не провалить запуск цифрового продукта</h1>
                                <figure>
                                    <img src="/Media/fhgelggy/dall-e-&#x43F;&#x438;&#x43D;&#x433;&#x432;&#x438;&#x43D;-&#x432;-&#x441;&#x43C;&#x43E;&#x43A;&#x438;&#x43D;&#x433;&#x435;.webp" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/94524310fd274df9bf45e2716b2e6122"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Привет! Я&nbsp;Вениамин Мустафин, директор по&nbsp;развитию компании fuse8. Мы&nbsp;строим свою экспертизу на&nbsp;создании цифровых продуктов для&nbsp;бизнеса и&nbsp;делимся наработками через контент. На&nbsp;мой&nbsp;взгляд, продуктовое проектирование – часть проекта настолько же&nbsp;важная, как&nbsp;и&nbsp;разработка. Одно без&nbsp;другого существовать не&nbsp;может.&nbsp;</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6951696c30344d75a4719f7b77018253"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5880e6740be34a199bda3df3d4881a19"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент, знает, чего хочет, но&nbsp;этого недостаточно</h2>
<p>Когда клиент приходит к&nbsp;команде разработки, он&nbsp;уже&nbsp;проделал немалую работу. В&nbsp;его&nbsp;голове есть образ конечного продукта, а&nbsp;иногда даже цели и&nbsp;метрики, которых он&nbsp;хочет достичь. Клиент может описывать это&nbsp;через функциональные требования: «хочу, чтобы в&nbsp;продукте был&nbsp;кабинет поставщика, который умеет вот&nbsp;это&nbsp;и&nbsp;вот&nbsp;то» или&nbsp;«нужно приложение, в&nbsp;котором можно будет оформлять заявки на&nbsp;банковские продукты».</p>
<p>Команда разработки, видя такой «список покупок», часто считает, что&nbsp;клиент – эксперт в&nbsp;своем бизнесе, поэтому можно следовать этим требованиям буквально. Но&nbsp;на&nbsp;практике, если команда разработки не&nbsp;вовлечена в&nbsp;обсуждение целей, ее&nbsp;работа сводится к&nbsp;выполнению задач по&nbsp;принципу «сделай то, что&nbsp;сказано». И&nbsp;тут&nbsp;команда превращается в&nbsp;группу исполнителей, а&nbsp;не&nbsp;партнеров. В&nbsp;результате создается продукт, который «работает по&nbsp;ТЗ», но&nbsp;не&nbsp;обязательно помогает бизнесу.</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/8f7/9c8/657/8f79c865729034904a342ae4790087f3.png" alt=""></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/9ec7063894964ee49ac85b8c335dca9c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            По-настоящему сильная команда разработки не&nbsp;просто «выполняет задачи», а&nbsp;работает на&nbsp;достижение целей продукта. 
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6c8508c465474d5ba70520f8c608611d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/68eb18970e544df9b0df73e5056ed0b1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Чтобы это&nbsp;стало возможным, с&nbsp;самого начала погружаем команду в&nbsp;стратегические цели, помогаем видеть продукт целиком и&nbsp;даем почву для&nbsp;проверки гипотез. Так&nbsp;получается не&nbsp;только решать задачи, но&nbsp;и&nbsp;генерировать идеи для&nbsp;улучшения продукта. Это&nbsp;и&nbsp;отличает команду исполнителей от&nbsp;команды создателей.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/432f8ef4b5d04d1db155677446c1fc24"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Почему цели важнее списка фич?</h2>
<h3><strong>Фокус на&nbsp;результате</strong></h3>
<p>Представьте, что&nbsp;вы&nbsp;запускаете сервис для&nbsp;банка. Можно сказать: «Сделайте кредитный калькулятор», а&nbsp;можно поставить цель: «Увеличить количество заполненных анкет на&nbsp;сайте в&nbsp;два&nbsp;раза». В&nbsp;первом случае команда просто выполняет задачу, не&nbsp;углубляясь в&nbsp;суть. Во&nbsp;втором – она&nbsp;фокусируется на&nbsp;результате и&nbsp;начинает предлагать решения, которые действительно помогут достичь цели. Разница в&nbsp;уровне погружения – колоссальная.</p>
<h3><strong>Приоритеты определяются целями</strong></h3>
<p>В разработке всегда наступает момент, когда становится понятно, что&nbsp;выполнить всё&nbsp;задуманное в&nbsp;срок невозможно. Если нет&nbsp;целей, задачи, которые придуманы без&nbsp;привязки к&nbsp;чему-либо, могут быть мертворожденными. Начинается хаос: что&nbsp;отложить, а&nbsp;что&nbsp;сделать? Кто&#8209;то&nbsp;решает это&nbsp;на&nbsp;основе интуиции, но&nbsp;это&nbsp;плохая валидация. Цели и&nbsp;метрики нужны, чтобы вычленить главное. Иначе начинается субъективизация – разные ЛПРы говорят: «Ну вот&nbsp;это&nbsp;уж&nbsp;точно надо внедрить», и&nbsp;у&nbsp;каждого «вот это» разное. При&nbsp;наличии оформленных целей, проще решить, какие задачи критичны для&nbsp;достижения успеха, а&nbsp;какие можно отложить или&nbsp;вовсе убрать.</p>
<h3><strong>Ответственность делится между клиентом и&nbsp;командой</strong></h3>
<p>Когда работа идет без&nbsp;целей, клиент остается единственным ответственным за&nbsp;результат. Он&nbsp;диктует задачи, и&nbsp;команда просто их&nbsp;выполняет. Но&nbsp;если цели зафиксированы и&nbsp;разработчики понимают, как&nbsp;их&nbsp;достичь, они&nbsp;становятся партнерами клиента. Ответственность за&nbsp;успех разделяется, и&nbsp;это&nbsp;– залог сильной и&nbsp;мотивированной команды а&nbsp;в&nbsp;дальнейшем – успешного продукта.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/511dda3e98b24338b500f8dbf6eb43dc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/0e8b6630931c40c895e629be273aac12"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5236eae315d945c49b2ff9cb4b2919f9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Цена незафиксированных целей: как&nbsp;потратить время впустую</h2>
<p><span class="highlighter">Имаджинируем: университетская администрация решила модернизировать свою систему для&nbsp;онлайн-зачислений студентов.</span> Фокус работы следующий: «Обновить личный кабинет абитуриента и&nbsp;добавить новые функции.» Клиент передает команде список желаемых изменений, среди которых — «встроить калькулятор баллов» и&nbsp;«обновить интерфейс загрузки документов.»</p>
<h4>Что произошло</h4>
<p>Команда берет макеты и&nbsp;текстовые описания, начиная работу. Аналитик погружается в&nbsp;разработку калькулятора баллов — это&nbsp;был&nbsp;самый подробно описанный элемент. На&nbsp;это&nbsp;уходит несколько дней: описание логики работы, уточнение формул и&nbsp;проектирование интерфейса.</p>
<p>Но когда аналитик возвращается к&nbsp;клиенту за&nbsp;уточнениями, звучит неожиданное:</p>
<p>«Калькулятор — это&nbsp;хорошо, но&nbsp;это&nbsp;не&nbsp;срочно. Сейчас абитуриенты жалуются на&nbsp;проблемы с&nbsp;загрузкой документов. Нам&nbsp;нужно срочно это&nbsp;исправить.»</p>
<h4>Результат стараний</h4>
<p>Команда потратила несколько дней на&nbsp;проработку задачи, которая не&nbsp;была ключевой для&nbsp;успеха продукта. А&nbsp;всё&nbsp;потому, что&nbsp;приоритеты не&nbsp;были выявлены до&nbsp;начала работы. Клиент, ожидая помощи от&nbsp;команды, не&nbsp;сформулировал цели, а&nbsp;команда приняла список задач как&nbsp;данность, не&nbsp;задав уточняющих вопросов.</p>
<h4>Как стоило сделать</h4>
<p><strong>Ответственность за&nbsp;формулировку целей лежит и&nbsp;на&nbsp;команде.</strong> Не&nbsp;нужно ждать, что&nbsp;клиент сам&nbsp;определит, что&nbsp;важно. Вместо этого команда должна провести обсуждение с&nbsp;заказчиком, выяснив:</p>
<ul>
<li>Что сейчас вызывает наибольшие сложности у&nbsp;пользователей?</li>
<li>Каковы основные жалобы или&nbsp;пожелания?</li>
<li>Какие задачи критичны сейчас?</li>
<li>Какие из&nbsp;них&nbsp;можно отложить на&nbsp;потом?</li>
</ul>
<p>Если бы&nbsp;команда задала эти&nbsp;вопросы, стало бы&nbsp;ясно, что&nbsp;главная проблема — это&nbsp;неудобный процесс загрузки документов. Калькулятор баллов, хотя и&nbsp;полезен, можно проработать на&nbsp;следующем этапе. </p>
<h4>Чему это&nbsp;нас&nbsp;учит?</h4>

<div class="umb-macro-highlights">
    <strong>Формулирование целей в&nbsp;продукте – процесс общий, где&nbsp;одинаково вовлечены должны быть и&nbsp;заказчик, и&nbsp;исполнитель. В&nbsp;интересах второго максимально полно «вытянуть» из&nbsp;заказчика ожидания, чтобы эффективно приоритезировать задачи. </strong>
    
</div>

<p>Кроме того, когда цели продукта формируются сообща, мы&nbsp;укрепляем доверие и&nbsp;движемся в&nbsp;сторону максимально прозрачной с&nbsp;обеих сторон коммуникации. Это&nbsp;важно. Ну, и&nbsp;как&nbsp;бонус – не&nbsp;тратим время и&nbsp;ресурсы впустую. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/56895146c6ff495f80bcd3f854e80ec9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4f1cddc0f2e543bb9f52f02777a8c6db"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/61991493a45b4549a000643fb89b42c9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как определить цели проекта и&nbsp;уйти от&nbsp;пунктов в&nbsp;списке покупок</h2>
<p>Базовый ответ на&nbsp;этот вопрос: формулируйте по&nbsp;SMART. Правильная цель должна быть конкретна, измерима, достижима, релевантна и&nbsp;привязана ко&nbsp;времени. Но&nbsp;эти&nbsp;характеристики не&nbsp;всегда получается применить в&nbsp;полном объеме и&nbsp;сразу. Поэтому рассмотрим на&nbsp;понятных примерах, как&nbsp;неоформленные цели можно преобразовать в&nbsp;«правильные».</p>
<h4>Банковская сфера</h4>
<p><span class="highlighter"><strong>Продукт:</strong> Мобильное приложение</span></p>
<p>Клиент приходит с&nbsp;запросом: «Нужно приложение, чтобы пользователи могли управлять своими счетами и&nbsp;кредитами». Это&nbsp;классический пример списка покупок. Команда разработчиков, следуя указаниям, делает базовую функциональность. Однако спустя месяцы использования аналитика показывает, что&nbsp;приложение не&nbsp;помогает увеличить объем активных пользователей.</p>
<p>Сравните это&nbsp;с&nbsp;подходом, основанным на&nbsp;целях:</p>
<p><strong>Цель</strong>: Увеличить долю активных пользователей на&nbsp;20% за&nbsp;6 месяцев.</p>
<p>С таким ориентиром команда понимает, что&nbsp;важно сосредоточиться, например, на&nbsp;удобстве пользовательского интерфейса, автоматизации напоминаний и&nbsp;кэшбэк-программах, которые стимулируют использование приложения.</p>
<h4>Образовательные платформы</h4>
<p><span class="highlighter"><strong>Продукт</strong>: Платформа онлайн образования</span></p>
<p>Клиент говорит: «Нужна платформа с&nbsp;видеоуроками, тестами и&nbsp;сертификатами». Команда реализует все&nbsp;пожелания, но&nbsp;результаты разочаровывают: студенты бросают курс, не&nbsp;доходя до&nbsp;середины. Почему?</p>
<p>Цель не&nbsp;была поставлена. Если бы&nbsp;фокус был&nbsp;на&nbsp;достижении <strong>завершения курса минимум 70% участников</strong>, подойти к&nbsp;задаче можно было бы&nbsp;иначе: проработать геймификацию, мотивационные рассылки и&nbsp;персонализированную поддержку.</p>
<h4>Ритейл и&nbsp;e-commerce</h4>
<p><span class="highlighter"><strong>Продукт</strong>: Онлайн магазин</span></p>
<p>Клиент просит: «Создайте функциональность фильтров, корзины и&nbsp;оплаты». Готовый продукт работает, но&nbsp;трафик не&nbsp;конвертируется в&nbsp;продажи. Почему?</p>
<p>С целью «Увеличить коэффициент конверсии на&nbsp;15%» команда изначально проанализировала бы&nbsp;путь пользователя, акцентировала внимание на&nbsp;удобстве поиска товаров, рекомендательных системах и&nbsp;оформлении процесса оплаты, чтобы убрать все&nbsp;«узкие места».</p>
<h2>Как ставить цели: инструменты и&nbsp;подходы</h2>
<p>Теперь, когда с&nbsp;важностью целей всё&nbsp;ясно, поговорим о&nbsp;том, как&nbsp;их&nbsp;правильно сформулировать. Вот&nbsp;несколько инструментов, которые помогают на&nbsp;старте:</p>
<ol>
<li><strong>Понимание задачи (ПЗ)<br></strong>Это базовый уровень фиксации целей. ПЗ&nbsp;помогает структурировать запрос клиента и&nbsp;понять, как&nbsp;он&nbsp;пришел к&nbsp;своему видению. </li>
<li><strong>Карта влияний<br></strong>Этот инструмент связывает цели бизнеса и&nbsp;функции продукта. Она&nbsp;помогает выделить, какие задачи действительно важны для&nbsp;достижения целей, а&nbsp;какие можно отложить. Карта влияний отлично работает, когда у&nbsp;клиента уже&nbsp;есть общее понимание, что&nbsp;нужно делать.</li>
<li><strong>Карта гипотез<br></strong>Подходит для&nbsp;проектов, где&nbsp;непонятно, с&nbsp;чего начать. Она&nbsp;помогает генерировать гипотезы и&nbsp;задачи, а&nbsp;также увязывать их&nbsp;с&nbsp;реальными потребностями пользователей. Если карта влияний ориентирована на&nbsp;бизнес, то&nbsp;карта гипотез погружает в&nbsp;пользовательский опыт и&nbsp;помогает создавать что&#8209;то&nbsp;действительно полезное.</li>
</ol>
<h3>Алгоритм постановки целей</h3>
<ol>
<li>Определите главную бизнес-цель (увеличить доход, повысить лояльность, привлечь новых клиентов).</li>
<li>Разбейте цель на&nbsp;измеримые метрики (рост на&nbsp;X%, конверсия Y%).</li>
<li>Свяжите метрики с&nbsp;задачами через карту влияний.</li>
<li>Используйте карту гипотез для&nbsp;поиска нестандартных решений.</li>
</ol>
<h2>Как начать правильно</h2>
<p>Поймите, зачем создается продукт, как&nbsp;он&nbsp;должен помочь бизнесу и&nbsp;какие метрики будут показывать, что&nbsp;вы&nbsp;на&nbsp;верном пути. Фиксируйте цели, проверяйте их&nbsp;актуальность и&nbsp;используйте инструменты вроде карты влияний и&nbsp;карты гипотез. Это&nbsp;увеличит шансы на&nbsp;успех  и&nbsp;сделает процесс разработки осмысленным и&nbsp;вдохновляющим.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Почему продуктовое проектиро&shy;вание лучше формального ТЗ
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Вместо громоздкого ТЗ — продуктовое проектирование и понятная всем документация. Как такой подход ускорил запуск и сблизил нас с бизнесом.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-stop-writing-huge-documentation-and-start-development-faster/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-stop-writing-huge-documentation-and-start-development-faster/</guid>

                <pubDate>Mon, 12 Jan 2026 03:39:39 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Почему продуктовое проектиро&shy;вание лучше формального ТЗ</h1>
                                <figure>
                                    <img src="/Media/stfntzyi/frame-11.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7fe263bdb2fe474aa8ae245e7c9ed79c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Перед началом разработки любого продукта обычно составляется ТЗ&nbsp;– документ, отвечающий на&nbsp;вопрос: «Как надо делать?». Составляли его&nbsp;и&nbsp;мы, пока не&nbsp;нашли другой подход. Теперь на&nbsp;старте мы&nbsp;проводим продуктовое проектирование. В&nbsp;итоге получаем документацию здорового человека, которую бизнесу проще понять, а&nbsp;времени на&nbsp;ее&nbsp;создание тратится в&nbsp;3 раза меньше, чем&nbsp;на&nbsp;проработку ТЗ.&nbsp;</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/151b462f2ff37308b357cb2b1a39b600"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c35d8e6caacf4f5eb686c6a8a5ba5c7c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Что такое ТЗ&nbsp;и&nbsp;почему его&nbsp;составляют</h2>
<p><span style="font-weight: 400;">Техническое задание (ТЗ) – это&nbsp;документ или&nbsp;пакет документов, определяющих требования и&nbsp;порядок создания IT-продукта. Проще говоря, это&nbsp;задание исполнителю от&nbsp;заказчика, в&nbsp;котором прописано, какой результат хочет получить заказчик, и&nbsp;как&nbsp;исполнитель должен его&nbsp;достигать.&nbsp;</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Согласно ГОСТ 34, хорошее ТЗ&nbsp;должно быть единичным, непротиворечивым, актуальным, выполнимым, проверяемым, однозначным.
</div>

<p>ТЗ обычно составляют в&nbsp;формате текста. Иногда к&nbsp;тексту прилагают прототипы будущего продукта. Готовый документ содержит информацию о&nbsp;сроках реализации проекта, ожиданиях, рисках, сценариях использования продукта и&nbsp;пользе, которую он&nbsp;должен принести бизнесу и&nbsp;пользователям. Звучит неплохо, но&nbsp;это&nbsp;пока дело не&nbsp;дошло до&nbsp;его&nbsp;создания.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e0f3c2929b9e4d6991acfca41945ec2b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2800/frame-2.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2812444afecce2b3ff1a252c6f54d8a5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5cc6b7873bce4f40978bb58931b28860"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Нельзя просто так&nbsp;взять и&nbsp;составить крутое ТЗ</h2>
<p><strong>У классического подхода к&nbsp;созданию ТЗ&nbsp;есть 4 основные проблемы:</strong></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сложно оценить объём работ&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">ТЗ пишется долго</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Требования описываются очень детально для&nbsp;разработчиков, но&nbsp;от&nbsp;этого становятся нечитаемыми для&nbsp;бизнеса</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">ТЗ устаревает в&nbsp;процессе собственного составления</span></li>
</ol>
<p><span style="font-weight: 400;">Теперь расшифруем.</span></p>
<p><span style="font-weight: 400;">Полноценное ТЗ&nbsp;не&nbsp;пишется сразу после первой встречи с&nbsp;заказчиком. Сначала мы&nbsp;погружаемся в&nbsp;проект, обозначаем требования верхнеуровнево, согласуем. На&nbsp;это&nbsp;нужно время, и&nbsp;тем&nbsp;больше, чем&nbsp;сложнее проект.&nbsp;</span></p>
<p><span style="font-weight: 400;">Дальше просто факт: для&nbsp;крупного проекта с&nbsp;разработкой от&nbsp;6-ти месяцев составление документации занимает 2-3 месяца без&nbsp;учета верхнеуровневого описания требований. Еще&nbsp;один факт: бизнес покупает у&nbsp;нас&nbsp;не&nbsp;ТЗ&nbsp;– он&nbsp;хочет работающий продукт. При&nbsp;этом процесс создания ТЗ&nbsp;оплачивается. Заказчик все&nbsp;это&nbsp;время в&nbsp;ожидании. То&nbsp;есть, он&nbsp;знает, что&nbsp;исполнители заняты делом, вникают, но&nbsp;результат «пощупать» пока нельзя. Находиться в&nbsp;таком подвешенном состоянии не&nbsp;нравится никому.&nbsp;</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6ca23c8d639f4fb88c0d39f7cb036e0e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2801/frame-3.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b91fa8586a654cd5b35578d88877effa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Теперь о&nbsp;том, что&nbsp;внутри. Сила ТЗ&nbsp;в&nbsp;его&nbsp;детализации. Грубо говоря, по&nbsp;хорошему ТЗ&nbsp;команда без&nbsp;лишних вопросов может запилить работающий продукт. Но&nbsp;это&nbsp;фантазии. Во-первых, потому что&nbsp;нельзя идеально детализировать ТЗ. Во-вторых, потому что&nbsp;сильной команде разработки не&nbsp;нужно, чтобы за&nbsp;нее&nbsp;решали, как&nbsp;реализовать «вот эту&nbsp;вот&nbsp;фичу» – она&nbsp;сама придумает изящное решение. А&nbsp;раз&nbsp;так, то&nbsp;время (и&nbsp;деньги) на&nbsp;детальные описания тратится зря. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/d007c25dc74e4ccf8addd2c0bb71facc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2802/frame-4.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/647edd5eb7464f65905808738d911009"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Помните про&nbsp;2-3 месяца создания документации? Так&nbsp;вот&nbsp;за&nbsp;этот срок она&nbsp;может стать дважды, а&nbsp;то&nbsp;и&nbsp;трижды неактуальной. Причин масса: вновь появившиеся требования бизнеса, выход новой версии языка программирования, обновление API&nbsp;для&nbsp;интеграций, новые тренды рынка. </span></p>
<p><span style="font-weight: 400;">Чтобы подстроиться под&nbsp;меняющийся мир, придется переписывать и&nbsp;передоговариваться. Так&nbsp;можно вообще никогда не&nbsp;дописать ТЗ. Поэтому приходится закрывать глаза на&nbsp;окружение, в&nbsp;котором продукт будет существовать. Так, на&nbsp;выходе получается компромисс из&nbsp;того, что&nbsp;хотел получить заказчик в&nbsp;самом начале и&nbsp;того, что&nbsp;будет работать сейчас. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/0d0fc444c243426181ce6a791b489471"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2803/frame-5.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6369f23994c940bc8f68b3156923ce5a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;"><span class="highlighter">Ну и&nbsp;откровение напоследок.</span> Классические ТЗ&nbsp;пытаются быть хорошими и&nbsp;для&nbsp;бизнеса, и&nbsp;для&nbsp;разработчиков. Это&nbsp;снова фантазии. Невозможно создать техническую инструкцию с&nbsp;легко считываемыми бизнес-смыслами. Это&nbsp;как&nbsp;писать руководство по&nbsp;эксплуатации автомобиля, надеясь, что&nbsp;оно&nbsp;будет работать как&nbsp;презентация для&nbsp;привлечения новых инвесторов.&nbsp;</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/370018d51994449fbf85d579bdc18033"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2804/frame-6.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/358f47ae3ae74fd9bbb2d5a6eb2655fc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/375fd328474fe2e1ce96fe4b98d67a43"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/44417aecf0144aff8963af7c81b06649"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как сохранить пользу ТЗ&nbsp;и&nbsp;избавиться от&nbsp;его&nbsp;несовершенств</h2>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сделать оценку объема работ проще</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Ускорить создание документации</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Меньше деталей – больше бизнес-пользы</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Меньше времени на&nbsp;описание – выше актуальность</span></li>
</ol>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Вместо длительного сбора требований мы&nbsp;стали проводить продуктовое проектирование. Оно&nbsp;занимает не&nbsp;более 5 недель. Сначала примерно договариваемся с&nbsp;заказчиком о&nbsp;занятости на&nbsp;каждую неделю, потом уточняем план. Отвечаем в&nbsp;ходе исследования на&nbsp;вопросы:<br></span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Зачем создается продукт и&nbsp;каких бизнесовых целей он&nbsp;должен достичь?</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Что эта&nbsp;за&nbsp;система и&nbsp;как&nbsp;она&nbsp;должна работать?</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Какую архитектуру и&nbsp;какие технологии мы&nbsp;будем использовать?</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Как пользователь будет взаимодействовать с&nbsp;системой?</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сколько будет стоить и&nbsp;сколько будет длиться разработка системы?</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Что мы&nbsp;делаем в&nbsp;первую очередь, а&nbsp;что&nbsp;оставляем на&nbsp;пострелизное развитие?</span></li>
</ul>
<p><span style="font-weight: 400;">Обычно мы&nbsp;на&nbsp;первых двух встречах понимаем, что&nbsp;заказчику нужно проектирование. Уже&nbsp;здесь можем рассказать об&nbsp;этом этапе, о&nbsp;вилке цен&nbsp;и&nbsp;сроках.&nbsp;</span></p>
<p><span style="font-weight: 400;">Заказчик же&nbsp;на&nbsp;второй-третьей встрече понимает, нравится ли&nbsp;ему&nbsp;мы&nbsp;и&nbsp;наш&nbsp;подход, формирует ожидания по&nbsp;бюджету и&nbsp;срокам.&nbsp;</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/4e17f63e422d4820980022f192847417"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/n2ujqwe5/frame-7.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e62c781f83734c3495a96bffc2e08318"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Результат продуктового проектирования – минимальный набор артефактов:&nbsp;</span></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Определение целей и&nbsp;границ проекта —&nbsp;Импакт Маппинг</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Проработка и&nbsp;описание системы и&nbsp;ее&nbsp;работы — Описание системы</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Архитектура и&nbsp;технологии для&nbsp;разработки системы</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Приоритезация задач и&nbsp;выделение первой версии системы</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Роадмап проекта со&nbsp;сроками и&nbsp;стоимостью разработки. Их&nbsp;всегда фиксируем точно. Фичи на&nbsp;пострелизное развитие проекта добавляем в&nbsp;беклог и&nbsp;роадмап на&nbsp;развитие продукта.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Набор метрик для&nbsp;отслеживания результата.</span></li>
</ol>

<div class="umb-macro-highlights">
    <strong></strong>
    Конечно, проекты бывают разные и&nbsp;под&nbsp;их&nbsp;особенности нужно подстраиваться. Например, если задача – модернизировать бизнес-процессы, то&nbsp;мы&nbsp;добавляем в&nbsp;ППИ&nbsp;этап изучения существующей системы и&nbsp;анализ путей ее&nbsp;улучшения. Если нужны специфические интеграции – включаем этап для&nbsp;их&nbsp;проработки. Словом, проявляем гибкость, от&nbsp;которой зависит бизнес-польза.
</div>

<p><span style="font-weight: 400;">Дальше о&nbsp;том, что&nbsp;внутри каждого из&nbsp;артефактов.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4cd89736af78428a9ad2f064a4829744"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Определение целей и&nbsp;границ проекта</h3>
<p><span style="font-weight: 400;">Начинаем с&nbsp;постановки цели и&nbsp;обсуждаем с&nbsp;заказчиком границы проекта. Прибегаем к&nbsp;Карте влияний. </span><span style="font-weight: 400;"></span></p>


    <div class="article-block">
        <a href="/articles/impact-mapping/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/niwpclnv/ay-20-2025-1.png"
         alt=""
         itemprop="">

    
            <span>Карта влияний: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>


<p><span style="font-weight: 400;">Синхронизируем нашу команду с&nbsp;бизнесом. Создаем базу для&nbsp;дальнейшей разработки и&nbsp;принятия решений. Всего этого не&nbsp;сделать без&nbsp;грамотной постановки целей. </span></p>


    <div class="article-block">
        <a href="/articles/development-goals-at-project-start/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/fhgelggy/dall-e-&#x43F;&#x438;&#x43D;&#x433;&#x432;&#x438;&#x43D;-&#x432;-&#x441;&#x43C;&#x43E;&#x43A;&#x438;&#x43D;&#x433;&#x435;.webp"
         alt=""
         itemprop="">

    
            <span>Постановка целей в&nbsp;digital-разработке: как&nbsp;не&nbsp;провалить запуск цифрового продукта</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>


<h3>Сбор требований и&nbsp;описание системы</h3>
<p><span style="font-weight: 400;">Самый трудоемкий этап — 60–70% от&nbsp;всего объема работ.</span></p>
<p><span style="font-weight: 400;">Мы собираем требования почти как&nbsp;при&nbsp;разработке ТЗ, но&nbsp;не&nbsp;углубляемся в&nbsp;детали реализации функциональности продукта, которую обсуждаем. Получается описание системы. Это&nbsp;документ, из&nbsp;которого бизнес понимает, какой продукт получится в&nbsp;итоге, а&nbsp;команда разработки может декомпозировать его&nbsp;по&nbsp;задачам, принять решения о&nbsp;реализации фич&nbsp;и&nbsp;стартовать разработку.</span></p>
<p><span style="font-weight: 400;"><span class="highlighter">Описание системы написано не&nbsp;характерным для&nbsp;гостовских ТЗ&nbsp;неформальным языком. Это&nbsp;сознательный шаг</span> — так&nbsp;мы&nbsp;упрощаем онбординг для&nbsp;новичков, которые будут входить в&nbsp;проект на&nbsp;следующих этапах. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/03697ef8d0ed43a48da3acf39938d10d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2806/frame-8.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ec072d668371472e8051c1212479cf21"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Это работает. Для&nbsp;одного нашего клиента мы&nbsp;делали проектирование с&nbsp;описанием системы. Согласно фидбеку, время на&nbsp;онбординг в&nbsp;проект после этого стало составлять 2 недели вместо 2-х месяцев. Это&nbsp;не&nbsp;значит, что&nbsp;через две&nbsp;недели разработчик уже&nbsp;пилит фичи на&nbsp;100% эффективности, но&nbsp;он&nbsp;может участвовать в&nbsp;обсуждениях по&nbsp;проекту и&nbsp;не&nbsp;теряться на&nbsp;них.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/abd6815e6daa491b8facdf71a4800262"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Архитектура и&nbsp;технологии</h3>
<p><span style="font-weight: 400;">Когда у&nbsp;нас&nbsp;на&nbsp;90% готово описание системы, мы&nbsp;формируем верхнеуровневую архитектуру и&nbsp;подбираем технологии, на&nbsp;которых будем создавать продукт.</span></p>
<p><span style="font-weight: 400;">Если у&nbsp;клиента есть своя техническая команда, то&nbsp;координируемся с&nbsp;ней. Смотрим на&nbsp;технологии, внутренние и&nbsp;внешние системы для&nbsp;интеграций, согласовываем технологии и&nbsp;подходы.</span></p>
<p><span style="font-weight: 400;">Основной критерий качества здесь — быстрый старт разработки, актуальные технологии, возможность масштабирования архитектуры и&nbsp;поддержка продукта без&nbsp;бубна и&nbsp;матов. Подробнее в&nbsp;процесс закладывания архитектуры мы&nbsp;погрузились в&nbsp;отдельной статье: разобрали 6 понятных принципов, которые помогут сориентироваться, даже если вы&nbsp;впервые сталкиваетесь с&nbsp;этой областью знаний.&nbsp;</span><span style="font-weight: 400;"></span></p>


    <div class="article-block">
        <a href="/articles/architectures-principles/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/xennaztf/chatgpt-image-&#x43D;&#x430;&#x441;&#x442;&#x44F;-3d-scene-apr-2025.png"
         alt=""
         itemprop="">

    
            <span>Как&nbsp;заложить архитектуру цифрового продукта: 6 практических принципов</span>
                <p>&#x410;&#x43D;&#x434;&#x440;&#x435;&#x439; &#x421;&#x442;&#x435;&#x43F;&#x430;&#x43D;&#x43E;&#x432;, &#x422;&#x435;&#x445;&#x434;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440;, &#x43F;&#x430;&#x440;&#x442;&#x43D;&#x451;&#x440;</p>
        </a>
    </div>


<h3>Приоритезация задач и&nbsp;выделение первой версии продукта</h3>
<p><span style="font-weight: 400;">Ближе к&nbsp;концу проектирования продукта мы&nbsp;приоритезируем описанные фичи и&nbsp;выделяем первую версию продукта. Работаем вместе с&nbsp;заказчиком: предлагаем свое видение и&nbsp;принимаем критику.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Суть: в&nbsp;первую версию идет функциональность, которая работает на&nbsp;достижение целей, поставленных в&nbsp;начале проекта. При&nbsp;этом разработку первой версии стараемся уложить в&nbsp;3–4 месяца для&nbsp;крупных проектов.
</div>

<p>Эффективный инструмент для&nbsp;визуализации пользовательских сценариев и&nbsp;приоритезации функциональности – User Story Mapping. Он&nbsp;помогает команде сосредоточиться на&nbsp;создании ценности для&nbsp;пользователя и&nbsp;бизнеса.&nbsp;</p>


    <div class="article-block">
        <a href="/articles/how-to-use-usm/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/gjznoga4/frame-5009624.png"
         alt=""
         itemprop="">

    
            <span>Как&nbsp;использовать User Story mapping при&nbsp;создании цифрового продукта</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>


<h3>Оценка разработки и&nbsp;роадмап продукта</h3>
<p><span style="font-weight: 400;">Финальный этап: декомпозируем задачи, уточняем оценку на&nbsp;разработку первой версии и&nbsp;формируем подробный план работ с&nbsp;разбивкой по&nbsp;функциональности. Далее прикидываем роадмап развития продукта после запуска. В&nbsp;него идут те&nbsp;фичи, которые не&nbsp;попали в&nbsp;первую версию. Все&nbsp;это&nbsp;согласовываем с&nbsp;заказчиком, собираем обратную связь и&nbsp;вносим коррективы в&nbsp;план, если надо.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ae0fac71eab5f87f7542cf651d2c775c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7d442bd4af034749b980493640f2d443"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>А что&nbsp;потом?</h2>
<p><span style="font-weight: 400;">После продуктового проектирования идет стандартный процесс разработки продукта: прототипирование и&nbsp;дизайн, разработка, тестирование и&nbsp;запуск. И&nbsp;здесь, конечно, стоит подумать о&nbsp;составе команды, которая реализует все&nbsp;задуманное. </span></p>


    <div class="article-block">
        <a href="/articles/product-team/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/tadn1ryk/frame-500&#x432;&#x432;&#x432;&#x432;9585.png"
         alt=""
         itemprop="">

    
            <span>Собираем команду для&nbsp;цифрового продукта: роли, подходы и&nbsp;практические советы</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>


</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/b35b36b89ce14b6ba998e8e9fa2678b8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/nuld3rvc/frame-9.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/afd151e1b4a343518bcc29db663054a8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Продуктовое проектирование в&nbsp;нашей практике показало себя как&nbsp;довольно универсальный подход. Единственный, пожалуй, случай, когда оно&nbsp;не&nbsp;будет работать – тендерная разработка. Для&nbsp;таких проектов важно четкое соответствие положениям ГОСТа.&nbsp;</span></p>
<p><span style="font-weight: 400;">Но не&nbsp;поймите неправильно – наш&nbsp;подход удовлетворяет требованиям </span><a href="https://www.swrit.ru/doc/gost34/34.602-2020.pdf"><span style="font-weight: 400;">ГОСТ 34</span></a><span style="font-weight: 400;"> на&nbsp;разработку ТЗ, просто улучшает его&nbsp;и&nbsp;делает менее бюрократическим. То&nbsp;есть мы&nbsp;меняем форму и&nbsp;упрощаем восприятие, а&nbsp;не&nbsp;бездумно вырываем куски из&nbsp;привычной для&nbsp;многих документации. А&nbsp;еще&nbsp;сокращаем время на&nbsp;онбординг команды и&nbsp;быстрее стартуем все&nbsp;то, что&nbsp;идет после проектирования продукта. Получается win-win.&nbsp;</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Карта влияний: как на старте повысить шансы проекта на успех
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Пара часов в начале проекта + Карта влияний = ясные приоритеты, экономия бюджета и больше шансов на успех. Рассказываем, как это работает.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/impact-mapping/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/impact-mapping/</guid>

                <pubDate>Mon, 12 Jan 2026 03:28:49 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Карта влияний: как на старте повысить шансы проекта на успех</h1>
                                <figure>
                                    <img src="/Media/niwpclnv/ay-20-2025-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1463132891df43919ae3145d92561418"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b65faa694eaf4c68917f14935434412d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Мы помогаем клиентам запускать эффективные IT-продукты и&nbsp;развивать с&nbsp;их&nbsp;помощью бизнес. Обычно это&nbsp;технически-сложные решения — финансовые и&nbsp;медицинские сервисы, внутренние системы для&nbsp;персонала и&nbsp;т.д.</p>
<p>Раньше мы&nbsp;предлагали клиентам начать работу над&nbsp;такими продуктами с&nbsp;разработки Технического задания. Этот этап мог&nbsp;занимать у&nbsp;нас&nbsp;3 месяца, в&nbsp;течение которых мы&nbsp;собирали требования с&nbsp;клиента и&nbsp;фиксировали их. В&nbsp;итоге получался большой документ с&nbsp;описанием того, что&nbsp;клиент хочет видеть в&nbsp;своем продукте.</p>
<p>В таком подходе есть недостаток: на&nbsp;выходе не&nbsp;всегда получается то, что&nbsp;хотел клиент. То&nbsp;есть функциональность он&nbsp;получил какую заявлял, но&nbsp;продукт не&nbsp;достигает поставленных бизнесовых целей. Все&nbsp;потому, что&nbsp;ТЗ&nbsp;отвечает на&nbsp;вопрос ЧТО, но&nbsp;не&nbsp;отвечает на&nbsp;вопрос ЗАЧЕМ. То&nbsp;есть у&nbsp;нас&nbsp;нет&nbsp;четкого понимания как&nbsp;наши действия, описанные в&nbsp;ТЗ, приведут к&nbsp;достижению целей клиента. И&nbsp;именно эту&nbsp;задачу решает Карта влияний.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="quotes"
            data-content-element-type-key="edc4593f-48e4-46e9-8acf-37e80491c5e9"
            data-element-udi="umb://element/aac1384e51244bbcaec063abba6b0e72"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<blockquote>
    <div class="blockquote-body">
        Когда мы&nbsp;внедрили этот инструмент в&nbsp;свои процессы, мы&nbsp;сократили сроки от&nbsp;начала проекта до&nbsp;запуска первой версии. И, что&nbsp;самое главное, стали четко понимать, что&nbsp;и&nbsp;зачем мы&nbsp;делаем уже&nbsp;на&nbsp;самых ранних стадиях работы. А&nbsp;еще, в&nbsp;конечном итоге, увеличили количество успешных для&nbsp;бизнеса проектов.
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    
                </cite>
            </div>
        </div>
    </footer>
</blockquote>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d950e4936b5e6eaccc17b1d25255f342"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/667bd7ce1ef84b0fb47505a3e5c548ca"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Что такое Карта влияний</h2>
<p>Карта влияний — это&nbsp;<a rel="noopener" href="https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D1%81%D0%B2%D1%8F%D0%B7%D0%B5%D0%B9" target="_blank" title="Статья о&nbsp;диаграмме связей на&nbsp;Википедии">ментальная карта</a>, которая определяет цели проекта и&nbsp;влияния, которые должны помочь достичь этих целей.</p>
<p>Основная ценность этого инструмента в&nbsp;том, что&nbsp;с&nbsp;самого начала мы&nbsp;обсуждаем не&nbsp;абстрактные хотелки, а&nbsp;конкретные бизнес-показатели и&nbsp;способы их&nbsp;достижения.</p>

<div class="umb-macro-highlights">
    <strong>Карта влияний отвечает на&nbsp;вопросы: каких целей мы&nbsp;должны достичь и&nbsp;как&nbsp;нам&nbsp;это&nbsp;сделать.</strong>
    
</div>

<p>Карта влияний – мощный способ избежать буксования проекта на&nbsp;старте, но&nbsp;он&nbsp;работает в&nbsp;связке с&nbsp;более широкой практикой осмысленного старта. Почему именно постановка целей — неформальная, но&nbsp;чёткая — определяет успех продукта, мы&nbsp;разбирали в&nbsp;отдельном материале.</p>


    <div class="article-block">
        <a href="/articles/development-goals-at-project-start/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/fhgelggy/dall-e-&#x43F;&#x438;&#x43D;&#x433;&#x432;&#x438;&#x43D;-&#x432;-&#x441;&#x43C;&#x43E;&#x43A;&#x438;&#x43D;&#x433;&#x435;.webp"
         alt=""
         itemprop="">

    
            <span>Постановка целей в&nbsp;digital-разработке: как&nbsp;не&nbsp;провалить запуск цифрового продукта</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>


<h3>Ценность для&nbsp;заказчика</h3>
<p>Заполняя Карту влияний, заказчик оценивает создание продукта с&nbsp;уровня достижения результата. Он&nbsp;видит, какие действия предпримет команда разработки и&nbsp;как&nbsp;это&nbsp;должно повлиять на&nbsp;конечную цель.&nbsp;</p>
<p>Часто составление Карты влияний позволяет сократить объем работ, который заказчик изначально предполагал, и&nbsp;сэкономить бюджет на&nbsp;создание продукта.</p>
<h3>Ценность для&nbsp;команды разработки</h3>
<p>Благодаря заполненной Карте влияний команда разработки знает, зачем вообще существует этот проект и&nbsp;ради чего они&nbsp;целыми днями делают все&nbsp;эти&nbsp;задачи.</p>
<h3>Ценность для&nbsp;менеджеров</h3>
<p>Карта влияний становится для&nbsp;менеджера инструментом, с&nbsp;помощью которого он&nbsp;может оценивать новые идеи по&nbsp;проекту и&nbsp;вместе с&nbsp;заказчиком решать — внедрять ту&nbsp;или&nbsp;иную фичу сейчас, в&nbsp;следующем релизе или&nbsp;вообще отказаться от&nbsp;нее.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/d9fe7068e9ca46a58f695594fc990122"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e4143ad68ab64463b0e1861f31ede3bd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9778dae961c340c69880418636643cb7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как составить Карту влияний</h2>
<p>Создавая Карту влияний, мы&nbsp;последовательно заполняем четыре блока:&nbsp;Зачем, Кто, Как, Что. Не&nbsp;забываем перед этим прояснить и&nbsp;утвердить <a href="/articles/task-understanding/" title="Что такое «понимание задачи» и&nbsp;как&nbsp;оно&nbsp;помогает в&nbsp;проектах">понимание задачи</a>.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/bf116f36dd5c36a268b3c807cf2ed060"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/070a50175275427989486db32a14116b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2645/group-11-3-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/710861a8aa2d07d7ca37ea7d2f4db361"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f7468d535e87495095a44c0ed6f3cfeb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<div class="umb-macro-highlights">
    <strong>Полезное действие карты влияний:</strong>
    мы&nbsp;видим четкую связь между функциональностью, которую мы&nbsp;заполнили в&nbsp;блоке ЧТО, и&nbsp;целью из&nbsp;блока ЗАЧЕМ. Все, что&nbsp;мы&nbsp;хотим сделать на&nbsp;проекте, должно влиять на&nbsp;достижение поставленной цели. А&nbsp;что&nbsp;не&nbsp;влияет — не&nbsp;делаем.
</div>

<h3>Зачем</h3>
<p><span style="font-weight: 400;">Фундамент карты. Заполняя этот блок, мы&nbsp;отвечаем на&nbsp;вопрос: «Зачем мы&nbsp;это&nbsp;делаем». Фактически, определяем цель, которую бизнес стремится достичь.</span></p>
<p><span style="font-weight: 400;">Например, у&nbsp;нас&nbsp;есть клиент — банк, на&nbsp;сайте которого можно получить кредит онлайн. В&nbsp;месяц выдается 500 таких кредитов. Клиент хочет больше.</span></p>
<p><span style="font-weight: 400;">Мы собираемся с&nbsp;нашим клиентом, уточняем и&nbsp;фиксируем цель — </span><strong>увеличить количество выдаваемых кредитов с&nbsp;сайта в&nbsp;2 раза через 6 месяцев после запуска</strong>. <span style="font-weight: 400;">Это и&nbsp;есть наше</span> ЗАЧЕМ.</p>
<p><span style="font-weight: 400;">В этом блоке обязательно нужно формулировать цель по&nbsp;</span><a rel="noopener" href="/articles/smart-goals/" target="_blank" title="Постановка целей по&nbsp;SMART в&nbsp;разработке цифровых продуктов"><span style="font-weight: 400;">SMART</span></a><span style="font-weight: 400;">:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">цель — увеличить количество выдаваемых кредитов через сайт банка;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">объект измерения — количество выдаваемых кредитов через сайт банка в&nbsp;месяц;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">где считаем — отчеты отдела кредитования банка;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">сейчас — 500 кредитов;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">цель — 1 000 кредитов.</span></li>
</ul>

<div class="umb-macro-highlights">
    <strong></strong>
    Если мы&nbsp;сразу не&nbsp;определим количественные показатели цели, то&nbsp;в&nbsp;итоге можем сесть в&nbsp;лужу. Например, мы&nbsp;говорим, что&nbsp;хотим увеличить количество выдаваемых кредитов, и&nbsp;дальше идем заполнять следующие уровни. При&nbsp;этом клиент может хотеть увеличить количество кредитов в&nbsp;два&nbsp;раза за&nbsp;год&nbsp;или&nbsp;в&nbsp;десять  раз&nbsp;за&nbsp;два&nbsp;месяца. Действия, которые нам&nbsp;надо предпринять для&nbsp;достижения каждой из&nbsp;этих целей, будут разные.
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1d5f858a357f9cdce6435683ab68172e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/3c6a975119b847779986674a71e0598e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2639/&#x437;&#x430;&#x447;&#x435;&#x43C;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d7e15eb2ad5b4b0b3d6285c531e66ee6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d963eb503c29402ab6fd1d02a47de4b6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Кто</h3>
<p><span style="font-weight: 400;">Действующие лица. Те&nbsp;роли, которые могут оказать влияние на&nbsp;достижение цели. Чтобы их&nbsp;определить, достаточно ответить на&nbsp;вопросы: на&nbsp;чье&nbsp;поведение мы&nbsp;хотим повлиять; кто&nbsp;может помочь в&nbsp;достижении цели; кто&nbsp;может помешать.</span></p>
<p><span style="font-weight: 400;">Можно указывать конкретных людей, отделы, сегменты целевой аудитории, организации и&nbsp;т.д.</span></p>
<p><span style="font-weight: 400;">Роли можно условно поделить на&nbsp;три&nbsp;вида:</span></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Первичные действующие лица. Это&nbsp;конечные пользователи. Именно для&nbsp;удовлетворения их&nbsp;потребностей создается продукт.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Вторичные действующие лица, которые предоставляют услуги.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Закулисные действующие лица, которые могут повлиять на&nbsp;решения по&nbsp;продукту: основные ЛПР, регулирующие органы и&nbsp;т.д.</span></li>
</ol>
<p><span style="font-weight: 400;">С нашим клиентом-банком мы&nbsp;определили, что&nbsp;действующими лицами будут:</span></p>
<ul>
<li><span style="font-weight: 400;">Клиенты банка, которым нужен кредит.</span></li>
<li><span style="font-weight: 400;">Сотрудники отдела кредитования банка.</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b4685af7a9e53d94b7d6f08bb165db19"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/9250b783af894091b5a313969cfc365a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2641/&#x43A;&#x442;&#x43E;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3cae390709b49a8a8131326913ece034"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0dcb3b109e974f158d4d88dfdb6d07c7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как</h2>
<p><span style="font-weight: 400;">Это примеры влияний. На&nbsp;этом уровне мы&nbsp;соотносим действующих лиц&nbsp;с&nbsp;бизнес-целью. Отвечаем на&nbsp;вопросы: как&nbsp;действующее лицо может помочь нам&nbsp;достигнуть цели; как&nbsp;должно измениться поведение действующих лиц.</span></p>
<p><span style="font-weight: 400;">Мы выдвигаем гипотезу, что&nbsp;отдел кредитования может быстрее обрабатывать заявки на&nbsp;кредиты с&nbsp;сайта, и&nbsp;это&nbsp;позволит терять меньше клиентов.</span></p>
<p><span style="font-weight: 400;">Клиенты, в&nbsp;свою очередь, должны отправлять формы без&nbsp;ошибочных данных. И&nbsp;вообще, хорошо, если они&nbsp;это&nbsp;будут делать быстро.</span></p>
<p><span style="font-weight: 400;">Также у&nbsp;нас&nbsp;есть отзывы от&nbsp;клиентов: анкета на&nbsp;сайте громоздкая, её&nbsp;сложно заполнить. Проще прийти в&nbsp;офис и&nbsp;там&nbsp;уже&nbsp;подать заявку на&nbsp;кредит. Как&nbsp;влияние запишем — подавать заявки на&nbsp;кредит через сайт, а&nbsp;не&nbsp;в&nbsp;офисах банка.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/240383ebdb431a02236e2ce7a1146e5f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/04929656149a49ed9f911aa905770b83"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2640/&#x43A;&#x430;&#x43A;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/10a18ab2533437c16c54ddacb74a1727"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/33d2e9fa9c7f463bbf697ca6474a2017"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Что</h2>
<p><span style="font-weight: 400;">Границы проекта или&nbsp;поставляемая функциональность. Переходим на&nbsp;обсуждение того, что&nbsp;мы&nbsp;можем сделать, чтобы добиться необходимых влияний. Это&nbsp;и&nbsp;есть наши задачи на&nbsp;проект.</span></p>
<p><span style="font-weight: 400;">Чтобы посетители сайта подавали кредит через сайт, а&nbsp;не&nbsp;в&nbsp;офисах банка, мы&nbsp;можем упростить им&nbsp;заполнение анкеты. Например, автоматически заполнять некоторые поля информацией из&nbsp;Госуслуг. А&nbsp;еще&nbsp;проработаем логику анкеты и&nbsp;постараемся ее&nbsp;сократить.   </span></p>
<p><span style="font-weight: 400;">Чтобы помочь сотрудникам отдела кредитования быстрее обрабатывать заявки, мы&nbsp;можем автоматизировать проверку данных анкет.  </span></p>
<p><span style="font-weight: 400;">По этой же&nbsp;схеме формулируем другие гипотезы этого блока.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5ced0629eb854871b0e14603a0911b43"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/2eda0c5c663b40d4a292e07ddb090c07"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2642/&#x447;&#x442;&#x43E;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c54a6d9bcefe0d4b5d0d076e09810474"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/dd71f821fe14468381719d318cf54f19"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Не вдавайтесь в&nbsp;подробности реализации задач из&nbsp;блока ЧТО. На&nbsp;этом этапе нам&nbsp;важно выдвинуть гипотезы и&nbsp;обозначить влияния. Уточнять реализацию будем на&nbsp;следующих шагах разработки.</p>
<p>Если клиент пришел с&nbsp;готовым списком функциональных требований, мы&nbsp;должны сверить эти&nbsp;требования с&nbsp;нашей картой влияний — убедиться, что&nbsp;все&nbsp;они&nbsp;оказывают влияния на&nbsp;достижение цели из&nbsp;блока ЗАЧЕМ. Если оказывают, смело добавляем их&nbsp;в&nbsp;ЧТО. Если нет&nbsp;— обсуждаем, а&nbsp;нужно ли&nbsp;нам&nbsp;вообще это&nbsp;делать.&nbsp;</p>
<p>После заполнения всех блоков стоит еще&nbsp;раз&nbsp;пройтись по&nbsp;карте и&nbsp;оценить, насколько ЧТО&nbsp;влияет на&nbsp;ЗАЧЕМ, и&nbsp;не&nbsp;записали ли&nbsp;мы&nbsp;что&#8209;то&nbsp;лишнее.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/c8f59cc0d39a487f85677fbc9c2e907a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/01c8b7a8fce245b5adceb2e3fcddcf4b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6b52ef759390407c9e27be4e6c6e4373"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>После составления карты</h2>
<p><span style="font-weight: 400;">Обычно после создания Карты влияний вы&nbsp;получаете огромную схему с&nbsp;гипотезами и&nbsp;верхнеуровневыми задачами. Перед тем, как&nbsp;брать задачи из&nbsp;блока ЧТО&nbsp;в&nbsp;проработку, полезно приоритезировать гипотезы и&nbsp;оценить — достаточно ли&nbsp;в&nbsp;первой версии продукта сделать самые приоритетные задачи, чтобы достичь поставленной цели? Если ответ «Да», то&nbsp;можно фиксировать границы первой версии этими задачами. Если «Нет» — добавляем менее приоритетные задачи в&nbsp;первую версию, пока не&nbsp;получим утвердительный ответ.</span></p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2644/&#x438;&#x43C;&#x43F;&#x430;&#x43A;&#x442;_&#x43C;&#x435;&#x43F;&#x43F;&#x438;&#x43D;&#x433;_&#x441;&#x43A;&#x440;&#x438;&#x43D;&#x448;&#x43E;&#x442;_&#x441;_&#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;_1-1.png"
         alt=""
         itemprop="">


        <figcaption>
            Пример «средней» по&nbsp;размеру Карты влияний из&nbsp;одного проекта. Зеленым отмечены задачи, которые вошли в&nbsp;первую версию.
        </figcaption>
</figure>

<p><span style="font-weight: 400;">Мы пользуемся Картой влияний на&nbsp;всех этапах проекта. Она&nbsp;служит поверочным эталоном, с&nbsp;которым мы&nbsp;сверяем новые идеи и&nbsp;задачи, возникающие в&nbsp;процессе производства. Это&nbsp;помогает&nbsp;контролировать объем задач, которые уходят в&nbsp;разработку, не&nbsp;затягивать сроки релиза и&nbsp;не&nbsp;раздувать бюджет.</span></p>
<p><span style="font-weight: 400;">На практике одним из&nbsp;следующих этапов <a href="/articles/how-to-stop-writing-huge-documentation-and-start-development-faster/" title="Почему продуктовое проектирование лучше формального ТЗ">проектирования продукта</a> после составления Карты влияний становится USM. К&nbsp;этому инструменту мы&nbsp;обращаемся, когда нужно переходить от&nbsp;глобальных целей к&nbsp;конкретным пользовательским историям. User Story Mapping помогает связать фичи с&nbsp;поведением пользователей. Мы&nbsp;рассказываtv, как&nbsp;правильно применять этот инструмент в&nbsp;<a href="/articles/how-to-use-usm/" title="Как использовать User Story mapping при&nbsp;создании цифрового продукта">отдельной статье</a>.</span></p>
<h2>Минусы и&nbsp;подводные камни</h2>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Карта влияний построена на&nbsp;гипотезах. Она&nbsp;не&nbsp;гарантирует достижения цели, даже если вы&nbsp;реализуете все&nbsp;влияния.&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Есть соблазн добавить в&nbsp;блок ЧТО&nbsp;функциональность, которая не&nbsp;будет напрямую влиять на&nbsp;конечную цель. Это&nbsp;лечится ответом на&nbsp;вопрос: как&nbsp;то, что&nbsp;мы&nbsp;записали, будет влиять на&nbsp;достижение цели.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Когда разработка уже&nbsp;идет полным ходом, можно забывать сверяться с&nbsp;Картой влияний. Мы&nbsp;после каждой итерации разработки стараемся синхронизировать наше текущее состояние проекта с&nbsp;картой.</span></li>
</ol>
<hr>
<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Собираем команду для цифрового продукта: роли, подходы и практические советы
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Какие роли ключевые в продуктовой разработке, как их закрыть — фрилансом, аутсорсом или наймом — и как выбрать подход к команде под задачи.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/product-team/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/product-team/</guid>

                <pubDate>Mon, 12 Jan 2026 03:20:01 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Собираем команду для цифрового продукта: роли, подходы и практические советы</h1>
                                <figure>
                                    <img src="/Media/tadn1ryk/frame-500&#x432;&#x432;&#x432;&#x432;9585.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2339e2f2729a4c8eb6f8902324704c6a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Цифровой продукт — это&nbsp;больше, чем&nbsp;просто функция или&nbsp;интерфейс. Его&nbsp;создание – это&nbsp;процесс, требующий не&nbsp;только технических навыков, но&nbsp;и&nbsp;правильной организации работы команды. В&nbsp;продуктах высока степень неопределенности на&nbsp;каждом этапе разработки. Поэтому каждый участник процесса должен качественно эту&nbsp;неопределенность снижать. Разберемся, какие роли важны для&nbsp;продуктовой разработки, чем&nbsp;отличается работа с&nbsp;фрилансерами, аутсорсингом и&nbsp;собственной командой, и&nbsp;как&nbsp;выбрать правильный подход.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/625c790a6c6048979ba041a1d8ea74b0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5c745ec4c3cf4d448e5132d8c85c6b9b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Почему продуктовая разработка — это&nbsp;не&nbsp;про&nbsp;сайты?</h2>
<p dir="ltr">Разработка сайтов или&nbsp;лендосов — понятный процесс с&nbsp;заранее предсказуемым результатом. Есть макет, структура страниц, минимальная степень неопределенности. Продукты — другое дело: более долгое и&nbsp;изменчивое. Здесь на&nbsp;каждом этапе может возникать новое «а что&nbsp;если?», которое меняет задачи и&nbsp;подходы. Например, что&nbsp;важнее: доработать интерфейс или&nbsp;срочно выпустить новую фичу?</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/c3922ab3b1c04cc7a3f9307b935fee90"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Поэтому команды для&nbsp;разработки продуктов отличаются: нужен не&nbsp;просто набор специалистов, а&nbsp;экосистема, где&nbsp;роли и&nbsp;процессы учитывают постоянные изменения.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d56993e6135a4f29b21d873164ea60c6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/38b94f1ff21d4244a50cb44a24b70d20"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">На практике не&nbsp;все&nbsp;понимают эту&nbsp;разницу, и&nbsp;порой даже не&nbsp;ощущают в&nbsp;ней&nbsp;необходимости. Недавно столкнулись с&nbsp;кейсом: лидер команды пришёл с&nbsp;задачей создания продукта, но&nbsp;сделать его&nbsp;хотел в&nbsp;традициях производства сайтов. Клиент ожидал, что&nbsp;за&nbsp;два&nbsp;месяца ему&nbsp;подготовят дизайн, потом за&nbsp;ещё&nbsp;месяц напишут ТЗ, согласуют и&nbsp;еще&nbsp;спустя пару месяцев запустят готовое решение. Сценарий, когда можно за&nbsp;месяц сделать дизайны и&nbsp;швырнуть их&nbsp;в&nbsp;разработку, которая тоже быстро все&nbsp;это&nbsp;зарелизит, в&nbsp;голове клиента часто выступает как&nbsp;единственно верный и&nbsp;возможный. Но&nbsp;попытки придерживаться таких методов сделать качественный продукт не&nbsp;позволят. Это&nbsp;тот&nbsp;случай, когда расхождение на&nbsp;понятийном уровне ведет к&nbsp;провалу сразу.</p>
<p dir="ltr">Итак, стороны сил&nbsp;прояснили, теперь будем погружаться в&nbsp;тонкости командных взаимодействий.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/c5cbccf4ed27400eb9042bb726ae0557"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8c14e54c07f44e2dab562e10dd4091f6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d1c6dce7aacf47989c6b5b02e877ed27"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Главные роли в&nbsp;команде продукта</h2>
<p dir="ltr">Чтобы цифровой продукт развивался, а&nbsp;не&nbsp;застревал на&nbsp;этапе «почти готово», важно, чтобы каждая роль закрывала свою зону ответственности и&nbsp;помогала преодолевать неопределенности в&nbsp;проекте. Вот&nbsp;ключевые игроки.</p>
<h3 dir="ltr">Владелец продукта&nbsp;</h3>
<p dir="ltr">Он отвечает за&nbsp;то, чтобы бизнес-цели продукта не&nbsp;терялись в&nbsp;бесконечных доработках. Это&nbsp;человек, который знает, что&nbsp;нужно рынку, фильтрует идеи команды и&nbsp;решает, что&nbsp;делать сейчас, а&nbsp;что&nbsp;потом. Например, если разработчики предлагают сложную функцию, владелец продукта проверяет: действительно ли&nbsp;она&nbsp;даст бизнесу ценность?</p>
<p dir="ltr">Владелец продукта должен хорошо понимать, что&nbsp;представляет из&nbsp;себя сам&nbsp;продукт, и&nbsp;как&nbsp;на&nbsp;него влияет окружение, в&nbsp;котором он&nbsp;существует или&nbsp;будет существовать. Сюда входит специфика рынка, особенные ограничения, боли аудитории, ее&nbsp;потребности и&nbsp;еще&nbsp;масса мелких деталей, которые позволяют владельцу продукта этот самый продукт развивать, строить небесполезные гипотезы и&nbsp;принимать решения.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/dc01020ef9094c4083c665e6ddab9e19"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--2033489">
    


    <img src="/Media/yxujxrzx/frame-5009582.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/9d667bf662a945df899b4c82f61f93b4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Что&nbsp;важно:</strong>
    владельцем продукта часто выступает заказчик, который знает рынок и&nbsp;понимает, какие задачи важны для&nbsp;бизнеса. Его&nbsp;задача — минимизировать стратегическую неопределенность, расставляя приоритеты и&nbsp;фокусируясь на&nbsp;наиболее ценных решениях.
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3209eea25b50406b95abd5cb1695017e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Главное – возможность и&nbsp;умение принимать решения в&nbsp;продукте. Без&nbsp;этого есть риск сделать что&#8209;то&nbsp;неработающее и&nbsp;ненужное.&nbsp;</p>
<h3 dir="ltr">Продюсер продукта&nbsp;</h3>
<p dir="ltr">Это не&nbsp;просто менеджер, а&nbsp;связующее звено между бизнесом и&nbsp;разработкой. Продюсер снижает хаос: планирует задачи, управляет ожиданиями клиента и&nbsp;защищает команду от&nbsp;лишних изменений. Если бизнес хочет мультикорзину, а&nbsp;разработчики говорят, что&nbsp;на&nbsp;это&nbsp;уйдет полгода, продюсер ищет компромисс: MVP&nbsp;за&nbsp;три&nbsp;месяца или&nbsp;альтернативное решение. Помимо декомпозиции задач, сверки времени их&nbsp;выполнения и&nbsp;общения с&nbsp;командами, продюсер продукта также погружен в&nbsp;приоритеты бизнеса, предметную область. Эти&nbsp;дополнительные знания помогают ему&nbsp;принимать полезные решения по&nbsp;ходу создания продукта.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/77a02b7fbd4449c3a3a51909d574482c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--26420462">
    


    <img src="/Media/peqpqds4/frame-5009580.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9814c1ecacae4067b0434b69c8c8251e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Продюсер продукта – это&nbsp;такая прокачанная версия проджект-менеджера и&nbsp;правая рука владельца продукта. Его&nbsp;вклад в&nbsp;снижение неопределенности — в&nbsp;том, чтобы упорядочить задачи, установить прозрачные процессы и&nbsp;выстроить предсказуемый рабочий ритм. Продюсер снижает неопределенность уже&nbsp;после того, как&nbsp;свою карту сыграет владелец, погрузив его&nbsp;в&nbsp;бизнес.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlight"
            data-content-element-type-key="c44ca899-4d83-4746-bf21-bdd1f8a25ccf"
            data-element-udi="umb://element/0906d4da5b454cfca99d77e2b7dfa4be"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="text-highlight">
  Если владелец продукта не уделил достаточного времени расстановке приоритетов, но команда все равно должна планировать спринт, делать это придется отчасти вслепую. 
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/38666b43138c49cd8eb5c4fa5e115044"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Продюсер может сам&nbsp;принять какие&#8209;то&nbsp;решения о&nbsp;порядке выполнения задач, поскольку погружен и&nbsp;в&nbsp;бизнес, и&nbsp;в&nbsp;процессы производства, но&nbsp;он&nbsp;не&nbsp;сможет всецело заменить стратегическое видение владельца продукта.&nbsp;</p>
<h3 dir="ltr">Аналитик</h3>
<p dir="ltr">Основная функция аналитика при&nbsp;создании цифрового продукта – следить за&nbsp;тем, чтобы требования были не&nbsp;просто реалистичными, а&nbsp;еще&nbsp;не&nbsp;противоречили друг другу и&nbsp;способствовали созданию цельной, согласовано работающей и&nbsp;не&nbsp;разрозненной системы.&nbsp;Аналитик учитывает все&nbsp;ключевые edge-кейсы, нужные и&nbsp;реалистичные сценарии, понимает, как&nbsp;внутренние части разрабатываемого сервиса работают или&nbsp;должны работать друг с&nbsp;другом. За&nbsp;счет этого получается создать цельные, логичные и&nbsp;понятные задачи для&nbsp;команды. Аналитик разбирается, какие требования реалистичны и&nbsp;дадут результат. Его&nbsp;работа: проверить, не&nbsp;станет ли&nbsp;новая функция пятой собачьей ногой, которая никому не&nbsp;нужна.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/40c69b07eeee47abb2b10992a4636ee9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--5761830">
    


    <img src="/Media/e0jnhuvd/frame-5009581.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a5a36ae2780e4a9285d91326fe3e6375"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Аналитик помогает команде ориентироваться в&nbsp;неоднозначных требованиях, выделять ключевые аспекты и&nbsp;фокусироваться на&nbsp;главном, уменьшая тактическую неопределенность.</p>
<h3 dir="ltr">UX-дизайнер</h3>
<p dir="ltr">Дизайнер не&nbsp;просто рисует красивые кнопки. Он&nbsp;проектирует интерфейс так, чтобы пользователи легко достигали своих целей. Например, если продукт рассчитан на&nbsp;массовую аудиторию, UX-дизайнер делает акцент на&nbsp;простоте и&nbsp;доступности.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/9dd1729839e64fdc967a212524fd77f4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--30159036">
    


    <img src="/Media/inqp1ey3/frame-5009583.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/88a41d20a8e34dab9561604b54837097"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Его роль в&nbsp;снижении неопределенности — создание понятных и&nbsp;предсказуемых интерфейсов, которые минимизируют риск недовольства пользователей и&nbsp;обеспечат успешный опыт использования сервиса, где&nbsp;юзеры закрывают свои потребности и&nbsp;не&nbsp;теряются в&nbsp;системе.&nbsp;</p>
<h3 dir="ltr">Тимлид</h3>
<p dir="ltr">Команда разработки может быть классной, но&nbsp;без&nbsp;технического лидера легко уйти не&nbsp;туда. Тимлид отвечает за&nbsp;архитектуру продукта, внедрение инженерных практик, стабильность кода и&nbsp;подготовку продукта к&nbsp;масштабированию. Без&nbsp;него есть риск получить «одноразовый» MVP, который рухнет при&nbsp;первом же&nbsp;увеличении нагрузки.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/9607b2c0bf0145feadbae967655378cc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--10984116">
    


    <img src="/Media/fkyl1kbs/frame-5009579.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/debefc4e7f6e46f78457833f0d55699d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Тимлид снижает техническую неопределенность, принимая правильные архитектурные решения и&nbsp;обеспечивая качество кода. Он&nbsp;выбирает инструменты, распределяет задачи между разработчиками в&nbsp;зависимости от&nbsp;их&nbsp;компетенций и&nbsp;обеспечивает тестирование на&nbsp;каждом этапе. В&nbsp;идеале команда избегает хаоса, внедрение проходит эффективно, а&nbsp;проект остается стабильным и&nbsp;масштабируемым.</p>
<p dir="ltr"><span class="highlighter">Слышали про&nbsp;принцип 3 Амиго?</span> Это&nbsp;подход к&nbsp;коммуникации в&nbsp;разработке, который помогает команде договариваться. Вместо того чтобы сначала что&#8209;то&nbsp;спроектировать, потом реализовать, а&nbsp;потом обнаружить кучу пострелизных проблем, участники обсуждают все&nbsp;вместе заранее. Они&nbsp;уточняют требования, проговаривают возможные сценарии использования и&nbsp;потенциальные риски. В&nbsp;итоге недопонимание уменьшается, качество продукта растёт, а&nbsp;переделывать приходится меньше. Так&nbsp;вот&nbsp;одним из&nbsp;трех амиго зачастую будет тимлид, который еще&nbsp;до&nbsp;старта разработки погружается в&nbsp;продукт, чтобы правильно снизить техническую неопределенность в&nbsp;ходе дальнейшей работы.&nbsp;</p>
<h3 dir="ltr">Команда разработки</h3>
<p dir="ltr">Это разработчики и&nbsp;тестировщики, движущая сила проекта. Они&nbsp;пишут код, тестируют, внедряют новые фичи. Важно, чтобы разработчики умели работать в&nbsp;связке с&nbsp;другими ролями, а&nbsp;не&nbsp;просто выполняли задачи «по инструкции».</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/c051b746a5e441d8999e2aee57218b5d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--49193043">
    


    <img src="/Media/ivuiclxu/frame-500&#x432;&#x432;&#x432;&#x432;&#x432;9584.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/588c1b58e49a4c09b62963bfd44ef377"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Их вклад в&nbsp;снижение неопределенности — четкое исполнение задач, адаптация к&nbsp;изменениям и&nbsp;внимание к&nbsp;деталям.</p>
<h2 dir="ltr">Как заполучить продуктовую команду</h2>
<p dir="ltr">Вариантов не&nbsp;так&nbsp;уж&nbsp;и&nbsp;много: взять фрилансеров, найти аутсорс-подрядчика или&nbsp;нанять своих сотрудников, то&nbsp;есть сформировать команду самостоятельно. Давайте попробуем каждый из&nbsp;этих вариантов рассмотреть.</p>
<p dir="ltr"><span class="highlighter"><strong>Фрилансеры</strong></span> — просто забудьте. Да, они&nbsp;дешевле, чем&nbsp;аутсорсинг и&nbsp;собственная команда, и&nbsp;можно гибко нанимать людей на&nbsp;отдельные задачи. Но&nbsp;пытаться сделать из&nbsp;этого фриланс-команду – только если вам&nbsp;отчаянно нужен челленж.  Фрилансер не&nbsp;будет генерировать гипотезы и&nbsp;погружаться в&nbsp;продукт – он&nbsp;просто выполняет задачу. </p>
<p dir="ltr">Попытки выстроить полноценную продуктовую работу с&nbsp;фрилансерами чаще всего проваливаются, особенно, если опыта управления командой продукта у&nbsp;вас&nbsp;нет. Даже если удастся найти опытных специалистов, проблема не&nbsp;в&nbsp;их&nbsp;компетенциях, а&nbsp;в&nbsp;потенциальном отсутствии коммуникации и&nbsp;погружения. Фрилансеры не&nbsp;взаимодействуют друг с&nbsp;другом на&nbsp;нужном уровне и&nbsp;не&nbsp;вовлекаются в&nbsp;проект настолько, чтобы закрывать продуктовые роли. В&nbsp;результате управление превращается в&nbsp;хаос, сроки срываются, а&nbsp;результатом становится не&nbsp;продукт, а&nbsp;набор разрозненных решений, которые сложно объединить в&nbsp;цельное и&nbsp;работоспособное.</p>

<div class="umb-macro-highlights">
    <strong>Отдельные краткосрочные и&nbsp;нерегулярные задачи – да. А&nbsp;продукты лучше создавать в&nbsp;сработанной команде. </strong>
    
</div>

<p dir="ltr"><span class="highlighter"><strong>Аутсорс</strong></span> – удобный вариант как&nbsp;в&nbsp;отсутствии своей команды, так&nbsp;и&nbsp;при&nbsp;ее&nbsp;наличии. Подрядчики берут на&nbsp;себя весь процесс: от&nbsp;понимания запроса до&nbsp;формирования задач и&nbsp;реализации продукта. Это&nbsp;удобно, когда не&nbsp;хочется углубляться в&nbsp;настройку процессов или&nbsp;управлять командой самостоятельно. Даже если есть штат разработчиков, привлечение внешней команды может сильно помочь на&nbsp;этапе запуска MVP. Эксперты со&nbsp;свежим взглядом быстрее соберут рабочее решение, избежав внутренних надрывов и&nbsp;замыленности. Если проект не&nbsp;взлетит, вы&nbsp;не&nbsp;понесете больших издержек, а&nbsp;если будет успех, сможете передать продукт своей команде и&nbsp;развивать его&nbsp;с&nbsp;учётом новых задач. Главное — выбрать подрядчика с&nbsp;опытом, проверить его&nbsp;портфолио и&nbsp;четко прописать цели и&nbsp;ожидания в&nbsp;контракте.</p>

<div class="umb-macro-highlights">
    <strong>Аутсорс-подрядчики, как&nbsp;правило, уже&nbsp;приобрели опыт выполнения схожих проектов, а&nbsp;это&nbsp;значит работа быстрее и&nbsp;меньше риск нарваться на&nbsp;типичные ошибки. Такая команда будет делать продукт с&nbsp;налаженной внутренней структурой и&nbsp;четкими рабочими процессами, что&nbsp;особенно ценно для&nbsp;проектов с&nbsp;ограниченными сроками. </strong>
    
</div>

<p dir="ltr"><span class="highlighter"><strong>Своя команда</strong></span> — это&nbsp;уже&nbsp;другая лига. Люди в&nbsp;вашей команде будут разбираться в&nbsp;вашем продукте лучше всех, быстро адаптироваться к&nbsp;любым изменениям и&nbsp;работать в&nbsp;долгую. Идеально, если вся&nbsp;кор-экспертиза продукта будет во&nbsp;внутренней команде. Но&nbsp;такие вкусности будут стоить сильно дороже. Своя команда требует больше труда и&nbsp;вложений: искать специалистов, регулярно обучать их, платить зарплаты как&nbsp;минимум в&nbsp;рынке. </p>
<p dir="ltr">Для формирования и&nbsp;поддержания штатной команды, все&nbsp;те&nbsp;же&nbsp;подводные камни с&nbsp;управлением и&nbsp;координацией, но&nbsp;умноженные на&nbsp;2. Нужно будет не&nbsp;разово приложить усилия, а&nbsp;делать это&nbsp;постоянно. Найти квалифицированных специалистов, которые не&nbsp;только обладают нужными навыками, но&nbsp;и&nbsp;разделяют ваши ценности, — задача также непростая. На&nbsp;это&nbsp;уходят месяцы, а&nbsp;иногда и&nbsp;годы. Кроме того, приходится вкладываться в&nbsp;обучение, адаптацию сотрудников и&nbsp;создание правильной атмосферы в&nbsp;коллективе. Это&nbsp;требует больших ресурсов: финансовых, временных и&nbsp;управленческих. </p>

<div class="umb-macro-highlights">
    <strong>Можно ошибиться и&nbsp;нарваться на&nbsp;задержки или&nbsp;вовсе завалить работу. Успех своей команды напрямую зависит от&nbsp;вашей способности выстраивать процессы и&nbsp;удерживать людей.</strong>
    
</div>

<h2 dir="ltr">Как сделать так, чтобы команда работала эффективно</h2>
<p dir="ltr">Тут все&nbsp;просто и&nbsp;честно: главное — наладить нормальное общение. Без&nbsp;этого все&nbsp;развалится. Какое общение считать нормальным – читаем ниже. </p>
<p dir="ltr">Постоянное общение – это&nbsp;не&nbsp;раз&nbsp;в&nbsp;неделю отправлять отчеты или&nbsp;делать регулярные демки. Это&nbsp;обсуждения идей, споры, предложения. Команда должна быть открыта к&nbsp;диалогу. И&nbsp;заказчик тоже. И&nbsp;тут&nbsp;внимание: важно не&nbsp;превращать это&nbsp;общение в&nbsp;пустой базар. Болтать два&nbsp;часа на&nbsp;каждой встрече малоэффективно. </p>
<p dir="ltr">У нас, например, для&nbsp;каждого проекта есть неизменные практики, которые помогают эффективнее продвигать работу. Когда нужно прояснять требования, тимлид, дизайнер и&nbsp;аналитик работают в&nbsp;связке сразу. Не&nbsp;будет такого, что&nbsp;каждый из&nbsp;них&nbsp;отдельно что&#8209;то&nbsp;подумал, а&nbsp;потом на&nbsp;ближайшем совместном митинге оказалось, что&nbsp;все&nbsp;думали в&nbsp;разные стороны. Это&nbsp;как&nbsp;раз&nbsp;к&nbsp;разговору о&nbsp;трех амигосах. Промежуточные результаты тоже стараемся показывать синергетически. Когда делаем демо, всегда приглашаем разработчиков, которые отвечают за&nbsp;демонстрируемую функциональность, чтобы обратная связь не&nbsp;передавалась через посредников, а&nbsp;можно было сразу выстроить диалог по&nbsp;спорным моментам.  </p>

<div class="umb-macro-highlights">
    <strong>Нельзя просто сидеть и&nbsp;ждать, что&nbsp;подрядчик сам&nbsp;по&nbsp;себе все&nbsp;сделает идеально. Все&nbsp;крутое рождается в&nbsp;совместной работе, когда обе&nbsp;стороны вовлечены, готовы слушать, предлагать и&nbsp;иногда искать компромиссы. Это&nbsp;делает процесс живым.</strong>
    
</div>

<p dir="ltr">Критически важно и&nbsp;по-настоящему разобраться, кто&nbsp;за&nbsp;что&nbsp;отвечает. Просто раздать роли — мало, нужно чтобы каждый в&nbsp;своей роли был&nbsp;эффективен и&nbsp;не&nbsp;залезал на&nbsp;зону ответственности другого.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/57dcd40e107042a2a29d2717aeb751d8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--19451675">
    


    <img src="/Media/qrhhmx0y/&#x441;&#x445;&#x435;&#x43C;&#x430;.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f3437c6d25fc4b64a79c56bbe84c2b83"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0506601cdc2e46449c34f72d66b45771"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Например, если продюсер продукта начнет решать проблему не&nbsp;через коммуникацию с&nbsp;владельцем а&nbsp;через прощупывание аналитических метрик, может сделать поверхностные выводы, которые при&nbsp;передаче в&nbsp;разработку не&nbsp;только не&nbsp;помогут, но&nbsp;и&nbsp;навредят проекту. Аналитик, после этого увязает в&nbsp;уточнении деталей, предоставленных продюсером. Тем&nbsp;временем UX-дизайнер, не&nbsp;дожидаясь чётких вводных, начинает улучшать интерфейс на&nbsp;своё усмотрение, полагая, что&nbsp;это&nbsp;будет полезно. Тимлид, пытаясь навести порядок, влезает в&nbsp;обсуждения приоритетов, хотя его&nbsp;задача — архитектура и&nbsp;стабильность кода. Разработчики начинают одновременно работать над&nbsp;несколькими противоречащими друг другу задачами, что&nbsp;приводит к&nbsp;конфликтам в&nbsp;кодовой базе и&nbsp;системе. В&nbsp;итоге уровень неопределенности возрастает, время теряется – если люди не&nbsp;понимают, зачем они&nbsp;здесь, проект сразу погружается в&nbsp;хаос.</p>
<p dir="ltr">Следующая важная сущность – это&nbsp;план проекта. План — штука хорошая, но&nbsp;он&nbsp;не&nbsp;должен быть высечен в&nbsp;камне. Продукты часто меняются, и&nbsp;это&nbsp;нормально. Умение быстро адаптироваться к&nbsp;новым вызовам — вот&nbsp;что&nbsp;делает команды сильными. И&nbsp;здесь гибкость не&nbsp;равна хаосу: команда должна сохранять общий вектор движения (по&nbsp;плану), который позволяет адекватно реагировать на&nbsp;изменения, не&nbsp;теряя фокус.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/ed60148fe896421583cc095cfb9d5727"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>И&nbsp;последнее: люди. Они&nbsp;— самое ценное, что&nbsp;есть у&nbsp;вас&nbsp;в&nbsp;проекте. Если дать команде возможность расти, учиться и&nbsp;развиваться, они&nbsp;вложат в&nbsp;работу больше, чем&nbsp;просто своё время. А&nbsp;это&nbsp;всегда отражается на&nbsp;результате.</strong>
    
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Постановка целей по SMART в разработке цифровых продуктов
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Рассказываем, как методика применима к цифровым продуктам, продуктовым командам и отдельным продуктовым ролям на проекте.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/smart-goals/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/smart-goals/</guid>

                <pubDate>Mon, 12 Jan 2026 03:04:35 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Постановка целей по SMART в разработке цифровых продуктов</h1>
                                <figure>
                                    <img src="/Media/z5uezofu/&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;-&#x44D;&#x43A;&#x440;&#x430;&#x43D;&#x430;-2025-05-06-&#x432;-211458.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0b9181b82d684581963ee9735134f700"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Как понять, что&nbsp;цель не&nbsp;абстрактна, а&nbsp;ведёт к&nbsp;результату? Методика SMART помогает задать фокус, измерить прогресс и&nbsp;не&nbsp;потеряться в&nbsp;таск-трекере. Рассказываем, как&nbsp;это&nbsp;применимо к&nbsp;цифровым продуктам, продуктовым командам и&nbsp;отдельным продуктовым ролям на&nbsp;проекте.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b22029d2306345b1a657ae501cbf99b4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/17cae4b5750b481dbdc556132d154c4b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Что такое SMART-цели</h2>
<p dir="ltr"><strong>SMART – это&nbsp;аббревиатура. Внутри – характеристики: Specific, Measurable, Achievable, Relevant, Time-bound. На&nbsp;русском это: конкретные, измеримые, достижимые, релевантные и&nbsp;ограниченные по&nbsp;времени цели.</strong> Методика используется в&nbsp;управлении проектами, бизнесе и&nbsp;особенно актуальна в&nbsp;разработке цифровых продуктов, где&nbsp;четкая постановка задач равна эффективности команды и&nbsp;скорости движения к&nbsp;результату.</p>
<p dir="ltr">Каждая составляющая SMART помогает сфокусировать внимание на&nbsp;сути задачи и&nbsp;сделать её&nbsp;понятной для&nbsp;всех участников digital-команды:</p>
<ul>
<li>Specific (Конкретность): цель должна быть ясно сформулирована;</li>
<li>Measurable (Измеримость): должен быть способ отслеживать прогресс;</li>
<li>Achievable (Достижимость): цель должна быть реальной, с&nbsp;учетом ресурсов;</li>
<li>Relevant (Актуальность): цель должна иметь ценность для&nbsp;бизнеса;</li>
<li>Time-bound (Ограниченность во&nbsp;времени): необходимо задать чёткие сроки.</li>
</ul>
<p>SMART помогает минимизировать недопонимания между участниками процесса создания продукта, повысить прозрачность и&nbsp;усилить привязку целей к&nbsp;стратегическим задачам компании или&nbsp;продуктовой команды.</p>
<h2 dir="ltr">Роль SMART-целей в&nbsp;жизненном цикле цифрового продукта</h2>
<p dir="ltr">Постановка SMART-целей важна на&nbsp;каждом этапе жизненного цикла цифрового продукта — от&nbsp;Discovery-фазы до&nbsp;масштабирования и&nbsp;пост-релиза. В&nbsp;начале разработки нужно установить ориентиры, которые помогут выявить реальные потребности пользователей и&nbsp;задать вектор развития. Например, на&nbsp;этапе Discovery можно сформулировать цель: «Собрать 30 интервью с&nbsp;пользователями в&nbsp;течение трех недель, чтобы подтвердить гипотезу о&nbsp;потребности в&nbsp;новой функции».</p>
<p dir="ltr">Также качественно провести Discovery-фазу для&nbsp;цифрового продукта помогут <a href="/articles/impact-mapping/" title="Impact Mapping: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех">карта влияний</a> и&nbsp;<a href="/articles/how-to-use-usm/" title="Как использовать User Story mapping при&nbsp;создании цифрового продукта">User Story Mapping</a>. В&nbsp;сочетании со&nbsp;SMART-целями эти&nbsp;практики помогут связать цели с&nbsp;реальными сценариями пользователей и&nbsp;формирует прочную основу для&nbsp;roadmap'а продукта.</p>

<div class="umb-macro-highlights">
    <strong>На фазе MVP&nbsp;и&nbsp;запуска цели могут звучать так: «Достичь 1 000 регистраций за&nbsp;первый месяц после релиза» — это&nbsp;конкретная, измеримая и&nbsp;достижимая цель с&nbsp;бизнес-ориентированным результатом.</strong>
    
</div>

<p>При масштабировании продукта или&nbsp;оптимизации процессов команды SMART помогает сохранять фокус на&nbsp;росте метрик, улучшении производительности или&nbsp;снижении издержек. Например: «Сократить технический долг на&nbsp;20% за&nbsp;квартал с&nbsp;помощью рефакторинга приоритетных модулей».</p>

<div class="text-highlight">
  Так, SMART-цели стоит использовать в&nbsp;управлении цифровым продуктом на&nbsp;всех стадиях, чтобы достигать устойчивых и&nbsp;предсказуемых результатов.
</div>

<h2 dir="ltr">Отличия SMART-целей от&nbsp;общих постановок задач</h2>
<p dir="ltr">Неструктурированные цели вроде «улучшить приложение» или&nbsp;«повысить производительность» – это&nbsp;абстракции. Такие формулировки трудно контролировать, невозможно измерить и&nbsp;поэтому невозможно реализовать в&nbsp;рамках спринтов или&nbsp;квартальных планов.</p>
<p dir="ltr"><strong>SMART-цели</strong>, напротив, помогают избавиться от&nbsp;размытой постановки задач. Сравним две&nbsp;формулировки:</p>
<ul>
<li><strong>Плохо</strong>: «Сделать сайт быстрее»</li>
<li><strong>Хорошо (по&nbsp;SMART): </strong>«Снизить среднее время загрузки главной страницы на&nbsp;30% в&nbsp;течение 2 месяцев»<strong><br></strong></li>
</ul>
<p dir="ltr">Вторая версия – это&nbsp;конкретная, измеримая и&nbsp;реализуемая цель, которая легко вписывается в&nbsp;процессы digital-команды и&nbsp;поддаётся контролю.</p>

<div class="umb-macro-highlights">
    <strong>Отличие SMART-целей также в&nbsp;том, что&nbsp;они&nbsp;работают на&nbsp;мотивированность и&nbsp;вовлечённость команды, так&nbsp;как&nbsp;каждый участник процесса разработки продукта понимает, куда движется проект, и&nbsp;как&nbsp;измеряется прогресс.</strong>
    
</div>

<h2 dir="ltr">Примеры SMART-целей для&nbsp;digital-команд</h2>
<p dir="ltr">Говоря о&nbsp;постановке целей в&nbsp;digital-командах, проще всего объяснить концепцию на&nbsp;примерах. Вот&nbsp;как&nbsp;можно использовать методику SMART в&nbsp;контексте разных ролей и&nbsp;задач на&nbsp;проекте.</p>
<h3 dir="ltr">Продуктовая команда</h3>
<p dir="ltr">Допустим, вы&nbsp;готовитесь к&nbsp;запуску новой фичи. Вместо абстрактной цели «добавить фильтр по&nbsp;категориям», можно задать цель по&nbsp;SMART:<br>«Реализовать фильтрацию по&nbsp;категориям в&nbsp;каталоге и&nbsp;протестировать её&nbsp;на&nbsp;80% пользователей в&nbsp;течение текущего спринта, чтобы повысить конверсию на&nbsp;15%».<br>Здесь и&nbsp;конкретика, и&nbsp;срок, и&nbsp;связь с&nbsp;метриками продукта.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/676083e264ea4f3aa677dec45f815b4a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/product-team/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/tadn1ryk/frame-500&#x432;&#x432;&#x432;&#x432;9585.png"
         alt=""
         itemprop="">

    
            <span>Собираем команду для&nbsp;цифрового продукта: роли, подходы и&nbsp;практические советы</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/437894efc4ce401c8801869011284060"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Команда разработки</h3>
<p dir="ltr">Работа с&nbsp;техническим долгом часто откладывается, если нет&nbsp;четкой цели. Пример:<br>«Оптимизировать API-запросы, снизив среднее время ответа с&nbsp;700мс до&nbsp;300мс за&nbsp;3 недели» – понятная и&nbsp;измеримая задача, которая вписывается в&nbsp;бэклог и&nbsp;влияет на&nbsp;пользовательский опыт. Согласитесь, это&nbsp;гораздо лучше, чем&nbsp;сказать команде просто рефакторить определенный модуль приложения.</p>
<h3 dir="ltr">Бизнес-цели</h3>
<p dir="ltr">Для роста важны не&nbsp;только фичи, но&nbsp;и&nbsp;метрики вроде LTV&nbsp;или&nbsp;CAC. Хорошая SMART-цель:<br>«Снизить стоимость привлечения клиента (CAC) на&nbsp;20% за&nbsp;квартал за&nbsp;счёт тестирования новых рекламных каналов».<br>Цифры, причина и&nbsp;срок – всё&nbsp;на&nbsp;месте.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/84a3444dcca44c3a923c6ab57f141fc2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8f7f51cb4aad458faf7be26f0a058241"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a47e3e05bcf0485587e68fccb2b75dc4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Построение SMART-цели: пошаговая методика</h2>
<p dir="ltr">Чтобы сформулировать цель по&nbsp;SMART, достаточно следовать пяти простым шагам. Вот&nbsp;как&nbsp;это&nbsp;работает:</p>
<p dir="ltr"><strong>Шаг 1: Specific (Конкретика)</strong><br>Не «сделать пользовательский опыт лучше», а&nbsp;что&nbsp;именно? Например, «добавить push-уведомления для&nbsp;новых заказов».</p>
<p dir="ltr"><strong>Шаг 2: Measurable (Измеримость)</strong><br>Как поймёте, что&nbsp;в&nbsp;результате манипуляций цель достигнута? Например, так: «получить 200 отзывов в&nbsp;приложении после внедрения фичи».</p>
<p dir="ltr"><strong>Шаг 3: Achievable (Достижимость)</strong><br>Учитывайте ресурсы. Если цель кажется невозможной, команда быстро потеряет мотивацию. Вместо «выпустить всё&nbsp;за&nbsp;неделю», лучше «выпустить модуль регистрации 25 января».</p>
<p dir="ltr"><strong>Шаг 4: Relevant (Актуальность)</strong><br>Цель должна иметь смысл для&nbsp;продукта или&nbsp;бизнеса. Например, нет&nbsp;смысла добавлять новые кнопки, если они&nbsp;не&nbsp;улучшают воронку.</p>
<p dir="ltr"><strong>Шаг 5: Time-bound (Сроки)</strong><br>Когда вы&nbsp;это&nbsp;сделаете? Не&nbsp;«в будущем», или&nbsp;«до конца квартала», а&nbsp;«в рамках текущего спринта» или&nbsp;«к 15 мая».</p>
<p dir="ltr">Всё вместе это&nbsp;превращает расплывчатые желания в&nbsp;понятные шаги. Такая цель не&nbsp;пугает, а&nbsp;настраивает на&nbsp;результат.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/100a23817f194d16be7b7933174502df"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/68bab35f6b754e8d88f6e95eda93e8b9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c00d5f32ce404fe3b3d703f5e11b10b2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">SMART vs&nbsp;OKR&nbsp;vs&nbsp;KPI: что&nbsp;выбрать и&nbsp;когда использовать</h2>
<p dir="ltr">Существует путаница между SMART, OKR&nbsp;и&nbsp;KPI. Давайте разберёмся, как&nbsp;их&nbsp;различать, и&nbsp;как&nbsp;они&nbsp;могут работать вместе.</p>
<p dir="ltr"><strong>SMART</strong> – это&nbsp;способ чётко и&nbsp;понятно поставить цель. Он&nbsp;отлично подходит для&nbsp;командных и&nbsp;индивидуальных задач, особенно если вы&nbsp;работаете в&nbsp;agile-команде или&nbsp;стартапе, где&nbsp;фокус важнее масштабных стратегий.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/cd028c017b34436d9498fde47bdd3ff5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/development-goals-at-project-start/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/fhgelggy/dall-e-&#x43F;&#x438;&#x43D;&#x433;&#x432;&#x438;&#x43D;-&#x432;-&#x441;&#x43C;&#x43E;&#x43A;&#x438;&#x43D;&#x433;&#x435;.webp"
         alt=""
         itemprop="">

    
            <span>Постановка целей в&nbsp;digital-разработке: как&nbsp;не&nbsp;провалить запуск цифрового продукта</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/01d30cc634014ec98296af114accc292"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><strong>OKR (Objectives and&nbsp;Key&nbsp;Results)</strong> – про&nbsp;большие амбиции. Вы&nbsp;задаёте вдохновляющую цель (Objective) и&nbsp;2–4 ключевых результата, по&nbsp;которым оцениваете прогресс. SMART-формулировки отлично вписываются в&nbsp;ключевые результаты OKR. Можно воспринимать OKR&nbsp;как&nbsp;надстройку над&nbsp;SMART-целями. OKR&nbsp;– про&nbsp;стратегию на&nbsp;год, SMART – про&nbsp;планирование спринтов.&nbsp;</p>
<p dir="ltr"><strong>KPI (Key&nbsp;Performance Indicators) –</strong>&nbsp;это метрики, по&nbsp;которым вы&nbsp;отслеживаете эффективность. Они&nbsp;отвечают на&nbsp;вопрос: «Насколько хорошо мы&nbsp;справляемся?» Например, KPI&nbsp;может быть: «Снижение процента оттока до&nbsp;10%». Можно воспринимать определенные KPI&nbsp;как&nbsp;часть SMART-цели.</p>
<p dir="ltr">Итого:</p>
<ul>
<li><strong>SMART</strong> — про&nbsp;чёткую постановку задач.</li>
<li><strong>OKR</strong> — про&nbsp;направление и&nbsp;амбиции.</li>
<li><strong>KPI</strong> — про&nbsp;трекинг и&nbsp;аналитику.</li>
</ul>

<div class="umb-macro-highlights">
    <strong>Часто они&nbsp;не&nbsp;конкурируют, а&nbsp;дополняют друг друга. SMART помогает сформулировать понятные шаги, OKR&nbsp;— задать направление, а&nbsp;KPI&nbsp;— измерить результат.</strong>
    
</div>

<h2 dir="ltr">Ошибки при&nbsp;постановке&nbsp;SMART&nbsp;целей в&nbsp;разработке продуктов</h2>
<p dir="ltr">Даже если команда знает про&nbsp;SMART-цели, не&nbsp;всё&nbsp;всегда идёт гладко. Вот&nbsp;три&nbsp;самые частые ошибки, которые мешают достигать результатов в&nbsp;разработке цифровых продуктов.</p>
<ol>
<li><strong>Завышенные ожидания</strong><br>Когда цель «Увеличить конверсию на&nbsp;300% за&nbsp;месяц», это&nbsp;демотивирует команду. Даже если результат нужен быстро, важно трезво оценивать ресурсы и&nbsp;ограничения. SMART предполагает реализм и&nbsp;достижимость, а&nbsp;не&nbsp;полёт фантазии.<br><br></li>
<li><strong>Отсутствие метрик</strong><br>«Сделать лучше интерфейс» – тоже так&nbsp;себе постановка цели. Как&nbsp;мы&nbsp;поймем, что&nbsp;он&nbsp;стал лучше? Без&nbsp;измеримых показателей цель превращается в, опять же, фантазию. Лучше: «Провести A/B-тест и&nbsp;добиться роста кликабельности кнопки на&nbsp;15%».<br><br></li>
<li><strong>Потеря связи с&nbsp;бизнес-целями</strong><br>Иногда команда ставит себе задачи, которые не&nbsp;решают реальных проблем продукта. Например, можно неделями улучшать админку, которую никто не&nbsp;видит, в&nbsp;то&nbsp;время как&nbsp;пользователи массово бросают корзину. Цели должны быть релевантны продукту и&nbsp;бизнесу.</li>
</ol>

<div class="text-highlight">
  Избежать этих ошибок помогает простое правило: любая цель должна быть понятна, полезна и&nbsp;уместна именно сейчас.
</div>

<h2 dir="ltr">SMART-цели для&nbsp;продуктового менеджера</h2>
<p dir="ltr">Продуктовый менеджер отвечает за&nbsp;фокус и&nbsp;движение продукта в&nbsp;правильном направлении. SMART-цели помогают ему&nbsp;чётко формулировать приоритеты как&nbsp;для&nbsp;себя, так&nbsp;и&nbsp;для&nbsp;команды.</p>
<h3 dir="ltr">Индивидуальные цели</h3>
<p dir="ltr">Пример: «Провести 10 интервью с&nbsp;ключевыми клиентами до&nbsp;конца месяца и&nbsp;подготовить 2 гипотезы для&nbsp;проверки». Такая цель будет направлена на&nbsp;развитие навыков Product Discovery и&nbsp;поможет сфокусироваться на&nbsp;реальных потребностях пользователей.</p>
<h3 dir="ltr">Командные цели</h3>
<p dir="ltr">Пример: «Увеличить Retention с&nbsp;20% до&nbsp;30% за&nbsp;квартал путём переработки онбординга». Тут&nbsp;важно, чтобы цель была согласована с&nbsp;разработкой и&nbsp;дизайном, и&nbsp;строилась на&nbsp;данных.</p>
<h3 dir="ltr">На квартал или&nbsp;год</h3>
<p dir="ltr">SMART-цели хорошо работают и&nbsp;на&nbsp;более длинных дистанциях. Например:</p>
<p dir="ltr">«Вывести новую версию продукта в&nbsp;трёх странах с&nbsp;удержанием не&nbsp;менее 35% пользователей в&nbsp;течение первых двух недель использования до&nbsp;конца Q3».</p>

<div class="umb-macro-highlights">
    <strong>Для PM&nbsp;SMART — это&nbsp;не&nbsp;только про&nbsp;контроль задач, но&nbsp;и&nbsp;про&nbsp;выстраивание логики развития продукта в&nbsp;связке с&nbsp;бизнесом и&nbsp;командой.</strong>
    
</div>

<h2 dir="ltr">SMART и&nbsp;agile-команды</h2>
<p dir="ltr">Agile предполагает гибкость, но&nbsp;гибкость не&nbsp;значит отсутствие структуры. SMART-цели отлично ложатся в&nbsp;agile-подход, особенно если их&nbsp;правильно встроить в&nbsp;спринты.</p>
<p dir="ltr"><strong>В спринтах</strong> можно использовать SMART как&nbsp;основу для&nbsp;user stories и&nbsp;задач. Например: «Увеличить скорость отклика фильтра на&nbsp;мобильных устройствах до&nbsp;&lt;1 секунды за&nbsp;2 спринта».</p>
<p dir="ltr"><strong>На ретроспективах</strong> цели помогают оценить, что&nbsp;удалось, а&nbsp;что&nbsp;— нет. Это&nbsp;даёт пищу для&nbsp;рефлексии и&nbsp;позволяет избежать повторения ошибок.</p>
<p dir="ltr"><strong>Jira, ClickUp, Notion</strong> — отличные инструменты для&nbsp;фиксации и&nbsp;отслеживания SMART-целей. Главное — не&nbsp;прятать их&nbsp;в&nbsp;документах, а&nbsp;делать видимыми и&nbsp;обсуждаемыми: на&nbsp;планированиях, демо и&nbsp;ретро.</p>

<div class="umb-macro-highlights">
    <strong>Agile и&nbsp;SMART — не&nbsp;конкуренты. Они&nbsp;помогают сделать команды предсказуемыми, но&nbsp;не&nbsp;позволяют (при&nbsp;разумном использовании) строить процессы ради процессов.</strong>
    
</div>

<h2 dir="ltr">Как внедрить SMART-подход в&nbsp;команде разработки</h2>
<p dir="ltr">Поставить цели – половина дела. Нужно еще&nbsp;и&nbsp;сделать так, чтобы вся&nbsp;команда разработки цифрового продукта принимала этот подход как&nbsp;часть своей ежедневной работы.</p>
<h3 dir="ltr">Обучение и&nbsp;воркшопы</h3>
<p dir="ltr">Не все&nbsp;в&nbsp;команде сразу понимают, зачем SMART и&nbsp;как&nbsp;его&nbsp;применять. Полезно проводить короткие воркшопы, где&nbsp;на&nbsp;реальных задачах показывается разница между «расплывчатой» и&nbsp;«умной» целью. Хорошо ввести быструю отработку на&nbsp;практике, когда каждый участник сам&nbsp;формулирует 1–2 SMART-цели для&nbsp;своей зоны ответственности.</p>
<h3 dir="ltr">Шаблоны и&nbsp;примеры</h3>
<p dir="ltr">Люди охотно повторяют, если есть удобная структура. Можно сделать шаблон в&nbsp;Notion или&nbsp;Google Docs, где&nbsp;будет форма: что&nbsp;делаем, зачем, как&nbsp;меряем, когда завершим. Это&nbsp;снижает порог вхождения, делает задачу понятнее и&nbsp;помогает внедрить привычку.</p>
<h3 dir="ltr">Работа с&nbsp;возражениями</h3>
<p dir="ltr">«Но мы&nbsp;и&nbsp;так&nbsp;всё&nbsp;делаем, зачем эти&nbsp;цели?». Тут&nbsp;важно показать, что&nbsp;SMART – это&nbsp;способ избежать разрозненности в&nbsp;работе и&nbsp;сделать усилия команды более прозрачными. Хорошая цель экономит время, снижает стресс и&nbsp;позволяет трекать прогресс, а&nbsp;не&nbsp;просто «работать над&nbsp;задачами».</p>
<h2 dir="ltr">Как оценивать и&nbsp;адаптировать SMART-цели</h2>
<p dir="ltr">Даже хорошо сформулированная SMART-цель со&nbsp;временем может потерять актуальность. Поэтому важно не&nbsp;просто ставить цели, но&nbsp;и&nbsp;периодически их&nbsp;пересматривать и&nbsp;адаптировать под&nbsp;изменившиеся условия.</p>
<h3 dir="ltr">Цикл пересмотра: месяц, квартал</h3>
<p dir="ltr">Хорошая практика – устроить ревизию целей раз&nbsp;в&nbsp;месяц или&nbsp;квартал. Особенно это&nbsp;актуально в&nbsp;agile-командах, где&nbsp;приоритеты могут быстро меняться. Не&nbsp;бойтесь пересматривать цели: лучше скорректировать и&nbsp;достигнуть, чем&nbsp;упрямо идти в&nbsp;тупик.</p>
<h3 dir="ltr">Визуализация прогресса</h3>
<p dir="ltr">Когда команда видит, что&nbsp;цель прогрессирует, это&nbsp;мотивирует. Можно использовать дашборды, графики или&nbsp;просто «светофорную» систему (красный, жёлтый, зелёный) в&nbsp;том&nbsp;же&nbsp;Notion или&nbsp;ClickUp.&nbsp;<strong>Главное – цель должна быть на&nbsp;виду, а&nbsp;не&nbsp;в&nbsp;папке в&nbsp;архиве.</strong></p>
<h2 dir="ltr">Вывод: зачем продуктовым командам нужен SMART</h2>
<p dir="ltr">Когда цели понятны, продукт двигается вперёд. Когда они&nbsp;туманные, команда буксует, метрики стоят, а&nbsp;пользователи не&nbsp;видят прогресса.</p>
<p dir="ltr"><strong>SMART-подход помогает digital-командам:</strong></p>
<ul>
<li>сфокусироваться на&nbsp;том, что&nbsp;действительно важно;</li>
<li>делать задачи понятными и&nbsp;измеримыми;</li>
<li>увидеть прогресс и&nbsp;отпраздновать достижение;</li>
<li>избегать выгорания и&nbsp;случайных решений;</li>
<li>повышать результативность не&nbsp;за&nbsp;счёт переработок, а&nbsp;за&nbsp;счёт ясности процесса.</li>
</ul>

<div class="umb-macro-highlights">
    <strong>Если вы&nbsp;ещё&nbsp;не&nbsp;внедрили SMART, начните с&nbsp;малого. Пропишите одну цель на&nbsp;спринт, протестируйте шаблон, обсудите цели на&nbsp;ретро. Главное — начать. А&nbsp;результат вас&nbsp;обязательно порадует.</strong>
    
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как я начал писать unit-тесты для Vue-компонентов
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Рано или поздно фронтендеру хочется подтвердить, что код работает. У меня это желание появилось после болезненной миграции с Vue 2 на Vue 3.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-test-vue-components/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-test-vue-components/</guid>

                <pubDate>Mon, 12 Jan 2026 03:04:22 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как я начал писать unit-тесты для Vue-компонентов</h1>
                                <figure>
                                    <img src="/Media/vkhouy2l/chatgpt-image-may-7-2025-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d3edfa19a274411091d53af08b224ec7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/018746c85bb2467599a106b33aa2a581"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В жизни каждого фронтенд-разработчика наступает момент, когда пора войти в&nbsp;нужную дверь когда приходит осознание того, что&nbsp;было бы&nbsp;неплохо как&#8209;то&nbsp;подтвердить, что&nbsp;твой код&nbsp;работает.  У&nbsp;меня этот момент настал после болезненной миграции с&nbsp;Vue&nbsp;2 на&nbsp;Vue&nbsp;3 с&nbsp;тоннами дефектов, которая завершилась очередной прядью седых волос, и&nbsp;не&nbsp;только у&nbsp;меня. Хватит это&nbsp;терпеть (с).</p>
<p>Меня зовут Дмитрий, я&nbsp;frontend-разработчик в&nbsp;компании fuse8, и&nbsp;в&nbsp;этой статье мы&nbsp;рассмотрим как&nbsp;можно начать тестировать Vue-компоненты.</p>
<h2>Мой проект и&nbsp;стек технологий</h2>
<p>Текущий проект на&nbsp;котором я&nbsp;тружусь — это&nbsp;классическая CRM, где&nbsp;формочки, формочки, посыпанные формочками, вывод списков, модалочки и&nbsp;перманентное преобразование данных в&nbsp;этих формочках. Стек технологий включает Vue&nbsp;3, Pinia, Vite и&nbsp;ElementPlus, из&#8209;за&nbsp;чего получается достаточно быстро и&nbsp;гибко разрабатывать интерфейсы.</p>
<h2>Почему именно юнит-тесты?</h2>
<p>Почитав теорию про&nbsp;пирамиды и&nbsp;<a href="https://www.testingjavascript.com/">кубки</a> тестирования, я&nbsp;пришел к&nbsp;выводу, что&nbsp;проще влиться в&nbsp;процесс, постепенно добавляя “юнит”-тесты для&nbsp;новых компонентов и&nbsp;фич, а&nbsp;также покрывать тестами найденные баги. </p>
<p>На всякий случай – пару слов о&nbsp;пирамиде тестирования. Это&nbsp;концепция, предложенная Мартином Фаулером, которая помогает организовать тесты в&nbsp;проекте. Она&nbsp;предполагает три&nbsp;уровня тестирования:</p>
<ul>
<li style="font-weight: 400;" aria-level="1">Юнит-тесты (Unit Tests): самый базовый уровень тестирования, который проверяет отдельные модули или&nbsp;функции приложения. Они&nbsp;быстры и&nbsp;легко настраиваются. Их&nbsp;цель — проверить, что&nbsp;отдельные компоненты работают правильно в&nbsp;изоляции.</li>
<li style="font-weight: 400;" aria-level="1">Интеграционные тесты (Integration Tests): тестируют взаимодействие между модулями или&nbsp;компонентами, например, как&nbsp;компоненты на&nbsp;странице взаимодействуют между собой. Они&nbsp;более сложные и&nbsp;медленные, но&nbsp;дают понимание о&nbsp;корректности интеграций.</li>
<li style="font-weight: 400;" aria-level="1">E2E-тесты (End-to-End Tests): проверяют весь процесс работы приложения от&nbsp;начала до&nbsp;конца, имитируя действия пользователя. Такие тесты могут быть медленными и&nbsp;требовать сложной инфраструктуры, но&nbsp;они&nbsp;позволяют убедиться, что&nbsp;приложение работает как&nbsp;единое целое.</li>
</ul>
<p>Слово «юнит» в&nbsp;кавычках, потому что&nbsp;здесь есть нюанс. Когда речь заходит о&nbsp;тестировании компонентов любого фреймворка или&nbsp;библиотеки, возникает вопрос: что&nbsp;считать unit-тестами? </p>
<p>В идеале, в&nbsp;unit-тестах тестируемый код&nbsp;должен быть изолирован от&nbsp;всего окружения, быть чистой функцией (вездесущий пример функции sum), но&nbsp;в&nbsp;реальности мы&nbsp;не&nbsp;можем полностью «замокать» фреймворк. Получается, что&nbsp;тесты для&nbsp;Vue-компонентов будут все-таки интеграционными, но&nbsp;в&nbsp;сообществе их&nbsp;продолжают называть unit-тестами. Поэтому и&nbsp;я&nbsp;буду придерживаться этого термина, хотя и&nbsp;с&nbsp;некоторыми оговорками.</p>
<h2>Варианты тестирования и&nbsp;мой&nbsp;выбор</h2>
<p>Конечно, были и&nbsp;другие варианты. Например, e2e-тестирование с&nbsp;использованием Playwright, которое запускает тесты в&nbsp;реальном браузере, эмулируя действия пользователей. Это&nbsp;мощный инструмент, но&nbsp;на&nbsp;практике я&nbsp;столкнулся с&nbsp;рядом инфраструктурных сложностей, о&nbsp;которых расскажу в&nbsp;конце статьи. </p>
<p>Спойлер: бекенд к&nbsp;такому оказался не&nbsp;готов, и&nbsp;по&nbsp;уму, e2e надо писать под&nbsp;чутким руководством QA&nbsp;– эти&nbsp;парни и&nbsp;девчонки умеют ломать систему.</p>
<p>В конечном счете, я&nbsp;остановился на&nbsp;Vitest и&nbsp;Vue&nbsp;Test Utils как&nbsp;основных инструментах для&nbsp;тестирования. Vitest, как&nbsp;раннер, идеально подошел, поскольку Vite уже&nbsp;был&nbsp;установлен в&nbsp;проекте, а&nbsp;Vue&nbsp;Test Utils предоставил все&nbsp;необходимые инструменты для&nbsp;монтирования и&nbsp;изменения  Vue-компонентов.</p>
<h2>Мой выбор: Vitest и&nbsp;Vue&nbsp;Test Utils</h2>
<p>Почему Vue&nbsp;Test Utils, а&nbsp;не&nbsp;Testing Library? Во-первых, это&nbsp;рекомендовано сообществом Vue&nbsp;(вроде Testing Library запаздывала с&nbsp;миграцией на&nbsp;3й Vue). Во-вторых, я&nbsp;придерживаюсь «Лондонской школы» тестирования (то&nbsp;есть мокаем весь интернет вокруг нашего компонента), чтобы тест был&nbsp;максимально честным. К&nbsp;тому же, Testing Library построена поверх VTU, и&nbsp;хотелось поменьше зависимостей.</p>
<p>Мы должны тестировать компонент без&nbsp;знания его&nbsp;внутренней структуры и&nbsp;реализации (как&nbsp;черный ящик). Этот подход помогает сосредоточиться на&nbsp;входных данных и&nbsp;выходных результатах, обеспечивая независимость тестов от&nbsp;деталей реализации.</p>
<p>Примечание: если у&nbsp;вас&nbsp;в&nbsp;компоненте, какая&#8209;то&nbsp;мегафункция со&nbsp;сложными расчетами, очевидно, её&nbsp;надо вынести из&nbsp;компонента и&nbsp;тестировать отдельно классическим unit-тестом.</p>
<p>Моки и&nbsp;заглушки отвечают за&nbsp;изоляцию тестов. Моки заменяют реальные зависимости компонента, позволяя контролировать их&nbsp;поведение. Заглушки упрощают взаимодействие с&nbsp;внешними системами (API, например), заменяя их&nbsp;упрощенными версиями. Здесь главное не&nbsp;стремиться замокать все&nbsp;подряд: мокаем только те&nbsp;части кода, которые действительно влияют на&nbsp;тестируемую функциональность, чтобы избежать излишней зависимости тестов от&nbsp;мока.</p>
<p>Для начала работы необходимо установить и&nbsp;настроить <a href="https://vitest.dev/guide/">Vitest</a>  и&nbsp;<a href="https://test-utils.vuejs.org/installation/">Vue test utils</a>.</p>
<pre>
<code class="language-javascript">
npm&nbsp;i&nbsp;-D vitest @vue/test-utils
</code>
</pre>

<p>Так как&nbsp;наши тесты будут запускать в&nbsp;node окружении, нужны имплементаторы DOM. Vitest рекомендует либо happy-dom, либо jsdom. </p>
<p>Я остановился на&nbsp;jsdom как&nbsp;более популярном, и&nbsp;он&nbsp;быстрее чем&nbsp;happy-dom, но&nbsp;переключиться можно быстро, так&nbsp;что&nbsp;на&nbsp;ваш&nbsp;выбор.</p>
<pre>
<code class="language-javascript">
npm&nbsp;i&nbsp;jsdom -D
</code>
</pre>

<p>Как я&nbsp;говорил, в&nbsp;стеке есть Pinia. Для&nbsp;тестирования можно использовать настоящий стор, а&nbsp;можно <a href="https://pinia.vuejs.org/cookbook/testing.html">тестовый</a>. Я&nbsp;выбрал тестовый, так&nbsp;как&nbsp;в&nbsp;этом случае можно мутировать стор напрямую, а&nbsp;это&nbsp;иногда полезно.</p>
<pre>
<code class="language-javascript">
npm&nbsp;i&nbsp;-D @pinia/testing
</code>
</pre>

<h2>Что и&nbsp;как&nbsp;тестировать?</h2>
<p>Для примера тестирования возьмем компонент, в&nbsp;котором есть кнопка и&nbsp;компонент модального окна. </p>
<p>Для контекста, схема компонента представлена на&nbsp;рисунке.</p>
<p>Есть кнопка (активна, если у&nbsp;пользователя есть права на&nbsp;ее&nbsp;использование), по&nbsp;нажатию на&nbsp;которую открывается форма в&nbsp;модальном окне (отдельный компонент). При&nbsp;заполнении полей формы и&nbsp;нажатии на&nbsp;кнопку «добавить», идет запрос на&nbsp;сервер, и&nbsp;после удачного ответа генерируется событие, что&nbsp;документ добавлен.</p>


<figure class="umb-macro-image">
    


    <img src="/media/l5gjk3wn/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-09-06_134409619.png"
         alt=""
         itemprop="">


</figure>

<p>Код компонента:</p>


<figure class="umb-macro-image">
    


    <img src="/media/0l5lqcs1/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-09-06_135325788.png"
         alt=""
         itemprop="">


</figure>

<p>Чуток теории. Для&nbsp;начала определим, что&nbsp;нужно тестировать. В&nbsp;литературе рекомендуется максимально следовать поведению пользователя и&nbsp;пропускать детали реализации, что&nbsp;логично. Предполагается, что&nbsp;мы&nbsp;будем тестировать свой компонент как&nbsp;черный ящик, меняя (подготавливая) входные данные компонента и&nbsp;тестируя выходные.</p>
<p>К входным данным относятся  свойства, компоненты, инъекции зависимостей, внешнее хранилище и&nbsp;слоты (может что&#8209;то&nbsp;забыл). Чтобы тест был&nbsp;честный, мы&nbsp;должны компоненты, хранилище, DI&nbsp;заменить заглушками. Так&nbsp;уменьшим вероятность ложного срабатывания теста.</p>


<figure class="umb-macro-image">
    


    <img src="/media/ta1bkrub/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-09-06_134529572.png"
         alt=""
         itemprop="">


</figure>

<p>На выходе же&nbsp;мы&nbsp;должны протестировать, получившийся html. Проверить вызов api&nbsp;(или&nbsp;результат вызова API), причем сам&nbsp;вызов должен быть также заменен заглушкой, мы&nbsp;же&nbsp;не&nbsp;хотим травмировать backend. И&nbsp;также, необходимо проверить  события которые будут обрабатываться снаружи компонента.</p>
<p>Давайте теперь напишем, наконец, тест. Определимся, что&nbsp;надо тестировать (как&nbsp;говорится, «рисуем круг»).</p>
<pre>
<code class="language-javascript">
describe('Добавление входящей корреспонденции - AddIncomingMail', () => {

  it.todo('Кнопка "Добавить входящую корреспонденцию" активна если у&nbsp;пользователя есть права', async () => {});

  it.todo('По клику на&nbsp;кнопку "Добавить входящую корреспонденцию" открывается модальное окно добавления нового документа', async () => {});

  it.todo(' При&nbsp;добавления входящей корреспонденции, генерируем событие наружу компонента', async () => {});
});
</code>
</pre>

<p>На что&nbsp;тут&nbsp;обратить внимание? Делая описания и&nbsp;поясняя, что&nbsp;ожидаем получить при&nbsp;выполнении действий, получаем самодокументируемый код… В&nbsp;теории…<br><br>Я использую вариант размещения тестов как&nbsp;можно ближе к&nbsp;компонентам. Кажется, что&nbsp;такой вариант лучше подходит для&nbsp;понимания того, как&nbsp;компонент работает.</p>
<p>В общем, рисуем еще&nbsp;круг, добавляем деталей, и&nbsp;получаем сову, то&nbsp;есть тест.</p>
<pre>
<code class="language-javascript">
import { getButtonByText } from '@/mocks/helpersForTesting/searchElements/index.js';
import { shallowMount } from '@vue/test-utils';
import AddIncomingMail from '@/components/AddIncomingMail.vue';
import { afterEach, beforeEach, describe, expect, it, vi&nbsp;} from 'vitest';
import { createTestingPinia } from '@pinia/testing';

let&nbsp;wrapper; // будет храниться экземпляр компонента

beforeEach(() => { // перед каждым тестом монтируем компонент с&nbsp;начальными настройками
  wrapper = shallowMount(AddIncomingMail, {
    global: {
	plugins:[     
createTestingPinia({ // Создаем тестовый экземпляр Pinia
          createSpy: vi.fn,
          stubActions: false,
          initialState: {
            user: {
              state: {
                claims: [1,2],
              },
            },
          },
        }),]
      stubs: { // Так&nbsp;как&nbsp;это&nbsp;юнит тестирование, то&nbsp;все&nbsp;дочерние компоненты заменяем заглушками
        AddIncomingMailModal: {
          name: 'AddIncomingMailModal',
          emits: ['mail-added'],
          template: 'Добавить корреспонденцию',
        },
        popup: {
          props: { isFormOpen: false },
          template: '',
        },
      },
    },
    props: {
      lawsuitId: 15,
    },
  });
});

afterEach(() => { // После каждого теста сбрасываем заглушки и&nbsp;уничтожаем экземпляр
  wrapper.unmount();
  vi.resetAllMocks();
});

describe('Добавление входящей корреспонденции - AddIncomingMail', () => {
  it.todo('Кнопка "Добавить входящую корреспонденцию" активна если у&nbsp;пользователя есть права', async () => {
    const button = getButtonByText({ wrapper, buttonText: 'Добавить входящую корреспонденцию' }); // Сделал хелпер для&nbsp;быстрого поиска кнопочек

expect(button.element.disabled).toBe(false);
});

  it('По клику на&nbsp;кнопку "Добавить входящую корреспонденцию" открывается модальное окно добавления нового документа', async () => {
    const button = getButtonByText({ wrapper, buttonText: 'Добавить входящую корреспонденцию' }); 

    await button.trigger('click'); 
    await wrapper.vm.$nextTick(); //Так как&nbsp;Vue&nbsp;изменения выполняет асинхронно, то&nbsp;важно обождать 

    expect(wrapper.text()).contain('Добавить корреспонденцию');
  });

 it('При добавления входящей корреспонденции, генерируем событие наружу компонента', async () => {
    const button = getButtonByText({ wrapper, buttonText: 'Добавить входящую корреспонденцию' });
    await button.trigger('click');
    await wrapper.vm.$nextTick();
    const modalStub = wrapper.findComponent({ name: 'AddIncomingMailModal' });

    modalStub.vm.$emit('mail-added');
    expect(wrapper.emitted()).toHaveProperty('mail-added');
  });
});
</code>
</pre>

<p>Хотел бы&nbsp;обратить ваше внимание на&nbsp;то, как&nbsp;происходит поиск элементов. Нужно стараться искать так, как&nbsp;ищет пользователь. Менее валидный, но&nbsp;более популярный вариант – через data-testId=”foo”.</p>
<h2>Проблема с&nbsp;unit-тестами</h2>
<p>Вроде бы&nbsp;все&nbsp;хорошо. Получаем в&nbsp;итоге контракт между компонентами, и&nbsp;можем выдыхать. Однако возникает проблема следующего характера:</p>


<figure class="umb-macro-image">
    


    <img src="/media/qz5fiw5r/1612595675_looped_1612595674-1.gif"
         alt=""
         itemprop="">


</figure>

<p>Если мы&nbsp;поменяем код&nbsp;модального окна, например, эмиты, то&nbsp;поломается только тест модального окна, а&nbsp;тест компонента AddIncomingMail останется зеленым.</p>
<p>Тут на&nbsp;помощь приходят тесты большей интеграции (как&nbsp;я&nbsp;писал выше: все&nbsp;тесты на&nbsp;фронте – интеграционные в&nbsp;той&nbsp;или&nbsp;иной мере), на&nbsp;уровне страницы или&nbsp;большего куска приложения. В&nbsp;нашем случае это&nbsp;бы&nbsp;был&nbsp;список документов и&nbsp;нашего компонента AddIncomingMail, и&nbsp;в&nbsp;этом тесте нужно проверять контракты между компонентами. </p>
<p>До реализации таких тестов я&nbsp;еще&nbsp;не&nbsp;дошел. В&nbsp;теории вроде все&nbsp;понятно, но&nbsp;пока не&nbsp;реализовано, так&nbsp;как&nbsp;надо подумать над&nbsp;инфраструктурой – в&nbsp;частности моками серверных запросов, через условный <a href="https://mswjs.io/">msw</a>. Однако там&nbsp;есть проблема с&nbsp;сохранением актуальности замоканных ответов (фикстур). И&nbsp;над&nbsp;этим я&nbsp;еще&nbsp;думаю. Хотелось бы&nbsp;использовать Vitest browser mode или&nbsp;playwright ct, но&nbsp;эти&nbsp;инструменты в&nbsp;очень сыром состоянии. </p>
<p>Итог: начинайте тестировать свой код&nbsp;и&nbsp;не&nbsp;отделяйте написание тестов от&nbsp;разработки. Да, поначалу будет очень тяжело, затем тяжело, ну&nbsp;а&nbsp;потом, вы&nbsp;просто привыкните.</p>
<h2>Полезные материалы</h2>
<ul>
<li style="font-weight: 400;" aria-level="1">Принципы юнит-тестирования | Хориков Владимир – хорошая книжка, примеры на&nbsp;C#, но&nbsp;по&nbsp;большому счету принципы не&nbsp;зависят от&nbsp;языка.</li>
<li style="font-weight: 400;" aria-level="1">Канал <a href="https://www.youtube.com/watch?v=0lV4dVYOyBw&amp;list=PLC2LZCNWKL9ahK1IoODqYxKu5aA9T5IOA">Lachlan Miller</a>  – сам&nbsp;разработчик активно участвует в&nbsp;развитии vue&nbsp;test utils, на&nbsp;его&nbsp;канале есть плейлисты по&nbsp;тестированию.</li>
<li style="font-weight: 400;" aria-level="1">Документация <a href="https://test-utils.vuejs.org/guide/">Vue test utils</a></li>
<li style="font-weight: 400;" aria-level="1">Здесь могла быть реклама моего телеграмма, но&nbsp;его&nbsp;нет.</li>
</ul>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    fuse8Talks: Федор Киселев – тимлид по призванию (и потому что никто другой не согласился)
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как вырасти на проекте, который пережил ковид, и отказаться от идеи переписать все заново
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/fuse8talks-feudor/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/fuse8talks-feudor/</guid>

                <pubDate>Fri, 05 Dec 2025 04:53:43 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>fuse8Talks: Федор Киселев – тимлид по призванию (и потому что никто другой не согласился)</h1>
                                <figure>
                                    <img src="/Media/qvgmxymb/frame-1321317478.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9c0fdc73ce76496fae57b9c2777b464e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><span class="first-p">fuse8Talks – это&nbsp;серия разговоров с&nbsp;людьми из&nbsp;fuse8. Мы&nbsp;часто рассказываем, как&nbsp;устроены процессы и&nbsp;продукты. Но&nbsp;в&nbsp;этой серии материалов сместим фокус на&nbsp;тех, кто&nbsp;делает эти&nbsp;продукты, принимает решения, ошибается, спорит и&nbsp;находит баланс между бизнесом и&nbsp;инженерией.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/70c6f0c581344c749c13bd1d3e0ba293"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--1920722">
    


    <img src="/Media/cvdbkna0/group-5009769.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4472c0d43f344bdabd002297a649a16e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8b3b6e46c52e4551a2ce4b3ed0c6e780"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><em>В пилотном выпуске — Федя Киселев, тимлид и&nbsp;разработчик с&nbsp;десятилетним опытом в&nbsp;компании. Мы&nbsp;поговорили о&nbsp;коде и&nbsp;людях, о&nbsp;ревью как&nbsp;«единой точке развития человека», о&nbsp;том, почему простые решения самые сложные, и&nbsp;о&nbsp;том, что&nbsp;чувствует разработчик, когда возвращается к&nbsp;собственному коду спустя годы.&nbsp;</em></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8505815e41be4149b35edeb20bb4c94c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Привет, Федя. Давай начнём по-классике. Расскажи немного о&nbsp;себе — кто&nbsp;ты, чем&nbsp;занимаешься, из&nbsp;чего состоит твоя работа?</h2>
<p dir="ltr">Я работаю тимлидом в&nbsp;команде fuse8. В&nbsp;компанию пришёл уже&nbsp;лет&nbsp;десять назад. Это&nbsp;была моя&nbsp;первая работа. Я&nbsp;тогда учился на&nbsp;пятом курсе универа: вторая половина курса, оставалось только сделать диплом, учебной нагрузки мало, и&nbsp;как&nbsp;раз&nbsp;освободилось время.</p>
<p dir="ltr">Изначально я&nbsp;пришёл джуном на&nbsp;бэкенд. Года два–три работал на&nbsp;этой позиции, дорос примерно до&nbsp;мидла. А&nbsp;потом случайно оказался тимлидом: на&nbsp;текущем проекте спросили, буду ли&nbsp;я&nbsp;брать на&nbsp;себя эту&nbsp;роль. Я&nbsp;сказал: «Почему бы&nbsp;нет, надо попробовать». Так&nbsp;и&nbsp;начал. Команда тогда была маленькая, несколько человек.</p>

<div class="umb-macro-highlights">
    <strong>На старте было очень трудно: никакого обучения, никакой системы. Просто «ты теперь тимлид» — и&nbsp;вперёд, на&nbsp;проект. С&nbsp;тех&nbsp;пор&nbsp;мы&nbsp;сделали несколько продуктов. Сейчас я&nbsp;на&nbsp;четвёртом проекте, и&nbsp;в&nbsp;целом всё&nbsp;прошло удачно: набрал много опыта, особенно тимлидского.</strong>
    
</div>

<p dir="ltr">Сейчас я&nbsp;на&nbsp;проекте, где&nbsp;прямо настоящая продуктовая большая команда. Часть людей — со&nbsp;стороны заказчика, часть — со&nbsp;стороны fuse8. От&nbsp;нас&nbsp;в&nbsp;команде человек восемь примерно. Я&nbsp;уже&nbsp;периодически пересчитываю: как&nbsp;с&nbsp;возрастом ребёнка после трёх лет&nbsp;— каждый раз&nbsp;вспоминать приходится.</p>
<p dir="ltr">Кроме разработчиков, в&nbsp;команде есть QA-специалисты, аналитики, PM, продуктолог, DevOps, БД-разработчики. В&nbsp;сумме постоянный состав — человек 15–20. Сейчас я&nbsp;управляю такой командой: стараюсь настраивать процессы, уменьшать свой бас-фактор на&nbsp;проекте, чтобы в&nbsp;идеале всё&nbsp;работало без&nbsp;меня, и&nbsp;активно занимаюсь онбордингом. За&nbsp;последние полгода–год к&nbsp;нам&nbsp;пришло много новых бэкендеров, их&nbsp;нужно погрузить в&nbsp;проект, научить нашим практикам и&nbsp;подходам. </p>
<h2 dir="ltr">А расскажи подробнее про&nbsp;сам&nbsp;продукт – для&nbsp;чего он, чем&nbsp;хорош?</h2>
<p dir="ltr">Я работаю на&nbsp;Цессионарии – это&nbsp;ERP&nbsp;система для&nbsp;досудебного взыскания в&nbsp;сфере финтеха. Его&nbsp;мы&nbsp;начали разрабатывать давно — примерно в&nbsp;середине 2019 года. Активно делали его, а&nbsp;потом случился ковид, и&nbsp;проект приостановили: было неясно, что&nbsp;будет дальше.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneProjectBlock"
            data-content-element-type-key="fbd4d025-d11c-4282-949f-91bea47ced9d"
            data-element-udi="umb://element/dc95970b3fe743dc8943afc2270918a3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

	<a href="/projects/assignot-new/">
		


    <img src="/Media/2905/3.png"
         alt=""
         itemprop="">

		<div class="project-block__content">
			<p>&#x421;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x43D;&#x430;&#x448; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;</p>
			<span>Индивидуальная ERP вместо Excel для бизнеса по взысканию долгов</span>
		</div>
	</a>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c4dec47abbb9466c973f3cd3b24e4d54"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3b541a829d534e7cb8d1f51230826598"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Потом проект возобновили: сначала маленькой командой в&nbsp;несколько человек, потом вернули туда полноценную команду. И&nbsp;вот&nbsp;эта&nbsp;пауза — очень прикольный опыт. Ты&nbsp;приходишь на&nbsp;проект через несколько лет, в&nbsp;систему, которую сам&nbsp;же&nbsp;когда&#8209;то&nbsp;писал, и&nbsp;понимаешь, что&nbsp;теперь вообще ничего не&nbsp;понятно. Очень сильная рефлексия получается.</p>
<h2 dir="ltr">И как&nbsp;это&nbsp;ощущается? Получается распознать написанное? Вообще есть ли&nbsp;у&nbsp;твоего кода свой «почерк»?</h2>
<p dir="ltr">Тут я&nbsp;бы&nbsp;разделил «почерк» на&nbsp;две&nbsp;части.</p>
<p dir="ltr">Первая — это&nbsp;именно стиль кода. Когда по&nbsp;формату, структуре, неймингу можно попытаться угадать, кто&nbsp;это&nbsp;писал. Вот&nbsp;здесь у&nbsp;нас&nbsp;всё, на&nbsp;мой&nbsp;взгляд, довольно хорошо: в&nbsp;идеале в&nbsp;команде ни&nbsp;у&nbsp;кого не&nbsp;должно быть своего ярко выраженного почерка. Тогда проще командно работать, поддерживать код, понимать друг друга.</p>
<p dir="ltr">Мы недавно были на&nbsp;вебинаре про&nbsp;простой код, и&nbsp;там&nbsp;как&nbsp;раз&nbsp;говорили, что&nbsp;все&nbsp;проверки и&nbsp;процессы должны быть устроены так, чтобы по&nbsp;виду кода было неясно, кто&nbsp;его&nbsp;написал. В&nbsp;целом у&nbsp;нас&nbsp;так&nbsp;и&nbsp;есть: часто смотришь на&nbsp;старый код&nbsp;— и&nbsp;вообще непонятно, чей&nbsp;он. Приходится идти в&nbsp;репозиторий и&nbsp;проверять. Иногда оказывается, что&nbsp;это&nbsp;ты&nbsp;сам, иногда — кто&#8209;то&nbsp;другой.</p>
<p dir="ltr">А вторая часть — это&nbsp;архитектурный почерк: как&nbsp;организованы файлы, как&nbsp;процессы взаимодействуют, как&nbsp;устроена БД, как&nbsp;применяются (или&nbsp;не&nbsp;применяются) DDD-практики и&nbsp;прочее.</p>
<p dir="ltr">Здесь это&nbsp;уже&nbsp;не&nbsp;только мой&nbsp;почерк — мы&nbsp;в&nbsp;2019-м пытались командой сделать «идеальный» проект. Большинство решений действительно принимал я, но&nbsp;не&nbsp;все&nbsp;— мы&nbsp;что&#8209;то&nbsp;обсуждали вместе.</p>
<p dir="ltr">Есть архитектурные решения, которые сейчас я&nbsp;считаю неправильными. И&nbsp;исправлять их&nbsp;сложнее, чем&nbsp;править кодстайл. Приходится с&nbsp;этим жить: страдать, понимать, что&nbsp;на&nbsp;старте можно было сделать иначе, и&nbsp;потихоньку всё&nbsp;это&nbsp;рефакторить.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/a393e50426384764a65b699dcec4a908"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Есть архитектурные решения, которые сейчас я&nbsp;считаю неправильными. И&nbsp;исправлять их&nbsp;сложнее, чем&nbsp;править кодстайл. Приходится с&nbsp;этим жить: страдать, понимать, что&nbsp;на&nbsp;старте можно было сделать иначе, и&nbsp;потихоньку всё&nbsp;это&nbsp;рефакторить.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Федор Киселев
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e18b81b5d34646c7ab0f069aba649382"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e5a53507efd54d8996a5ff65c5345fbe"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Где-то мы&nbsp;переписываем архитектуру «по пути», когда сильно дорабатываем функциональность и&nbsp;заодно чуть её&nbsp;улучшаем. Где&#8209;то&nbsp;приходит запрос от&nbsp;бизнеса, а&nbsp;мы&nbsp;честно говорим: «В текущей архитектуре это&nbsp;либо почти невозможно, либо очень долго. Давайте сначала отдельной задачей отрефакторим, а&nbsp;потом уже&nbsp;быстро сделаем нужную фичу». И&nbsp;рефакторим уже&nbsp;с&nbsp;пониманием того, какая функциональность сверху приедет.</p>
<p dir="ltr">Поэтому архитектурный почерк сейчас очень виден — и&nbsp;он&nbsp;создаёт нам&nbsp;немало проблем.</p>
<p dir="ltr">При этом есть интересный момент: проект по&nbsp;сути стартовал как&nbsp;внутренний стартап. Нужно было сделать быстро, непонятно было, «полетит» он&nbsp;или&nbsp;нет. И&nbsp;часть архитектурных решений, которые сейчас мы&nbsp;считаем неправильными, тогда были правильными — именно потому, что&nbsp;сильно ускоряли разработку MVP. Они&nbsp;помогли быстро выпустить первую версию.</p>
<p dir="ltr">А вот&nbsp;другая часть проблем — просто про&nbsp;недостаток хардскиллов и&nbsp;опыта в&nbsp;тот&nbsp;момент. Где&#8209;то&nbsp;сделали неоптимально, просто потому что&nbsp;ещё&nbsp;не&nbsp;знали, как&nbsp;лучше.</p>
<h2 dir="ltr">Можешь привести пример такого прям уродливого костыля, который в&nbsp;моменте сильно помог ускорить релиз и&nbsp;принёс пользу бизнесу?</h2>
<p dir="ltr">Да, у&nbsp;нас&nbsp;есть такой классический пример — то, что&nbsp;мы&nbsp;делали ради ускорения MVP. И&nbsp;я&nbsp;думаю, это&nbsp;реально ускорило релиз процентов на&nbsp;20. Мы&nbsp;использовали анти-паттерн generic repository для&nbsp;чтения данных из&nbsp;БД. Был&nbsp;один обобщенный репозиторий, не&nbsp;привязанный к&nbsp;конкретной таблице или&nbsp;сущности. Из&nbsp;него доставались данные для&nbsp;всего подряд.</p>
<p dir="ltr">Это работало в&nbsp;связке с&nbsp;автомаппером: мы&nbsp;настраивали маппинг таблиц БД&nbsp;и&nbsp;сущностей на&nbsp;кастомные DTO-модели. На&nbsp;базе этой модельки автоматически генерировался запрос в&nbsp;БД, а&nbsp;результат маппился обратно в&nbsp;DTO.</p>
<p dir="ltr">На старте это&nbsp;казалось магией. Пишешь модельку, настраиваешь маппинг — часто довольно простой — и&nbsp;буквально одним-двумя файлами у&nbsp;тебя уже&nbsp;есть и&nbsp;запрос, и&nbsp;ответ. Можно переиспользовать запросы. Для&nbsp;кучи задач на&nbsp;запуске проекта это&nbsp;было супер удобно и&nbsp;сильно ускоряло разработку.</p>
<p dir="ltr">Пока БД&nbsp;была маленькая, и&nbsp;нагрузки были небольшие, проблем не&nbsp;было. А&nbsp;вот&nbsp;потом, когда база разрослась и&nbsp;начался второй этап активных доработок, всё&nbsp;стало гораздо веселее.</p>
<p dir="ltr">Во-первых, проблемы с&nbsp;оптимизацией: автоматически собранные запросы часто получаются неоптимальными, их&nbsp;трудно тюнить по&nbsp;перформансу.</p>
<p dir="ltr">Во-вторых, проблемы с&nbsp;поддержкой. У&nbsp;тебя есть сущность, в&nbsp;БД&nbsp;у&nbsp;неё&nbsp;поле, например DealDate. Ты&nbsp;хочешь по&nbsp;коду найти, где&nbsp;«дата сделки» используется. И&nbsp;не&nbsp;находишь нигде. А&nbsp;по&nbsp;факту она&nbsp;используется в&nbsp;десяти местах — просто это&nbsp;поле продублировано в&nbsp;куче разных DTO-моделей. Это&nbsp;сильно мешает поддержке, повышает риск всё&nbsp;сломать при&nbsp;доработках.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/b350462a73ef4254bb59363e95ce125c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/refactoring-helps-to-save-budget/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/2936/frame-300.png"
         alt=""
         itemprop="">

    
            <span>Как&nbsp;рефакторинг помогает не&nbsp;потратить кучу денег на&nbsp;продукт</span>
                <p>&#x424;&#x451;&#x434;&#x43E;&#x440; &#x41A;&#x438;&#x441;&#x435;&#x43B;&#x451;&#x432;, &#x422;&#x438;&#x43C;&#x43B;&#x438;&#x434;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/97c44a26ee304224aa2583a574efc82c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Сейчас мы&nbsp;потихоньку избавляемся от&nbsp;этого generic-репозитория и&nbsp;переписываем всё&nbsp;на&nbsp;нормальные репозитории. Но&nbsp;как&nbsp;стартовый костыль для&nbsp;MVP&nbsp;он&nbsp;действительно помог.</p>
<h2 dir="ltr">А что&nbsp;для&nbsp;тебя пример красивого решения? Как&nbsp;ты&nbsp;понимаешь, что&nbsp;оно&nbsp;действительно оптимальное, достаточно хорошее, и&nbsp;его&nbsp;не&nbsp;придётся через полгода переписывать?</h2>
<p dir="ltr">Для меня красота решения почти всегда в&nbsp;простоте. Чем&nbsp;проще и&nbsp;понятнее код, при&nbsp;этом хорошо работающий, тем&nbsp;лучше. Такой код&nbsp;легче читать, когда нужно разобраться, как&nbsp;всё&nbsp;устроено. Его&nbsp;проще дорабатывать. И&nbsp;он&nbsp;реже ломается.</p>
<p dir="ltr">Причём «понятный» не&nbsp;равно «примитивный». Понятность достигается за&nbsp;счёт нормального нейминга методов, переменных, за&nbsp;счет структуры. И&nbsp;ещё&nbsp;— за&nbsp;счёт комментариев.</p>
<p dir="ltr">У нас&nbsp;на&nbsp;старте проекта была большая проблема: мы&nbsp;почти не&nbsp;писали комментариев там, где&nbsp;боролись с&nbsp;какими&#8209;то&nbsp;особенностями библиотек или&nbsp;реализовывали странные, на&nbsp;первый взгляд, требования бизнеса. Когда мы&nbsp;вернулись к&nbsp;этому коду спустя несколько лет, стало понятно, что&nbsp;ничего не&nbsp;понятно. Почему сделано именно так: истории нет, объяснений нет.</p>

<div class="umb-macro-highlights">
    <strong>Сейчас я&nbsp;считаю, что&nbsp;комментарии нужны как&nbsp;раз&nbsp;там, где&nbsp;есть неочевидное решение, хак&nbsp;или&nbsp;нелинейное требование. Не&nbsp;везде, а&nbsp;точечно. И&nbsp;это&nbsp;тоже часть «красоты»: ты&nbsp;смотришь на&nbsp;участок кода и&nbsp;сразу видишь контекст.</strong>
    
</div>

<p dir="ltr"><strong>Поэтому, если коротко: красивый код&nbsp;— максимально простой и&nbsp;максимально понятный</strong>. А&nbsp;дальше уже&nbsp;идут другие характеристики: устойчивость к&nbsp;изменениям, тестируемость, архитектурная целостность. Это&nbsp;важные вещи, но&nbsp;это&nbsp;уже&nbsp;немного другая плоскость.</p>
<h2 dir="ltr">А где&nbsp;проходит граница между чистым, понятным кодом и&nbsp;оверинжинирингом? Как&nbsp;в&nbsp;команде заметить, что&nbsp;кто&#8209;то&nbsp;пошел слишком далеко в&nbsp;усложнение, и&nbsp;поймать этот момент до&nbsp;того, как&nbsp;станет поздно?</h2>
<p dir="ltr">Начну с&nbsp;того, как&nbsp;у&nbsp;нас&nbsp;в&nbsp;принципе устроен процесс. На&nbsp;проекте почти все&nbsp;задачи проходят код-ревью — я&nbsp;бы&nbsp;сказал, процентов 99. Это&nbsp;последняя точка контроля. Не&nbsp;самая идеальная точка, но&nbsp;неизбежная: если проблема дошла до&nbsp;ревью, её&nbsp;там&nbsp;можно поймать.</p>
<p dir="ltr">Как это&nbsp;выглядит на&nbsp;практике. Ты&nbsp;читаешь задачу, идешь смотреть код&nbsp;— и&nbsp;вроде он&nbsp;что&#8209;то&nbsp;делает, но&nbsp;ничего не&nbsp;понятно. Появляется желание всё&nbsp;переписать. Или&nbsp;ты&nbsp;не&nbsp;можешь по&nbsp;коду понять, как&nbsp;это&nbsp;работает, и&nbsp;вынужден запускать проект, дебажить, чтобы разобраться. Это&nbsp;и&nbsp;есть маркеры: если ревьюер не&nbsp;может понять код&nbsp;без&nbsp;дебага, значит, человек переусложнил, либо есть проблемы с&nbsp;читабельностью и&nbsp;неймингом.</p>
<p dir="ltr">Теперь про&nbsp;оптимизацию. <strong>Часто оптимизация — противоположность простоте. Она&nbsp;усложняет код. </strong>И тут&nbsp;всё&nbsp;упирается в&nbsp;тип&nbsp;проекта. Если у&nbsp;тебя серьёзный публичный продукт с&nbsp;большими нагрузками — банки, маркетплейсы, крупные B2C-сервисы, — без&nbsp;оптимизаций никак. Там&nbsp;это&nbsp;обязательная часть работы.</p>
<p dir="ltr">Если это&nbsp;внутренняя система, как&nbsp;у&nbsp;нас, где&nbsp;пользователей ограниченное количество, то&nbsp;чаще всего можно обойтись без&nbsp;овероптимизаций. Дальше встаёт вопрос объёмов данных. Где&#8209;то&nbsp;их&nbsp;мало, где&#8209;то&nbsp;очень много. У&nbsp;нас&nbsp;данных достаточно много, и&nbsp;каждый месяц они&nbsp;растут, поэтому в&nbsp;отдельных местах нам&nbsp;оптимизации всё-таки нужны. Но&nbsp;всё&nbsp;равно — местами, не&nbsp;везде.</p>
<p dir="ltr">Есть ещё&nbsp;тема разделения потоков чтения и&nbsp;записи. Часто встречаются сервисы, в&nbsp;которых данные меняются не&nbsp;так&nbsp;часто, как&nbsp;читаются. Для&nbsp;таких случаев есть подходы, где&nbsp;чтение данных отделено от&nbsp;их&nbsp;редактирования. Тогда чтение можно сделать более сложным и&nbsp;оптимизированным, а&nbsp;код, который отвечает за&nbsp;добавление и&nbsp;обновление, оставить простым и&nbsp;понятным.</p>
<p dir="ltr">Если говорить про&nbsp;наш&nbsp;продукт: где&#8209;то&nbsp;нам&nbsp;нужна оптимизация обновления данных, где&#8209;то&nbsp;— только выборки, а&nbsp;чаще — ничего особо оптимизировать не&nbsp;нужно. Поэтому в&nbsp;основной массе кода хочется видеть простой, прозрачный код, и&nbsp;только в&nbsp;точечных местах — сложные мегазапросы с&nbsp;пятью join’ами и&nbsp;кучей интеграций.</p>
<p dir="ltr">И если ты&nbsp;заходишь на&nbsp;ревью и&nbsp;видишь вот&nbsp;такой «мегазапрос» там, где&nbsp;нет&nbsp;ни&nbsp;нагрузки, ни&nbsp;причин его&nbsp;делать — это&nbsp;и&nbsp;есть граница, которую человек перешёл.</p>
<h2 dir="ltr">Давай поговорим про&nbsp;код-ревью. Почему это&nbsp;необходимый инструмент для&nbsp;роста разработчиков и&nbsp;улучшения практик?</h2>
<p dir="ltr"><strong>Важно сразу сказать: код-ревью — не&nbsp;только про&nbsp;развитие людей. Оно&nbsp;ещё&nbsp;и&nbsp;про&nbsp;здоровье кодовой базы, особенно если проект долгоживущий.</strong> Ревью помогает поддерживать нормальное состояние кода: простоту, читаемость, поддерживаемость, возможность вносить изменения без&nbsp;тотального переписывания.</p>
<p dir="ltr">Если говорить про&nbsp;разные типы проектов, то&nbsp;код-ревью, на&nbsp;мой&nbsp;взгляд, почти не&nbsp;нужно в&nbsp;ситуации, когда у&nbsp;тебя чистый стартап: нужно максимально быстро собрать MVP&nbsp;за&nbsp;минимальные деньги. Там&nbsp;ревью — это&nbsp;прямое замедление выхода фич&nbsp;и&nbsp;рост бюджета.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/bacd33ea2d1d4d2b9d9e5fab33770d56"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            У&nbsp;нас&nbsp;на&nbsp;проекте ревью очень помогает в&nbsp;онбординге. У&nbsp;нас&nbsp;нет&nbsp;огромной документации по&nbsp;best practices в&nbsp;Confluence, нет&nbsp;отдельного тома по&nbsp;кодстайлу, паттернам и&nbsp;подходам — того самого «учебника по&nbsp;проекту», который можно выдать новичку со&nbsp;словами «Вот тебе неделя, сядь почитай, тут&nbsp;всё&nbsp;есть».
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Федор Киселев
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/caf819cd19a34cf18a27b142e787e9db"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/df55cbaec8e44d6b908db1cf7c78b55e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Раньше в&nbsp;этом не&nbsp;было особой необходимости: команда мало менялась, было много «старичков», которые и&nbsp;онбордили новичков, и&nbsp;держали в&nbsp;голове контекст. Поэтому мы&nbsp;использовали связку: несколько созвонов для&nbsp;ввода в&nbsp;проект, объяснение общих принципов и&nbsp;потом — погружение через задачи и&nbsp;код-ревью.</p>
<p dir="ltr">Человек делает задачи, а&nbsp;мы&nbsp;на&nbsp;ревью проверяем и&nbsp;кодстайл, и&nbsp;архитектурные принципы, и&nbsp;понятность. По&nbsp;ходу дела корректируем, подсказываем. За&nbsp;несколько месяцев — полгода человек через такой практический онбординг очень хорошо встраивается в&nbsp;проект и&nbsp;уже&nbsp;пишет код, который органично в&nbsp;него ложится.</p>
<p dir="ltr">Потом произошел переломный момент: новых разработчиков стало больше, чем&nbsp;старых. И&nbsp;тут&nbsp;начались сложности. Старички просто физически не&nbsp;успевают ревьюить всё&nbsp;подряд и&nbsp;параллельно вести свои задачи. Поэтому сейчас мы, начали-таки описывать best practices.</p>
<p dir="ltr">Ревью все&nbsp;равно остается полезным для&nbsp;шаринга новых знаний: ты&nbsp;заходишь в&nbsp;чужую задачку и&nbsp;вдруг видишь, что&nbsp;можно использовать какой&#8209;то&nbsp;новый оператор, по-другому написать запрос, применить новый подход или&nbsp;библиотеку.</p>
<p dir="ltr">Но тут&nbsp;тоже есть эффект масштаба: в&nbsp;большой команде из&nbsp;восьми человек один внедрил что&#8209;то&nbsp;классное, двое это&nbsp;увидели на&nbsp;ревью, а&nbsp;остальные так&nbsp;и&nbsp;не&nbsp;узнали.</p>
<p dir="ltr">Чтобы это&nbsp;исправить, мы&nbsp;ввели на&nbsp;проекте tech demo. Когда кто&#8209;то&nbsp;делает большую бизнес-фичу или&nbsp;важную техническую задачу, он&nbsp;потом созванивается с&nbsp;командой, рассказывает, какую проблему решал, показывает верхнеуровнево код, объясняет новые подходы или&nbsp;библиотеки. Если это&nbsp;что&#8209;то&nbsp;переиспользуемое, например обработка Excel, — показывает, как&nbsp;этим пользоваться.</p>
<p dir="ltr">В итоге у&nbsp;нас&nbsp;сейчас разделение:</p>
<ul>
<li>в команде до&nbsp;четырёх человек код-ревью действительно может быть единой точкой развития — и&nbsp;дополнительных процессов почти не&nbsp;нужно;</li>
<li>если человек больше, ревью будет про&nbsp;поиск сложных багов, которые сложно поймать тестами, про&nbsp;то, чтобы не&nbsp;упустить важные нюансы из&nbsp;ТЗ&nbsp;и&nbsp;сохранить единый стиль и&nbsp;качество кодовой базы.</li>
</ul>
<h2 dir="ltr">Ты говорил, что&nbsp;на&nbsp;ревью часто ловятся вещи, которые негативно влияют на&nbsp;продукт и&nbsp;могут не&nbsp;вылезти в&nbsp;тестах. Как&nbsp;вы&nbsp;обычно делитесь такими находками с&nbsp;командой?</h2>
<p dir="ltr">Если мы&nbsp;на&nbsp;код-ревью видим проблему — будь то&nbsp;недочёт в&nbsp;ТЗ&nbsp;или&nbsp;ошибка в&nbsp;реализации — мы&nbsp;решаем её&nbsp;в&nbsp;рамках этого ревью. До&nbsp;продакшена такие вещи, как&nbsp;правило, не&nbsp;доходят. И&nbsp;тогда нет&nbsp;необходимости поднимать это&nbsp;на&nbsp;уровень всей команды.</p>

<div class="umb-macro-highlights">
    <strong>Зато очень важно, как&nbsp;мы&nbsp;даём фидбэк. Просто написать «здесь какая&#8209;то&nbsp;фигня, перепиши» — плохой вариант. У&nbsp;меня у&nbsp;самого лет&nbsp;пять назад был&nbsp;период, когда я, видя неоптимальный код&nbsp;или&nbsp;баг, просто заходил в&nbsp;чужую ветку, переписывал за&nbsp;человека и&nbsp;оставлял сверху комментарий, что&nbsp;«так лучше». Это&nbsp;не&nbsp;работает.</strong>
    
</div>

<p dir="ltr">Нужно писать развернутый комментарий: описать проблему, объяснить, почему это&nbsp;не&nbsp;будет работать или&nbsp;почему это&nbsp;ухудшает поддержку. Иногда — дать больше контекста по&nbsp;функциональности. Можно накидать кусочек примера кода, но&nbsp;не&nbsp;переписывать всё&nbsp;целиком за&nbsp;человека. Или&nbsp;пошагово описать, как&nbsp;можно улучшить решение.</p>
<p dir="ltr">Так человек сам&nbsp;вносит правки, при&nbsp;этом обучается и&nbsp;онбордится дальше. И&nbsp;это&nbsp;касается не&nbsp;только новичков, но&nbsp;и&nbsp;старичков тоже — все&nbsp;иногда узнают что&#8209;то&nbsp;новое через ревью.</p>
<p dir="ltr">Если это&nbsp;типовая проблема, которая повторяется у&nbsp;двух-трех людей, тогда её&nbsp;проще обсуждать уже&nbsp;как&nbsp;паттерн, а&nbsp;не&nbsp;как&nbsp;персональный промах. Мы&nbsp;выносим её&nbsp;в&nbsp;отдельные созвоны и&nbsp;в&nbsp;документацию по&nbsp;best practices. Там&nbsp;мы&nbsp;разбираем конкретные кейсы, но&nbsp;стараемся делать это&nbsp;без&nbsp;эмоциональной окраски: просто по&nbsp;фактам — что&nbsp;было сделано, к&nbsp;каким проблемам это&nbsp;может привести, как&nbsp;лучше делать. Обычно формулируем это&nbsp;так: «В последнее время в&nbsp;ревью часто видим вот&nbsp;такую ошибку». Без&nbsp;привязки к&nbsp;конкретным именам.</p>
<p dir="ltr">И это&nbsp;сильно снижает напряжение. Люди видят, что&nbsp;это&nbsp;не&nbsp;«я один всё&nbsp;делаю неправильно», а&nbsp;просто общая «болячка» команды, которую мы&nbsp;сейчас лечим.</p>
<p dir="ltr">Главное — тон, а&nbsp;не&nbsp;сам&nbsp;факт разбора.</p>
<h2 dir="ltr">Перейдём к&nbsp;более общим практикам. Какую привычку или&nbsp;практику ты&nbsp;бы&nbsp;вообще выпилил из&nbsp;отрасли? То, что, по&nbsp;твоему опыту не&nbsp;приносит, а&nbsp;мешает.</h2>
<p dir="ltr">Сложный вопрос — у&nbsp;нас&nbsp;просто сейчас очень адекватный заказчик и&nbsp;довольно здоровые процессы. Но&nbsp;если говорить в&nbsp;целом по&nbsp;индустрии, я&nbsp;бы&nbsp;выделил такую практику: полная изоляция IT-команды от&nbsp;заказчика.</p>
<p dir="ltr">Когда вся&nbsp;коммуникация идёт только через PM’а или&nbsp;продуктолога. Есть один–два человека-«шлюза», и&nbsp;через них&nbsp;проходит всё&nbsp;общение. Разработчики никогда не&nbsp;общаются напрямую с&nbsp;бизнесом, не&nbsp;ходят на&nbsp;общие созвоны. </p>
<p dir="ltr">Эта практика, с&nbsp;одной стороны, «экранирует» разработчиков от&nbsp;давления, от&nbsp;эмоциональных качелей заказчика, улучшает атмосферу в&nbsp;команде. В&nbsp;этом действительно есть плюсы. Но&nbsp;с&nbsp;другой стороны, сильно снижается скорость и&nbsp;качество обратной связи. Не&nbsp;всегда понятно, как&nbsp;люди реально пользуются фичами, что&nbsp;им&nbsp;неудобно, какие у&nbsp;них&nbsp;ожидания на&nbsp;будущее.</p>
<p dir="ltr">В такой ситуации есть риск релиза фич, которыми потом невозможно пользоваться в&nbsp;реальной жизни. Не&nbsp;потому, что&nbsp;разработчики плохие, а&nbsp;потому что&nbsp;где&#8209;то&nbsp;по&nbsp;пути потерялся контекст, что&#8209;то&nbsp;не&nbsp;спросили, не&nbsp;учли, неправильно поняли. Плюс риск неправильной приоритизации, потому что&nbsp;о&nbsp;планах как&nbsp;следует никто не&nbsp;поговорил.</p>

<div class="umb-macro-highlights">
    <strong>Мне кажется, здесь важно не&nbsp;уходить в&nbsp;крайности. Не&nbsp;нужно давать всей команде неограниченный доступ к&nbsp;заказчику. Но&nbsp;и&nbsp;полная изоляция тоже вредна. Как&nbsp;минимум лиды направлений должны иметь возможность общаться с&nbsp;бизнесом напрямую и&nbsp;периодически участвовать в&nbsp;общих созвонах.</strong>
    
</div>

<h2 dir="ltr">Иногда проблема не&nbsp;в&nbsp;том, что&nbsp;разработчики не&nbsp;общаются с&nbsp;заказчиком, а&nbsp;в&nbsp;том, что&nbsp;тот&nbsp;самый «шлюз» — аналитик или&nbsp;PM&nbsp;— что&#8209;то&nbsp;недоработал. Ты&nbsp;с&nbsp;этим согласен?</h2>
<p dir="ltr">Отчасти да, но&nbsp;я&nbsp;бы&nbsp;всё&nbsp;равно смотрел на&nbsp;это&nbsp;как&nbsp;на&nbsp;вопрос процесса, а&nbsp;не&nbsp;конкретного человека. Если у&nbsp;тебя один аналитик ведёт одну задачу от&nbsp;начала до&nbsp;конца, то&nbsp;да&nbsp;— он&nbsp;может что&#8209;то&nbsp;не&nbsp;учесть, где&#8209;то&nbsp;ошибиться, о&nbsp;чём&#8209;то&nbsp;не&nbsp;спросить. Все&nbsp;люди ошибаются. И&nbsp;чем&nbsp;дольше всё&nbsp;держится на&nbsp;одном человеке, тем&nbsp;выше риск.</p>
<p dir="ltr">Если бы&nbsp;на&nbsp;каком&#8209;то&nbsp;этапе — не&nbsp;обязательно с&nbsp;самого начала, хотя бы&nbsp;ближе к&nbsp;концу — подключались другие люди и&nbsp;обсуждали всё&nbsp;вместе, в&nbsp;том&nbsp;числе с&nbsp;заказчиком, качество ТЗ&nbsp;и&nbsp;решений было бы&nbsp;выше.</p>

<div class="umb-macro-highlights">
    <strong>Я иногда сравниваю это&nbsp;с&nbsp;публичными продуктами. Представь сайт, где&nbsp;нет&nbsp;ни&nbsp;одного канала обратной связи: ни&nbsp;формочки «оцените сервис», ни&nbsp;быстрого контакта, ни&nbsp;опросов. Тогда команда делает продукт по&nbsp;ощущениям: как&nbsp;кажется, так&nbsp;и&nbsp;будет. Но&nbsp;проверить, как&nbsp;совпадает это&nbsp;с&nbsp;реальностью, невозможно.</strong>
    
</div>

<p dir="ltr">Здесь похожая история. Разработчики не&nbsp;могут почувствовать, как&nbsp;система живёт в&nbsp;руках пользователей, если они&nbsp;вообще не&nbsp;видят этих людей и&nbsp;не&nbsp;слышат их&nbsp;голос.</p>
<p dir="ltr">Если, например, хотя бы&nbsp;на&nbsp;этапе демо перед выкладкой на&nbsp;прод подключать тех, для&nbsp;кого делалась фича, можно заранее поймать несовпадения ожиданий и&nbsp;реальности. Прокликать сценарий, посмотреть, где&nbsp;неудобно, и&nbsp;заложить время на&nbsp;доработки ещё&nbsp;до&nbsp;релиза.</p>
<h2 dir="ltr">Раз уж&nbsp;мы&nbsp;ушли в&nbsp;тему коммуникации, должен ли&nbsp;разработчик уметь объяснять свои решения простыми словами и&nbsp;понимать «обывательский» язык запросов бизнеса?</h2>
<p dir="ltr">Не везде есть идеально настроенные процессы передачи информации от&nbsp;бизнеса к&nbsp;аналитике, от&nbsp;аналитика к&nbsp;разработке и&nbsp;дальше. Часто приходится самим «переводить» туда-обратно. Мне&nbsp;кажется, это&nbsp;как&nbsp;раз&nbsp;тот&nbsp;навык, тот&nbsp;софт-скилл, который универсален не&nbsp;только для&nbsp;разработки, но&nbsp;и&nbsp;вообще для&nbsp;любой отрасли.</p>
<p dir="ltr">В нашей команде этот скилл мы&nbsp;развиваем на&nbsp;перфоманс-ревью. Берем примеры, когда что&#8209;то&nbsp;вовремя не&nbsp;спросили, когда что&#8209;то&nbsp;было не&nbsp;так&nbsp;описано. Важно все&nbsp;эти&nbsp;проблемы не&nbsp;замалчивать и&nbsp;не&nbsp;обсуждать абстрактно. Лучше всего учат конкретные примеры. </p>
<p dir="ltr">На сеньорном грейде навык перевода с&nbsp;разработчиковского на&nbsp;русский должен быть вообще у&nbsp;каждого, на&nbsp;мой&nbsp;взгляд. Потому что&nbsp;делать это&nbsp;не&nbsp;только с&nbsp;заказчиком надо будет, но&nbsp;и&nbsp;с&nbsp;командой. Нужно будет на&nbsp;техдемо, например, объяснять фичи всей команде. Ну&nbsp;а&nbsp;в&nbsp;идеале, конечно, уметь это&nbsp;делать уже&nbsp;будучи мидлом. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/4bc3b0edd9894e50a92aa33a4a7e9e7f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            На&nbsp;сеньорном грейде навык перевода с&nbsp;разработчиковского на&nbsp;русский должен быть вообще у&nbsp;каждого, на&nbsp;мой&nbsp;взгляд. Потому что&nbsp;делать это&nbsp;не&nbsp;только с&nbsp;заказчиком надо будет, но&nbsp;и&nbsp;с&nbsp;командой. Нужно будет на&nbsp;техдемо, например, объяснять фичи всей команде. Ну&nbsp;а&nbsp;в&nbsp;идеале, конечно, уметь это&nbsp;делать уже&nbsp;будучи мидлом. 
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Федор Киселев
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/fb501faa040a4ed8995a9a74c71d532f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/11f05b481da64f4e8c7e6e03c68f47f8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">У нас&nbsp;на&nbsp;проекте есть еще&nbsp;чатик с&nbsp;вопросами на&nbsp;всю&nbsp;команду. Когда по&nbsp;задаче возникает какой&#8209;то&nbsp;вопрос, разработчик должен в&nbsp;этом чате максимально понятно все&nbsp;расписать: дать контекст, сформулировать проблему, поразмышлять, к&nbsp;чему может привести игнорирование этой проблемы, добавить все&nbsp;полезные ссылки. Так&nbsp;все&nbsp;вместе тренируемся друг друга понимать и&nbsp;не&nbsp;оставлять пробелов в&nbsp;знаниях по&nbsp;продукту. </p>
<h2 dir="ltr">Ну, и&nbsp;напоследок, что&nbsp;можешь посоветовать ребятам, которые читают это&nbsp;сейчас? </h2>

<div class="umb-macro-highlights">
    <strong>Для новичков лучший совет – не&nbsp;стесняться задавать глупые вопросы. Потому что&nbsp;это&nbsp;единственный путь к&nbsp;развитию.</strong>
    
</div>

<p dir="ltr">По себе помню, что&nbsp;первые два&nbsp;года на&nbsp;работе я&nbsp;сильно стеснялся спрашивать старших коллег о&nbsp;моментах, которые мне&nbsp;были непонятны. Я&nbsp;считал, что&nbsp;вопросы, которые у&nbsp;меня появляются, глупые, и&nbsp;молчал, чтобы не&nbsp;сойти за&nbsp;неумеху. Поэтому гуглил сам, понимал что&#8209;то&nbsp;урывками и&nbsp;частично. Сейчас могу точно сказать, что&nbsp;это&nbsp;плохой путь. </p>
<p dir="ltr">Сейчас задаю вопросы везде и&nbsp;всегда: бизнесу на&nbsp;проекте, если не&nbsp;понимаю что&#8209;то&nbsp;по&nbsp;их&nbsp;части; коллегам по&nbsp;разработке, если не&nbsp;вижу где&#8209;то&nbsp;полной картины или&nbsp;кто&#8209;то&nbsp;что&#8209;то&nbsp;новое впилил. И&nbsp;это&nbsp;всегда окей и&nbsp;круто, если в&nbsp;итоге удается все&nbsp;слепые зоны для&nbsp;себя закрыть. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Что такое «понимание задачи» и как оно помогает в проектах
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Понимание задачи – основа работы с клиентом. Расказываем, зачем оно нужно, и что даёт нам и заказчику.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/task-understanding/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/task-understanding/</guid>

                <pubDate>Thu, 04 Dec 2025 10:37:31 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Что такое «понимание задачи» и как оно помогает в проектах</h1>
                                <figure>
                                    <img src="/Media/ykpp44z4/&#x43C;&#x438;&#x43D;&#x438;&#x430;&#x442;&#x44E;&#x440;&#x43D;&#x430;&#x44F;-&#x441;&#x446;&#x435;&#x43D;&#x430;-&#x43F;&#x443;&#x43B;&#x44C;&#x442;&#x430;-20-&#x43C;&#x430;&#x44F;-2025.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/54a30c52600a4d209b88aa2f03b1bc1c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Ошибочно считать, что&nbsp;запуск продукта — это&nbsp;только про&nbsp;разработку, технологии и&nbsp;дизайн. Очень легко оступиться задолго до&nbsp;старта всего этого – на&nbsp;этапе первоначальных обсуждений. Если подрядчик и&nbsp;заказчик эффективно не&nbsp;синхронизировались на&nbsp;старте, ничего хорошего из&nbsp;дальнейшей работы не&nbsp;выйдет.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d48608dc86e4121868b6ebdb4c416b03"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/19c9b926a19143688bee3ca7fdbb94ab"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Чтобы такого не&nbsp;происходило, мы&nbsp;всегда составляем понимание задачи. Оно&nbsp;помогает в&nbsp;самом начале зафиксировать общую картину, не&nbsp;прибегая к&nbsp;громоздким ТЗ&nbsp;и&nbsp;многотомным документам. Просто делаем понятную и&nbsp;полезную точку опоры для&nbsp;всей команды.&nbsp;</p>
<h2>Что такое понимание задачи</h2>
<p dir="ltr">Понимание задачи (ПЗ) — это&nbsp;краткое описание того, что&nbsp;мы&nbsp;узнали о&nbsp;заказчике и&nbsp;его&nbsp;продуктовой идее: кто&nbsp;инициатор, в&nbsp;каком контексте работает бизнес, какие цели и&nbsp;ограничения стоят перед проектом. Это&nbsp;документ — саммари, фиксирующее общий язык между заказчиком и&nbsp;командой, и&nbsp;помогающее быстрее двигаться к&nbsp;нужному результату.</p>
<p dir="ltr">Для нас&nbsp;ПЗ&nbsp;— не&nbsp;файлик, который делается где&#8209;то&nbsp;на&nbsp;первой встрече, и&nbsp;после этого теряется в&nbsp;ворохе документов.&nbsp;</p>

<div class="umb-macro-highlights">
    <strong>Понимание задачи – первый шаг&nbsp;к&nbsp;описанию продукта: верхнеуровневое представление о&nbsp;том, что&nbsp;мы&nbsp;делаем и&nbsp;зачем. На&nbsp;основе этого потом выстраиваются детали — от&nbsp;пользовательских сценариев и&nbsp;проектирования архитектуры до&nbsp;дизайна интерфейсов и&nbsp;плана релизов.</strong>
    
</div>

<p dir="ltr">ПЗ не&nbsp;статично. Оно&nbsp;развивается вместе с&nbsp;продуктом: от&nbsp;первых встреч и&nbsp;гипотез к&nbsp;discovery-фазе, затем к&nbsp;MVP&nbsp;и&nbsp;масштабированию с&nbsp;поддержкой. На&nbsp;каждом шаге появляются новые данные, уточняются метрики, корректируются сценарии и&nbsp;архитектурные решения.</p>
<p dir="ltr">Итак, ПЗ&nbsp;– это&nbsp;фундамент цифрового продукта, который позволяет:</p>
<ul>
<li>соотнести бизнес-цели и&nbsp;продуктовые гипотезы;</li>
<li>определить приоритеты на&nbsp;ближайший этап (например, какие сценарии включаем в&nbsp;MVP, а&nbsp;какие откладываем);</li>
<li>зафиксировать риски и&nbsp;ограничения, чтобы избежать недопониманий;</li>
<li>держать команду и&nbsp;заказчика в&nbsp;одном информационном поле.</li>
</ul>
<p dir="ltr">Так, ПЗ&nbsp;становится не&nbsp;только инструментом фиксации договоренностей, но&nbsp;и&nbsp;рабочим артефактом, вокруг которого выстраивается продуктовая стратегия.</p>
<h2>Как создать понимание задачи</h2>
<p dir="ltr">Создание понимания задачи может занимать много времени — до&nbsp;недели с&nbsp;учетом всех возможных этапов подготовки — переговоров, написания, корректировок и&nbsp;формирования решения. Но&nbsp;в&nbsp;долгосрочной перспективе это&nbsp;того стоит. Конкретнее о&nbsp;профитах поговорим чуть позже, а&nbsp;пока перейдем к&nbsp;тому, как&nbsp;мы&nbsp;готовим понимание задачи.</p>
<h3>Встреча с&nbsp;заказчиком</h3>
<p dir="ltr">Сразу оговоримся — это&nbsp;не&nbsp;первый контакт с&nbsp;заказчиком. Мы&nbsp;предполагаем, что&nbsp;до&nbsp;встречи по&nbsp;пониманию задачи у&nbsp;нас&nbsp;уже&nbsp;есть какие&#8209;то&nbsp;вводные: название компании, направление бизнеса и&nbsp;первичный запрос, сформулированный в&nbsp;2-3 словах («нам нужен личный кабинет» или&nbsp;«разработайте нам&nbsp;маркетплейс»).</p>
<p dir="ltr">На встрече собираются ключевые люди. Со&nbsp;стороны заказчика — основатель компании, или&nbsp;владелец бизнеса, иногда руководитель направления. С&nbsp;нашей стороны — продюсер продукта, аналитик, архитектор или&nbsp;тимлид, а&nbsp;также UX-дизайнер.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/bf5d5b3cba6b4c92adc70ba87d008d14"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/product-team/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/tadn1ryk/frame-500&#x432;&#x432;&#x432;&#x432;9585.png"
         alt=""
         itemprop="">

    
            <span>Собираем команду для&nbsp;цифрового продукта: роли, подходы и&nbsp;практические советы</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d860436e015b476fa27cdbd72087ebb6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Что нужно обсудить для&nbsp;понимания задачи</h3>
<p dir="ltr">Всего нам&nbsp;нужно обсудить три&nbsp;большие темы: специфику бизнеса, предполагаемых пользователей и&nbsp;сам&nbsp;продукт. Сначала обсуждаем, чем&nbsp;занимается компания, какие у&nbsp;нее&nbsp;боли и&nbsp;проблемы и&nbsp;каких результатов она&nbsp;ждет. Это&nbsp;могут быть конкретные эффекты: быстрее проводить сделки, уменьшить ручную работу или&nbsp;расширить каналы продаж.</p>
<p dir="ltr">Затем говорим о&nbsp;пользователях, ЦА&nbsp;продукта: кто&nbsp;эти&nbsp;люди, для&nbsp;чего и&nbsp;в&nbsp;каких условиях будут (предположительно) использовать продукт, какие задачи хотят решать.</p>
<p dir="ltr">Дальше обсуждаем сам&nbsp;продукт: что&nbsp;должно быть в&nbsp;первой версии, какие интеграции и&nbsp;технические требования важны, как&nbsp;будем выпускать обновления и&nbsp;по&nbsp;каким метрикам оценивать успех.</p>
<p dir="ltr">Когда все&nbsp;обговорили, кратко и&nbsp;устно резюмируем. Мы&nbsp;обязательно проговариваем, как&nbsp;в&nbsp;итоге поняли задачу — фактически, тезисно повторяем все, что&nbsp;сообщил заказчик и&nbsp;что&nbsp;нам&nbsp;удалось выяснить и&nbsp;сформулировать с&nbsp;ним&nbsp;вместе во&nbsp;время разговора. Часто первичный запрос, с&nbsp;которым клиент к&nbsp;нам&nbsp;пришел, к&nbsp;этому моменту сильно меняется. Вот&nbsp;вам&nbsp;пример:</p>
<table border="1" style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 49.4876%; text-align: center;"><strong>Первичный запрос, с&nbsp;которым клиент пришел на&nbsp;встречу</strong></td>
<td style="width: 49.4876%; text-align: center;"><strong>Задача, сформулированная после встречи</strong></td>
</tr>
<tr>
<td style="width: 49.4876%;">Нужно разработать сервис, на&nbsp;котором клиенты и&nbsp;исполнители будут искать друг друга</td>
<td style="width: 49.4876%;">Проверить гипотезу по&nbsp;услуге и&nbsp;получить по&nbsp;10 платных запросов от&nbsp;клиентов и&nbsp;исполнителей</td>
</tr>
</tbody>
</table>
<p dir="ltr">Чувствуете разницу? Задача серьезно изменилась. А&nbsp;значит и&nbsp;решение будет уже&nbsp;совершенно другим — по&nbsp;форме, содержанию, временным и&nbsp;денежным затратам.</p>
<p dir="ltr">Итак, если задача в&nbsp;целом понята верно, и&nbsp;клиент это&nbsp;подтвердил, можно уже&nbsp;сейчас верхнеуровнево предположить, каким может быть решение. Если нет, значит мы&nbsp;что&#8209;то&nbsp;упустили во&nbsp;время разговора. Конечно, начинать все&nbsp;сначала не&nbsp;придется, но&nbsp;лишние 10-15 минут на&nbsp;уточнения и&nbsp;корректировку ПЗ&nbsp;потратить нужно будет.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/66ce4736834e423b890c0939f79f3bf4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Тут&nbsp;важно понять, что&nbsp;понимание задачи не&nbsp;подразумевает бездумного выписывания вообще всего, что&nbsp;говорит нам&nbsp;заказчик
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/17dceb9551714e5ab6748d410f3b43a3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6dfcf3f5c2c9447b927b4e6d3549458e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Чтобы точнее настроиться на&nbsp;восприятие целей (и&nbsp;метрик, если они&nbsp;сразу проговариваются), прочтите наш&nbsp;<a href="/articles/development-goals-at-project-start/" title="Постановка целей в&nbsp;digital-разработке: как&nbsp;не&nbsp;провалить запуск цифрового продукта">текст о&nbsp;практике целеполагания в&nbsp;цифровых продуктах</a>. В&nbsp;нем&nbsp;мы&nbsp;разбираем, как&nbsp;именно размытые формулировки задач становятся причиной провала проектов.</p>
<p dir="ltr">Затем берем пару дней на&nbsp;создание документа с&nbsp;пониманием задачи и&nbsp;формулировку нашего предложения по&nbsp;реализации задуманного.</p>
<h3 dir="ltr">Работа после встречи</h3>
<p dir="ltr">После встречи мы&nbsp;формулируем все&nbsp;услышанное и&nbsp;оговоренное в&nbsp;документ. Внутри – общие очертания желаемого продукта, а&nbsp;также гипотезы и&nbsp;измеримые цели. Например:</p>
<ul>
<li>«Сократить время обработки заявки с&nbsp;5 дней до&nbsp;2»;</li>
<li>«Проверить гипотезу: пользователи будут использовать чат&#8209;бот&nbsp;для&nbsp;оформления заказов»;</li>
<li>«Первый релиз MVP&nbsp;должен покрывать три&nbsp;ключевых сценария — регистрация, заказ и&nbsp;оплата».</li>
</ul>
<p>Так формируется общий ориентир, вокруг которого дальше строится продуктовое проектирование, планирование MVP&nbsp;и&nbsp;дорожная карта продукта.</p>
<h2 dir="ltr">Что внутри понимания задачи</h2>
<p dir="ltr">Документ, который получается в&nbsp;итоге, обычно состоит из&nbsp;трех частей:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/3d5cfe804e404d66aa57b31d490b7643"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/56f0abfde54146d3bb2b066b933d7b7f"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">О клиенте</h3>
<p dir="ltr">Кратко описываем, кто&nbsp;заказчик и&nbsp;в&nbsp;каком контексте работает бизнес. Например: на&nbsp;каком рынке он&nbsp;действует, какие у&nbsp;него ключевые продукты или&nbsp;сервисы, кто&nbsp;конкуренты, кто&nbsp;клиенты.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3857026201fa434dbe3c1a163619538d"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">О задаче</h3>
<p dir="ltr">Фиксируем, ради чего создается продукт. Формулируем задачу со&nbsp;слов клиента максимально подробно — со&nbsp;всеми озвученными пожеланиями, условиями и&nbsp;подробностями.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0e0552cecfcd4e369cf1d8fa3aa5532f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Наше решение</h3>
<p dir="ltr">Определяем, как&nbsp;будем двигаться дальше. На&nbsp;этом этапе речь не&nbsp;о&nbsp;ТЗ, а&nbsp;о&nbsp;стратегии, и&nbsp;вот&nbsp;что&nbsp;мы&nbsp;фиксируем здесь в&nbsp;рамках понимания задачи:</p>
<ul>
<li>каким может быть путь продукта — фаза проектирования, разработка и&nbsp;запуск MVP, дальнейшее масштабирование;</li>
<li>какие гипотезы проверим в&nbsp;ближайших итерациях;</li>
<li>как будет выглядеть первая версия (MVP) и&nbsp;какие сценарии в&nbsp;нее&nbsp;войдут.</li>
</ul>
<p dir="ltr">Такой документ не&nbsp;закрывает все&nbsp;вопросы, но&nbsp;дает общее направление: зачем делаем продукт, как&nbsp;будем подходить к&nbsp;его&nbsp;созданию, и&nbsp;какие шаги приведут нас&nbsp;к&nbsp;результату.&nbsp;</p>
<h2 dir="ltr">Что дальше</h2>
<p dir="ltr">После того как&nbsp;понимание задачи собрано, мы&nbsp;презентуем его&nbsp;заказчику. Это&nbsp;момент синхронизации: мы&nbsp;вместе смотрим на&nbsp;то, как&nbsp;сформулированы цели, сценарии и&nbsp;гипотезы, и&nbsp;вправе уточнить детали или&nbsp;что&#8209;то&nbsp;доработать.</p>
<p dir="ltr">Потом, дополняя зафиксированное ПЗ, мы&nbsp;формулируем коммерческое предложение (КП). Помимо всего того, что&nbsp;уже&nbsp;есть в&nbsp;ПЗ, КП&nbsp;включает также:&nbsp;</p>
<ul>
<li>архитектурная гипотеза: основные технологии и&nbsp;компоненты системы, интеграции, работа с&nbsp;данными;</li>
<li>состав команды и&nbsp;роли по&nbsp;этапам разработки;</li>
<li>ориентировочные сроки и&nbsp;диапазоны затрат;</li>
<li>возможные риски и&nbsp;способы их&nbsp;контролировать.</li>
</ul>
<p dir="ltr">Следующий шаг&nbsp;чаще всего – это&nbsp;проектирование продукта. О&nbsp;нем&nbsp;мы&nbsp;написали в&nbsp;<a href="/articles/how-to-stop-writing-huge-documentation-and-start-development-faster/" title="Почему продуктовое проектирование лучше формального ТЗ">отдельной статье</a>. А&nbsp;после – разработка, релиз и&nbsp;дальнейшее развитие.&nbsp;</p>

<div class="umb-macro-highlights">
    <strong>Выходит, что&nbsp;документ ПЗ&nbsp;становится отправной точкой в&nbsp;работе с&nbsp;любым запросом. Он&nbsp;сначала помогает стартовать проект, а&nbsp;после служит ориентиром при&nbsp;дальнейших движениях — от&nbsp;MVP&nbsp;до&nbsp;масштабирования.</strong>
    
</div>

<h2 dir="ltr">В чем&nbsp;профит понимания задачи</h2>
<p dir="ltr">Работая над&nbsp;пониманием задачи, мы&nbsp;даем себе из&nbsp;будущего (когда проект уже&nbsp;вовсю идет) несколько преимуществ:</p>
<h3 dir="ltr">Четкие границы</h3>
<p dir="ltr">Если мы&nbsp;понимаем задачу и&nbsp;знаем цель, которую преследует продукт, у&nbsp;нас&nbsp;меньше вероятности свернуть с&nbsp;намеченного пути и&nbsp;потратить время на&nbsp;что&#8209;то&nbsp;лишнее. Фактически, любую идею, фичу или&nbsp;изменение в&nbsp;продукте мы&nbsp;прогоняем через фильтр ПЗ.</p>
<p dir="ltr">Как это&nbsp;работает: если фича никак не&nbsp;влияет на&nbsp;достижение цели проекта, но&nbsp;при&nbsp;этом требует дополнительного времени на&nbsp;разработку, мы&nbsp;её&nbsp;не&nbsp;делаем. Чтобы сделать этот фильтр еще&nbsp;более точным, в&nbsp;фазе проектирования мы&nbsp;создаем карту влияний.&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/aa5ccb7947eb4e2baeb1eaf2c4aa5ce1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/impact-mapping/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/niwpclnv/ay-20-2025-1.png"
         alt=""
         itemprop="">

    
            <span>Карта влияний: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f34a0c754d4e4fcfaefc15226ca287cb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Быстрый старт</h3>
<p dir="ltr">Когда у&nbsp;нас&nbsp;есть согласованное понимание задачи и&nbsp;утвержденное решение, очень легко и&nbsp;быстро получается погрузить в&nbsp;контекст команду, которая будет работать на&nbsp;проекте. Достаточно просто дать всем прочитать документ с&nbsp;ПЗ&nbsp;или&nbsp;провести по&nbsp;нему краткую презентацию.</p>
<h3 dir="ltr">Прозрачность и&nbsp;предсказуемость</h3>
<p dir="ltr">ПЗ – первый шаг&nbsp;к&nbsp;согласованной дорожной карте продукта: заказчик понимает, что&nbsp;команда будет делать и&nbsp;зачем, а&nbsp;команда видит, как&nbsp;ее&nbsp;работа будет связана с&nbsp;бизнес-целями. Это&nbsp;снижает количество недопониманий и&nbsp;повышает доверие в&nbsp;процессе работы.&nbsp;</p>
<p dir="ltr">Доверие как&nbsp;составляющую продуктовой разработки сложно переоценить, однако нам&nbsp;хотелось бы&nbsp;лишний раз&nbsp;отметить, как&nbsp;важно доверять друг другу в&nbsp;команде продукта. На&nbsp;этом основана <a href="/articles/fff/" title="FFF: методология, которая принимает реальность и&nbsp;помогает делать цифровой продукт">методология</a>, которую мы&nbsp;используем в&nbsp;работе над&nbsp;каждым из&nbsp;созданных продуктов.&nbsp;&nbsp;</p>
<h3 dir="ltr">Предсказуемый результат&nbsp;</h3>
<p dir="ltr">Благодаря документу с&nbsp;пониманием задачи и&nbsp;подробным описанием нашего решения клиент еще&nbsp;на&nbsp;старте понимает, что&nbsp;он&nbsp;получит в&nbsp;конце.</p>
<h3 dir="ltr">Лояльность клиента&nbsp;</h3>
<p dir="ltr">Это уже&nbsp;вопрос клиентского сервиса. Мы&nbsp;не&nbsp;просто удовлетворяем первичный запрос заказчика, а&nbsp;через разговор узнаем (а&nbsp;порой и&nbsp;помогаем ему&nbsp;узнать), что&nbsp;действительно нужно ему&nbsp;и&nbsp;его&nbsp;бизнесу. И&nbsp;почему именно это.</p>
<h3 dir="ltr">Управляемые риски</h3>
<p dir="ltr">Формулируя гипотезы и&nbsp;метрики заранее, мы&nbsp;видим потенциальные узкие места: от&nbsp;регуляторных ограничений до&nbsp;технической сложности интеграций. Так&nbsp;проще готовиться к&nbsp;возможным нюансам еще&nbsp;до&nbsp;старта и&nbsp;продумывать более гибкие решения.</p>
<p dir="ltr">Вместо ситуации «делаем продукт ради продукта» получается краткий, но&nbsp;осмысленный набросок пути от&nbsp;идеи до&nbsp;измеримого результата.</p>
<h2 dir="ltr">Вывод</h2>
<p dir="ltr">Готовить ли&nbsp;понимание задачи для&nbsp;каждого лида — это&nbsp;личный выбор каждого отдельного исполнителя. Нам&nbsp;кажется, что&nbsp;потратить на&nbsp;это&nbsp;время стоит даже на&nbsp;самых небольших проектах, просто потому что&nbsp;профит того стоит. В&nbsp;конце концов, как&nbsp;можно предложить классное решение и&nbsp;успешно реализовать его, не&nbsp;разобравшись в&nbsp;задаче?</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/38a66b134d0343a5ae39bd00a1d190e7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    За движением стоит UX: дизайнер как мотор цифрового продукта 
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Дизайнер больше не оформитель — он стратег, влияющий на UX, скорость разработки и бизнес. Как он стал ключевой фигурой в цифровом продукте?
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/za-dvizheniem-stoit-ux-dizainer-kak-motor-fifrovogo-produkta/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/za-dvizheniem-stoit-ux-dizainer-kak-motor-fifrovogo-produkta/</guid>

                <pubDate>Thu, 04 Dec 2025 10:34:00 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>За движением стоит UX: дизайнер как мотор цифрового продукта </h1>
                                <figure>
                                    <img src="/Media/hs4lke45/chatgpt-image-apr-15-2025-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/194e1fc5925c4da69d98b749825d5724"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span class="first-p">Сегодня всё&nbsp;меньше места для&nbsp;роли дизайнера как&nbsp;«оформителя» в&nbsp;разработке цифровых продуктов. Вместо этого дизайнер становится ключевым участником проектной команды — тем, кто&nbsp;влияет на&nbsp;темп разработки, формирует сценарии взаимодействия и&nbsp;помогает бизнесу не&nbsp;просто красиво или&nbsp;стилистически правильно, но&nbsp;и&nbsp;осмысленно решать задачи. Обсудим, как&nbsp;именно дизайнер становится точкой сборки продукта, и&nbsp;что&nbsp;это&nbsp;меняет в&nbsp;командах.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8b03517c1bbc4816a89d7d14d91dc265"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cfba9008a8aa4ae69aa8620719c7aa16"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Эта статья – адаптация <a href="https://www.youtube.com/watch?v=OkmFbGPkzo4">подкаста</a> «Дизайн и&nbsp;люди», в&nbsp;котором продуктовый дизайнер Саша Ефремов и&nbsp;директор по&nbsp;развитию fuse8 Вениамин Мустафин с&nbsp;разной степенью серьёзности и&nbsp;юмора поговорили о&nbsp;том, как&nbsp;дизайнер задает темп с&nbsp;самого начала работы над&nbsp;продуктом и&nbsp;почему ему&nbsp;всё&nbsp;чаще выпадает роль продуктового игрока, а&nbsp;не&nbsp;просто специалиста. </p>
<p dir="ltr">Подскаст можно послушать на&nbsp;нескольких площадках</p>
<p dir="ltr">💙 <a href="https://vk.com/podcast-220753438_456239046">Подкасты ВКонтакте</a></p>
<p dir="ltr">🎵 <a href="https://podcasts.apple.com/us/podcast/%D0%BC%D0%B5%D1%81%D1%82%D0%BE-%D0%B4%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD%D0%B5%D1%80%D0%B0-%D0%B2-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5-%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0-%D0%B2%D0%B5%D0%BD%D0%B8%D0%B0%D0%BC%D0%B8%D0%BD-%D0%BC%D1%83%D1%81%D1%82%D0%B0%D1%84%D0%B8%D0%BD/id1688014280?i=1000702967534">Apple Podcasts</a></p>
<p dir="ltr">📚 <a href="https://www.litres.ru/podcast/aleksandr-efremov-33/mesto-dizaynera-v-razrabotke-produkta-veniamin-mustaf-71871752/">Литрес</a></p>
<p dir="ltr">🎧 <a href="https://podster.fm/podcasts/designandpeople/e/403572/mesto-dizaynera-v-razrabotke-produkta-veniamin-mustafin">Podster.fm</a></p>
<p dir="ltr">Мы в&nbsp;fuse8 разрабатываем цифровые продукты на&nbsp;заказ, и&nbsp;именно на&nbsp;этом контексте — агентской модели — построен весь разговор. Несмотря на&nbsp;то, что&nbsp;fuse8 свои продукты не&nbsp;делает, принципы проектной работы, описанные здесь, во&nbsp;многом универсальны.</p>
<h2 dir="ltr">Дизайнер задает направление, а&nbsp;не&nbsp;просто украшает интерфейс</h2>
<p dir="ltr">Есть проекты, которые начинаются не&nbsp;с&nbsp;ТЗ, а&nbsp;с&nbsp;бизнес-проблемы. И&nbsp;часто такая проблема описана размыто, а&nbsp;возможно и&nbsp;вовсе недопонята заказчиком: «что-то чеки упали», «хотим повысить конверсию», «нужно что-то, чтобы конкурент не&nbsp;ушёл вперёд». Тут&nbsp;ноль осуждения заказчиков – ситуация базовая и&nbsp;вполне рабочая. Суть в&nbsp;другом. При&nbsp;таких вводных дизайнер — это&nbsp;точка входа в&nbsp;проект. <strong>Он способен задать направление, синхронизировать смыслы и&nbsp;вовремя задать вопрос, к&nbsp;которому другие могут не&nbsp;прийти. В&nbsp;таких условиях дизайнер уже&nbsp;не&nbsp;просто исполнитель, а&nbsp;соавтор стратегии.</strong></p>
<p dir="ltr">Если дизайнер работает в&nbsp;отрыве от&nbsp;понимания целей бизнеса, он&nbsp;не&nbsp;сможет принять обоснованные интерфейсные решения. Вот&nbsp;пример: аналитик написал документацию, дизайнер получил её&nbsp;и&nbsp;начал проектировать, не&nbsp;зная, зачем вообще нужен экран. Итог — красивая, но&nbsp;неработающая фича. Спустя месяцы клиент может остаться недоволен, хотя вроде всё&nbsp;было как&nbsp;надо. Красивые экраны не&nbsp;работают, если дизайнер (и&nbsp;команда) не&nbsp;понимает цели бизнеса и&nbsp;контекста решений.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/31b02fe7776d4544b2ce58af075d8aec"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Дизайнер должен быть там, где&nbsp;формируются цели. А&nbsp;не&nbsp;просто когда рисовать пора
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/60ee19946ad54e0d8652f7f072d540c9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a8bdb69720ff41568ca57d50c3172d34"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"><strong>Важно, чтобы дизайнер не&nbsp;стеснялся задавать вопросы бизнесу</strong>, даже если это&nbsp;кажется не&nbsp;его&nbsp;зоной ответственности. Иногда именно дизайнер первым замечает, что&nbsp;условные 30 видов уведомлений, которые просит реализовать клиент — это&nbsp;не&nbsp;решение, а&nbsp;симптом другой, более серьезной проблемы, для&nbsp;которой еще&nbsp;только предстоит спроектировать решение. Зрелый дизайнер — это&nbsp;тот, кто&nbsp;работает не&nbsp;по&nbsp;брифу, а&nbsp;над&nbsp;гипотезой вместе с&nbsp;командой. Он&nbsp;— один из&nbsp;тех, кто&nbsp;превращает разрозненные требования в&nbsp;связную пользовательскую логику.</p>
<h2 dir="ltr">Дизайнер как&nbsp;хранитель темпа: от&nbsp;первых экранов до&nbsp;MVP</h2>
<p dir="ltr">Темп — это&nbsp;не&nbsp;только про&nbsp;сроки. Это&nbsp;про&nbsp;то, насколько команда синхронизирована, как&nbsp;быстро переходит от&nbsp;идеи к&nbsp;реализации, насколько последовательно и&nbsp;реалистично раскладывает работу на&nbsp;этапы. <strong>И здесь дизайнеру под&nbsp;силу определить, по&nbsp;какой логике и&nbsp;с&nbsp;какой скоростью пойдёт развитие продукта</strong>. Вместе с&nbsp;аналитиком и&nbsp;продюсером он&nbsp;формирует дорожную карту: какие сценарии прорабатывать первыми, как&nbsp;разбивать на&nbsp;спринты, где&nbsp;возможна гибкость. Использование UI-библиотек, компонентный подход, ранняя сверка с&nbsp;разработкой — всё&nbsp;это&nbsp;инструменты сохранения темпа.</p>

<div class="text-highlight">
  Мы&nbsp;во&nbsp;fuse8 раньше пробовали собирать дизайн по&nbsp;модели «всё и&nbsp;сразу», а&nbsp;потом передавать в&nbsp;разработку. Стало понятно, что&nbsp;итеративный подход куда эффективнее: экран за&nbsp;экраном, сценарий за&nbsp;сценарием. Так&nbsp;поддерживаем темп и&nbsp;синхронизируемся с&nbsp;разработкой, а&nbsp;не&nbsp;просто закидываем в&nbsp;нее&nbsp;задачки.
</div>

<p dir="ltr">Интересный момент — распределение ролей. У&nbsp;нас&nbsp;на&nbsp;проектах есть роль продуктового аналитика — это&nbsp;гибрид между BA, дизайнером и&nbsp;продактом. Этот человек вместе с&nbsp;дизайнером формирует видение продукта, разбивает его&nbsp;создание на&nbsp;итерации. А&nbsp;уже&nbsp;затем дизайнер в&nbsp;тандеме с&nbsp;разработкой начинает проработку конкретных сценариев.</p>

<div class="umb-macro-highlights">
    <strong>«Когда дизайнер и&nbsp;продакт вместе осмысляют, что&nbsp;можно пофлексить, а&nbsp;что&nbsp;оставить, — это&nbsp;про&nbsp;зрелость команды».</strong>
    
</div>

<p dir="ltr">Сценарии прогоняются в&nbsp;UI-библиотеках, дизайнеры используют уже&nbsp;существующие компоненты. Это&nbsp;снижает порог входа для&nbsp;разработки, но&nbsp;требует от&nbsp;дизайнера внимания к&nbsp;ограничениям, без&nbsp;которых, кажется, ни&nbsp;один продукт обойтись не&nbsp;может.</p>
<h2 dir="ltr">Пересечение ролей — норма, если команда понимает, кто&nbsp;за&nbsp;что&nbsp;отвечает</h2>
<p dir="ltr">Любой продукт требует плана, но&nbsp;он&nbsp;не&nbsp;должен быть высечен в&nbsp;камне. В&nbsp;командной работе важна гибкость. Не&nbsp;должно быть жёсткого деления, где&nbsp;чуть только смежная область – сразу расстрел. Наоборот, <strong>в сработанной продуктовой команде дизайнер может подсобить с&nbsp;аналитикой, тестировщик — с&nbsp;документацией, а&nbsp;продюсер — с&nbsp;формулировкой задач. </strong>Тут важно не&nbsp;переборщить, разумеется. Не&nbsp;стоит залезать на&nbsp;чужую зону ответственности просто по&nbsp;приколу или&nbsp;потому, что&nbsp;ты&nbsp;уверен, что&nbsp;знаешь, как&nbsp;лучше. Все&nbsp;это&nbsp;должно быть через диалог и&nbsp;взаимное согласование. Такая вот&nbsp;тонкая грань между проактивностью и&nbsp;хаосом.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="quotesNew"
            data-content-element-type-key="dc59da8b-5aeb-4d1a-9451-f2cad6cee581"
            data-element-udi="umb://element/c5384bef716849aca567b5bc1faac218"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Идеальная ситуация — когда тебе как&nbsp;руководителю не&nbsp;нужно руководить. Команда сама всё&nbsp;рулит
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/94518f657b334b7f9e2b7a33ceaa5f1c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d6f8ea1c5b8c4de9b1f7c1392fa09dd4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Но это&nbsp;не&nbsp;значит анархия. <strong>Например, у&nbsp;нас&nbsp;во&nbsp;fuse8 держится структура из&nbsp;5–6 ключевых ролей. Подробнее о&nbsp;них&nbsp;можно узнать <a href="/articles/product-team">в другой нашей статье</a>.</strong> Просто важно, чтобы команда сама могла вносить поправки по&nbsp;ходу дела. Иногда дизайнер и&nbsp;аналитик пишут документацию параллельно, иногда команда договаривается, кто&nbsp;ведёт ту&nbsp;или&nbsp;иную фичу. Главное — чтобы было доверие.</p>
<h2 dir="ltr">Дизайн и&nbsp;разработка: из&nbsp;чего соберем интерфейс, и&nbsp;как&nbsp;не&nbsp;перегреть команду</h2>
<p dir="ltr">Проектировать в&nbsp;отрыве от&nbsp;технологий — дорога в&nbsp;никуда. Тем&nbsp;более в&nbsp;условиях сжатых сроков. Да&nbsp;и&nbsp;без&nbsp;сжатых сроков не&nbsp;нужно отлетать от&nbsp;контекста (или&nbsp;работать без&nbsp;него) просто потому, что&nbsp;очень захотелось. <strong>Дизайнер должен понимать, какие компоненты доступны, какие ограничения есть у&nbsp;разработки, и&nbsp;как&nbsp;эти&nbsp;ограничения сделать опорой, а&nbsp;не&nbsp;тормозом.</strong></p>

<div class="text-highlight">
  Вот&nbsp;показательный пример: дизайнер придумал и&nbsp;нарисовал скролл как&nbsp;на&nbsp;macOS с&nbsp;условием, что&nbsp;в&nbsp;интерфейсе он&nbsp;будет отображаться как&nbsp;на&nbsp;маке во&nbsp;всех браузерах. Так&nbsp;оформилась задачка для&nbsp;фронтендеров на&nbsp;два&nbsp;месяца. Красиво ли&nbsp;было? Очень! Реализуемо ли? Вопрос. 
</div>

<p dir="ltr">Проблема рассинхрона дизайна и&nbsp;разработки не&nbsp;в&nbsp;сверхамбициях или&nbsp;их&nbsp;отсутствии, а&nbsp;в&nbsp;недостатке коммуникации. В&nbsp;идеале дизайнер приносит макеты в&nbsp;разработку, сверяется с&nbsp;техническими возможностями (например, UI-библиотекой), обсуждает с&nbsp;тимлидом и&nbsp;только после этого отрисовывает итог. А&nbsp;еще&nbsp;идеальнее, если все&nbsp;технические ограничения, способные повлиять на&nbsp;дизайн, сразу формулируются в&nbsp;ходе проработки решения. В&nbsp;обоих случаях, конечно, может понадобиться время на&nbsp;синхронизацию, но&nbsp;потом все&nbsp;станет понятно обоим юнитам. </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="articleBlock"
            data-content-element-type-key="e825589b-4abf-4ab0-927c-4c87486b5817"
            data-element-udi="umb://element/fba69c37935244a69246cd3eba712f6e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

    <div class="article-block">
        <a href="/articles/product-team/">
            <p>
                &#x427;&#x438;&#x442;&#x430;&#x439;&#x442;&#x435; &#x442;&#x430;&#x43A;&#x436;&#x435;:
            </p>
    
            


    <img src="/Media/tadn1ryk/frame-500&#x432;&#x432;&#x432;&#x432;9585.png"
         alt=""
         itemprop="">

    
            <span>Собираем команду для&nbsp;цифрового продукта: роли, подходы и&nbsp;практические советы</span>
                <p>&#x412;&#x435;&#x43D;&#x438;&#x430;&#x43C;&#x438;&#x43D; &#x41C;&#x443;&#x441;&#x442;&#x430;&#x444;&#x438;&#x43D;, &#x414;&#x438;&#x440;&#x435;&#x43A;&#x442;&#x43E;&#x440; &#x43F;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44E; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</p>
        </a>
    </div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c10f28fd74fc44028716ea8e01bf16ee"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">У нас&nbsp;разработчики не&nbsp;обладают правом вето, как&nbsp;и&nbsp;дизайнеры. Все&nbsp;спорные решения принимаются с&nbsp;привлечением продакта или&nbsp;заказчика. Если фича требует много времени, а&nbsp;её&nbsp;ценность не&nbsp;очевидна — её&nbsp;двигают в&nbsp;бэклог. Такой подход помогает команде не&nbsp;перегреваться и&nbsp;не&nbsp;терять контроль над&nbsp;сложностью.</p>
<h2 dir="ltr">Приемка результата: дизайнер тоже участвует в&nbsp;проверке, не&nbsp;только тестировщик</h2>
<p dir="ltr">Запуск интерфейса — не&nbsp;всегда автоматическое соответствие макету. Дизайнер способен заметить, где&nbsp;поведение отклоняется от&nbsp;задуманного, где&nbsp;сценарий начинает буксовать. Поэтому на&nbsp;этапе приёмки дизайнер вовлечен наравне с&nbsp;тестировщиком. <strong>Там, где&nbsp;QA&nbsp;проверит корректность данных, дизайнер увидит разрыв в&nbsp;логике, который не&nbsp;фиксируется тест-кейсами.</strong></p>

<div class="text-highlight">
  Пиксель-перфект — не&nbsp;самоцель. Гораздо важнее ощущение целостности и&nbsp;связности интерфейса. Иногда на&nbsp;этапе щупания MVP&nbsp;становится ясно, что&nbsp;сценарий нужно переделать, потому что&nbsp;он&nbsp;просто неудобен. И&nbsp;только дизайнер может это&nbsp;почувствовать, потому что&nbsp;он&nbsp;— хранитель всей логики.
</div>

<p dir="ltr">У нас&nbsp;в&nbsp;разных командах дизайн-ревью встроено в&nbsp;разные процессы: где&#8209;то&nbsp;это&nbsp;часть спринта, где&#8209;то&nbsp;— отдельный этап. В&nbsp;любом случае, дизайнер и&nbsp;тестировщик — это&nbsp;последние инстанции перед показом клиенту. И&nbsp;в&nbsp;этом их&nbsp;большая ответственность.</p>
<h2 dir="ltr">С заказчиком не&nbsp;защищаемся, а&nbsp;партнёримся</h2>
<p dir="ltr">Вот мы&nbsp;сделали очередной функциональный блок, и&nbsp;настало время показывать результат клиенту: организовываем демо. Правильно выстроенные демо — это&nbsp;не&nbsp;театр одного актёра. Это&nbsp;момент, когда команда делится прогрессом, признаётся в&nbsp;сложностях, собирает уточнения и&nbsp;вместе с&nbsp;заказчиком двигается дальше. Дизайнер здесь&nbsp;— полноценный участник диалогов, а&nbsp;не&nbsp;фоновый исполнитель.</p>
<p dir="ltr"><strong>Важно фокусироваться не&nbsp;на&nbsp;том, чтобы продать или&nbsp;продавить решение, а&nbsp;на&nbsp;том, чтобы обсуждать смысл тех&nbsp;или&nbsp;иных внедрений.</strong> Так&nbsp;демо очередной релизной итерации не&nbsp;становится стрессом. Не&nbsp;воспринимайте клиентские демо как&nbsp;«судилище» над&nbsp;командой – это&nbsp;просто совместный разговор.&nbsp;</p>
<p dir="ltr">Даже бэкендер может показывать клиенту код, если это&nbsp;помогает выстроить доверие и&nbsp;прояснить возникшие вопросы. А&nbsp;дизайнер — не&nbsp;просто демонстрирует макеты, а&nbsp;помогает понять, какие продуктовые компромиссы были сделаны и&nbsp;почему.</p>

<div class="umb-macro-highlights">
    <strong>«У нас&nbsp;даже был&nbsp;случай, когда один дизайнер рассказывал, а&nbsp;другой в&nbsp;реальном времени допиливал следующий шаг&nbsp;прототипа. А&nbsp;я&nbsp;с&nbsp;двух мониторов следил, чтобы всё&nbsp;шло&nbsp;по&nbsp;плану»</strong>
    
</div>

<p dir="ltr">Формат демо — это&nbsp;скорее «репорт за&nbsp;неделю» с&nbsp;открытыми вопросами, чем&nbsp;презентация «как всё&nbsp;идеально». Такой подход снижает тревожность и&nbsp;укрепляет связь с&nbsp;заказчиком.&nbsp;</p>
<h2 dir="ltr">Work-life balance и&nbsp;процессы&nbsp;</h2>
<p dir="ltr">Один из&nbsp;признаков зрелости команды — умение не&nbsp;выгорать. В&nbsp;культуре, где&nbsp;дизайнер — движущая сила, особенно важно не&nbsp;требовать от&nbsp;него 12 часов у&nbsp;монитора. Тем&nbsp;более, если в&nbsp;этих часах он&nbsp;не&nbsp;проектирует, а&nbsp;«договаривается с&nbsp;собой» через стресс.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="telegram"
            data-content-element-type-key="cfc4976d-8b18-4380-9c65-04100b956bab"
            data-element-udi="umb://element/b386fbbac40b4eb5840965f68a713ba2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="telegram-block" data-tilt-telegram>
  <div class="telegram-block__content">
    <a class="telegram-block__content__icon" href="https://t.me/fuse8_product" target="_blank" aria-label="Telegram link">
      <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
        <path d="M75 0C33.5661 0 0 33.571 0 75C0 116.429 33.571 150 75 150C116.434 150 150 116.429 150 75C150 33.571 116.429 0 75 0ZM111.837 51.3823L99.5274 109.389C98.6177 113.502 96.1694 114.498 92.7532 112.563L74.0032 98.7435L64.9597 107.453C63.9629 108.45 63.1161 109.297 61.1806 109.297L62.5113 90.2129L97.2581 58.8194C98.7726 57.4887 96.9242 56.7339 94.9258 58.0645L51.9823 85.0984L33.4742 79.321C29.4532 78.0532 29.3613 75.3 34.321 73.3645L106.631 45.479C109.989 44.2694 112.921 46.2968 111.832 51.3774L111.837 51.3823Z" fill="black"/>
      </svg>
    </a>
	  <div class="telegram-block__content__text">
&#x41E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x43C; &#x442;&#x435;&#x445;, &#x43A;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x430;&#x43D;&#x430;&#x43B;&#x438;&#x437;&#x438;&#x440;&#x443;&#x435;&#x442;, &#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;&#x438;&#x442;, &#x43A;&#x43E;&#x434;&#x438;&#x442; &#x438; &#x43F;&#x440;&#x438;&#x432;&#x43E;&#x434;&#x438;&#x442; &#x43A; &#x443;&#x441;&#x43F;&#x435;&#x445;&#x443; &#x446;&#x438;&#x444;&#x440;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x440;&#x43E;&#x434;&#x443;&#x43A;&#x442;&#x44B;	  </div>
    <a class="button button--filled-black telegram-block__content__link" href="https://t.me/fuse8_product" target="_blank">Присоединиться</a>
  </div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/58d02c9e9d43439d89c7e0f347821b8d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2e32f6b07d0b4a48a223c72fdc55e727"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Здоровые границы внутри команды и&nbsp;с&nbsp;заказчиками — это&nbsp;не&nbsp;слабость, а&nbsp;инвестиция в&nbsp;устойчивость. У&nbsp;нас&nbsp;есть правило: не&nbsp;писать в&nbsp;нерабочее время. У&nbsp;некоторых есть два&nbsp;профиля в&nbsp;Telegram — рабочий и&nbsp;личный. А&nbsp;если что&#8209;то&nbsp;важное из&nbsp;задач вспомнилось под&nbsp;вечер — оно&nbsp;автомотический улетает в&nbsp;личный  to&#8209;do&nbsp;лист на&nbsp;утро.</p>
<h2 dir="ltr">Вместо заключения</h2>
<p dir="ltr"><strong>В командах, которые стремятся к&nbsp;скорости, качеству и&nbsp;осмысленной работе, дизайнер должен вступать в&nbsp;игру не&nbsp;в&nbsp;конце, а&nbsp;в&nbsp;начале. </strong>Он не&nbsp;обслуживает задачи, а&nbsp;помогает их&nbsp;формулировать. Не&nbsp;просто двигает пиксели, а&nbsp;выстраивает пользовательский путь. Не&nbsp;только оформляет интерфейс, но&nbsp;и&nbsp;держит темп.</p>
<p dir="ltr">И, возможно, именно такая роль дизайнера сегодня становится новой нормой. Конечно, нет&nbsp;универсальных рецептов, но&nbsp;зато есть живые подходы:</p>
<ul>
<li>давать дизайнеру голос с&nbsp;самого начала,</li>
<li>не бояться пересечений ролей,</li>
<li>превращать ограничения в&nbsp;точки опоры реализации,</li>
<li>делать демо с&nbsp;клиентом, а&nbsp;не&nbsp;для&nbsp;клиента,</li>
<li>сохранять темп, но&nbsp;не&nbsp;перегревать(ся),</li>
<li>беречь себя и&nbsp;команду.</li>
</ul>
<p dir="ltr">И если эти&nbsp;идеи находят отклик — возможно, и&nbsp;в&nbsp;вашей команде дизайнер станет не&nbsp;просто исполнителем, а&nbsp;тем, кто&nbsp;задаёт направление и&nbsp;смысл всему продукту.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/aaa28108894c420eb88c7acaba09a673"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Разбираемся в серверных и клиентских компонентах в Next.js: когда, как и почему?
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    С появлением Next App Router важно понять, как работают серверные и клиентские компоненты. Зачем они нужны и как управлять рендерингом — рассказываем.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/nextjs-components/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/nextjs-components/</guid>

                <pubDate>Thu, 04 Dec 2025 10:02:07 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Разбираемся в серверных и клиентских компонентах в Next.js: когда, как и почему?</h1>
                                <figure>
                                    <img src="/media/suwmtizl/frame-518.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a5035b71dd784fb0bc5eee311d6a6fd3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/03ad6dc3673d4350959b61b558f42522"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Next.js предлагает широкие возможности для&nbsp;создания высокопроизводительных веб-приложений. Важной частью его&nbsp;функциональности с&nbsp;появлением Next App&nbsp;Router являются серверные и&nbsp;клиентские компоненты, которые позволяют разработчикам управлять рендерингом на&nbsp;стороне сервера и&nbsp;на&nbsp;стороне клиента, в&nbsp;зависимости от&nbsp;требований проекта. Давайте разберемся в&nbsp;этих компонентах более подробно. </p>
<p>Текст и&nbsp;примеры в&nbsp;статье относятся к&nbsp;Next.js 13.4 и&nbsp;старше, в&nbsp;котором React Server Components обрели статус stable и&nbsp;стали рекомендуемыми при&nbsp;разработке приложений на&nbsp;Nextjs. </p>
<h2>Что такое серверный компонент (RSC), и&nbsp;как&nbsp;он&nbsp;рендерится</h2>
<p> </p>

<div class="text-highlight">
  React Server Components рендерятся исключительно на&nbsp;сервере. Их&nbsp;код&nbsp;не&nbsp;включается в&nbsp;файл JavaScript бандла, поэтому они&nbsp;никогда не&nbsp;гидратируются или&nbsp;перерендериваются.
</div>

<p> </p>
<p>По умолчанию все&nbsp;компоненты являются серверными. Это&nbsp;позволяет автоматически внедрить серверный рендеринг без&nbsp;дополнительной конфигурации, и&nbsp;вы&nbsp;можете при&nbsp;необходимости сделать из&nbsp;серверного компонента клиентский позже.</p>
<p> </p>
<h4>RSC рендерится в&nbsp;два&nbsp;этапа, на&nbsp;сервере:</h4>
<ol>
<li>React рендерит серверные компоненты в&nbsp;специальный формат данных, называемый RSC&nbsp;Payload.</li>
<li>Next.js использует RSC&nbsp;payload и&nbsp;инструкции JavaScript для&nbsp;клиентских компонентов, чтобы рендерить HTML на&nbsp;сервере.</li>
</ol>
<h4>Затем, на&nbsp;клиенте:</h4>
<ol>
<li>HTML используется для&nbsp; моментального показа быстрого интерактивного предпросмотра — это&nbsp;только для&nbsp; первоначальной загрузки страницы.</li>
<li>RSC payload используется для&nbsp; согласования деревьев клиентского и&nbsp;серверного компонентов и&nbsp;обновления DOM.</li>
<li>Инструкции JavaScript используются для&nbsp; гидратации клиентских компонентов и&nbsp;обеспечения интерактивности приложения.<br><br></li>
</ol>
<h2>Что такое RSC&nbsp;payload?</h2>
<p> </p>

<div class="text-highlight">
  RSC&nbsp;payload — это&nbsp;компактное бинарное представление отрендеренного дерева серверных компонентов React. RSC&nbsp;payload используется на&nbsp; клиенте для&nbsp; обновления DOM&nbsp;браузера и&nbsp;содержит:
</div>

<p> </p>
<ol>
<li>Отрендеренный результат серверных компонентов.</li>
<li>Плейсхолдеры для&nbsp;того, где&nbsp;должны появиться отрендеренные клиентские компоненты, и&nbsp;ссылки на&nbsp;их&nbsp;JavaScript файлы-чанки.</li>
<li>Любые пропсы, переданные из&nbsp;серверного компонента в&nbsp;клиентский компонент.</li>
</ol>
<h3>Преимущества RSC</h3>
<ol>
<li>Улучшение производительности приложения т.к. на&nbsp; клиент не&nbsp; отправляются тяжелые зависимости, которые могли использоваться для&nbsp; рендера компонента на&nbsp; сервере (Markdown, code highlighter и&nbsp; т. п.)</li>
<li>Улучшаются web&nbsp;vitals метрики приложения (TTI&nbsp;и&nbsp; т. п.)</li>
<li><a href="https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming#what-is-streaming">HTML streaming</a> при&nbsp;использовании RSC&nbsp;позволяют разбивать работу по&nbsp;рендерингу на&nbsp;фрагменты и&nbsp;передавать их&nbsp;клиенту по&nbsp;мере готовности. Это&nbsp;позволяет пользователю видеть части страницы раньше, не&nbsp;дожидаясь полного рендеринга всей страницы на&nbsp;сервере.</li>
</ol>
<h3>Недостатки RSC</h3>
<ol>
<li>RSC payload увеличивает размер HTML</li>
<li>На клиент могут утечь секреты предназначенные только для&nbsp;сервера (токены, ключи и&nbsp;т.п.). Вопросы безопасности next.js приложений подробно описаны в&nbsp; <a href="https://nextjs.org/blog/security-nextjs-server-components-actions">этой статье</a>.</li>
<li>Повышенная ментальная нагрузка при&nbsp;выборе типа компонента во&nbsp;время разработки приложения и, скорее всего, потребуется время на&nbsp;обучение команды.</li>
</ol>
<h2>Что такое клиентский компонент, и&nbsp;как&nbsp;он&nbsp;рендерится</h2>
<p>Клиентские компоненты позволяют вам&nbsp;создавать интерактивный пользовательский интерфейс, который предварительно отрисовывается на&nbsp;сервере и&nbsp;может использовать клиентский JavaScript для&nbsp;выполнения в&nbsp;браузере.</p>
<p>Для оптимизации первоначальной загрузки страницы Next.js использует <a href="https://react.dev/reference/react-dom/server">API React</a> для&nbsp;рендеринга статического предпросмотра HTML на&nbsp; сервере как&nbsp; для&nbsp; клиентских, так&nbsp;и&nbsp;для&nbsp; серверных компонентов. Это&nbsp;означает, что&nbsp; когда пользователь первый раз&nbsp;посещает ваше приложение, он&nbsp;сразу видит содержимое страницы, без&nbsp; ожидания загрузки, разбора и&nbsp;выполнения бандла JavaScript клиентского компонента.</p>
<p>Несмотря на&nbsp; их&nbsp;название, «клиентские компоненты» рендерятся на&nbsp; сервере и&nbsp;выполняются как&nbsp; на&nbsp; сервере, так&nbsp;и&nbsp;на&nbsp; клиенте.</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/1ce/ded/922/1ceded92299f51e2493b9e9f53b9297f.png" alt=""></p>
<p>Мы можем легко превратить серверный компонент в&nbsp;клиентский, добавив директиву ‘use client’ в&nbsp;начало файла или&nbsp;переименовав его&nbsp;в&nbsp; counter.client.js:</p>
<pre>
<code class="language-javascript">
'use client';
 
export default function Counter() {
  return <div>Counter - client component</div>;
}
</code>
</pre>

<h2>Когда использовать серверный, a&nbsp;когда клиентский компонент?</h2>
<p>Выбор между серверными и&nbsp;клиентскими компонентами зависит от&nbsp;специфики задачи. Серверные компоненты идеально подходят для&nbsp;сценариев, требующих доступа к&nbsp;данным на&nbsp;сервере во&nbsp;время рендеринга или&nbsp;получения данных, которые не&nbsp;должны быть доступны на&nbsp;клиенте. Клиентские компоненты, напротив, эффективны для&nbsp;создания интерактивных элементов, использующих React hooks и&nbsp;API&nbsp;браузера.</p>
<p>Чтобы понять какой тип&nbsp;компонента подходит в&nbsp;том&nbsp;или&nbsp;ином случае, можно воспользоваться удобной таблицей <a href="https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns#when-to-use-server-and-client-components">таблицей</a> размещенной на&nbsp;сайте документации next.js</p>
<p><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/dd7/9bb/1a9/dd79bb1a9a4edcf19fb3d9f7b71be7d6.png" alt=""></p>
<p>В RSC&nbsp;мы&nbsp;не&nbsp;можем использовать React hooks, Context или&nbsp;API&nbsp;браузера. Однако мы&nbsp;можем использовать только API&nbsp;серверных компонентов, такие как&nbsp;headers, cookie и&nbsp;т. д.</p>

<div class="umb-macro-highlights">
    <strong>Важно: Серверные компоненты могут импортировать клиентские компоненты.</strong>
    Серверные компоненты могут импортировать клиентские компоненты.
</div>

<p>Когда мы&nbsp;используем клиентские компоненты, мы&nbsp;можем использовать React hooks, Context и&nbsp;API, доступные только в&nbsp;браузере. Однако мы&nbsp;не&nbsp;можем использовать некоторые API, доступные только в&nbsp;серверных компонентах, такие как&nbsp;headers, cookie и&nbsp;т. д.</p>

<div class="umb-macro-highlights">
    <strong>Важно:</strong>
    Клиентские компоненты не&nbsp; могут импортировать серверные компоненты, но&nbsp;вы&nbsp;можете передать серверный компонент в&nbsp;качестве дочернего элемента или&nbsp;свойства клиентского компонента.
</div>

<p>С появлением React Server Components общей рекомендацией стало перемещение клиентских компонентов в&nbsp;концевые узлы вашего дерева компонентов, где&nbsp;это&nbsp;возможно. Однако иногда требуется условное отображение серверных компонентов с&nbsp;использованием интерактивности на&nbsp;стороне клиента. </p>
<p>Допустим, у&nbsp;нас&nbsp;есть такой клиентский компонент:</p>
<pre>
<code class="language-javascript">
'use client'
 
import { useState } from 'react'
 
export default function ClientComponent({
  children,
}: {
  children: React.ReactNode
}) {
  const [show, setShow] = useState(false)
 
  return (
    <>
      <button onClick={() => setShow(!show)}>Show</button>
      {show && children}
    </>
  )
}
</code>
</pre>

<p>ClientComponent не&nbsp; знает, что&nbsp; его&nbsp;дочерние элементы в&nbsp; конечном итоге будут заполнены результатом рендера серверного компонента. Единственная обязанность ClientComponent — решить, куда в&nbsp; конечном итоге будут помещены дочерние элементы.</p>
<pre>
<code class="language-javascript">
// This pattern works:
// You&nbsp;can&nbsp;pass a&nbsp;Server Component as&nbsp;a&nbsp;child or&nbsp;prop of&nbsp;a&nbsp;
// Client Component.
import ClientComponent from './client-component'
import ServerComponent from './server-component'
 
// Pages in&nbsp;Next.js are&nbsp;Server Components by&nbsp;default
export default function Page() {
  return (
    <ClientComponent>
      <ServerComponent />
    </ClientComponent>
  )
}
</code>
</pre>

<p>С таким подходом &lt;ClientComponent&gt; и&nbsp;&lt;ServerComponent&gt; разделены друг от&nbsp;друга и&nbsp;могут быть отрендерены независимо. В&nbsp;этом случае дочерний компонент &lt;ServerComponent&gt; может быть отрендерен на&nbsp;сервере до&nbsp;того, как&nbsp;&lt;ClientComponent&gt; будет отрендерен на&nbsp;клиенте.</p>
<p>Все возможные паттерны совместного использования серверных и&nbsp;клиентских компонентов подробно <a href="https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns">описаны в&nbsp;документации</a>.</p>
<h2>FAQ</h2>
<h3>Почему нужно использовать Next.js React Server Components (RSC)?</h3>
<p>React Server Components (RSC) предоставляют новый способ создания приложений, который позволяет разработчикам разделять код&nbsp;между клиентом и&nbsp;сервером. Это&nbsp;становится особенно полезным для&nbsp; крупных проектов с&nbsp; большим объемом данных или&nbsp; динамическим контентом.</p>
<h3>Как связаны RSC&nbsp;и&nbsp;Next.js? Могу ли&nbsp;я&nbsp;использовать RSC&nbsp;без&nbsp;Next.js?</h3>
<p>RSC тесно интегрированы с&nbsp; Next.js и&nbsp;предоставляют дополнительные возможности для&nbsp; оптимизации загрузки страницы. Хотя теоретически вы&nbsp;можете создавать RSC&nbsp;и&nbsp;без&nbsp; использования Next.js, это&nbsp;будет гораздо сложнее и&nbsp;менее эффективно. Next.js предоставляет удобную инфраструктуру для&nbsp; работы с&nbsp; RSC, автоматическую предварительную загрузку и&nbsp;множество других функций, которые значительно облегчают процесс разработки.</p>
<h3>Как это&nbsp;связано с&nbsp;Suspense?</h3>
<p>API для&nbsp; получения данных Server Components интегрированы с&nbsp; Suspense. RSC&nbsp;использует Suspense для&nbsp; предоставления состояний загрузки и&nbsp;разблокировки частей потока, чтобы клиент мог&nbsp;показывать что‑то до&nbsp; того, как&nbsp; будет завершен весь ответ.</p>
<h3>Какие преимущества производительности дает использование RSC?</h3>
<p>Server Components позволяют вам&nbsp;переместить большую часть получения данных на&nbsp; сервер, чтобы клиенту не&nbsp; приходилось делать много запросов. Это&nbsp;также избавляет от&nbsp; типичных для&nbsp; получения данных в&nbsp; useEffect network waterfalls на&nbsp; клиенте.</p>
<p>Server Components также позволяют добавлять неинтерактивные функции в&nbsp; ваше приложение без&nbsp; увеличения размера JS&nbsp;бандла. Перемещение функций с&nbsp; клиента на&nbsp; сервер уменьшает начальный размер кода и&nbsp;время разбора клиентского JS. Также уменьшение числа компонентов клиента улучшает время работы процессора клиента. Клиент может пропустить серверно‑сгенерированные части дерева во&nbsp; время согласования, потому что&nbsp; он&nbsp;знает, что&nbsp; они&nbsp;не&nbsp; могли быть затронуты обновлениями состояния.</p>
<h3>Обязательно ли&nbsp;нужно мне&nbsp;использовать RSC?</h3>
<p>Если у&nbsp; вас&nbsp;уже&nbsp;есть клиентское приложение, вы&nbsp;можете рассматривать его&nbsp;как&nbsp; дерево клиентских компонентов. Если это&nbsp;вас&nbsp;устраивает, замечательно! Серверные компоненты расширяют React для&nbsp; поддержки других сценариев и&nbsp;не&nbsp; являются заменой клиентским компонентам.</p>
<h3>Является ли&nbsp;это&nbsp;заменой SSR?</h3>
<p>Нет, они&nbsp;дополняют друг друга. SSR&nbsp;в&nbsp; первую очередь является техникой быстрого отображения неинтерактивной версии клиентских компонентов. Вам&nbsp;все&nbsp;равно придется платить стоимость загрузки, разбора и&nbsp;выполнения этих клиентских компонентов после загрузки исходного HTML.</p>
<p>Вы можете объединить серверные компоненты и&nbsp;SSR, где&nbsp;серверные компоненты рендерятся первыми, а&nbsp; клиентские компоненты рендерятся в&nbsp; HTML для&nbsp; быстрого неинтерактивного отображения во&nbsp; время гидратации. Когда они&nbsp;комбинируются таким образом, вы&nbsp;все&nbsp;равно получаете быстрый запуск, но&nbsp; также существенно снижаете объем загружаемого на&nbsp; клиенте JS.</p>
<h3>Могу ли&nbsp;я&nbsp;постепенно переходить на&nbsp;RSC, переписывая кодовую базу проекта?</h3>
<p>Да, с&nbsp; <a href="https://nextjs.org/blog/next-13-4">выходом app&nbsp;router и&nbsp;RSC</a>, предыдущий подход по‑прежнему работает и&nbsp;можно постепенно переходить на&nbsp; RSC&nbsp;подход. Здесь нужно отметить, что&nbsp; RSC&nbsp;компоненты работают только в&nbsp; app&nbsp;router. Есть подробное <a href="https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration">руководство по&nbsp; переходу на&nbsp; app&nbsp;router</a>.</p>
<h2>Полезные ссылки</h2>
<ol>
<li><a href="https://vercel.com/blog/understanding-react-server-components">Understanding React Server Components — Vercel</a></li>
<li><a href="https://nextjs.org/docs/app/building-your-application/data-fetching/patterns#preventing-sensitive-data-from-being-exposed-to-the-client">Preventing sensitive data from being exposed to&nbsp;the&nbsp;client</a></li>
</ol>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Тимлид в новом digital-проекте: с чего начать, если всё туманно
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Вы стали тимлидом — что дальше? Как навести порядок в хаосе, расставить приоритеты и запустить процессы так, чтобы команда начала работать слаженно.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-manage-a-new-project-as-a-teamlead/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-manage-a-new-project-as-a-teamlead/</guid>

                <pubDate>Thu, 04 Dec 2025 09:54:30 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Тимлид в новом digital-проекте: с чего начать, если всё туманно</h1>
                                <figure>
                                    <img src="/Media/bb5d0ne2/group-5009565.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3da2fa0690e148a6bf76317cab6126c8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3bf65c8cf6eb419dadb35bff9b7a16a5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><em>Добрый день! Меня зовут Мария, я&nbsp;тимлид и&nbsp;бэкенд-разработчик компании Fuse8. Если бы&nbsp;каждый проект начинался с&nbsp;чистого листа, жизнь тимлидов была бы&nbsp;проще. Но&nbsp;реальность другая: нередко приходится брать в&nbsp;работу чужой код, разбираться в&nbsp;старой архитектуре, вылавливать ускользающий контекст и&nbsp;организовывать хаос.</em></p>
<p><em>Особенно сложно, когда проект переходит от&nbsp;другой команды — с&nbsp;фрагментарной документацией, странными решениями и&nbsp;неочевидными зависимостями. Как&nbsp;быстро войти в&nbsp;курс дела, не&nbsp;утонуть в&nbsp;неопределенности и&nbsp;организовать процесс так, чтобы команда могла работать продуктивно?</em></p>
<p><em>В этой статье я&nbsp;поделюсь своим опытом: расскажу, как&nbsp;разобраться в&nbsp;сложном проекте, наладить процессы и&nbsp;превратить его&nbsp;в&nbsp;«свой».</em></p>
<h2>Как не&nbsp;утонуть в&nbsp;новом проекте</h2>
<p>Каждый новый проект — это&nbsp;немного (или&nbsp;много) стресс. Но&nbsp;он&nbsp;становится управляемым, если знать, за&nbsp;какие нити дергать. Вот&nbsp;несколько шагов, которые помогут.</p>
<p><strong>Задайте вектор: зачем все&nbsp;это?</strong> Поймите, зачем вообще существует ваш&nbsp;проект. Продажи? Улучшение UX? Новая функциональность? Тимлид не&nbsp;может быть эффективным, если не&nbsp;понимает конечной цели. Начните с&nbsp;разговора с&nbsp;бизнесом или&nbsp;клиентом, выясните ключевые показатели успеха и&nbsp;постарайтесь мысленно «примерить» эти&nbsp;цели на&nbsp;свою работу. Проясните основные пользовательские сценарии.</p>
<p><strong>Нарисуйте карту: архитектура под&nbsp;лупой.</strong> Перед вами должна быть ясная схема взаимодействия всех компонентов системы. Какие сервисы с&nbsp;какими системами взаимодействуют? Какие данные где&nbsp;хранятся? Изучите документацию, если она&nbsp;есть. Если нет, начните собирать её&nbsp;сами. Сделайте так, чтобы у&nbsp;каждого члена команды был&nbsp;доступ к&nbsp;актуальной информации. Существующие данные провалидируйте: вместе с&nbsp;текущей командой и&nbsp;заказчиком убедитесь, что&nbsp;данные не&nbsp;устарели и&nbsp;пригодны к&nbsp;использованию.</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/0a00b49fd7f546ec9d46a1521b647207"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--10069372">
    


    <img src="/Media/mtulzash/slide-16_9-151.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/55117e18d8a8466899e5b70ce49dece4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>На этапе онбординга не&nbsp;нужно вдаваться в&nbsp;детали реализаций. Нужно просто понять, насколько дока актуальна, как&nbsp;настраивать проект, какие есть интеграции, логирование, мониторинг. Особое внимание – на&nbsp;разделы, к&nbsp;которым не&nbsp;знаем как&nbsp;подступиться.</p>
<p><strong>Уберите хаос: матрица доступов.</strong> Когда в&nbsp;проекте участвует много людей и&nbsp;систем, хаос доступов — это&nbsp;первое, что&nbsp;нужно упорядочить. Создайте матрицу: укажите, кто&nbsp;и&nbsp;к&nbsp;каким системам должен иметь доступ, а&nbsp;кто&nbsp;— нет. Эта&nbsp;таблица станет спасением при&nbsp;онбординге новых сотрудников и&nbsp;позволит вам&nbsp;экономить время. Новых сотрудников просто прогоняем по&nbsp;матрице доступов и&nbsp;быстро идем к&nbsp;клиенту за&nbsp;новыми, если их&nbsp;не&nbsp;хватает.&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/5873b9643e974326a5e5923676babaa6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--50772827">
    


    <img src="/Media/en4g413d/frame-5009571.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/109230927ecd44d480c730c8d10efb92"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d0cc4d3c18734786b9200d71e8cd106e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<h2>Хэндоверы: секреты успешного наследования знаний</h2>
<p>Хэндоверы — это&nbsp;сессии, на&nbsp;которых «старички» проекта передают новичкам проекта нужные знания. Многие относятся к&nbsp;ним&nbsp;формально, но&nbsp;это&nbsp;огромная ошибка.</p>
<p><strong>Сфокусируйтесь: тематические сессии.</strong>&nbsp;Разделите хэндоверы на&nbsp;отдельные темы: архитектура, деплой, QA. Такой подход позволяет сфокусироваться и&nbsp;подготовиться. Перед каждым звонком изучите доступную документацию по&nbsp;теме и&nbsp;подготовьте вопросы. Обязательно поделитесь ими&nbsp;заранее с&nbsp;участниками, чтобы не&nbsp;терять время на&nbsp;пространные обсуждения.</p>
<p><strong>Задавайте неудобные вопросы.</strong>&nbsp;Спросите старую команду про&nbsp;типичные ошибки. Какие моменты в&nbsp;проекте вызывают наибольшие сложности? Есть ли&nbsp;важные неочевидные особенности, которые нигде не&nbsp;задокументированы? Какой информации не&nbsp;хватает, если завтра нужно будет залить изменения или&nbsp;запустить тесты? Можно собрать эти&nbsp;вопросы заранее и&nbsp;вручить их&nbsp;заказчику перед звонком – это&nbsp;тоже повысит осмысленность разговора и&nbsp;позволит концентрироваться на&nbsp;сути.&nbsp;</p>
<p><strong>Не теряйте информацию: записывайте встречи.</strong> Записывайте все&nbsp;хэндоверы и&nbsp;сохраняйте их&nbsp;в&nbsp;общем доступе. Это&nbsp;будет полезно, если кто&#8209;то&nbsp;из&nbsp;новых сотрудников захочет быстро разобраться в&nbsp;проекте. Даже спустя месяцы вы&nbsp;сможете вернуться к&nbsp;этим записям и&nbsp;восстановить детали. Новым людям на&nbsp;проекте может быть достаточно пересмотреть запись, вместо того, чтобы расспрашивать более опытных коллег бесконечно в&nbsp;чате.&nbsp;</p>
<h2>Планируйте с&nbsp;умом: задачи и&nbsp;приоритеты</h2>
<p>Как распределить задачи так, чтобы успеть всё&nbsp;важное и&nbsp;не&nbsp;потратить ресурсы впустую? Ключи — планирование и&nbsp;аудит.</p>
<p><strong>Разберитесь с&nbsp;бэклогом.</strong>&nbsp;Просмотрите текущий бэклог. Какие задачи критичны? Какие можно отложить? Например, если вы&nbsp;знаете, что&nbsp;проект через год&nbsp;будет переделан, то&nbsp;работа над&nbsp;обновлением архитектуры может быть лишней. Приоритизируйте задачи, основываясь на&nbsp;глобальных целях проекта.</p>
<p><strong>Проведите аудит: это&nbsp;ваша страховка.</strong> Даже если клиент не&nbsp;требует аудита, сделайте его&nbsp;для&nbsp;себя. Оцените архитектуру, интеграции, технический долг. Это&nbsp;поможет выявить слабые места системы и&nbsp;будет вашей страховкой, если что&#8209;то&nbsp;пойдет не&nbsp;так.</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/05dbd581f4514ad7bf9b983d32708c54"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--47193845">
    


    <img src="/Media/m01ga5e0/slide-16_9-152.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f02c044d6a0244bdba39eaa6444c5574"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Аудит изначально формулирует риски и&nbsp;ограничения на&nbsp;проекте. Если вдруг клиенту срочно понадобится реализация, которую система не&nbsp;в&nbsp;силах будет поддержать, всегда будет, что&nbsp;показать такому клиенту. Самая большая проблема здесь обычно – проблема чистого листа – вы&nbsp;не&nbsp;понимаете, сколько это&nbsp;займет времени и&nbsp;что&nbsp;вообще делать в&nbsp;первую очередь. Копаться в&nbsp;коде можно бесконечно долго, но&nbsp;в&nbsp;этом нет&nbsp;смысла. Ориентируйтесь на&nbsp;общие приоритеты. Например, смотрите на&nbsp;моменты, связанные только с&nbsp;текущим бэклогом, ближайшей на&nbsp;реализацию фичей.</p>
<p><strong>Иногда нужно оценить оценку </strong>– и&nbsp;это&nbsp;не&nbsp;должно казаться странным ни&nbsp;вам, ни&nbsp;команде, ни&nbsp;заказчику. Есть ситуации неопределенности, когда кажется, что&nbsp;в&nbsp;эстимейте можно сильно промахнуться. Для&nbsp;таких случаев делаем оценку на&nbsp;исследование, а&nbsp;не&nbsp;на&nbsp;реализацию. У&nbsp;клиентов будут реалистичные ожидания – они&nbsp;будут знать, над&nbsp;чем&nbsp;вы&nbsp;работаете сейчас. Разработчики же&nbsp;в&nbsp;это&nbsp;время не&nbsp;будут связаны ложными эстимейтами: работать по&nbsp;ночам или&nbsp;расстраивать клиента незакрытыми задачами.</p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/c7305ddaaa5d4a3a854a69146710024d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--65112333">
    


    <img src="/Media/wpgpdoh3/slide-16_9-153.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/68ee456ecdca4916a84262c86fa2e441"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p><strong>Экспериментируйте с&nbsp;Proof of&nbsp;Concept (PoC).</strong> Если вы&nbsp;не&nbsp;уверены, что&nbsp;выбранный подход к&nbsp;задаче сработает, делайте PoC. Это&nbsp;небольшой эксперимент, который позволяет проверить, будет ли&nbsp;работать ваша идея. Главное — не&nbsp;вдаваться в&nbsp;детали. Помните, что&nbsp;цель PoC&nbsp;— понять, возможно ли&nbsp;реализовать задумку, а&nbsp;не&nbsp;сделать готовый продукт.</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/8c2f083ab4414f38b72addb047560f3e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--46047399">
    


    <img src="/Media/z5ad3je1/slide-16_9-154.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4e2b1813099d4703ac8bb4979fdaf369"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1a881c9e69774d22be94c3799c53dfaf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Деплой без&nbsp;стресса: настраиваем релизы</h2>
<p>Работа с&nbsp;релизами — это&nbsp;еще&nbsp;один ключевой аспект работы тимлида. Не&nbsp;всё, что&nbsp;звучит просто, оказывается таковым на&nbsp;практике.</p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/1ed65b36b91d44bab02f2be3e8ed5ca3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--33095432">
    


    <img src="/Media/jcgaxbrq/slide-16_9-155.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b4010a194bd04b56b2c7778aa1764ea1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p><strong>Автоматизируйте, где&nbsp;возможно.</strong>&nbsp;Узнайте, как&nbsp;настроены пайплайны на&nbsp;проекте. Есть ли&nbsp;полностью автоматизированные процессы? Если нет, выясните, какие этапы требуют ручного вмешательства, и&nbsp;постарайтесь оптимизировать их.</p>
<p><strong>Согласуйте окна для&nbsp;релизов.</strong>&nbsp;Перед каждым релизом уведомляйте всех участников: команду, клиента, пользователей. Определите фиксированные временные окна для&nbsp;заливок изменений, чтобы минимизировать риски.</p>
<p><strong>Всегда имейте план Б.</strong>&nbsp;Держите где&#8209;то&nbsp;«под подушкой» план отката. Если релиз привел к&nbsp;проблемам, кто&nbsp;и&nbsp;как&nbsp;будет устранять их? Создайте пошаговый чек-лист действий для&nbsp;таких ситуаций.</p>
<h2>Сложности — это&nbsp;возможности для&nbsp;роста</h2>
<p>Работа тимлида — это&nbsp;баланс между техникой, людьми и&nbsp;процессами. Главное — не&nbsp;бояться неопределенности. Системный подход, открытая коммуникация и&nbsp;внимание к&nbsp;деталям помогут вам&nbsp;справиться с&nbsp;любыми вызовами. Не&nbsp;забывайте: тимлид — это&nbsp;тот, кто&nbsp;ведет за&nbsp;собой.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Проблемы с производи&shy;тельностью веб-сервисов: как находить и устранять
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Узкие места, оценка нагрузки, проверка скорости и использование кэширования для стабильной работы. 
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/web-performance-upgrade/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/web-performance-upgrade/</guid>

                <pubDate>Thu, 04 Dec 2025 09:53:34 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Проблемы с производи&shy;тельностью веб-сервисов: как находить и устранять</h1>
                                <figure>
                                    <img src="/Media/cqdnrab1/chatgpt-image-jul-18-2025-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/350eeed55d7a4a418bad68d856955335"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/072139586c8f433a809821902e8867c7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Производительность — это&nbsp;базовое требование в&nbsp;разработке. Однако не&nbsp;всегда о&nbsp;базово высокой производительности говорят на&nbsp;этапе обсуждения проекта. Заказчик вряд ли&nbsp;скажет: «Сделайте так, чтобы сайт отвечал за&nbsp;Х&nbsp;мс», но&nbsp;он&nbsp;точно удивится и&nbsp;расстроится, если все&nbsp;будет грузиться медленно. В&nbsp;команде тоже мало кто&nbsp;рад: проект сдан, а&nbsp;теперь приходится выяснять, что&nbsp;тормозит и&nbsp;почему.</p>
<p dir="ltr">Эта статья — для&nbsp;тех, кто&nbsp;хочет понять, где&nbsp;обычно прячутся проблемы с&nbsp;производительностью, как&nbsp;их&nbsp;не&nbsp;пропустить и&nbsp;устранить.</p>
<h2 dir="ltr">О производительности ресурса думаем с&nbsp;самого начала</h2>
<p dir="ltr">Быстрый отклик — это&nbsp;не&nbsp;дополнительная опция, а&nbsp;такое же&nbsp;требование, как&nbsp;корректная работа логики или&nbsp;API-запросов. Это&nbsp;часть требований. Просто о&nbsp;производительности часто не&nbsp;договариваются в&nbsp;явном виде.&nbsp;</p>
<p dir="ltr">Никто не&nbsp;говорит: «Сделайте так, чтобы навигация отрисовывалась за&nbsp;10 миллисекунд». Но&nbsp;подразумевается, что&nbsp;всё&nbsp;должно работать нормально. Как&nbsp;в&nbsp;любой другой профессии, например, дорожного строителя, тебе не&nbsp;скажут: «Пожалуйста, положите асфальт без&nbsp;дыр». Это&nbsp;должно быть по&nbsp;умолчанию.</p>
<p dir="ltr">Если не&nbsp;учитывать такие вещи на&nbsp;старте, потом будет больно: что&#8209;то&nbsp;окажется не&nbsp;в&nbsp;кэше, какой&#8209;то&nbsp;компонент делает десятки лишних запросов, и&nbsp;вот&nbsp;уже&nbsp;всё&nbsp;тормозит, а&nbsp;времени разбираться — нет.</p>
<p dir="ltr">Можно воспринимать это&nbsp;как&nbsp;навык. Или&nbsp;даже привычку. Не&nbsp;оптимизировать заранее, а&nbsp;просто замечать, где&nbsp;может работать плохо.&nbsp;</p>
<h2 dir="ltr">Кто отвечает за&nbsp;производительность сайта</h2>
<p dir="ltr">Вопросы обычно появляются уже&nbsp;после запуска, когда начинаются проблемы. Кто&nbsp;виноват, если страницы долго открываются? Кто&nbsp;должен был&nbsp;предусмотреть, что&nbsp;в&nbsp;пиковые часы все&nbsp;встанет? Кто&nbsp;не&nbsp;проверил, что&nbsp;навигация запрашивает из&nbsp;CMS&nbsp;по&nbsp;сто&nbsp;элементов на&nbsp;каждой странице?</p>
<p dir="ltr">В команде быстро становится ясно: этим должен был&nbsp;заняться кто&#8209;то&nbsp;из&nbsp;разработчиков.</p>
<p dir="ltr">Бывает, что&nbsp;в&nbsp;начале проекта никто не&nbsp;уточняет, какой трафик планируется, сколько пользователей может быть одновременно на&nbsp;сайте, что&nbsp;именно должно оставаться быстрым при&nbsp;нагрузке. Это&nbsp;часть ограничений, которые формируют архитектуру цифрового продукта – о&nbsp;ней&nbsp;у&nbsp;нас&nbsp;есть <a href="/articles/architectures-principles/" title="Как заложить архитектуру цифрового продукта: 6 практических принципов">отдельная статья</a>. В&nbsp;брифах и&nbsp;юзер-стори таких цифр может не&nbsp;быть. Но&nbsp;это&nbsp;не&nbsp;освобождает от&nbsp;ответственности. Потому что&nbsp;даже если требования не&nbsp;прописали, ресурс всё&nbsp;равно должен работать стабильно. И&nbsp;когда он&nbsp;не&nbsp;справляется, первым делом идут не&nbsp;к&nbsp;менеджеру и&nbsp;не&nbsp;к&nbsp;дизайнеру.</p>

<div class="umb-macro-highlights">
    <strong>Если ты&nbsp;пишешь код&nbsp;для&nbsp;сайта, предполагается, что&nbsp;ты&nbsp;умеешь хотя бы&nbsp;в&nbsp;общих чертах оценить, насколько он&nbsp;нагружает систему. И&nbsp;если есть риск, что&nbsp;что&#8209;то&nbsp;будет тормозить, как&nbsp;минимум стоит сказать об&nbsp;этом. А&nbsp;лучше — предложить решение заранее.</strong>
    
</div>

<p dir="ltr">У опытных разработчиков такая ответственность уже&nbsp;встроена в&nbsp;процесс. Они&nbsp;не&nbsp;ждут отдельного запроса. Они&nbsp;сами уточняют, под&nbsp;какой трафик должен работать сайт, и&nbsp;прикидывают, выдержит ли&nbsp;инфраструктура то, что&nbsp;они&nbsp;собираются развернуть.</p>
<p dir="ltr">Перфоманс ресурса — это&nbsp;такая же&nbsp;задача, как&nbsp;логика, работающая кнопка или&nbsp;правильный API-запрос. Если всё&nbsp;будет красиво, но&nbsp;медленно, никого не&nbsp;будет заботить, что&nbsp;«в тикете этого не&nbsp;было».</p>
<h2 dir="ltr">Что значит «быстрая загрузка», и&nbsp;кто&nbsp;это&nbsp;решает</h2>
<p dir="ltr">Скорость — штука коварная. Для&nbsp;одних и&nbsp;две&nbsp;секунды загрузки нормально, другие начинают нервничать уже&nbsp;через полторы. Пользователь может не&nbsp;сформулировать, что&nbsp;именно его&nbsp;не&nbsp;устраивает, но&nbsp;если сайт медленно реагирует, негативное ощущение останется.</p>
<p dir="ltr">Чтобы не&nbsp;гадать, что&nbsp;считать «нормальной» скоростью, можно опираться на&nbsp;готовые исследования. Например, <a href="https://research.google/blog/speed-matters">Google потратил немало усилий, чтобы разобраться, как&nbsp;пользователи воспринимают задержки</a>. На&nbsp;основе этих данных строятся метрики вроде Time to&nbsp;Interactive и&nbsp;других показателей в&nbsp;PageSpeed и&nbsp;Lighthouse. Это&nbsp;понятная отправная точка, особенно если нужно говорить о&nbsp;производительности с&nbsp;клиентом или&nbsp;внутри команды.</p>
<p dir="ltr">Если говорить не&nbsp;о&nbsp;фронтенде, а&nbsp;о&nbsp;серверной части – ориентир простой: в&nbsp;95% случаев HTML-страница должна отдаваться за&nbsp;200 миллисекунд или&nbsp;быстрее. И&nbsp;это&nbsp;при&nbsp;реальной нагрузке — не&nbsp;только у&nbsp;вас, но&nbsp;и&nbsp;у&nbsp;десятков пользователей — сервер стабильно укладывается в&nbsp;эти&nbsp;рамки.</p>
<p dir="ltr">Почему именно 200 миллисекунд? Потому что&nbsp;всё, что&nbsp;выше, начинает отъедать общее время, за&nbsp;которое сайт должен не&nbsp;только отдать HTML, но&nbsp;и&nbsp;загрузить скрипты, стили, отрисовать интерфейс. Если сервер тормозит, фронтенду не&nbsp;из&nbsp;чего собирать быструю страницу.</p>
<p dir="ltr">Эта цифра кажется простой, но&nbsp;достичь её&nbsp;непросто, особенно если изначально об&nbsp;этом не&nbsp;думали. Лишние запросы, медленные компоненты и&nbsp;отсутствие кэша моментально «съедают» время.</p>
<h2 dir="ltr">Как оценить нагрузку</h2>
<p dir="ltr">Если проект делается для&nbsp;бизнеса, у&nbsp;которого уже&nbsp;есть сайт, все&nbsp;просто. Достаточно посмотреть аналитику — Метрику или&nbsp;любой другой инструмент, которым пользуется клиент. Там&nbsp;обычно можно найти три&nbsp;ключевых значения:</p>
<ul>
<li>самый загруженный месяц,</li>
<li>самый активный день,</li>
<li>пиковый час.</li>
</ul>
<p dir="ltr">Эти данные помогают построить модель нагрузки. Иногда можно пережить редкие пики, а&nbsp;иногда — именно они&nbsp;дают половину выручки, и&nbsp;тогда под&nbsp;них&nbsp;придётся оптимизировать всё. Например, счастливые часы в&nbsp;доставках – когда цены привлекательнее и&nbsp;желающих заказать еду&nbsp;становится больше.&nbsp;</p>
<p dir="ltr">Если сайт новый и&nbsp;данных нет, нагрузку можно оценить через разговор с&nbsp;заказчиком. Вот&nbsp;что&nbsp;нужно узнать:</p>
<ul>
<li>Кто будет пользоваться сайтом?</li>
<li>Сколько примерно людей — в&nbsp;день, в&nbsp;месяц, одновременно?</li>
<li>Сколько заявок или&nbsp;покупок он&nbsp;должен собирать?</li>
<li>Какую конверсию клиент считает нормальной?</li>
<li>Есть ли&nbsp;у&nbsp;бизнеса сезонность или&nbsp;периоды всплеска?</li>
</ul>
<p dir="ltr">С этими цифрами можно построить простую цепочку: если сайт должен давать 10 000 заявок в&nbsp;месяц, а&nbsp;конверсия, по&nbsp;словам клиента, — 1%, значит, нужно около 1 000 000 сессий в&nbsp;месяц. Разделить это&nbsp;по&nbsp;дням и&nbsp;прикинуть среднюю продолжительность одной сессии — уже&nbsp;достаточно, чтобы примерно понять, сколько людей могут быть на&nbsp;сайте одновременно.</p>
<p dir="ltr">Например, если в&nbsp;день ~33 000 сессий, и&nbsp;каждая длится в&nbsp;среднем 1 минуту, то&nbsp;в&nbsp;любой момент времени на&nbsp;сайте может находиться примерно 20–30 человек одновременно. Это&nbsp;concurrent users — количество сессий, которые происходят параллельно.&nbsp;</p>
<p dir="ltr"><img src="/Media/kslnpzb4/slide-16_9-157.png?rmode=max&amp;height=500" alt="" width="482" height="500"></p>
<p dir="ltr">В этой модели нет&nbsp;ничего сложного. Но&nbsp;если её&nbsp;вообще не&nbsp;строить, потом будет трудно объяснить, почему сайт лёг&nbsp;в&nbsp;разгар рекламной кампании или&nbsp;упал в&nbsp;день запуска.</p>
<p dir="ltr">Бывает полезно смотреть на&nbsp;аналитику конкурентов, если она&nbsp;доступна. Или&nbsp;использовать данные с&nbsp;похожих проектов в&nbsp;своей практике. Любая опора — лучше, чем&nbsp;«а давайте потестим в&nbsp;проде».</p>
<p dir="ltr">И тут&nbsp;важный момент: все&nbsp;это&nbsp;нужно явно проговорить с&nbsp;клиентом, даже если расчеты пока довольно грубые. Во-первых, потому что&nbsp;часто у&nbsp;клиента такие ожидания есть, просто их&nbsp;никто не&nbsp;спросил. А&nbsp;во-вторых — чтобы потом не&nbsp;пришлось объяснять, почему система, рассчитанная на&nbsp;5 человек, не&nbsp;справляется с&nbsp;500.</p>
<h2 dir="ltr">Как проверить, не&nbsp;тормозит ли&nbsp;то, что&nbsp;уже&nbsp;написано</h2>
<p dir="ltr">Если ты&nbsp;пишешь код, хочется понять заранее, будет ли&nbsp;тормозить. Здесь не&nbsp;нужны редкие специалисты и&nbsp;сложные тесты. Достаточно простой локальной проверки, которую можно сделать до&nbsp;передачи задачи на&nbsp;тест.</p>

<div class="umb-macro-highlights">
    <strong>Если коротко: локального теста чаще всего хватает, чтобы заметить проблемы. </strong>
    
</div>

<p dir="ltr">Может, точной цифры по&nbsp;каждому запросу узнать не&nbsp;получится, но&nbsp;зато можно увидеть, что, например, одна и&nbsp;та&nbsp;же&nbsp;страница подгружается по&nbsp;20 секунд. Или&nbsp;что&nbsp;компонент генерирует десятки запросов в&nbsp;базу без&nbsp;нужды. Или&nbsp;что&nbsp;отрисовка меню тормозит даже без&nbsp;данных. И&nbsp;этого уже&nbsp;достаточно, чтобы остановиться и&nbsp;поправить.</p>
<p dir="ltr">Можно подключить инструменты. Например, K6 — лёгкий фреймворк, моделирующий поведение виртуальных пользователей. С&nbsp;ним&nbsp;можно посмотреть, как&nbsp;сайт реагирует на&nbsp;нагрузку. Там&nbsp;не&nbsp;нужно быть инженером по&nbsp;тестированию — достаточно набросать простой скрипт. Он&nbsp;покажет, насколько быстро сервер отвечает, где&nbsp;возникают задержки, какие страницы выбиваются по&nbsp;времени. Все&nbsp;это&nbsp;можно запустить без&nbsp;сложной настройки. Даже если знаний по&nbsp;К6 у&nbsp;вас&nbsp;совсем нет, с&nbsp;чатом GPT&nbsp;или&nbsp;любой другой нейронкой вы&nbsp;справитесь с&nbsp;задачей за&nbsp;полчаса-час. Мы&nbsp;проверили 🙂</p>
<p dir="ltr">Ещё один плюс: K6 можно использовать даже для&nbsp;того, чтобы просто пробежаться по&nbsp;всем страницам сайта — например, по&nbsp;карте ссылок (sitemap). Это&nbsp;помогает проверить, как&nbsp;сайт ведёт себя на&nbsp;холодную, без&nbsp;прогрева кэша. Часто именно в&nbsp;этот момент всплывают скрытые проблемы — медленные компоненты, цепочки запросов, отсутствие кэширования, да&nbsp;и&nbsp;просто ошибки сервера. Это&nbsp;не&nbsp;нагрузочный тест, но&nbsp;он&nbsp;даёт понимание: если сайт тормозит при&nbsp;одном пользователе, под&nbsp;сотней он&nbsp;точно не&nbsp;справится.</p>
<p dir="ltr">Тестировать можно и&nbsp;через Postman, и&nbsp;через плагины, и&nbsp;даже с&nbsp;помощью обычных замеров в&nbsp;браузере. Но&nbsp;смысл не&nbsp;в&nbsp;инструментах. Смысл в&nbsp;том, чтобы не&nbsp;ждать, пока тестировщик скажет, что&nbsp;что&#8209;то&nbsp;не&nbsp;так. Проверить можно самому — и&nbsp;лучше сделать это&nbsp;до&nbsp;того, как&nbsp;код&nbsp;уйдет дальше по&nbsp;цепочке.</p>
<h2 dir="ltr">Где чаще всего прячутся тормоза на&nbsp;сайте</h2>
<p dir="ltr">Сайт может выглядеть простым: несколько страниц, обычная навигация, карточки, пара фильтров. Но&nbsp;при&nbsp;этом он&nbsp;может загружаться по&nbsp;пять секунд и&nbsp;задыхаться, когда на&nbsp;него заходит чуть больше людей. Почему так&nbsp;происходит?</p>
<p dir="ltr">Чаще всего — из&#8209;за&nbsp;вполне обычных вещей. Просто они&nbsp;написаны без&nbsp;оглядки на&nbsp;нагрузку. И&nbsp;проблема в&nbsp;том, что&nbsp;это&nbsp;компоненты, которые встречаются на&nbsp;каждой странице — и&nbsp;если они&nbsp;«тяжёлые», сайт начинает тормозить везде.</p>
<p dir="ltr">Вот несколько примеров из&nbsp;реальной практики.</p>
<h3 dir="ltr">Навигация, хедер, футер</h3>
<p dir="ltr">Если для&nbsp;этих блоков каждый раз&nbsp;запрашивать данные из&nbsp;CMS&nbsp;или&nbsp;базы, особенно с&nbsp;вложенностью, получится очень дорогая операция. А&nbsp;поскольку хедер, футер и&nbsp;навигация есть буквально на&nbsp;каждой странице, то&nbsp;чем&nbsp;больше сайт, тем&nbsp;больнее это&nbsp;будет. Хотя на&nbsp;самом деле навигация меняется довольно редко, и&nbsp;ее&nbsp;можно кэшировать или&nbsp;сгенерировать заранее, не&nbsp;боясь показывать «протухшие» данные.</p>
<h3 dir="ltr">Breadcrumbs</h3>
<p dir="ltr">Казалось бы, мелочь. Но&nbsp;если путь до&nbsp;текущей страницы нужно собирать из&nbsp;цепочки родительских, и&nbsp;для&nbsp;этого делается несколько последовательных запросов — это&nbsp;сильно замедляет отрисовку. Особенно если на&nbsp;сайте тысячи страниц и&nbsp;у&nbsp;каждой — своя глубина.</p>
<h3 dir="ltr">Метаданные</h3>
<p dir="ltr">Canonical, hreflang, alternate-URL – всё, что&nbsp;нужно для&nbsp;SEO&nbsp;– иногда подтягивается в&nbsp;реальном времени и&nbsp;для&nbsp;каждого языка. Если языков на&nbsp;ресурсе 10–15, это&nbsp;уже&nbsp;десятки запросов к&nbsp;базе или&nbsp;API. При&nbsp;этом они&nbsp;редко кешируются, потому что&nbsp;считаются «мелочами».</p>
<h3 dir="ltr">Юзерские данные</h3>
<p dir="ltr">Если логика логина, приветствия или&nbsp;показа корзины реализована на&nbsp;стороне сервера, а&nbsp;не&nbsp;фронтенда — кэш&nbsp;уже&nbsp;не&nbsp;спасти. Сервер будет собирать страницу заново для&nbsp;каждого пользователя. Это&nbsp;незаметно на&nbsp;первых порах, но&nbsp;начинает бить по&nbsp;производительности при&nbsp;росте трафика.</p>
<h3 dir="ltr">Списки и&nbsp;фильтры</h3>
<p dir="ltr">Листинг карточек, сортировка, поиск — все&nbsp;это&nbsp;часто пишут на&nbsp;прямых SQL-запросах к&nbsp;базе. На&nbsp;самом деле для&nbsp;таких задач есть более подходящие специализированные инструменты – поисковые индексы. Например, Solr, Elastic Search, Algolia, Azure Search и&nbsp;десятки других сервисов. Они&nbsp;специально предназначены для&nbsp;быстрого текстового поиска и&nbsp;фильтрации данных.&nbsp;</p>
<h3 dir="ltr">Поисковые результаты</h3>
<p dir="ltr">Найти результаты — одно дело. А&nbsp;вот&nbsp;если ты&nbsp;к&nbsp;каждой найденной странице делаешь еще&nbsp;дополнительные запросы за&nbsp;данными (например, чтобы в&nbsp;поисковой выдаче сразу показать еще&nbsp;и&nbsp;breadcrumbs или&nbsp;картинку для&nbsp;найденной страницы), то&nbsp;нагрузка на&nbsp;сервер резко возрастает. Даже один пользователь, просто нажимая «поиск», может создать десятки тяжёлых обращений к&nbsp;серверу. Тут&nbsp;рекомендация очень проста: все&nbsp;данные для&nbsp;отрисовки результатов поисковой выдачи должны быть добавлены в&nbsp;индекс заранее, еще&nbsp;на&nbsp;этапе индексации, в&nbsp;уже&nbsp;готовом для&nbsp;показа пользователю формате.</p>
<h3 dir="ltr">Картинки и&nbsp;редиректы</h3>
<p dir="ltr">Иногда оптимизация изображений может происходить на&nbsp;лету. А&nbsp;еще&nbsp;ваш&nbsp;сервер может проверять гигантский список редиректов при&nbsp;каждом запросе. Обычно эти&nbsp;штуки живут где&#8209;то&nbsp;в&nbsp;тени, но&nbsp;могут сожрать всё&nbsp;доступное время — особенно если логика написана с&nbsp;лукапом по&nbsp;списку из&nbsp;30 тысяч строк.</p>
<p dir="ltr">Все эти&nbsp;вещи — просто следствие того, что&nbsp;в&nbsp;момент реализации никто не&nbsp;подумал, как&nbsp;компонент поведёт себя под&nbsp;нагрузкой. А&nbsp;потом это&nbsp;становится общей бедой. Но&nbsp;почти всегда причина одна и&nbsp;та&nbsp;же: элемент, который должен был&nbsp;быть легким, оказался тяжёлым, и&nbsp;его&nbsp;не&nbsp;закэшировали. А&nbsp;так&nbsp;как&nbsp;он&nbsp;встречается на&nbsp;многих страницах, тормозить начинает всё.</p>
<h2 dir="ltr">Как кэш&nbsp;спасает сайт, если им&nbsp;пользоваться</h2>
<p dir="ltr">Итак, у&nbsp;нас&nbsp;все&nbsp;страшно тормозит, нужно срочно что&#8209;то&nbsp;делать. Первое, что&nbsp;приходит на&nbsp;ум&nbsp;— ускорить код. Переписать запрос, поправить логику, убрать дубли. Это&nbsp;может помочь, но&nbsp;часто есть способ проще и&nbsp;надёжнее — не&nbsp;запускать лишние операции каждый раз, а&nbsp;использовать кэш.</p>
<p dir="ltr">У кэширования есть репутация чего&#8209;то&nbsp;технического и&nbsp;необязательного. Иногда кажется, что&nbsp;это&nbsp;«второй этап», который можно доделать потом. Но&nbsp;по&nbsp;сути, это&nbsp;просто способ не&nbsp;делать одну и&nbsp;ту&nbsp;же&nbsp;работу многократно.&nbsp;</p>
<p dir="ltr">Есть разные уровни кэширования. Самый понятный — CDN, который раздаёт статику и&nbsp;страницы без&nbsp;участия сервера. Дальше — output cache, когда сервер отдает уже&nbsp;собранный HTML, а&nbsp;не&nbsp;пересобирает его&nbsp;на&nbsp;каждый запрос. Это&nbsp;самый эффективный способ с&nbsp;точки зрения скорости: просто отдать готовую страницу, без&nbsp;вычислений, запросов и&nbsp;сборки.</p>
<p dir="ltr">Дальше идёт data-layer cache — когда ты&nbsp;хотя бы&nbsp;не&nbsp;запрашиваешь одни и&nbsp;те&nbsp;же&nbsp;данные из&nbsp;базы или&nbsp;API, а&nbsp;держишь их&nbsp;в&nbsp;памяти на&nbsp;время. Это&nbsp;помогает, но&nbsp;требует больше контроля: нужно следить за&nbsp;сроком жизни кэша, за&nbsp;актуальностью, за&nbsp;тем, как&nbsp;он&nbsp;сбрасывается.</p>
<p dir="ltr"><span><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdgvvbWIDOme2jCD_GKr8BIBoB2g-JSQJOtESHwl9iMOovyQHeXBhhAOuJQKRDKgTbr4PTN-1kRqhgVmHzKRVkSATqSU4A1tttBm_3JEz8x31bE-fIkQEWZIpeg_zFPUXDNSfOaiw?rmode=max&amp;width=682&amp;height=335" alt="" width="682" height="335"></span></p>
<p dir="ltr">И наконец, самый затратный путь — каждый раз&nbsp;собирать всё&nbsp;с&nbsp;нуля. То&nbsp;есть при&nbsp;любом запросе ходить в&nbsp;базу, подтягивать данные, собирать страницу, рендерить и&nbsp;отдавать. Если так&nbsp;сделана даже одна популярная страница, она&nbsp;может замедлить весь сайт. А&nbsp;если таких страниц десятки — сайт просто не&nbsp;выдержит.</p>
<p dir="ltr">Output cache часто не&nbsp;используют. Либо потому что&nbsp;не&nbsp;знают, как&nbsp;его&nbsp;внедрить, либо боятся, что&nbsp;будет сложно управлять инвалидацией. Но&nbsp;если фреймворк это&nbsp;поддерживает (а&nbsp;большинство современных — поддерживают), нужно хотя бы&nbsp;попробовать. Это&nbsp;сильно снижает нагрузку и&nbsp;решает массу проблем до&nbsp;того, как&nbsp;они&nbsp;станут критичными.</p>
<h2 dir="ltr">Когда проверять производительность, и&nbsp;кто&nbsp;это&nbsp;должен делать</h2>
<p dir="ltr">Есть распространённое представление, что&nbsp;за&nbsp;перформанс на&nbsp;проекте отвечает тимлид. Он&nbsp;опытный, у&nbsp;него всё&nbsp;под&nbsp;контролем, он&nbsp;заметит, если что&#8209;то&nbsp;тормозит. Иногда так&nbsp;и&nbsp;бывает. Но&nbsp;чаще — нет.</p>

<div class="umb-macro-highlights">
    <strong> Проблема в&nbsp;том, что&nbsp;многие вещи, которые влияют на&nbsp;скорость, видны только в&nbsp;момент, когда ты&nbsp;их&nbsp;пишешь. </strong>
    
</div>

<p dir="ltr">Когда ты&nbsp;решаешь, делать ли&nbsp;запрос к&nbsp;базе или&nbsp;взять данные из&nbsp;кэша. Когда думаешь, вызывать ли&nbsp;API&nbsp;в&nbsp;каждом компоненте или&nbsp;передать данные сверху. Когда собираешь сложную навигацию или&nbsp;breadcrumbs и&nbsp;решаешь подумать, как&nbsp;их&nbsp;упростить. Здесь можно понять, будет ли&nbsp;компонент вести себя стабильно. Если передать его&nbsp;в&nbsp;тест, даже не&nbsp;проверив, насколько он&nbsp;тяжелый, шансы на&nbsp;то, что&nbsp;он&nbsp;начнёт тормозить, очень высоки.</p>
<p dir="ltr">Это не&nbsp;значит, что&nbsp;теперь каждый разработчик должен стать специалистом по&nbsp;нагрузочному тестированию. Достаточно завести простую привычку: перед тем&nbsp;как&nbsp;закрыть задачу, проверить, как&nbsp;ведет себя компонент. Хотя бы&nbsp;локально. Хотя бы&nbsp;прикинуть: делает ли&nbsp;он&nbsp;что&#8209;то&nbsp;лишнее? Можно ли&nbsp;его&nbsp;кешировать? Нет&nbsp;ли&nbsp;там&nbsp;цепочки запросов, которые тормозят все&nbsp;приложение?</p>
<p dir="ltr">Если каждый в&nbsp;команде проверяет свой код&nbsp;хотя бы&nbsp;на&nbsp;базовом уровне, то&nbsp;тимлиду не&nbsp;приходится быть последней линией обороны. И&nbsp;проект в&nbsp;целом становится устойчивее. Потому что&nbsp;вместо того, чтобы в&nbsp;конце выяснять, что&nbsp;сайт не&nbsp;тянет, команда заранее устраняет то, что&nbsp;может его&nbsp;замедлить.</p>
<h2 dir="ltr">Что точно стоит проверять, прежде чем&nbsp;закрыть задачу</h2>
<p dir="ltr">Не стоит делить проект на&nbsp;«функциональность» и&nbsp;«оптимизацию», подразумевая, что&nbsp;первое – необходимая база, а&nbsp;второе – что-то, что&nbsp;можно сделать позже. На&nbsp;практике всё&nbsp;наоборот: многие вещи начинают тормозить не&nbsp;потому, что&nbsp;в&nbsp;них&nbsp;что&#8209;то&nbsp;не&nbsp;так, а&nbsp;потому что&nbsp;никто не&nbsp;посмотрел на&nbsp;них&nbsp;с&nbsp;нужной стороны в&nbsp;нужный момент.</p>
<p dir="ltr">Если ты&nbsp;работаешь над&nbsp;компонентом, который будет встречаться на&nbsp;каждой странице — навигация, хедер, футер, breadcrumbs, карточки — стоит задать себе несколько простых вопросов.&nbsp;</p>
<ul>
<li>Запрашиваю ли&nbsp;я&nbsp;что-то, что&nbsp;почти не&nbsp;меняется? Можно ли&nbsp;это&nbsp;закэшировать?</li>
<li>Не делаю ли&nbsp;я&nbsp;одни и&nbsp;те&nbsp;же&nbsp;запросы в&nbsp;разных местах?</li>
<li>Не тяну ли&nbsp;я&nbsp;больше данных, чем&nbsp;нужно прямо сейчас?</li>
<li>Если у&nbsp;компонента есть динамика (пользователь, фильтры, поиск) — что&nbsp;будет при&nbsp;10, 100, 1000 сессиях одновременно?</li>
</ul>
<p dir="ltr">И ещё: если компонент уже&nbsp;работает, загляни в&nbsp;него глазами пользователя. Быстро ли&nbsp;он&nbsp;отвечает? Не&nbsp;чувствуется ли&nbsp;задержка? Это&nbsp;не&nbsp;всегда точный тест, но&nbsp;часто он&nbsp;первым подсказывает, что&nbsp;что&#8209;то&nbsp;не&nbsp;так.</p>
<p dir="ltr">Самое простое — провести быструю локальную проверку. Через K6, Postman, DevTools — неважно. Главное, чтобы ты&nbsp;сам&nbsp;понял, что&nbsp;написал. Тогда баги по&nbsp;перформансу не&nbsp;будут сюрпризом. А&nbsp;сайт не&nbsp;начнёт тормозить в&nbsp;тот&nbsp;самый момент, когда этого меньше всего ждёшь.</p>
<h2 dir="ltr">Вместо вывода</h2>
<p dir="ltr">Производительность — это&nbsp;обычная часть разработки веб-сервиса. Да&nbsp;вообще любого сервиса. Просто о&nbsp;ней&nbsp;говорят меньше, чем&nbsp;о&nbsp;дизайне или&nbsp;логике. Но&nbsp;когда что&#8209;то&nbsp;начинает тормозить, именно она&nbsp;выходит на&nbsp;первый план.</p>
<p dir="ltr">Важно не&nbsp;забывать о&nbsp;вещах, которые действительно влияют на&nbsp;скорость. Замечать потенциально тяжёлые места. Проверять то, что&nbsp;можно проверить локально. Спрашивать, если не&nbsp;знаешь, какую нагрузку закладывать.</p>
<p dir="ltr">Большинство проблем с&nbsp;производительностью не&nbsp;придется решать, если не&nbsp;создавать их&nbsp;в&nbsp;самом начале. И&nbsp;это&nbsp;вполне посильная задача. Не&nbsp;для&nbsp;архитектора или&nbsp;тимлида, а&nbsp;для&nbsp;любого, кто&nbsp;пишет код.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Freedom Football Manager: автоматизация тренировочного процесса для футбольной лиги Казахстана
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/ffm-development/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/ffm-development/</guid>

                <pubDate>Thu, 13 Nov 2025 07:24:34 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x412;&#x435;&#x431;-&#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Freedom Football Manager: автоматизация тренировочного процесса для футбольной лиги Казахстана</h1>
                                <figure>
                                    <img src="/Media/kwhfcyrb/&#x43F;&#x43B;&#x430;&#x43D;&#x448;&#x435;&#x442;&#x44B;-&#x43C;&#x43E;&#x43A;&#x430;&#x43F;-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/9cfd0b3b3c624192bdc78e87611a73cb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/287c17ab1c234808a62fa6a850b5c7a5"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1><strong>Freedom Football Manager: автоматизация тренировочного процесса для&nbsp;футбольной лиги Казахстана</strong></h1>
<p dir="ltr">Заказчик – Freedom QJ&nbsp;League. Это&nbsp;казахстанская юношеская футбольная лига. Ребята занимаются развитием молодежного футбола в&nbsp;Казахстане и&nbsp;выращивают репутацию казахстанских футболистов на&nbsp;мировой арене. Подробнее о&nbsp;Freedom QJ&nbsp;League – на&nbsp;<a href="https://qjl.kz">сайте</a>.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/099655a4aa5148c59c4fdfe702fec9bf"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--34108339">
    


    <img src="/Media/2e0nkbyh/frame-5009586.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ac2da2fcf8a7453dae2cfc91c2368c8e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/39ad84fb231148f98700afa52192bfb3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="forseti-about">
<div class="forseti-about__breakpoints">
<div class="forseti-about__start"><strong>Старт работ:</strong> февраль 2024</div>
<div class="forseti-about__final"><strong>Запуск проекта:</strong> август 2024</div>
</div>
<div class="forseti-about__timeline">
<div class="forseti-about__timeline-start"><a href="/projects/proektirovanie-produkta-dlya-freedom-qj-league/" title="Проектирование продукта для&nbsp;Freedom QJ&nbsp;League">Проектирование</a></div>
<div class="forseti-about__timeline-final"><span>Оценка</span> <span>Разработка</span> <span>Тестирование</span></div>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/0ddb7080446e448badc91c1c6c2fbecf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/af05d31f96174951a0ed57cdd3faac05"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Идея продукта – не&nbsp;просто дать тренерам интерфейс для&nbsp;управления тренировками, а&nbsp;системно подойти к&nbsp;развитию молодых игроков в&nbsp;Казахстане. Цель максимум – регулярно готовить как&nbsp;можно больше игроков для&nbsp;юношеской  и&nbsp;молодежной сборных Казахстана. Сейчас с&nbsp;этим трудности, потому что&nbsp;из&#8209;за&nbsp;отсутствия системы тренировок и&nbsp;их&nbsp;отслеживания часто прогресс некоторых молодых талантов теряется. А&nbsp;система позволит таких огрех избежать.</p>
<p dir="ltr"> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/2609533f89284c89aa186158d664322f"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Вокруг деятельности лиги будет развернута целая экосистема решений. Одно из&nbsp;них&nbsp;– система, которая автоматизирует тренировочный процесс и&nbsp;помогает поднять уровень юношеского футбола в&nbsp;стране. За&nbsp;проектированием и&nbsp;разработкой для&nbsp;такой системы Freedom QJ&nbsp;League обратились к&nbsp;нам.</strong>
    
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/63d71f6326144275933012c15573c463"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--46762092">
    


    <img src="/Media/qpwbjdp1/image-479.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/05e0338df4554543a47eebbbbe2ec592"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/86b3a66325964649b92eea946dc44da7"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">FF Manager: что&nbsp;внутри</h2>
<h3 dir="ltr">Планирование тренировок</h3>
<p dir="ltr">Легко составлять микроциклы, состоящие из&nbsp;нескольких тренировок с&nbsp;конкретными целями. Можно либо создавать планы самостоятельно, либо воспользоваться шаблонами от&nbsp;профессиональных аналитиков футбольной лиги и&nbsp;использовать готовые тренировки из&nbsp;базы упражнений.</p>
<h3 dir="ltr">База упражнений</h3>
<p dir="ltr">Встроенная библиотека упражнений предлагает множество вариантов, разработанных экспертами. Тренеры могут подбирать упражнения по&nbsp;типу и&nbsp;сложности, или&nbsp;использовать готовые варианты тренировок.</p>
<p dir="ltr">&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/9758a8cdf358497a88df61b22b44d36b"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--2508087">
    


    <img src="/Media/n1qixvdo/frame-5009588.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a7a329ceb7424d62b6f3d6cef5828ae5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/2e5d979b06b448698bede131e94a1569"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--28128344">
    


    <img src="/Media/kwhfcyrb/&#x43F;&#x43B;&#x430;&#x43D;&#x448;&#x435;&#x442;&#x44B;-&#x43C;&#x43E;&#x43A;&#x430;&#x43F;-1.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/46fce061a43642469f97832006cb48b7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/41aae5dce8c242deb1fc2f782331a5be"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--52078164">
    


    <img src="/Media/th0fdx15/image-484.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/68491f09ed7041d0ad1926f8c38034f8"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Аналитика и&nbsp;отчеты</h3>
<p dir="ltr">После каждой тренировки тренеры могут создавать отчеты, которые помогают оценить эффективность тренингов и&nbsp;прогресс игроков. Комментарии от&nbsp;аналитиков дают возможность получить всесторонний анализ. По&nbsp;итогам каждой тренировки отчеты о&nbsp;ней&nbsp;смогут отправлять игроки, принимавшие в&nbsp;ней&nbsp;участие.</p>
<h3 dir="ltr">Автоматизация процессов</h3>
<p dir="ltr">Сервис предлагает тренерам рекомендации на&nbsp;основе целей и&nbsp;статистических данных, что&nbsp;экономит время и&nbsp;ускоряет планирование тренировочного, делает его&nbsp;эффективнее.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/31d1943c4ab54f71b2c5e58628526352"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/aff9fad1ff214612a6675390f03c9bc4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 dir="ltr">Гугл-календарь в&nbsp;мире футбола: простое и&nbsp;интуитивное создание тренировочного расписания</h1>
<p dir="ltr">Система предлагает тренерам уникальный инструмент для&nbsp;создания и&nbsp;управления тренировками, построенных на&nbsp;базе микроциклов.&nbsp;</p>
<ul>
<li aria-level="2">
<p dir="ltr">Микроциклы — это&nbsp;цикл подготовки команды к&nbsp;какому-либо событию, как&nbsp;правило к&nbsp;матчу, который обычно длится неделю. Микроциклы состоят из&nbsp;ряда тренировок, проведение которых призвано охватить такие аспекты как&nbsp;тактика, техника и&nbsp;фитнес.</p>
</li>
<li aria-level="2">
<p dir="ltr">Тренеры могут гибко планировать микроциклы, учитывая предстоящие соревнования и&nbsp;тактические задачи.</p>
</li>
</ul>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/c21f7c2b40a142fa82f4a34d285c4681"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Пример: за&nbsp;неделю до&nbsp;игры тренер формирует микроцикл, акцентируя внимание на&nbsp;развитии нужных навыков и&nbsp;подготовке к&nbsp;следующему сопернику.</strong>
    
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/66e4b0c4ecda41c5ae255d847633dab3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--35141102">
    


    <img src="/Media/ahvnnhhf/frame-5009589.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/49dcf693a9244328ba4ca126d3cdfe1c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/b30c6bebed114435b6be5451656486df"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--62295082">
    


    <img src="/Media/irvhvcmp/frame-5009590.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/3a09275b2d4e40179b09e42661025479"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Индивидуальный подход:</strong>
    
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a7018436511743b0a44c16f28881f02e"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"> </p>
<ul>
<li style="list-style-type: none;">
<ul>
<li aria-level="3">
<p dir="ltr">Возможность адаптации тренировок под&nbsp;конкретные цели команды или&nbsp;отдельного игрока.</p>
</li>
<li aria-level="3">
<p dir="ltr">Каждая тренировка в&nbsp;микроцикле может быть настроена с&nbsp;учетом текущей формы и&nbsp;состояния игроков.</p>
</li>
</ul>
</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/886e4f3e7dbc4de487dad777662e7b49"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7b483622f48649e99a0eabdbe05794cc"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 dir="ltr">Кастомные тренировки или&nbsp;использование базы знаний от&nbsp;футбольных экспертов</h1>
<p dir="ltr">&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/a8de7f1d777a4cb19c8368e56c239ccf"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Сервис содержит обширную базу упражнений и&nbsp;тренировок, разработанных аналитиками футбольной лиги. Тренеры могут как&nbsp;создавать свои индивидуальные тренировки, так&nbsp;и&nbsp;использовать эталонные упражнения из&nbsp;базы, а&nbsp;также адаптировать предложенные варианты на&nbsp;свое усмотрение. Система позволяет легко искать упражнения, фильтровать их&nbsp;по&nbsp;типу и&nbsp;сложности, а&nbsp;также добавлять в&nbsp;избранное для&nbsp;быстрого доступа.</strong>
    
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/65e9afe0f2204d42b1ee45ca1ce61439"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li aria-level="2">
<p dir="ltr">Упражнения классифицируются по&nbsp;разным критериям: типу тренировки (разминка, тактические упражнения), уровню сложности, задачам.</p>
</li>
<li aria-level="2">
<p dir="ltr">Система автоматически предлагает к&nbsp;включению в&nbsp;план-конспект тренировки упражнения в&nbsp;зависимости от&nbsp;целей, упрощая процесс их&nbsp;выбора. Система автоматического подбора упражнений основана на&nbsp;рекомендациях экспертов-аналитиков Лиги</p>
</li>
<li aria-level="2">
<p dir="ltr">Функциональность рекомендаций помогает тренерам сосредоточиться на&nbsp;самых эффективных упражнениях для&nbsp;решения конкретных задач.</p>
</li>
<li aria-level="2">
<p dir="ltr">Тренеры могут добавлять в&nbsp;базу свои уникальные тренировки.</p>
</li>
<li aria-level="2">
<p dir="ltr">Доступна персонализация тренировочного плана на&nbsp;основе предпочтений и&nbsp;опыта тренера.</p>
</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1cbfaa44029f4c5b83e462e9ec8d6553"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/29b66fa68ef441629cd9c3b0ae38c63a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--40199245">
    


    <img src="/Media/tx5bh14t/frame-5009592.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/f2735cb4951d402ead34846b19aea8bc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8fd64f5c21284ce484c0164960e660a3"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 dir="ltr">Интерактивная карта тренировочного процесса</h1>
<p dir="ltr">Быстрое создание эффективных тренировочных планов, основанныъ на&nbsp;современных методиках построения тренировочного процесса.</p>
<p dir="ltr">&nbsp;</p>
<p dir="ltr">&nbsp;</p>
<p dir="ltr">&nbsp;</p>
<p dir="ltr">&nbsp;</p>
<ul>
<li aria-level="2">
<p dir="ltr">Встроенная логика помогает тренеру выбирать упражнения и&nbsp;тактики на&nbsp;основе заданных параметров.</p>
</li>
<li aria-level="2">
<p dir="ltr">Дерево решений автоматически отсекает ненужные варианты, оставляя только те, которые соответствуют текущей фазе игры и&nbsp;задачам команды.</p>
</li>
</ul>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/51355bab42c1441fbf4c727b05b40716"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--57528282">
    


    <img src="/Media/4t1n3w1b/image-476.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/7effbc496ed049c9b66c2de6dc78c879"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Здесь заложена система знаний по&nbsp;построению тренировок в&nbsp;виде дерева решений. Благодаря автоматизации подбора упражнений, тренеры могут сосредоточиться на&nbsp;тактической подготовке команды, не&nbsp;тратя время на&nbsp;поиск и&nbsp;отбор упражнений вручную.</strong>
    
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8863de893b07472da7988f084101f4f4"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/1d398e5dc3ee4c4b9a715dba17fae022"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--20101781">
    


    <img src="/Media/bh0cktjn/&#x440;&#x430;&#x441;&#x43F;&#x43E;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435;-&#x438;&#x43A;&#x43E;&#x43D;&#x43E;&#x43A;-&#x43D;&#x430;-&#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x435;.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f7ac3db5be5441899fa8377312e3980a"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<ul>
<li aria-level="2">
<p dir="ltr">Система автоматически предлагает подходящие стили игры в&nbsp;зависимости от&nbsp;выбранных фаз&nbsp;(например, контроль мяча, прессинг).</p>
</li>
<li aria-level="2">
<p dir="ltr">Можно динамически изменять тактику и&nbsp;тренировочный план по&nbsp;мере прогресса команды.</p>
</li>
</ul>
<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8325227c74a447818039d635a4506782"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/41de2fa44fcd4eb3983abf4da5f17a61"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 dir="ltr">Автоматизированный подбор упражнений: эффективные рекомендации</h1>
<p dir="ltr">Система анализирует задачи, стоящие перед тренером, и&nbsp;предлагает наилучшие упражнения.</p>
<ul>
<li aria-level="2">
<p dir="ltr">Система автоматически предлагает наиболее подходящие упражнения и&nbsp;тактики в&nbsp;зависимости от&nbsp;целей тренировки.</p>
</li>
<li aria-level="2">
<p dir="ltr">Алгоритм учитывает предпочтения тренера и&nbsp;статистику эффективности упражнений.</p>
</li>
<li aria-level="2">
<p dir="ltr">Возможность добавлять наиболее успешные тренировки в&nbsp;избранное для&nbsp;быстрого доступа и&nbsp;повторного использования.</p>
</li>
</ul>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/66cc826cd85242999c4316ae81c5771f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--29077122">
    


    <img src="/Media/0uqlamzr/&#x438;&#x437;-&#x43A;&#x430;&#x43B;&#x435;&#x43D;&#x434;&#x430;&#x440;&#x44F;-&#x432;&#x43D;&#x435;-&#x43C;&#x438;&#x43A;&#x440;&#x43E;&#x446;&#x438;&#x43A;&#x43B;&#x430;.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/48ec1177bafc41b5903379159f328021"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6ba8f287d24b4f85bce556efeb01afb5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 dir="ltr">Отчеты и&nbsp;аналитика</h1>
<p dir="ltr">После каждой проведенной тренировки тренеры могут создавать детализированные отчеты, оценивая эффективность и&nbsp;результативность занятия. Эти&nbsp;отчеты могут дополняться комментариями аналитиков, что&nbsp;обеспечивает всестороннюю оценку тренировочного процесса. В&nbsp;дальнейшем планируется интеграция отчетов от&nbsp;игроков и&nbsp;верхнего менеджмента лиги, что&nbsp;позволит создавать комплексную ю&nbsp;оценку процесса подготовки команды.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/bdd9d5ab0c654862b84788607b279df1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/3c6c78710bf64f82969716ed9c7e7eaf"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--55433189">
    


    <img src="/Media/1dvpha1r/frame-5009593.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9d76de9c713f488f8264e41c3cda0969"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li aria-level="2">
<p dir="ltr">В отчетах отражаются достижения, сложности и&nbsp;общая результативность тренировочного процесса.</p>
</li>
<li aria-level="2">
<p dir="ltr">Аналитики добавляют свои оценки, предоставляя тренеру объективную картину его&nbsp;эффективности.</p>
</li>
<li aria-level="2">
<p dir="ltr">В будущем станут доступны отчеты игроков и&nbsp;менеджеров, что&nbsp;позволит создать полную картину прогресса команды.</p>
</li>
<li aria-level="2">
<p dir="ltr">Система собирает данные о&nbsp;посещаемости, участии и&nbsp;эффективности тренировок.</p>
</li>
<li aria-level="2">
<p dir="ltr">Эти данные помогают тренерам корректировать планы и&nbsp;стратегии тренировок.</p>
</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/bf3829ad754f4a808074971bba1f58f4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/85566a77bb664fe0bba0b611341504c4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 dir="ltr">Печать и&nbsp;экспорт тренировок</h1>
<p dir="ltr">Тренеры могут создавать бумажные версии своих план-конспектов и&nbsp;использовать их&nbsp;непосредственно на&nbsp;поле, что&nbsp;особенно ценно для&nbsp;тех, кто&nbsp;предпочитает физические носители.</p>
<p dir="ltr">&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/db475bf59de644ad9c0e849c0e239aec"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--51857731">
    


    <img src="/Media/ftsfqnuk/frame-1321315070-2.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/852427ef744c40828c5a3394068b708a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9acf6905832148ed98d835208ebab049"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <ul>
<li aria-level="2">
<p dir="ltr">В систему интегрирован обработчик, который быстро конвертирует информацию из&nbsp;интерфейса в&nbsp;красивые и&nbsp;единым образом сверстанные PDF-файлы тренировочных листов.</p>
</li>
<li aria-level="2">
<p dir="ltr">Тренировочные листы включают всю&nbsp;необходимую информацию: порядок упражнений, время и&nbsp;необходимый инвентарь</p>
</li>
<li aria-level="2">
<p dir="ltr">Тренеры могут распечатывать планы и&nbsp;использовать их&nbsp;в&nbsp;формате бумажных журналов.</p>
</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/ab26a5d900734cc785d3ffcc3ebf659b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/06395d73c5a7475e9191758f938601b4"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 dir="ltr">Как строили процесс</h1>
<p dir="ltr">Первым этапом работы над&nbsp;системой было <a href="/projects/proektirovanie-produkta-dlya-freedom-qj-league/" title="Проектирование продукта для&nbsp;Freedom QJ&nbsp;League">продуктовое проектирование</a>. По&nbsp;его&nbsp;итогам у&nbsp;нас&nbsp;получилось создать комплексное видение продукта, включающее прототипы, стек и&nbsp;дизайны интерфейсов. Для&nbsp;каждой фичи системы провели более мелкую декомпозицию, после чего сделали календарный план-роадмап, который согласовали с&nbsp;клиентом. </p>
<p dir="ltr">После согласования настроили процессы так, чтобы было удобно и&nbsp;нам, и&nbsp;заказчику. Внедрили формат работы с&nbsp;более короткими спринтами: одна неделя вместо двух, но&nbsp;с&nbsp;сохранением всех нужных артефактов. </p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/91bf40871ac140e2a7214d3679e30fc2"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>Заказчик выступил в&nbsp;роли владельца продукта, регулярно синхронизировался с&nbsp;нами и&nbsp;прояснял свое видение, задавая нам&nbsp;направление движения.</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/19ec97fd213d4ae69d27fb218daf5e88"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Особенность: демо по&nbsp;итогам разработанных функциональных блоков для&nbsp;заказчика мы&nbsp;проводили не&nbsp;как&nbsp;официальное согласование работ, а&nbsp;как&nbsp;встречу свободного формата с&nbsp;рассказом о&nbsp;сделанной работе. Это&nbsp;позволило снизить уровень стресса в&nbsp;команде, удерживать руку на&nbsp;пульсе, быть близко к&nbsp;бизнесу и&nbsp;в&nbsp;итоге запустить действительно полезное решение, где&nbsp;каждая деталь ясна обеим сторонам разработки</strong>
    
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f28162375d6945fb8da71b158ecaf79f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/3a9a821ed4744d18ad59f10dd03dd987"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2971453b846b4d7b8465478c6d09b260"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3b689f830e7e489c909f885adfb99563"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 dir="ltr">Техническая реализация: что&nbsp;применяли</h1>
<p dir="ltr">Архитектуру сервиса проработали так, чтобы ближайшие 2 года систему можно было беспроблемно развивать при&nbsp;росте числа команд, тренеров и&nbsp;игроков в&nbsp;лиге, а&nbsp;также использования сервиса другими лигами в&nbsp;Казахстане и&nbsp;зарубежом.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/ff27ff54685e4f43b637a003c705fbd3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/39591a9167ec4b00a3219bfbc984f54c"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Так&nbsp;как&nbsp;нагрузка в&nbsp;системе умеренная, для&nbsp;бэкенда выбрали классическую монолитную архитектуру на&nbsp;Nest.js, Typescript, Sequelize, PostgreSQL, Minio.  А&nbsp;«тяжелые» операцие по&nbsp;генерации PDF&nbsp;для&nbsp;планов и&nbsp;журналов тренировок выделили в&nbsp;отдельный микросервис.
</strong>
    
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ac8ecb8196834abd8f8db07354050969"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Для мониторинга продукта в&nbsp;продакшене мы&nbsp;настроили метрики в&nbsp;Prometheus/Grafana, отслеживание производительности и&nbsp;трейсы ошибок – в&nbsp;Sentry.</strong></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/babec34c835b434884bdcfcd964cfae9"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Фронтенд реализован как&nbsp;single-page application на&nbsp;React, Next.js, TypeScript. Чтобы сократить время на&nbsp;запуск продукта, мы&nbsp;воспользовались набором компонентов Ant&nbsp;Design и&nbsp;адаптировали их&nbsp;под&nbsp;нужный дизайн. Мы&nbsp;используем библиотеку Hey&nbsp;API&nbsp;для&nbsp;генерации кода для&nbsp;доступа к&nbsp;бекенду на&nbsp;основе спецификации OpenAPI, которая также генерируется на&nbsp;основе кода бэка. Благодаря этому мы&nbsp;сразу избегаем множества проблем связанных с&nbsp;различиями в&nbsp;типах данных, используемых на&nbsp;фронте и&nbsp;бекенде.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/772750fb862a4f5b8ac3b9497775d252"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-page" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="awards"
            data-content-element-type-key="82cdbbd8-0baa-4271-a5b0-0f1aae3d3bed"
            data-element-udi="umb://element/8dd7b006caa3497e8995ef2335abd5b8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    gRPC для тестировщика: быстрый старт после REST
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Разбираем основы gRPC, отличие от REST, как устроены .proto-файлы, и самое главное – как тестировать gRPC-сервисы с помощью Postman.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/grpc-dlya-testirovshika-bystryi-start-posle-rest/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/grpc-dlya-testirovshika-bystryi-start-posle-rest/</guid>

                <pubDate>Wed, 15 Oct 2025 14:47:22 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>gRPC для тестировщика: быстрый старт после REST</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Nextjs SSR vs SSG. Приготовить заранее или испечь по заказу?
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Гайд по рендерингу для пиццерий и разработчиков
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/nextjs-ssr-vs-ssg-prigotovit-zaranee-ili-ispech-po-zakazu/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/nextjs-ssr-vs-ssg-prigotovit-zaranee-ili-ispech-po-zakazu/</guid>

                <pubDate>Wed, 15 Oct 2025 14:47:08 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Nextjs SSR vs SSG. Приготовить заранее или испечь по заказу?</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Делаем фронтенд-сборку для верстки HTML-писем на MJML
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Разберём два ключевых этапа: сначала создадим репозиторий для верстки писем, а затем настроим локальную тестовую отправку через SMTP.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/delaem-frontend-sborku-dlya-verstki-html-pisem-na-mjml/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/delaem-frontend-sborku-dlya-verstki-html-pisem-na-mjml/</guid>

                <pubDate>Wed, 15 Oct 2025 14:37:26 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Делаем фронтенд-сборку для верстки HTML-писем на MJML</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Цифровой продукт с нуля: как его собрать до написания кода
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Собираем продукт до старта разработки, чтобы не нужно было спасать процессы в спринтах
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/fifrovoi-produkt-s-nulya-kak-ego-sobrat-do-napisaniya-koda/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/fifrovoi-produkt-s-nulya-kak-ego-sobrat-do-napisaniya-koda/</guid>

                <pubDate>Wed, 15 Oct 2025 05:55:50 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Цифровой продукт с нуля: как его собрать до написания кода</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    37 тысяч отчетов за 5 месяцев или телеграм-бот для отслеживания прогресса игроков футбольной лиги
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/ffm-tg-bot/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/ffm-tg-bot/</guid>

                <pubDate>Thu, 09 Oct 2025 05:10:14 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>37 тысяч отчетов за 5 месяцев или телеграм-бот для отслеживания прогресса игроков футбольной лиги</h1>
                                <figure>
                                    <img src="/Media/erfb1szx/&#x444;&#x444;&#x43C;-&#x431;&#x43E;&#x442;-&#x43E;&#x431;&#x43B;&#x43E;&#x436;&#x43A;&#x430;.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/50a1e685255c496a974c01a022abfbcd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5e95dccffdf84ad5aa98045dacc6c48e"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1><strong>37 тысяч отчетов за&nbsp;5 месяцев или&nbsp;телеграм-бот для&nbsp;отслеживания прогресса игроков футбольной лиги</strong></h1>
<p>Как собрать полную базу данных о&nbsp;самочувствии и&nbsp;тренировках игроков футбольной лиги? Сделать Telegram-бота для&nbsp;быстрых отчетов и&nbsp;интегрировать его&nbsp;с&nbsp;основной платформой.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/2c271f57daee44609562b6396b8c1fb2"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/ohulmztb/group-5009605.png"
         alt=""
         itemprop="">


</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f3ca500516fe4e3c97bd08f8797f1fc1"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/cc7b22f3dd9643818f7ad023e8e2be26"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Теперь игрокам не&nbsp;нужно даже трогать десктоп: все&nbsp;делается в&nbsp;пару кликов со&nbsp;смартфона — и&nbsp;тренеры видят полную картину, и&nbsp;футболисты довольны.</strong>
    
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/91671dd14f904cd694ddb32693448970"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/5faa7c0d9a244b63bb3541730b56d814"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/30c8e3a0d5c140bbb6e4a42dbbea6812"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Продукт</h2>
<p dir="ltr"><a href="/projects/ffm-development/" title="Freedom Football Manager: автоматизация тренировочного процесса для&nbsp;футбольной лиги Казахстана">Freedom Football Manager (FFM)</a> — цифровая платформа для&nbsp;юношеской футбольной лиги Казахстана.</p>
<p dir="ltr">&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/02b9f53bd4b04fdca71cd534427fbf86"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--3178335">
    


    <img src="/Media/tlxhm550/image-481.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0e112eac401b48f7ab1f3a35a37cbe67"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Главная цель проекта — повысить качество подготовки игроков. Для&nbsp;этого тренерам и&nbsp;аналитикам нужны регулярные данные: как&nbsp;футболисты себя чувствуют, как&nbsp;они&nbsp;справляются с&nbsp;нагрузками, насколько эффективно проходят тренировки.</p>
<p dir="ltr">Массово собирать такие данные напрямую от&nbsp;спортсменов непросто. Но&nbsp;без&nbsp;них&nbsp;сложно строить полноценную картину: корректировать планы занятий, оценивать динамику и&nbsp;в&nbsp;целом следить за&nbsp;прогрессом молодых футболистов.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2c26700506284feaab484ea037f7a801"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/e33cee1a275249eaa2fcecc6f5766215"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--58205502">
    


    <img src="/Media/2e0nkbyh/frame-5009586.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="fourEight"
            data-content-element-type-key="ca282c47-86be-3881-a738-38a85635f98f"
            data-element-udi="umb://element/c7ab8ce0a62244f08dc3274dae70ab66"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/057037f00ede4a938b5381bcbd8b9083"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Задача</h2>
<p dir="ltr">В FFM&nbsp;предусмотрено два&nbsp;вида отчетов от&nbsp;игроков:</p>
<ul>
<li>ежедневный — о&nbsp;состоянии, самочувствии и&nbsp;нагрузках;</li>
<li>о прошедшей тренировке — что&nbsp;получилось, что&nbsp;вызвало сложности, как&nbsp;спортсмен оценивает занятие.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/712828467815472c99f6325ab89c6f23"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr"> </p>
<p dir="ltr">У нас&nbsp;есть <a href="/projects/ffm-development">десктоп-версия системы</a>. Она&nbsp;хороша сама по&nbsp;себе, но&nbsp;клиент трезво оценивал ситуацию: ждать, что&nbsp;подростки каждый день будут заходить на&nbsp;сайт ради заполнения форм, — нереалистично. </p>

<div class="umb-macro-highlights">
    <strong>Это узкое горлышко создавало проблему в&nbsp;получении регулярных отчетов. У&nbsp;тренеров и&nbsp;аналитиков не&nbsp;было полной базы для&nbsp;анализа, а&nbsp;значит, терялась составляющая для&nbsp;главной ценности продукта. Нужно было устранить этот разрыв.</strong>
    
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/a504a893a4214da9bc1079873e741a24"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  margin-bottom: 15px" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/38911d61f0dc4c879c0fe603957df850"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Решение</h2>

<div class="umb-macro-highlights">
    <strong>Если подростки не&nbsp;пойдут в&nbsp;десктоп, нам&nbsp;нужно прийти туда, где&nbsp;они&nbsp;проводят время. И&nbsp;это, конечно, смартфоны. А&nbsp;у&nbsp;каждого юного футболиста в&nbsp;смартфоне есть Telegram.</strong>
    
</div>

</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2fbceaeadd3b436ebf364f2acb97eb1d"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Мы разработали удобного Telegram-бота, который:</p>
<ul>
<li>каждый день присылает игроку уведомление о&nbsp;необходимости заполнить ежедневный отчёт;</li>
<li>отправляет напоминание о&nbsp;тренировочном отчёте сразу после окончания занятия;</li>
<li>даёт пройти все&nbsp;шаги за&nbsp;несколько кликов — быстро и&nbsp;без&nbsp;лишней когнитивной нагрузки.</li>
</ul>
<p>&nbsp;</p>
<h2 dir="ltr">Как это&nbsp;работает</h2>
<p dir="ltr">После авторизации в&nbsp;боте игрок может сразу же&nbsp;приступать к&nbsp;созданию отчетов. Ежедневные отчеты доступны сразу, а&nbsp;отчеты о&nbsp;тренировках можно заполнить, выбрав дату, либо непосредственно в&nbsp;день тренировки – бот&nbsp;сам&nbsp;присылает напоминание о&nbsp;заполнении, когда тренировка заканчивается.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9655b8c1235b4f1caef8d3a4ebc536ba"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c3beaf1e6b2242db9117b8eee86d2992"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Так процесс стал частью привычной среды. Игроку не&nbsp;нужно ничего искать, ставить отдельные приложения или&nbsp;вспоминать логины: бот&nbsp;сам&nbsp;«постучал», задал вопросы, получил ответы.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/2a8fdaa7d4194294a59dd2cbc8ef085b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--51189794">
    


    <img src="/Media/1slmuio0/image.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/424ec644cf3e4cf19df1306ed212057c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fca9adfab1274399937013f9d8bcdf82"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Также из&nbsp;бота можно скачать план тренировки для&nbsp;лучшего погружения в&nbsp;процесс. План автоматически собирается в&nbsp;удобочитаемый документ, с&nbsp;которым легко ознакомиться даже со&nbsp;смартфона.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/ae019c30a3264dd7bb403aa0a089a497"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--40545169">
    


    <img src="/Media/l0kl2vqe/slide-16_9-161.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/7b1ba81ef1ba45ee9a4dbf5ba2f5660a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4ca39174f09245c2a53fcce27c9bead2"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Всего в&nbsp;рамках отчета о&nbsp;тренировке бот&nbsp;запрашивает несколько параметров: общие впечатления, самочувствие, технические действия, тактические действия, ментальное состояние и&nbsp;физическая нагрузка. Общие впечатления игрок оставляет в&nbsp;свободной текстовой форме, а&nbsp;остальные параметры фиксирует в&nbsp;виде оценки.&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/564d840dfc3c42959bc990f60917ee2b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--40578382">
    


    <img src="/Media/egbd04cr/slide-16_9-159.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/2508b6f096694b79801f4ed62e6fb895"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5adc0525e3b549238e8a0bb0d39e2adf"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Ежедневная оценка включает более обобщенные параметры относительно целостного самочувствия игрока. Эти&nbsp;отчеты можно заполнять и&nbsp;в&nbsp;те&nbsp;дни, когда тренировок нет. Для&nbsp;отслеживания прогресса игроков такие сводки тоже очень важны.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/9660e48cd0d44638bc1df869a854434a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--45394269">
    


    <img src="/Media/iymbx0uh/slide-16_9-160.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/7a6012927cd34298a77ff73c219048d5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/58510cc5241247aab7e8cc343757f805"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Все заполняемые игроками отчеты интегрированы с&nbsp;основной платформой. На&nbsp;десктопе тренеры и&nbsp;аналитики лиги могут просматривать эти&nbsp;отчеты в&nbsp;удобном виде.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/df6b611a6b054c5290f14d95166367bd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--5500419">
    


    <img src="/Media/liof5sjw/slide-16_9-162.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/1c7dda408e634cc4887825b6560ef308"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f090cef96e34402b8aa445058d0870a7"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Результаты</h2>
<ul>
<li>За 5 месяцев после релиза через бота было собрано всего 37 000 отчётов. 22 тысячи из&nbsp;них&nbsp;– ежедневные отчеты, 15 тысяч – отчеты о&nbsp;тренировке. Это&nbsp;количество оставили с&nbsp;разной долей активности 700 зарегистрированных в&nbsp;системе игроков.&nbsp;</li>
<li>Теперь практически по&nbsp;каждой тренировке команда сдаёт нужный набор мнений и&nbsp;информации.</li>
<li>У клиента появилась огромная база данных, которая раньше была недоступна.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/4eab4e3714d546b199cdbf05ff10fb77"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b6aaa3b06c2e467abaebb355194bffd9"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Эффект</h2>
<ul>
<li><strong>Игроки</strong> получили понятный и&nbsp;удобный способ выполнять обязательную часть подготовки.</li>
<li><strong>Тренеры</strong> видят в&nbsp;цифрах, как&nbsp;спортсмены справляются с&nbsp;нагрузкой, и&nbsp;могут вовремя корректировать план.</li>
<li><strong>Аналитики</strong> получили массив данных, достаточный для&nbsp;глубокого анализа динамики и&nbsp;эффективности процессов в&nbsp;лиге.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/351ff52759cb46e794f526b117aaca9b"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/e0e60fc244e84f9b8094c56ff431608f"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Привычка сдавать отчеты закрепилась. Бот&nbsp;стал инструментом, который дисциплинирует игроков и&nbsp;делает процесс регулярным.</strong>
    
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/493d63b97e84470c973ea4bc242a5f27"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/14db01bd99b64d47963bf5031425bb52"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 dir="ltr">Подробнее о&nbsp;продукте</h2>
<p>Telegram-бот — это&nbsp;лишь один из&nbsp;функциональных блоков Freedom Football Manager. Посмотреть весь кейс о&nbsp;продукте можно <a href="/projects/ffm-development">здесь</a><strong>.</strong></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Помогли стартапу превратиться в одного из лидеров микрофинансового рынка РФ с собственным IT-департаментом
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Помогли стартапу превратиться в одного из лидеров микрофинансового рынка РФ с собственным IT-департаментом
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/lime/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/lime/</guid>

                <pubDate>Thu, 25 Sep 2025 07:10:11 GMT</pubDate>

                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>
                            <category>&#x424;&#x438;&#x43D;&#x430;&#x43D;&#x441;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x44B;</category>
                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Помогли стартапу превратиться в одного из лидеров микрофинансового рынка РФ с собственным IT-департаментом</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/8f6f79352d88801bb27624232edca850"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5ae7449e5dea405ea880d42e5735c967"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/3146/logo-1.svg"
         alt=""
         width="px"
         height="px"
         itemprop="">


</figure>

<h1>Помогли стартапу превратиться в&nbsp;одного из&nbsp;лидеров микрофинансового рынка РФ&nbsp;с&nbsp;собственным IT-департаментом </h1>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="tags"
            data-content-element-type-key="63a4c374-4210-45ac-851a-40ff3a9bbb25"
            data-element-udi="umb://element/5bc309eca9154bd5b24d5148e56bdd83"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">


        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/574d4d6882034deab3eea8711f138151"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>«Лайм-Займ» обратились во&nbsp;fuse8 в&nbsp;далеком 2013, когда концепция онлайн-кредитования для&nbsp;российского финансового рынка была новинкой. За&nbsp;деньгами обычно нужно было идти в&nbsp;офис организации и&nbsp;брать их&nbsp;очно.&nbsp;</p>
<p>Основатели «Лайм-Займ» тогда пришли с&nbsp;идеей разработки цифрового финансового сервиса, внутри которого будет реализован весь процесс выдачи займов: от&nbsp;скоринга до&nbsp;возврата денег.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/9b46a862b5cb4b33aae076c278369630"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/3144/frame-1003.png"
         alt=""
         itemprop="">


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9f6aac8b4570b657eb97684879f23999"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5402793132144331b5cb5e40189b8529"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Аналитика</h2>
<p><span style="font-weight: 400;">Нужно было создать онлайн сервис, который бы&nbsp;быстро принимал решение по&nbsp;выдаче микрокредита. Тогда кроме идеи и&nbsp;представления о&nbsp;том, как&nbsp;должны работать онлайн-займы, не&nbsp;было ничего. Поэтому мы&nbsp;начали работу над&nbsp;продуктом с&nbsp;предпроектной аналитики. </span></p>
<p><span style="font-weight: 400;">Нужно было написать ТЗ&nbsp;и&nbsp;спецификацию на&nbsp;предполагаемый сервис. Описывали не&nbsp;только логику и&nbsp;интеграции внутри сервиса, но&nbsp;и&nbsp;экраны, формы для&nbsp;ввода паспортных и&nbsp;других данных заемщиков. Без&nbsp;этапа ППА&nbsp;было бы&nbsp;сложно оценить, сколько времени все&nbsp;это&nbsp;займет, поэтому дробили проект на&nbsp;части, и&nbsp;делали спецификации для&nbsp;каждой из&nbsp;них&nbsp;по&nbsp;очереди. </span></p>
<p><span style="font-weight: 400;">Сразу начали погружаться в&nbsp;предметную область вместе с&nbsp;заказчиком. Чтобы спроектировать экраны приложения и&nbsp;логику переходов между ними, использовали </span><a href="https://www.axure.com"><span style="font-weight: 400;">Axure RP</span></a><span style="font-weight: 400;">. Так&nbsp;получилось закрепить процессы функционирования будущего продукта. </span></p>
<h2>Первая версия и&nbsp;интеграции</h2>
<p><span style="font-weight: 400;">Первой фичей была интеграция с&nbsp;КЛАДР – сертификатором адресов РФ. С&nbsp;его&nbsp;помощью сервис научился достоверно определять вводимые адреса заемщиков. Сейчас такие интеграции есть во&nbsp;множестве сервисов. Они&nbsp;позволяют сделать базу адресов приложения единообразной и&nbsp;избежать разночтений улиц, например.</span></p>
<p><span style="font-weight: 400;">Для первой версии реализовали 3 тарифа для&nbsp;получения займов. Условия тарифов отличались друг от&nbsp;друга в&nbsp;зависимости от&nbsp;кредитной истории заемщика. С&nbsp;помощью калькулятора-бегунка можно было выбрать сумму кредита и&nbsp;отследить проценты. </span></p>
<p> </p>
<p><span style="font-weight: 400;"><img src="/Media/3143/frame-1001.png" alt=""></span></p>
<p> </p>
<p><span style="font-weight: 400;">Первоначально решения по&nbsp;займам выносил человек, который анализировал автоматически собранные данные. Пользователь заполнял форму и&nbsp;после ее&nbsp;отправления ждал решения какое&#8209;то&nbsp;время, за&nbsp;которое сервис собирал информацию по&nbsp;заемщику через интеграцию с&nbsp;БКИ. Затем происходило одобрение (или&nbsp;отказ) выдачи займа. После деньги приходили на&nbsp;указанную заемщиком карту. </span></p>
<p><span style="font-weight: 400;">Сумма задолженности была доступна пользователю в&nbsp;ЛК. Созданный нами кредитный калькулятор раз&nbsp;в&nbsp;сутки анализировал заемщиков и&nbsp;фиксировал оставшийся долг – так&nbsp;информация в&nbsp;ЛК&nbsp;актуализировалась. </span></p>
<p><span style="font-weight: 400;">Сервис мы&nbsp;строили на&nbsp;.Net с&nbsp;применением паттерна MVC&nbsp;и&nbsp;базы данных MS&nbsp;Sql.</span></p>
<p><span style="font-weight: 400;">Запуск первой версии – июнь 2014 года. </span></p>
<h2>Развитие проекта и&nbsp;новые продукты</h2>
<p><span style="font-weight: 400;">Проект мы&nbsp;развивали до&nbsp;2020 года. За&nbsp;это&nbsp;время было внедрено множество обновлений на&nbsp;основе обновляющихся требований ЦБ. Также сервис стал предлагать новые тарифы и&nbsp;со&nbsp;временем стал работать не&nbsp;только с&nbsp;картами, но&nbsp;и&nbsp;с&nbsp;различными онлайн-кошельками. Помимо этого работа сервиса улучшилась с&nbsp;точки зрения регуляторных рисков благодаря новым интеграциям. </span></p>
<p><span style="font-weight: 400;">Стартап «Лайм-Займ» за&nbsp;это&nbsp;время стал одним из&nbsp;лидеров рынка МФО&nbsp;в&nbsp;России и&nbsp;вырастил собственный сильный IT-дивизион, к&nbsp;которому перешла работа над&nbsp;сервисом выдачи займов. Но&nbsp;на&nbsp;этом наше сотрудничество не&nbsp;закончилось – теперь мы&nbsp;развиваем их&nbsp;дополнительный продукт <a href="/projects/assignot-new/" title="Индивидуальная ERP&nbsp;вместо Excel для&nbsp;бизнеса по&nbsp;взысканию долгов">«Цессионарий»</a>, который автоматизирует работу с&nbsp;задолженностями по&nbsp;кредитам.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/da2f29d4cc0948b8a421126546edd7ca"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Фанатский сервис для Crystal Palace: как мы создали многофункциональную веб-платформу футбольного клуба
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/crystal-palace/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/crystal-palace/</guid>

                <pubDate>Thu, 25 Sep 2025 07:08:11 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Фанатский сервис для Crystal Palace: как мы создали многофункциональную веб-платформу футбольного клуба</h1>
                                <figure>
                                    <img src="/Media/3030/slide-16_9-88.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/d06da3006d4e093d343e25e1c2dad445"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/72b9c2eb075c44509831548c80f58350"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1 class="content-title">Фанатский сервис для&nbsp;Crystal Palace: как&nbsp;мы&nbsp;создали многофункциональную веб-платформу футбольного клуба</h1>
<p><span>Большие нагрузки в&nbsp;дни&nbsp;матчей, стриминг игр, встроенная покупка билетов и&nbsp;мерча клуба. Внутри одной платформы собрали все, что&nbsp;нужно фанатам, и&nbsp;сделали единую точку входа для&nbsp;множества интеграций.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/ed0acc1f22964be0ae0db176370a5504"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--59363266">
    


    <img src="/Media/3036/kjuj.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7d1884c90a544a889449eb0c7df9d963"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/a42406769bc642e7848baf335339d801"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3030/slide-16_9-88.png"
         alt=""
         itemprop="">


        <figcaption>
            Главная страница платформы Crystal Palace
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/63cb3aad32bd41cd94bcab53d5af5f00"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p> </p>
<p>Спортивные сервисы, рассчитанные под&nbsp;высокие пользовательские нагрузки и&nbsp;множество контента, за&nbsp;годы работы стали одной из&nbsp;наших специализаций. Например, мы<span> </span><a rel="noopener" href="/projects/theopen/" target="_blank" title="theopen">рассказывали, как&nbsp;делали портал для&nbsp;гольф-турнира The&nbsp;Open</a>. Кроме этого проекта были и&nbsp;другие – на&nbsp;одном из&nbsp;них&nbsp;сфокусируемся в&nbsp;этом материале.</p>
</div>
<div class="l-island-a">
<p>Crystal Palace – это&nbsp;английский профессиональный футбольный клуб из&nbsp;Лондона, основанный в&nbsp;1905 году. Сейчас выступает в&nbsp;Премьер-лиге, высшем дивизионе в&nbsp;системе футбольных лиг&nbsp;Англии.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/758fb9452ef69709464dc037b8f5630e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d696483c169b4c65a0dcbd8c3bcb60a5"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Запрос</h2>
<div class="l-island-a">
<p>До знакомства с&nbsp;нами у&nbsp;клуба уже&nbsp;был&nbsp;свой сайт, но&nbsp;современным запросам функциональности он&nbsp;не&nbsp;отвечал. Поэтому заказчик решил создать новую платформу, через которую фанаты и&nbsp;болельщики смогут делать все&nbsp;свои фанатско-болельщицкие дела: покупать билеты и&nbsp;мерч, смотреть трансляции матчей и&nbsp;пресс-конференций, читать статьи и&nbsp;аналитику, следить за&nbsp;счетом и&nbsp;игроками.</p>
</div>
<div class="l-island-a">
<p>Crystal Palace нужно было повысить вовлечение болельщиков через веб-ресурс и&nbsp;сделать опыт его&nbsp;использования персонализированным, создать «прямой контакт» с&nbsp;клубом.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6276bf9d18914d9f9f7fb6bee622c398"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Измеримые результаты</h2>
<div class="l-island-a">
<ul>
<li>На 40% увеличился доход клуба от&nbsp;покупки болельщиками членства.</li>
<li>На 78% увеличилось количество веб-сессий по&nbsp;сравнению с&nbsp;предыдущим решением.</li>
<li>Расходы на&nbsp;серверные мощности для&nbsp;обслуживания сервиса сократились в&nbsp;10 раз.</li>
</ul>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/551872947fca4f7cf749752aece85e11"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bee815a7bd7146b3a3c06acb3220edda"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Основа решения</h2>
<div class="l-island-a">
<p><a rel="nofollow noreferrer noopener" href="https://www.cpfc.co.uk/" target="_blank">Платформа футбольного клуба</a><span> </span>– это&nbsp;в&nbsp;первую очередь большое количество различного контента, который часто обновляется, и&nbsp;наплывы пользователей. Во&nbsp;время матчей публикуется множество статей, постоянно обновляется счет, а&nbsp;нагрузка в&nbsp;месяц достигает 2 млн&nbsp;пользователей, и&nbsp;основная часть визитов приходится на&nbsp;часы матчей.</p>
<p> </p>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/7c879b8bb28743a2a36914e21722ab0e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3034/slide-16_9-92.png"
         alt=""
         itemprop="">


        <figcaption>
            Матч-центр на платформе Crystal Palace
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8b080c8ccd534c52b474cec61b2f1add"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p> </p>
<p>Чтобы реализовать возможность быстрой обработки и&nbsp;выкладки контента, в&nbsp;гибридном режиме использовали Static site generation (SSG) и&nbsp;Client side rendering (CSR) – такой подход позволил выдерживать высокую нагрузку во&nbsp;время матчей и&nbsp;больших новостей, а&nbsp;также дал&nbsp;основу для&nbsp;хорошей SEO-оптимизации. Подробнее о&nbsp;том, какие подходы к&nbsp;отображению контента использовать для&nbsp;определенных нужд проекта, читайте<span> </span><a rel="noopener" href="/articles/frontend-approach-2023/" target="_blank" title="Разработка фронтенда ИТ-продукта: какой подход выбрать исходя из&nbsp;задач бизнеса">в другой нашей статье</a>.</p>
</div>
<div class="l-island-a">
<p>Работа с&nbsp;контентом в&nbsp;админке портала должна была быть удобной. Для&nbsp;этих целей хорошо подходят готовые решения – digital experience платформы. Одну из&nbsp;них&nbsp;– InCrowd – мы&nbsp;использовали для&nbsp;Crystal Palace. Вместе с&nbsp;ней&nbsp;интегрировали CRM-систему, через которую реализовывалась функциональность регистрации и&nbsp;логина для&nbsp;пользователей.</p>
</div>
<div class="l-island-a">
<p>Фронтенд и&nbsp;бекенд реализовали на&nbsp;Next.js. С&nbsp;этим стеком сократили расходы на&nbsp;серверы в&nbsp;10 раз.</p>
<h2>Интеграции и&nbsp;единый логин</h2>
<div class="l-island-a">
<p>Для полноценной работы платформы требовалось интегрировать основной веб-ресурс с&nbsp;контентом и&nbsp;регистрацией пользователей с&nbsp;другими системами. Среди них, например стриминговая платформа, интеграция с&nbsp;которой позволила создать раздел PalaceTV, где&nbsp;в&nbsp;реалтайме можно смотреть матчи или&nbsp;пересматривать хайлайты из&nbsp;уже&nbsp;сыгранных.</p>
<p> </p>
</div>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ea20abd565ea4c799b9dcd96fcad53d1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3031/slide-16_9-89.png"
         alt=""
         itemprop="">


        <figcaption>
            Страница PalaceTV
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/de0efc5f1ea3440c9b3ea39c78893dde"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span>Нашей задачей было встроить в&nbsp;веб-сервис трансляции, которые организуются партнером клуба. Видео-команда, отвечающая за&nbsp;прямые трансляции и&nbsp;нарезки, работает как&nbsp;бы&nbsp;«на другой стороне», но&nbsp;все, что&nbsp;они&nbsp;делают, отображается на&nbsp;портале Crystal Palace благодаря интеграции. Видеоплееры ограничены – избранный контент доступен только для&nbsp;зарегистрированных пользователей. Это&nbsp;ограничение работает на&nbsp;вовлечение и&nbsp;позволяет клубу узнать больше о&nbsp;своих фанатах.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/37bf79ea0a354e85988928031fb38ba2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3032/slide-16_9-90.png"
         alt=""
         itemprop="">


        <figcaption>
            Crystal Palace Shop и Ticket Hub
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f20511d3f9b244088c310685657d06a4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p> </p>
<p>Другая интеграция – Shop — это&nbsp;также отдельная платформа, позволяющая делать покупки, интернет-магазин. Его&nbsp;мы&nbsp;не&nbsp;разрабатывали самостоятельно, а&nbsp;интегрировали в&nbsp;платформу. Точно так&nbsp;же, как&nbsp;и&nbsp;раздел для&nbsp;покупки билетов – разработка его&nbsp;функциональности не&nbsp;была нашей задачей.</p>
</div>
<div class="l-island-a">
<p>Эти интеграции сами по&nbsp;себе – удобство для&nbsp;пользователей, но&nbsp;помимо их&nbsp;подключения мы&nbsp;реализовали доступ к&nbsp;ним&nbsp;«в одно касание» – single sign on. То&nbsp;есть пользователю достаточно залогиниться только на&nbsp;портале Crystal Palace, чтобы автоматически получить доступ ко&nbsp;всем интегрированным в&nbsp;него сервисам. Даже несмотря на&nbsp;то, что&nbsp;каждый из&nbsp;них&nbsp;– отдельная система.</p>
<h2>Персонализация</h2>
<div class="l-island-a">
<p>Single sign&#8209;on&nbsp;работает и&nbsp;на&nbsp;благо пользователям, и&nbsp;на&nbsp;пользу Crystal Palace. У&nbsp;клуба есть реклама (своя и&nbsp;спонсоров), которая показывается на&nbsp;страницах их&nbsp;платформы. Отображается она&nbsp;не&nbsp;рандомно для&nbsp;каждого пользователя, а&nbsp;исходя из&nbsp;его&nbsp;поведения на&nbsp;ресурсе. Механизм отображения рекламы работает согласно особой логике, основанной на&nbsp;том, что&nbsp;каждый зарегистрированный болельщик делал на&nbsp;платформе за&nbsp;последнее время.</p>
<p> </p>
</div>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/7ec68141807544b3bac264c58ea7423a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3035/slide-16_9-93.png"
         alt=""
         itemprop="">


        <figcaption>
            Меню портала и окно логина/регистрации
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bde8899743ae4120bad283ffa8af4828"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span>Нашей задачей для&nbsp;реализации этих рекламных возможностей было встроить в&nbsp;этот механизм статическую генерацию контента. То&nbsp;есть, в&nbsp;целом платформа работает на&nbsp;гибриде из&nbsp;Static site generation (SSG) и&nbsp;Client side rendering (CSR) – на&nbsp;этой базе генерируются все&nbsp;страницы портала. А&nbsp;для&nbsp;персонализированной рекламы мы&nbsp;добавили дополнительный слой клиентского рендеринга, который работает отдельно и&nbsp;как&nbsp;бы&nbsp;поверх остального контента на&nbsp;странице, при&nbsp;этом подтягивая данные из&nbsp;CRM&nbsp;с&nbsp;данными пользователя.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ebe8c2b2f9a34713ae04120574cb63bb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3033/slide-16_9-91.png"
         alt=""
         itemprop="">


        <figcaption>
            Страница команд Crystal Palace и информационная страница одного из игроков
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/756ccfb2dc9f4e42a44168cde22d3df7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p> </p>
<p>Кроме того, на&nbsp;платформе есть эксклюзивный контент, который доступен после регистрации и/или приобретении платного членства. Эти&nbsp;особенности, благодаря single sign&#8209;on&nbsp;также влияют на&nbsp;персонализацию.</p>
</div>
<div class="l-island-a">
<p>Так получилось сделать единый источник всей возможной информации о&nbsp;деятельности клуба, который объединяет и&nbsp;фанбазу Crystal Palace, позволяя получать контент самым быстрым образом. Полноценное создание платформы заняло у&nbsp;нас&nbsp;около 9 месяцев, включая аналитику и&nbsp;фазу активной разработки.</p>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/44ad9cd090d74815bf1b7784f7341f12"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Проектирование продукта для Freedom QJ League: от идеи до плана развития на 2 года
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/proektirovanie-produkta-dlya-freedom-qj-league/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/proektirovanie-produkta-dlya-freedom-qj-league/</guid>

                <pubDate>Thu, 25 Sep 2025 07:06:14 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Проектирование продукта для Freedom QJ League: от идеи до плана развития на 2 года</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/e9f2189f6281457db911d24affade5bc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0808e92025e34b92a29f9eebac46d8e1"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1>Проектирование продукта для&nbsp;<strong>Freedom QJ&nbsp;League</strong></h1>
<h2 dir="ltr">С кем&nbsp;работали</h2>
<p>Заказчик – Freedom QJ&nbsp;League. Это&nbsp;казахстанская юношеская футбольная лига. Ребята занимаются развитием молодежного футбола в&nbsp;Казахстане и&nbsp;выращивают репутацию казахстанских футболистов на&nbsp;мировой арене. У&nbsp;организации есть хороший <a href="https://qjl.kz/" target="_top">сайт</a>, который носит медийно-информационный характер. На&nbsp;нем&nbsp;можно найти информацию об&nbsp;игровой статистике, матчах, командах, игроках и&nbsp;событиях, связанных с&nbsp;лигой.</p>
<p dir="ltr">Помимо сайта вокруг деятельности лиги наши заказчики планируют развернуть целую экосистему решений, и&nbsp;сейчас они&nbsp;сфокусировались на&nbsp;системе, которая будет автоматизировать тренировочный процесс и&nbsp;поможет поднять уровень юношеского футбола в&nbsp;стране. За&nbsp;проектированием и&nbsp;разработкой для&nbsp;такой системы Freedom QJ&nbsp;League обратились к&nbsp;нам.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/d9c705df24074e5ea4fc71ae52cea247"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/332e0s3m/frame-59585.png"
         alt=""
         itemprop="">


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/97bcff0e9ed149c3a467760e1921e40c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/a7b70cdb96454fc59340b75995533ff4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--17739104">
    


    <img src="/Media/jgenvq1z/&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;-&#x44D;&#x43A;&#x440;&#x430;&#x43D;&#x430;-2024-12-06-&#x432;-215004.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/b9a30ea8b8d54a7fb017c9955b694796"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/dd4b15cbeaf141e283c44bf249fb0e9b"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Задача</h3>
<p dir="ltr">Матчи и&nbsp;публичные мероприятия, которые видны наблюдателям и&nbsp;болельщикам – лишь часть жизни лиги. За&nbsp;ширмой остается тренировочный процесс, который состоит из&nbsp;разноуровневых элементов, но&nbsp;нет&nbsp;централизованного инструмента для&nbsp;планирования и&nbsp;аналитики тренировочного процесса, который помог бы&nbsp;сделать его&nbsp;более эффективным.</p>
<p dir="ltr">Идея продукта – не&nbsp;просто дать тренерам интерфейс для&nbsp;управления тренировками, а&nbsp;системно подойти к&nbsp;развитию молодых игроков в&nbsp;Казахстане. Цель максимум – подготовить как&nbsp;можно больше высококлассных футболистов для&nbsp;сборных Казахстана. Сейчас с&nbsp;этим трудности, потому что&nbsp;из&#8209;за&nbsp;отсутствия системы тренировок и&nbsp;их&nbsp;отслеживания часто прогресс некоторых молодых талантов теряется. А&nbsp;система позволит таких огрех избежать.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/0865cbdf06d24b419774e8ced8b9529b"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Планируется, что&nbsp;интерфейс, который хотят разработать Freedom QJ&nbsp;League, будет использоваться клубами лиги – </strong>
    каждый из&nbsp;них&nbsp;будет настраивать для&nbsp;себя процесс тренировок, кастомизируя его&nbsp;под&nbsp;команды.
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3706bf7f34434a04b811b60a3e4a6199"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fbb94d35ab444475a70a114a1476e892"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Какие процессы охватит система</h3>
<p dir="ltr">Нужно не&nbsp;просто дать тренерам возможность учитывать и&nbsp;создавать тренировки в&nbsp;электронном режиме – нужно сделать этот процесс унифицированным и&nbsp;систематизированным. Сейчас полная картина тренировочного процесса той&nbsp;или&nbsp;иной команды видна только ее&nbsp;тренеру. Нет&nbsp;возможности оценки в&nbsp;долгосрочной перспективе, а&nbsp;самое главное – не&nbsp;копится база информации для&nbsp;анализа и&nbsp;дальнейших рекомендации и&nbsp;корректировок. А&nbsp;с&nbsp;новой системой получится не&nbsp;только отслеживать прогресс игроков, но&nbsp;и&nbsp;прозрачно наблюдать за&nbsp;работой тренера. Для&nbsp;этого существующие программы тренировок берем за&nbsp;основу тренировочного процесса, наращивая на&nbsp;них&nbsp;циклы и&nbsp;реализуя возможность гибко формировать расписание.</p>
<p dir="ltr">&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/cd6d5c2e54e94e4583698e4d23183afa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--22033377">
    


    <img src="/Media/ohtiylrp/slide-16_9-143.png"
         alt=""
         itemprop="">


</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/ecee009d367742668b10818c6bacff67"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlight"
            data-content-element-type-key="c44ca899-4d83-4746-bf21-bdd1f8a25ccf"
            data-element-udi="umb://element/4b8562164b1d472c95f905077e5dc0d8"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="text-highlight">
  Сезон планируется заранее, поэтому у тренера всегда должно быть расписание матчей, чтобы, опираясь, на него, он мог создавать расписание тренировок. Тренировки, в свою очередь, объединяются в микроциклы, а общий процесс подготовки к матчам можно сравнить с подготовкой к экзамену.
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlight"
            data-content-element-type-key="c44ca899-4d83-4746-bf21-bdd1f8a25ccf"
            data-element-udi="umb://element/d850df008aba4b308069e4d7d9579471"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="text-highlight">
  На первоначальных этапах аналитики поняли, что тренер на жизненном цикле тренировки проходит несколько фаз и составили список из 10 основных. 

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7e31c0e45ccf472aae36d48530c6b86c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8c68940636e145ccbd79afdfb2894185"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 dir="ltr">Как делали аналитику</h3>
<h4 dir="ltr">Неделя 1</h4>
<p dir="ltr">Первым этапом мы&nbsp;совместно с&nbsp;заказчиком зафиксировали цели и&nbsp;метрики продукта через Impact Mapping и&nbsp;карту гипотез. Для&nbsp;этого изучили предметную область, решения конкурентов и&nbsp;те&nbsp;процессы, которые сейчас существуют в&nbsp;лиге, а&nbsp;также обучающие методические программы для&nbsp;для&nbsp;тренеров и&nbsp;аналогичные программы других клубов и&nbsp;лиг.&nbsp;</p>
<blockquote dir="ltr"><em>QJ League показали нам&nbsp;список конкурентов и&nbsp;– внезапно – игру Football manager, которая идеально отражает то, какую систему хотелось бы&nbsp;видеть на&nbsp;выходе. В&nbsp;игру мы&nbsp;втянулись. Наш&nbsp;директор по&nbsp;развитию провел несколько&nbsp;бессонных выходных увлекшись&nbsp;ее&nbsp;аналитикой. Это&nbsp;помогло разложить на&nbsp;кусочки процессы, которые мы&nbsp;фиксировали для&nbsp;создания будущих интерфейсов.</em></blockquote>
<p dir="ltr">Для лучшего погружения провели встречу с&nbsp;действующим тренером лиги. Спросили у&nbsp;него, как&nbsp;на&nbsp;самом деле все&nbsp;происходит – тестировали наши гипотезы. Получилось, что&nbsp;подтвердилось в&nbsp;целом все, но&nbsp;появились надстройки над&nbsp;гипотезами и&nbsp;дополнительные фишки от&nbsp;тренера.</p>
<p dir="ltr">&nbsp;</p>
<h4 dir="ltr">Неделя 2</h4>
<p dir="ltr">Заказчик знакомил нас&nbsp;с&nbsp;теорией и&nbsp;практикой тренировочного процесса футболистов без&nbsp;оглядки на&nbsp;интерфейс. На&nbsp;нашей стороне было выделение в&nbsp;этих процессах ролей и&nbsp;сценариев, общее проектирование системы, основанное на&nbsp;основных артефактах.&nbsp;</p>
<p dir="ltr">Первой зафиксированной сущностью стал календарь с&nbsp;тренировками. Это&nbsp;основа интерфейса планирования тренировочного процесса.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/4751d0917a9b42f1acb8e1d01b87abc4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--40723079">
    


    <img src="/Media/4iranjfz/frame-59586.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/0ae8ee4e47b2497c8f9551fd13827baa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/522668517f6848bfa4418d387a814dee"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">Все, что&nbsp;мы&nbsp;обсуждали, закрепляли в&nbsp;документе, готовили какие&#8209;то&nbsp;вопросы заказчику, составляли идеи и&nbsp;декомпозировали процессы. В&nbsp;целом подходу, согласно которому мы&nbsp;работали, можно дать рабочее название «Ничего не&nbsp;понятно – все&nbsp;понятно». По&nbsp;такому принципу многоступенчатую аналитику проводить становится чуть понятнее и&nbsp;проще.&nbsp;</p>
<p dir="ltr">При этом мы&nbsp;не&nbsp;забываем, что&nbsp;не&nbsp;нужно прорабатывать каждый сценарий до&nbsp;максимально понятного уровня. То&nbsp;есть надо остановиться на&nbsp;моменте, когда в&nbsp;целом представление получилось четким, но&nbsp;есть еще&nbsp;детали на&nbsp;прояснение. Если какой&#8209;то&nbsp;один сценарий до&nbsp;мелочей прорабатывать, есть риск, что&nbsp;остальные сценарии проработать не&nbsp;успеем. Поэтому идем по&nbsp;методу прогрессивного джипега.</p>
<p dir="ltr">Так получилось сформировать видение решения, нагенерировать идеи по&nbsp;функциональности решения.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="highlightedBox"
            data-content-element-type-key="c37dd9ca-275a-4472-b89c-8873e5fc8d6f"
            data-element-udi="umb://element/619ff2caef39496fa31c8916ccbed04a"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-highlights">
    <strong>Когда впервые смотришь на&nbsp;какой&#8209;то&nbsp;процесс, в&nbsp;два&nbsp;счета разложить его&nbsp;на&nbsp;кусочки не&nbsp;получается. Это&nbsp;стадия «Ничего не&nbsp;понятно». Мы&nbsp;берем какой&#8209;то&nbsp;кусок процесса, например, «тренер создает тренировку», начинаем выстраивать связи сначала верхнеуровнево – вот&nbsp;уже&nbsp;становится «Все понятно» широкими мазками. </strong>
    Потом углубляемся в&nbsp;одну из&nbsp;вех&nbsp;процесса – опять «Ничего не&nbsp;понятно». Идем к&nbsp;заказчику, уточняем, дописываем, снова получаем «Все понятно». И&nbsp;так&nbsp;раз&nbsp;за&nbsp;разом: качели понимания качаются до&nbsp;тех&nbsp;пор, пока все, что&nbsp;нужно, по&nbsp;полочкам не&nbsp;разложим и&nbsp;не&nbsp;упорядочим.
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/871bf44d4efc47609e23ec9d0d77f7b8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/30ed23a22af34854bdb192d4eeb34bd3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h4 dir="ltr">Неделя 3</h4>
<p dir="ltr">Когда сценарии были готовы, пришло время отрисовки прототипов. Здесь у&nbsp;нас&nbsp;появилась идея дашборда, где&nbsp;тренер видит свои ближайшие события и&nbsp;отчеты, помогающие ему&nbsp;лучше взаимодействовать с&nbsp;системой. Можно проследить стадии эволюции от&nbsp;прототипов до&nbsp;экранов.</p>
<p dir="ltr">&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/b72a57f5febb438595e3f78989d680dd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--66375384">
    


    <img src="/Media/hzwfbmam/slide-1677_9-144.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b3b50cddf82d45a3b9810b30b622d7b7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9a832e5be53c47da9a58c68bafeb9366"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Таким образом мы&nbsp;проработали все&nbsp;нужные интерфейсы и&nbsp;процессы будущей системы. После этого нужно было собрать все&nbsp;это&nbsp;воедино, чтобы определить, какая функциональность войдет в&nbsp;первую версию системы, и&nbsp;какие фичи оставим на&nbsp;развитие. Получился бэклог, на&nbsp;основе которого мы&nbsp;составили роадмап проекта.</p>
<p dir="ltr">&nbsp;</p>
<h4 dir="ltr">Недели 4 и&nbsp;5</h4>
<p dir="ltr">Финальные этапы проектирования – это&nbsp;валидация ранее сгенерированных гипотез, формирование User Story Map&nbsp;и&nbsp;определение той&nbsp;функциональности, которая войдет в&nbsp;первую версию системы. Кроме того, здесь мы&nbsp;уже&nbsp;приступили к&nbsp;планированию архитектуры решения и&nbsp;подбору технологий для&nbsp;реализации всей задуманной функциональности – не&nbsp;только для&nbsp;MVP, но&nbsp;и&nbsp;для&nbsp;дальнейшего масштабирования.&nbsp;</p>
<p dir="ltr">&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/48ded26dde484ec79f05db4822b50139"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--27863191">
    


    <img src="/Media/j4uhsedr/&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;-&#x44D;&#x43A;&#x440;&#x430;&#x43D;&#x430;-2024-12-06-&#x432;-215051.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/07accb6a756b4851a65616acf18074db"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Из-за того, что&nbsp;результатом аналитики стали не&nbsp;только описания системы, а&nbsp;также прототипы и&nbsp;USM, получилось быстро отдать все&nbsp;наработки в&nbsp;дизайн и&nbsp;на&nbsp;оценку в&nbsp;разработку. Фактически, к&nbsp;следующим после аналитики этапам мы&nbsp;перешли уже&nbsp;через неделю после ее&nbsp;окончания.&nbsp;</p>
<p dir="ltr">Помимо основной функциональности мы&nbsp;также проработали техстек, подходы для&nbsp;интеграций, спланировали инфраструктуру и&nbsp;хостинги, установили, как&nbsp;будет проект развиваться дальше, и&nbsp;по&nbsp;каким метрикам будет отслеживаться его&nbsp;эффективность.</p>
<h3 dir="ltr">Архитектура и&nbsp;технологии</h3>
<p dir="ltr">Архитектуру сервиса проработали так, чтобы ближайшие 2 года систему можно было беспроблемно развивать при&nbsp;росте числа команд, тренеров и&nbsp;игроков в&nbsp;лиге, а&nbsp;также использования сервиса другими лигами в&nbsp;Казахстане.&nbsp;</p>
<p dir="ltr">&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/064b78e4f71742cc994db0d99c75f798"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--13630920">
    


    <img src="/Media/dull3jtc/&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;-&#x44D;&#x43A;&#x440;&#x430;&#x43D;&#x430;-2024-12-06-&#x432;-215106.png"
         alt=""
         itemprop="">


</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/79503df2527c4078b6f6a8fb32593ee8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p dir="ltr">&nbsp;</p>
<p dir="ltr">Технологический стек: NodeJS, NestJS, React, Next.js, TypeScript, Serilog, NUnit.&nbsp;</p>
<h3 dir="ltr">Результаты</h3>
<p dir="ltr">Командой, состоящей из&nbsp;продуктового дизайнера, продуктового аналитика и&nbsp;архитектора в&nbsp;связке с&nbsp;заказчиком мы&nbsp;реализовали этап аналитики системы для&nbsp;управления футбольной лигой за&nbsp;5 недель. На&nbsp;шестой неделе уже&nbsp;спроектированный план развития системы в&nbsp;работу взяли дизайнеры и&nbsp;разработчики.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="projectGuideCTA"
            data-content-element-type-key="1960fa6c-4efa-48e5-ab4e-617b38200f01"
            data-element-udi="umb://element/ae5386e96a354318ab3cf311a5ddf30f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">
<section class="project-guide-cta">
  <div class="project-guide-cta__header">
    <h2 class="project-guide-title">7 шагов от идеи продукта до запуска</h2>
    <span class="project-guide-tag">Гайд</span>
    <img 
      src="/Media/jpohdjwo/image-4.png" 
      alt="Compass"
      class="project-guide-img"
    >
  </div>
  <p class="project-guide-text">Гайд из 7 шагов, с которыми путь от идеи до запуска становится яснее. Чёткая последовательность, понятные объяснения, рабочие шаблоны. То, что мы сами кладём в рюкзак перед стартом</p>
  <a class="button button--filled-black project-guide-button" target="_blank" href="/project-guide">получить гайд</a>
</section>        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    .NET-разработчик в проекте: кого брать и как оценивать
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Какие задачи решает .NET-разработчик, что он должен уметь и как проверить его уровень? Плюс — отличия найма в штат и аутстаффа.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-hire-dotnet/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-hire-dotnet/</guid>

                <pubDate>Fri, 16 May 2025 06:24:49 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>.NET-разработчик в проекте: кого брать и как оценивать</h1>
                                <figure>
                                    <img src="/Media/3070/frame-485.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5406cc0b1fa451e2259efae6cd84d83d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/702d25c3b7574fe0a103eb5e0e40ef38"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Чтобы нанять квалифицированного .NET-разработчика, стоит разобраться, какие задачи он&nbsp; способен решить, и&nbsp; что&nbsp;именно он&nbsp; должен будет делать на&nbsp; проекте. Правильный выбор .NET-разработчика для&nbsp;реализации бизнес-задач находится на&nbsp; стыке технологических компетенций и&nbsp; мягких навыков: важно, чтобы человек не&nbsp; только хорошо работал с&nbsp; кодом, но&nbsp; и&nbsp; был&nbsp;способен влиться в&nbsp; команду, понять бизнес-задачу. В&nbsp; этой статье разберемся, какие задачи сможет решить .NET-разработчик на&nbsp; проекте, что&nbsp;он&nbsp; должен знать для&nbsp;качественной работы, и&nbsp; как&nbsp;проверить компетенции junior, middle и&nbsp; senior .NET-разработчиков. Также расскажем, в&nbsp; чем&nbsp;основные отличия найма .NET разработчика в&nbsp; штат и&nbsp; аутстаффинга.</span></p>
<h2>Кто такой .NET / C# разработчик и&nbsp; какие задачи он&nbsp; решает?</h2>
<p><span style="font-weight: 400;">.NET разработчик — это&nbsp;специалист, обладающий глубокими знаниями и&nbsp; опытом работы с&nbsp; платформой .NET, разработанной компанией Microsoft. Эта&nbsp;платформа предоставляет инструменты и&nbsp; средства для&nbsp;создания разнообразных приложений — от&nbsp; веб-сайтов до&nbsp; корпоративных систем. C# - это&nbsp;язык программирования, который чаще всего используют в&nbsp;.NET.</span></p>
<p><span style="font-weight: 400;">Разработчики на&nbsp;.NET могут работать в&nbsp; разных направлениях:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">enterprise разработка: бекенд разработка решений и&nbsp; продуктов для&nbsp;бизнеса разных размеров, разработка корпоративных порталов, ERP, интеграция их&nbsp; со&nbsp; сторонними системами, микросервисы.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">геймдев: разработка игр&nbsp;и&nbsp; различных геймификаций на&nbsp; Unity.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">десктопные приложения для&nbsp;Windows на&nbsp; WPF.</span></li>
</ul>
<p><span style="font-weight: 400;">Чаще всего решения на&nbsp;.NET разрабатывают для&nbsp;финтеха (банки и&nbsp; страхование) и&nbsp; систем документооборота в&nbsp; компаниях разного размера.</span></p>
<p><span style="font-weight: 400;">Среди преимуществ разработки на&nbsp;.NET можно выделить следующие:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">надежность</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">безопасность</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">легкость освоения</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">высокая производительность</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">кросс-платформенность</span></li>
</ul>
<h2>Компетенции и&nbsp; ответственность: какими инструментами, подходами и&nbsp; технологиями должен владеть .NET разработчик</h2>
<p>Опишем несколько базовых компетенций, универсальных для&nbsp;проектов из&nbsp; любых предметных областей. В&nbsp; зависимости от&nbsp; специфики и&nbsp; особенностей продукта, на&nbsp; который вам&nbsp;нужен .NET разработчик, этот список может дополняться.</p>
<h3>MVC (Model-View-Controller)</h3>
<p><span style="font-weight: 400;">.NET разработчик должен обладать знаниями о&nbsp; паттерне проектирования MVC, чтобы правильно организовывать код&nbsp;в&nbsp; веб-приложениях. Паттерн объединяет 3 сущности. Модель (Model) — данные и&nbsp; логика, Представление (View) — отображение информации пользователю, а&nbsp; Контроллер (Controller) — взаимодействие между ними. Разработчик должен понимать, как&nbsp;работает реализация MVC&nbsp; в&nbsp;.NET, и&nbsp; какие есть варианты кастомизации его&nbsp;поведения.</span></p>
<h3>SOLID, паттерны проектирования и&nbsp; ООП</h3>
<p><span style="font-weight: 400;">.NET-разработчики используют принципы SOLID для&nbsp;создания гибкого и&nbsp; устойчивого кода. Эти&nbsp;принципы включают в&nbsp; себя различные идеи, например, создание классов с&nbsp; одной конкретной задачей, возможность менять поведение программы без&nbsp;изменения кода, использование интерфейсов и&nbsp; абстракций для&nbsp;уменьшения зависимостей между частями программы. </span></p>
<p><span style="font-weight: 400;">Паттерны проектирования применяются в&nbsp;.NET для&nbsp;создания гибких и&nbsp; повторно используемых структур. Паттерны используются для&nbsp;введения абстракций, управления алгоритмами и&nbsp; настройки уведомлений об&nbsp; изменениях в&nbsp; системе. Они&nbsp;помогают создавать код, который легко поддерживать и&nbsp; расширять. </span></p>
<p><span style="font-weight: 400;">Основы объектно-ориентированного программирования в&nbsp;.NET включают использование наследования, полиморфизма, инкапсуляции и&nbsp; абстракции. Разработчики используют эти&nbsp;концепции для&nbsp;создания чистого и&nbsp; структурированного кода, что&nbsp;важно при&nbsp;заказной разработке на&nbsp;.NET.</span></p>
<h3>Чистая архитектура</h3>
<p><span style="font-weight: 400;">Это концепция, направленная на&nbsp; создание модульных, гибких и&nbsp; тестируемых приложений. Она&nbsp;определяет структуру приложения, разделяя его&nbsp;на&nbsp; уровни, где&nbsp;каждый уровень имеет определенную ответственность. В&nbsp; контексте .NET разработки применение принципов чистой архитектуры означает создание проектов, которые не&nbsp; зависят от&nbsp; конкретных технологий и&nbsp; легко могут быть заменены или&nbsp;обновлены. </span></p>
<h3>Domain-Driven Design (DDD)</h3>
<p><span style="font-weight: 400;">DDD — это&nbsp;методология разработки ПО, ориентированная на&nbsp; модель предметной области. Знание DDD&nbsp;помогает создавать приложения, ориентированные на&nbsp; бизнес-задачам. Разработчик, знающий DDD, лучше взаимодействует с&nbsp; бизнесом, обеспечивает точное отражение бизнес-логики в&nbsp; коде и&nbsp; способен создать структурированные и&nbsp; легко поддерживаемые системы на&nbsp;.NET. </span></p>
<h3>Микросервисная архитектура</h3>
<p><span style="font-weight: 400;">Микросервисная архитектура предполагает разбиение крупных приложений на&nbsp; небольшие и&nbsp; независимые сервисы, что&nbsp;повышает гибкость, масштабируемость и&nbsp; возможность параллельной разработки решений. Обновлять и&nbsp; поддерживать приложения на&nbsp; миросервисах проще, поскольку изменения в&nbsp; одном сервисе не&nbsp; затрагивают другие. Микросервисы более отказоустойчивы и&nbsp; дружелюбны к&nbsp; изменениям, чем&nbsp;монолитные приложения. </span></p>
<h3>Управление данными в&nbsp; разработке</h3>
<p><span style="font-weight: 400;">.NET-разработчик должен уметь работать с&nbsp; базами данных: MS&nbsp; SQL&nbsp;или&nbsp;PostgreSQL, например. Для&nbsp;работы с&nbsp; БД&nbsp;используют Entity Framework — это&nbsp;ORM&nbsp;(Object-Relational Mapping) система, которая представляет их&nbsp; данные в&nbsp; виде объектов, что&nbsp;делает код&nbsp;более читаемым и&nbsp; удобным.</span></p>
<p><span style="font-weight: 400;">Для отдельных задач .NET разработчику полезно владеть навыками использования Redis и&nbsp; MongoDB. Redis — это&nbsp;система хранения данных, используемая для&nbsp;кэширования и&nbsp; обработки событий в&nbsp; реальном времени. MongoDB — NoSQL БД&nbsp; с&nbsp; хранением данных в&nbsp; формате документов: хорошо подходит для&nbsp;работы с&nbsp; неструктурированными данными. Знание обеих технологий помогает .NET разработчику гибче и&nbsp; эффективнее работать с&nbsp; данными. </span></p>
<p><span style="font-weight: 400;">В микросервисной разработке на&nbsp;.NET применяют асихнронное взаимодействие сервисов с&nbsp; помощью систем обмена сообщений. Например, Kafka и&nbsp; RabbitMQ. С&nbsp; ними можно настроить асинхронное взаимодействие между разными частями приложения, улучшая его&nbsp;производительность и&nbsp; масштабируемость. </span></p>
<h3>API и&nbsp; интеграции</h3>
<p><span style="font-weight: 400;">Для того, чтобы реализовывать интеграции в&nbsp; разрабатываемом ПО, нужно освоить REST-проектирование с&nbsp; использованием спецификации Swagger/OpenAPI. REST-сервисы — это&nbsp;способ организации взаимодействия между компонентами ПО. Swagger или&nbsp;OpenAPI — это&nbsp;инструменты для&nbsp;описания и&nbsp; документирования REST-сервисов.</span></p>
<p><span style="font-weight: 400;">Еще одна важная компетенция .NET-разработчика в&nbsp; этом контексте — умение использовать gRPC для&nbsp;межсервисного взаимодействия. Во-первых, gRPC обеспечивает эффективную и&nbsp; быструю передачу данных между сервисами благодаря использованию бинарного протокола и&nbsp; асинхронным вызовам. Это&nbsp;особенно полезно в&nbsp; распределенных системах с&nbsp; высокой нагрузкой. Во-вторых, gRPC автоматически генерирует клиентский код&nbsp;на&nbsp; основе описания API, что&nbsp;упрощает работу с&nbsp; удаленными сервисами. </span></p>
<h3>Тестирование и&nbsp; Отладка</h3>
<p><span style="font-weight: 400;">Несмотря на&nbsp; то, что&nbsp;тестированием ПО&nbsp;занимаются QA&nbsp;специалисты, бекенд-разработчикам (да&nbsp; и&nbsp; вообще разработчикам) важно уметь самостоятельно тестировать написанный код. В&nbsp; этом контексте компетенций .NET разработчика стоит сказать про&nbsp;интеграционное и&nbsp; юнит-тестирование. </span></p>
<p><span style="font-weight: 400;">Юнит-тесты направлены на&nbsp; проверку отдельных компонентов кода. Применение юнит-тестов помогает выявлять ошибки на&nbsp; ранних этапах разработки и&nbsp; способствует созданию более структурированного и&nbsp; поддерживаемого кода. Юнит-тестирование также помогает проверить, влияют ли&nbsp;изменения в&nbsp; коде на&nbsp; существующую функциональность.</span></p>
<p><span style="font-weight: 400;">Интеграционное тестирование — это&nbsp;проверка взаимодействия между компонентами системы в&nbsp; целом. С&nbsp; его&nbsp;помощью выявляют проблемы интеграций внешних библиотек, сервисов или&nbsp;других компонентов. Интеграционные тесты дают понять, все&nbsp; ли&nbsp;части системы работают согласованно.</span></p>
<p><span style="font-weight: 400;">Говоря об&nbsp; инструментах и&nbsp; библиотеках, .NET разработчику полезно знать NUnit, NSubstitute для&nbsp;решения задач тестирования. А&nbsp; для&nbsp;отладки приложений обычно используют Rider и&nbsp; Visual Studio.</span></p>
<h3>DevOps и&nbsp; работа с&nbsp; инфраструктурой</h3>
<p><span style="font-weight: 400;">При разработке .NET-приложений важно знать, как&nbsp;использовать Docker-контейнеры и&nbsp; организовывать процессы Continuous Integration/Continuous Delivery (CI/CD. Docker — единый и&nbsp; изолированный контейнер для&nbsp;приложения и&nbsp; его&nbsp;зависимостей, что&nbsp;обеспечивает консистентность в&nbsp; различных средах разработки и&nbsp; развертывания. Интеграция CI/CD процессов автоматизирует сборку, тестирование и&nbsp; развертывание приложения, что&nbsp;в&nbsp; целом ускоряет процесс разработки. .NET-разработчик интегрирует свой код&nbsp;в&nbsp; CI/CD, используя Jenkins, GitLab CI, или&nbsp;Azure DevOps, чтобы автоматизировать тестирование и&nbsp; доставку приложения в&nbsp; производственную среду.</span></p>
<h2>Что должен уметь .NET разработчик уровня Junior, Middle и&nbsp; Senior, и&nbsp; как&nbsp;это&nbsp;проверить</h2>
<p><span style="font-weight: 400;">Опишем основные требования к&nbsp;.NET разработчикам, которые обычно проверяются на&nbsp; собеседованиях. Этот список можно расширять, вводя в&nbsp; него вопросы и&nbsp; проверки, относящиеся к&nbsp; конкретному проекту.</span></p>
<h3>Junior</h3>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Знание языка программирования и&nbsp; основных стандартных типов данных и&nbsp; классов</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: дать решить простые задачи на&nbsp; знания конструкций языка и&nbsp; типов данных из&nbsp; стандартной библиотеки (коллекции, классы для&nbsp;работы с&nbsp; файлами), задать вопросы на&nbsp; знание различий между разными типами данных.</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Навыки работы с&nbsp; БД</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: С&nbsp; какими типами баз&nbsp;данных вы&nbsp; работали? Какие типы объектов есть в&nbsp; реляционной БД? Попросить написать простой SQL&nbsp;запрос. Расскажите, как&nbsp; бы&nbsp;вы&nbsp; оптимизировали медленный запрос к&nbsp; БД? </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Умение работать с&nbsp; системами контроля версия — Git</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: С&nbsp; какими сложностями сталкивались при&nbsp;работе с&nbsp; Git?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Понимание того, как&nbsp;работают веб&nbsp;приложения</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Вы&nbsp; вводите адрес в&nbsp; строку браузера и&nbsp; через несколько секунд появляется страница — как&nbsp;это&nbsp;работает? Как&nbsp;работает аутентификация в&nbsp; веб&nbsp;приложении? Как&nbsp;работают HTML, CSS, JavaScript?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Умение планировать и&nbsp; выполнять задачи в&nbsp; срок</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Как&nbsp;вы&nbsp; планируете свою работу? Что&nbsp;будете делать, если случится аврал, срыв сроков? Были у&nbsp; вас&nbsp;уже&nbsp;такие ситуации? Как&nbsp;справились?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Знание английского языка на&nbsp; уровне чтения техдокументации</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Предложить прочитать техническую документацию и&nbsp; объяснить её. Или&nbsp;пройти небольшой тест.</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Способность к&nbsp; профессиональному развитию и&nbsp; непрерывное самообучение</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Что&nbsp;и&nbsp; как&nbsp;вы&nbsp; делаете для&nbsp;своего развития? На&nbsp; какие каналы подписаны, какие блоги/профильные сайты читаете? Какие митапы и&nbsp; конференции посещали? Что&nbsp;полезное извлекли и&nbsp; применили?</span></p>
<h3>Middle и&nbsp; Middle+</h3>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Знание паттернов проектирования и&nbsp; принципов ООП.</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Какие паттерны проектирование знаете? Какие применяли в&nbsp; работе? Попросить сделать код-ревью кода с&nbsp; некоторыми архитектурными ошибками?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Уметь интегрироваться с&nbsp; API&nbsp;и&nbsp; проектировать их&nbsp; структуру (REST, gRPC, SOAP более редки в&nbsp; использовании в&nbsp; свежих проектах)</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Какие API&nbsp;вы&nbsp; разрабатывали? Для&nbsp;каких задач? Какими принципами пользовались при&nbsp;проектировании? Какие еще&nbsp;варианты интеграции сервисов вы&nbsp; знаете? Какие их&nbsp; преимущества и&nbsp; недостатки?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Базы данных и&nbsp; очереди сообщений, умение проектировать структуру БД, работа с&nbsp; ORM, оптимизация производительности</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: дать задачу подобрать базу данных и&nbsp; спроектировать схему БД&nbsp;для&nbsp;какой&#8209;то&nbsp;небольшой реалистичной задачи. Какие частые проблемы могут возникать при&nbsp;работе с&nbsp; ORM? Как&nbsp;от&nbsp; них&nbsp;избавляться? Как&nbsp;можно анализировать производительность БД? С&nbsp; каким очередями сообщений работали, какими фичам пользовались и&nbsp; почему?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Навыки самостоятельного тестирования и&nbsp; отладки приложения</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: какие тесты вы&nbsp; создавали? Писали юнит-тесты? Какие библиотеки для&nbsp;тестирования вы&nbsp; используете?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Наличие знания основ безопасности веб-приложений</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Какие самые частые проблемы с&nbsp; безопасностью веб-приложений вы&nbsp; знаете? Какие методы их&nbsp; решения вы&nbsp; знаете? </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Знания в&nbsp; области оценивания и&nbsp; улучшения производительности веб-сервисов</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Если продукт тормозит, как&nbsp; бы&nbsp;вы&nbsp; подошли к&nbsp; анализу и&nbsp; улучшение производительности? Какой у&nbsp; вас&nbsp;опыт в&nbsp; рефакторинге кода, расскажите на&nbsp; примерах как&nbsp;вы&nbsp; подходили к&nbsp; задаче?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Умение составить понятное и&nbsp; определенное технической задание, оценить его&nbsp;</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Составляли ли&nbsp;вы&nbsp; техзадание? Для&nbsp;каких задач? Для&nbsp;себя или&nbsp;других? С&nbsp; какими ошибками чаще всего встречались в&nbsp; ТЗ? </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Навыки планирования и&nbsp; командной работы</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Как&nbsp;вы&nbsp; строите коммуникацию с&nbsp; коллегами? Что&nbsp;делаете, когда заканчиваете свою часть работы? Что&nbsp;вы&nbsp; сделаете, если кто&#8209;то&nbsp;совершит, на&nbsp; ваш&nbsp;взгляд, глупую ошибку?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Основы DevOps</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Как&nbsp;происходил деплой приложения над&nbsp;которых вы&nbsp; работали? Доводилось настраивать сборку или&nbsp;деплой приложения в&nbsp; CI/CD? Какой опыт с&nbsp; Docker?</span></p>
<h3>Senior и&nbsp; Lead</h3>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Проектирование архитектуры систем и&nbsp; микросервисов</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: дать задачу спроектировать «на салфетке» какую&#8209;то&nbsp;достаточно масштабную реалистичную систему, дать возможность задавать вопросы, обратить внимание на&nbsp; какие ключевые ограничения задачи кандидат обращает внимание. Какие паттерны микросервисной архитектуры вы&nbsp; знаете или&nbsp;применяли? Как&nbsp;реализовать транзакции в&nbsp; микросервисной архитектуре?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Умение работать с&nbsp; проблемными частями продукта и&nbsp; минимизировать технологические риски</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: С&nbsp; какими проблемами и&nbsp; сложными задачами вы&nbsp; встречались? Приходилось ли&nbsp;вам&nbsp;доносить до&nbsp; руководства/заказчика риски, которые вы&nbsp; предвидели до&nbsp; начала разработки проекта?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Навыки управления командой, отслеживанием атмосферы в&nbsp; ней&nbsp;и&nbsp; способность оценивать и&nbsp; ставить задачи</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Какой у&nbsp; вас&nbsp;опыт в&nbsp; управлении командой? Как&nbsp;вы&nbsp; распределяете нагрузку? Как&nbsp;отслеживаете и&nbsp; контролируете результаты команды? Как&nbsp;часто отправляете код&nbsp;на&nbsp; доработку?</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Опыт наставничества и&nbsp; обмена знаниями внутри команды или&nbsp;в&nbsp; рамках компании</span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Были ли&nbsp;вы&nbsp; наставником для&nbsp;других разработчиков? С&nbsp; какими сложностями сталкивались? </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Умение общаться с&nbsp; разными людьми, развитая коммуникация в&nbsp; различных условиях, умение убеждать </span></li>
</ul>
<p><span style="font-weight: 400;">Как проверить: Как&nbsp;вы&nbsp; доносили до&nbsp; команды/заказчиков свое решение? Как&nbsp;убеждали в&nbsp; своей правоте? Как&nbsp;вы&nbsp; объясняли команде свои решения? Расскажите историю какого&#8209;то&nbsp;из&nbsp; своих фейлов?</span></p>
<h2>Найм разработчика в&nbsp; штат или&nbsp;аутстаф .NET разработчиков?</h2>
<table border="1" style="height: 315px; width: 100%; border-collapse: collapse; border-style: hidden;">
<tbody>
<tr style="height: 21px;">
<th style="width: 50%; height: 21px; border-style: none; background-color: #5e5b5b;"><strong>Найм в&nbsp; штат</strong></th>
<th style="width: 50%; height: 21px; border-style: none; background-color: #5e5b5b;"><strong>Аутстаф/Аутсорс</strong></th>
</tr>
<tr style="height: 63px; border-style: hidden; background-color: #ffffff;">
<td style="width: 50%; height: 63px; border-style: hidden;"><span style="font-weight: 400;">Расходование временных и&nbsp; денежных ресурсов на&nbsp; подбор и&nbsp; собеседования кандидатов. А&nbsp; если в&nbsp; компании нет&nbsp;опытного технического рекрутера или&nbsp;человека, способного проверить компетенции технического специалиста, придется тратить также и&nbsp; на&nbsp; обращение в&nbsp; рекрутинговое агентство. </span></td>
<td style="width: 50%; height: 63px;"><span style="font-weight: 400;">Подбор и&nbsp; проверка компетенции разработчиков на&nbsp; стороне агентства. Заказчикам предлагают senior и&nbsp; middle специалистов, навыки которых уже&nbsp;подтверждены на&nbsp; практике и&nbsp; проверены штатными нанимающими менеджерами.</span></td>
</tr>
<tr style="height: 63px; background-color: #e2e2e2; border-style: hidden;">
<td style="width: 50%; height: 63px; border-style: hidden;"><span style="font-weight: 400;">Найм в&nbsp; штат практически невозможно осуществить за&nbsp; короткий срок, особенно если вам&nbsp;нужен действительно опытный специалист. Процедура может затянуться на&nbsp; недели и&nbsp; даже месяцы, а&nbsp; разработка все&nbsp;это&nbsp;время будет заблокирована.</span></td>
<td style="width: 50%; height: 63px;"><span style="font-weight: 400;">Подбор и&nbsp; выделение отдельного разработчика или&nbsp;команды на&nbsp; проект вместе с&nbsp; онбордингом занимает не&nbsp; больше недели.</span></td>
</tr>
<tr style="height: 63px; border-style: hidden; background-color: #ffffff;">
<td style="width: 50%; height: 63px; border-style: hidden;"><span style="font-weight: 400;">Если публиковать вакансии на&nbsp; карьерных ресурсах самостоятельно, эти&nbsp;вложения окупятся после того, как&nbsp;вы&nbsp; наймете нужных специалистов. Однако при&nbsp;привлечении рекрутерской работы, на&nbsp; окупаемость ресурсов можно рассчитывать только после 3-4 месяцев работы нанятых сотрудников.</span></td>
<td style="width: 50%; height: 63px;"><span style="font-weight: 400;">Не нужно платить за&nbsp; процесс найма. Оплачивается только ставка .NET разработчиков.</span></td>
</tr>
<tr style="height: 42px; border-style: hidden; background-color: #e2e2e2;">
<td style="width: 50%; height: 42px; border-style: hidden;"><span style="font-weight: 400;">Онбординг новичков на&nbsp; проектах требует времени. Обычно для&nbsp;понимания всех процессов специалист с&nbsp; рынка адаптируется за&nbsp; 2-3 недели в&nbsp; зависимости от&nbsp; сложности проекта.</span></td>
<td style="width: 50%; height: 42px;"><span style="font-weight: 400;">Стартовать работу над&nbsp;проектом при&nbsp;подборе разработчиков через агентство занимает получится в&nbsp; срок до&nbsp; недели.</span></td>
</tr>
<tr style="height: 42px; border-style: hidden; background-color: #ffffff;">
<td style="width: 50%; height: 42px; border-style: hidden;"><span style="font-weight: 400;">Штатный специалист обходится в&nbsp; меньшую сумму за&nbsp; час&nbsp;работы, но&nbsp; на&nbsp; содержание его&nbsp;в&nbsp; штате требуются дополнительные расходы. Например, нужно будет выплачивать отпускные, больничные, налоги за&nbsp; сотрудника.</span></td>
<td style="width: 50%; height: 42px;"><span style="font-weight: 400;">Час работы аутстаф разработчика выходит дороже, чем&nbsp;при&nbsp;найме человека в&nbsp; штат. Однако вы&nbsp; избавляете себя от&nbsp; необходимости нести дополнительные расходы, связанные с&nbsp; содержанием сотрудника. </span></td>
</tr>
<tr style="height: 21px; border-style: hidden; background-color: #e2e2e2;">
<td style="width: 50%; height: 21px; border-style: hidden;"><span style="font-weight: 400;">Штатного сотрудника нельзя урезать в&nbsp; зарплате, когда количество задач на&nbsp; проекте резко уменьшается или, наоборот, заставить работать сверхурочно, когда произошел аврал.</span></td>
<td style="width: 50%; height: 21px;"><span style="font-weight: 400;">В случае резкого увеличения пула задач на&nbsp; проекте, легко увеличить количество разработчиков, которые смогут быстро подключиться. Если же&nbsp;вдруг внезапно станет меньше, снять аутстаф разработчика с&nbsp; проекта также не&nbsp; составит труда. </span></td>
</tr>
</tbody>
</table>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Настраиваем рабочее место: полезные инструменты для разработчиков и не только
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Фишки Windows и сторонние инструменты, которые делают работу комфортнее и быстрее. Полезно всем, но часть доступна только в Windows 11 23H2+.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/useful-tools-for-work/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/useful-tools-for-work/</guid>

                <pubDate>Fri, 16 May 2025 06:22:49 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Настраиваем рабочее место: полезные инструменты для разработчиков и не только</h1>
                                <figure>
                                    <img src="/Media/0jelaksp/3d-penguin-office-render-apr-2-2025-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/244320264bdb6128024f2a9a03a98c97"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3a348d58e1ab47d98befd3cb7cf029ec"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Рассказываю про&nbsp;некоторые инструменты и&nbsp;настройки, которые помогают сделать рабочий процесс более комфортным и&nbsp;производительным. Что&#8209;то&nbsp;будет о&nbsp;встроенных в&nbsp;Windows фишках, что&#8209;то&nbsp;– о&nbsp;сторонних программах. Полезно всем – не&nbsp;только разработчикам.</p>

<div class="umb-macro-highlights">
    <strong>Дисклеймер:</strong>
    часть настроек и&nbsp;инструментов есть только в&nbsp;Windows 11 версии не&nbsp;ниже 23H2.
</div>

<h2>Расширенный буфер обмена</h2>
<p>Расширенный буфер обмена можно включить в&nbsp;настройках<span> </span><strong>Параметры &gt; Система &gt; Буфер обмена &gt; Журнал буфера обмена</strong>. Для&nbsp;его&nbsp;вызова нужно использовать хоткей<span> </span><code>Win + V</code>. Можно закрепить слово – тогда оно&nbsp;не&nbsp;будет очищаться при&nbsp;переполнении истории. Можно вставлять эмодзи – пригодится, чтобы поставить в&nbsp;статус 🌴 перед отпуском. В&nbsp;истории также автоматически сохраняются скриншоты из&nbsp;Ножниц. Недавно появилась удобная фича: можно вставлять текст с&nbsp;очисткой форматирования, потому что&nbsp;не&nbsp;все&nbsp;проги (передаем привет Word-у) поддерживают вставку без&nbsp;форматирования через<span> </span><code>Ctrl + Shift + V</code>.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3121/12-&#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;-&#x441;-&#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x435;&#x43D;&#x43D;&#x44B;&#x43C;-&#x431;&#x443;&#x444;&#x435;&#x440;&#x43E;&#x43C;-&#x43E;&#x431;&#x43C;&#x435;&#x43D;&#x430;.gif"
         alt=""
         itemprop="">


</figure>

<h2>Удобные скриншоты</h2>
<p>Многие пользуются LightShot, это&nbsp;окей. Однако есть и&nbsp;те, кто&nbsp;до&nbsp;сих&nbsp;пор&nbsp;используют сервисы для&nbsp;скриншотов, которые предполагают открытие картинки по&nbsp;ссылке. Помимо того, что&nbsp;это&nbsp;просто сильно неудобно, в&nbsp;корпоративной среде такие сервисы вызывает вопросы еще&nbsp;и&nbsp;с&nbsp;точки зрения безопасности.</p>
<p>Можно вообще не&nbsp;использовать сторонние сервисы. В&nbsp;Windows есть Ножницы, и&nbsp;это&nbsp;классная штука. Киллер фича – распознавания текста сразу со&nbsp;скриншота. Можно скопировать текст со&nbsp;скрина даже с&nbsp;сохранением форматирования (например, скопировать список с&nbsp;переносами строк) и&nbsp;вставить в&nbsp;документ без&nbsp;лишних телодвижений. </p>


<figure class="umb-macro-image">
    


    <img src="/Media/3119/11-&#x440;&#x430;&#x441;&#x43F;&#x43E;&#x437;&#x43D;&#x430;&#x432;&#x430;&#x43D;&#x438;&#x435;-&#x442;&#x435;&#x43A;&#x441;&#x442;&#x430;.gif"
         alt=""
         itemprop="">


        <figcaption>
            Распознавание текста на&nbsp;скриншоте
        </figcaption>
</figure>

<p>Ножницы позволяют настроить создание скриншота с&nbsp;задержкой в&nbsp;3, 5 и&nbsp;10 сек. Вы&nbsp;можете выделить прямоугольную область, окно программы или&nbsp;весь экран. После создания снимка можно сразу же&nbsp;его&nbsp;отредактировать: выделить маркером важное, замазать конфиденциальное или&nbsp;обрезать лишнее.</p>
<p>Если по&nbsp;работе приходится часто делать скриншоты, то&nbsp;можно использовать клавишу<span> </span><code>Print Screen</code><span> </span>или сочетания клавиш<span> </span><code>Win + Shift + S</code>. А&nbsp;если у&nbsp;вас&nbsp;мышь с&nbsp;дополнительными кнопками, то&nbsp;можно привязать создание скриншота на&nbsp;одну из&nbsp;них.</p>
<p>Еще в&nbsp;Ножницах можно сделать запись экрана, чем&nbsp;я&nbsp;и&nbsp;воспользовался при&nbsp;подготовке статьи. Записанное видео можно подредактировать через бесплатное приложение<span> </span><a href="https://apps.microsoft.com/detail/9p1j8s7ccwwt">Microsoft Clipchamp</a>.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3136/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-04-02_131639771.png"
         alt=""
         itemprop="">


</figure>

<h2>Контекстное меню и&nbsp;комбинации клавиш</h2>
<p>С одной стороны, не&nbsp;хочется капитанить, а&nbsp;с&nbsp;другой… С&nbsp;другой стороны, для&nbsp;многих кнопка контекстного меню и&nbsp;клавиатурные навигационные шорткаты – до&nbsp;сих&nbsp;пор&nbsp;неизвестный инструмент. Между тем, с&nbsp;их&nbsp;помощью гораздо удобнее работать с&nbsp;текстом, чем&nbsp;кликать мышью по&nbsp;словам для&nbsp;исправления опечаток. Сюда же&nbsp;сочетания<span> </span><code>Ctrl + {стрелка влево/вправо}</code><span> </span>для передвижения по&nbsp;словам и<span> </span><code>Ctrl + Shift + {стрелка влево/вправо}</code><span> </span>для выделения. Не&nbsp;забываем также про&nbsp;клавиши<span> </span><code>Home</code><span> </span>и<span> </span><code>End</code><span> </span>для передвижения в&nbsp;начало и&nbsp;конец строки, которые совместно с&nbsp;клавишей<span> </span><code>Ctrl</code><span> </span>позволяют перемещаться в&nbsp;начало и&nbsp;в&nbsp;конец всего документа.</p>
<p>Кстати, тройной клик левой кнопкой мыши по&nbsp;слову выделит текст внутри текущего контекста. Если это&nbsp;ячейка таблицы – то&nbsp;весь текст в&nbsp;ячейке, если это&nbsp;абзац – то&nbsp;весь абзац в&nbsp;документе.</p>
<h2>Google Chrome</h2>
<p>Для автоматического открытия заранее заданных вкладок можно зайти в&nbsp;настройки Chrome, перейти в&nbsp;раздел «Запуск Chrome» и&nbsp;там&nbsp;задать определенный список страниц. В&nbsp;случае Google Календаря и&nbsp;Google Почты это&nbsp;поможет не&nbsp;пропустить важные уведомления о&nbsp;письмах или&nbsp;начавшихся событиях.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3113/3-&#x441;&#x442;&#x430;&#x440;&#x442;&#x43E;&#x432;&#x44B;&#x435;-&#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B;-&#x432;-&#x445;&#x440;&#x43E;&#x43C;&#x435;.png"
         alt=""
         itemprop="">


        <figcaption>
            Страницы, открывающиеся при&nbsp;запуске Chrome
        </figcaption>
</figure>

<p>Для быстрого переключения между вкладками удобно использовать хоткей<span> </span><code>Ctrl + {цифра от&nbsp;1 до&nbsp;8}</code>. Цифра «8» – это&nbsp;не&nbsp;очепятка, потому что&nbsp;сочетание<span> </span><code>Ctrl + 9</code><span> </span>зарезервировано для&nbsp;перехода на&nbsp;последнюю вкладку. Сочетания<span> </span><code>Ctrl + Tab</code><span> </span>и<span> </span><code>Ctrl + Shift + Tab</code><span> </span>позволяют перейти на&nbsp;следующую/предыдущую вкладку соответственно.</p>
<p>Есть ряд&nbsp;других быстрых клавиш, которыми я&nbsp;пользуюсь ежедневно. Для&nbsp;чего нам&nbsp;нужен браузер? Правильно, чтобы открывать новые вкладки – для&nbsp;этого используется сочетание клавиш<span> </span><code>Ctrl + T</code>. А&nbsp;если нужно открыть вкладку в&nbsp;новом окне, то&nbsp;вам&nbsp;в&nbsp;помощь<span> </span><code>Ctrl + N</code>. В&nbsp;случае, когда вкладку наоборот нужно закрыть, можно использовать сочетание<span> </span><code>Ctrl + W</code>. Но&nbsp;если удобнее закрыть вкладку с&nbsp;помощью мыши, то&nbsp;нет&nbsp;смысла целиться на&nbsp;крестик – это&nbsp;обречено на&nbsp;провал с&nbsp;той&nbsp;же&nbsp;вероятностью, что&nbsp;и&nbsp;встретить на&nbsp;улице динозавра (то&nbsp;есть с&nbsp;вероятностью 50%). Лучше закрыть вкладку, кликнув на&nbsp;нее&nbsp;средней кнопкой мыши (колесиком).</p>
<p>Я думаю, у&nbsp;каждого случалась ситуация, когда случайно закрываешь нужную вкладку. В&nbsp;этом случае на&nbsp;помощь придет хоткей<span> </span><code>Ctrl + Shift + T</code>, позволяющий восстанавливать закрытые вкладки.</p>
<p>Вспомните, как&nbsp;вы&nbsp;забрели в&nbsp;самую глубь<span> </span>леса<span> </span>сайта и&nbsp;выбирались оттуда<span> </span>с помощью мха<span> </span>с использованием истории переходов (кнопок назад/вперед). Оказывается, на&nbsp;этот случай есть горячие клавиши<span> </span><code>Alt + {стрелка влево/вправо}</code>.</p>
<p>Если начать поиск на&nbsp;странице с&nbsp;помощью<span> </span><code>Ctrl + F</code><span> </span>выделив при&nbsp;этом текст, то&nbsp;он&nbsp;подставится в&nbsp;поисковую строку.</p>
<p>Ознакомиться с&nbsp;полным списком быстрых клавиш можно вот<span> </span><a href="https://support.google.com/chrome/answer/157179">тут</a>.</p>
<h2>Проводник </h2>
<p>Если вы&nbsp;пользуетесь<span> </span><strong>лучшим файловым менеджером</strong><span> </span>(да-да, речь про&nbsp;Проводник), то&nbsp;для&nbsp;вас&nbsp;есть отличные новости: Microsoft в&nbsp;одном из&nbsp;последних обновлений добавил поддержку нескольких вкладок. Теперь не&nbsp;нужно в&nbsp;течение дня&nbsp;держать открытыми 100500+ окон Проводника. Приятно, что&nbsp;для&nbsp;работы со&nbsp;вкладками используется точно такой же&nbsp;набор хоткеев, что&nbsp;и&nbsp;для&nbsp;Chrome:<span> </span><code>Ctrl + T</code><span> </span>открывает новую вкладку,<span> </span><code>Ctrl + N</code><span> </span>открывает новое окно,<span> </span><code>Ctrl + {цифра от&nbsp;1 до&nbsp;9}</code><span> </span>осуществляет быстрый переход на&nbsp;соответствующую вкладку,<span> </span><code>Ctrl + Tab</code><span> </span>переходит на&nbsp;следующую вкладку,<span> </span><code>Ctrl + Shift + Tab</code><span> </span>переходит на&nbsp;предыдущую вкладку, а<span> </span><code>Ctrl + W</code><span> </span>закрывает текущую вкладку.</p>
<p>Разберем еще&nbsp;несколько горячих клавиш. Например, чтобы быстро создать новую папку, можно использовать сочетание клавиш<span> </span><code>Ctrl + Shift + N</code>. Если нужно исправить имя&nbsp;файла, то&nbsp;достаточно нажать клавишу<span> </span><code>F2</code>. Для&nbsp;открытия свойств файла/папки, можно использовать сочетание<span> </span><code>Alt + Enter</code>. Чтобы вернуться к&nbsp;предыдущей папке (назад по&nbsp;истории), используем<span> </span><code>Backspace</code>. Также навигация по&nbsp;истории доступна комбинацией<span> </span><code>Alt + {стрелка влево/вправо}</code>.</p>
<p>Если в&nbsp;папке стоит сортировка файлов по&nbsp;имени, и&nbsp;вы&nbsp;только что&nbsp;переименовали файлик, то&nbsp;он&nbsp;сразу же&nbsp;не&nbsp;переместится на&nbsp;нужное место. В&nbsp;этом случае поможет клавиша<span> </span><code>F5</code><span> </span>– она&nbsp;позволяет обновить страницу с&nbsp;текущей папкой. </p>
<p>Бывает ситуация, когда в&nbsp;текущей папке много файлов/папок, но&nbsp;известно имя&nbsp;целевого файла/папки – в&nbsp;этом случае можно ввести первую букву имени и&nbsp;быстро перевести курсор к&nbsp;элементам, начинающимся с&nbsp;этой буквы.</p>
<p>Если есть необходимость скопировать полный путь до&nbsp;файла, то&nbsp;достаточно нажать сочетание<span> </span><code>Ctrl + Shift + C</code>, либо сделать это&nbsp;через контекстное меню: пункт «Копировать как&nbsp;путь».</p>
<p>Из неожиданного: в&nbsp;Проводнике можно открыть старую-добрую консоль в&nbsp;текущей папке. Для&nbsp;этого в&nbsp;строку текущего пути достаточно ввести<span> </span><code>cmd</code>.</p>
<p>Древней и&nbsp;классной фишкой Проводника является возможность закрепить любую папку в&nbsp;панели быстрого доступа, которая находится слева. Для&nbsp;этого необходимо на&nbsp;нужной папке вызвать контекстное меню и&nbsp;выбрать пункт «Закрепить на&nbsp;панели быстрого доступа». Таким образом, например, можно закрепить папку со&nbsp;своим проектом.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3126/18-&#x437;&#x430;&#x43A;&#x440;&#x435;&#x43F;&#x43B;&#x435;&#x43D;&#x438;&#x435;-&#x43F;&#x430;&#x43F;&#x43A;&#x438;-&#x432;-&#x43F;&#x440;&#x43E;&#x432;&#x43E;&#x434;&#x43D;&#x438;&#x43A;&#x435;.gif"
         alt=""
         itemprop="">


        <figcaption>
            Закрепление папки в&nbsp;Проводнике
        </figcaption>
</figure>

<p>Ознакомиться со&nbsp;списком быстрых клавиш для&nbsp;Проводника (и&nbsp;не&nbsp;только) можно вот<span> </span><a href="https://support.microsoft.com/ru-ru/windows/%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D1%88-%D0%B2-windows-dcc61a57-8ff0-cffe-9796-cb9706c75eec">тут</a>.</p>
<h2>Панель задач Windows</h2>
<p>У каждого человека есть набор приложений, которыми он&nbsp;пользуется ежедневно. Также есть набор приложений, которые нужны несколько раз&nbsp;в&nbsp;неделю. Есть возможность ускорить работу с&nbsp;часто используемыми приложениями – просто закрепите их&nbsp;на&nbsp;панели задач (панель снизу, на&nbsp;которой расположены иконки приложений и&nbsp;«Пуск»). Для&nbsp;этого нужно нажать правой кнопкой мыши на&nbsp;открытом приложении и&nbsp;выбрать пункт «Закрепить на&nbsp;панели задач». Приложение закрепится на&nbsp;том&nbsp;же&nbsp;месте, где&nbsp;оно&nbsp;находилось, но&nbsp;есть возможность перенести его&nbsp;в&nbsp;любое другое. После этого приложение будет всегда открываться на&nbsp;одном месте и&nbsp;вам&nbsp;будет проще его&nbsp;найти. Более того, если вы&nbsp;запомните расположение приложений, то&nbsp;с&nbsp;помощью хоткея<span> </span><code>Win + {цифра от&nbsp;1 до&nbsp;0}</code><span> </span>можно быстро переключаться/запускать соответствующее по&nbsp;порядку приложение (цифра 0 является десятым по&nbsp;счету приложением). А&nbsp;если все&nbsp;необходимые приложения закреплены, то&nbsp;они&nbsp;всегда будут на&nbsp;одном и&nbsp;том&nbsp;же&nbsp;месте!</p>
<p>Более редкие приложения имеет смысл закрепить в&nbsp;меню «Пуск». Для&nbsp;этого достаточно найти нужное приложение, вызвать контекстное меню и&nbsp;выбрать пункт «Закрепить на&nbsp;начальном экране».</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3131/21-&#x442;&#x430;&#x441;&#x43A;-&#x431;&#x430;&#x440;-&#x438;-&#x43C;&#x435;&#x43D;&#x44E;-&#x43F;&#x443;&#x441;&#x43A;&#x430;.png"
         alt=""
         itemprop="">


        <figcaption>
            Закрепление частых программ в&nbsp;панели задач
        </figcaption>
</figure>

<h2>Уведомления Windows</h2>
<p>Иногда нужно сконцентрироваться на&nbsp;работе на&nbsp;некоторое время – в&nbsp;этом случае можно временно отключить уведомления приложений. Для&nbsp;этого нужно кликнуть на&nbsp;уведомления в&nbsp;нижнем правом углу, выбрать необходимое время и&nbsp;нажать кнопку «Фокусировка».</p>
<p>А если необходимо полностью отключить уведомления на&nbsp;неопределенное время, то&nbsp;можно использовать кнопку «Не беспокоить». Это&nbsp;может быть полезно в&nbsp;сценарии, когда вы&nbsp;делаете воркшоп и&nbsp;шарите весь экран – в&nbsp;этом случае не&nbsp;хочется, чтобы лишние уведомления появлялись в&nbsp;этот момент на&nbsp;экране.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3130/20-&#x444;&#x43E;&#x43A;&#x443;&#x441;&#x438;&#x440;&#x43E;&#x432;&#x43A;&#x430;-&#x432;&#x43D;&#x438;&#x43C;&#x430;&#x43D;&#x438;&#x44F;-&#x432;-&#x43D;&#x43E;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x44F;&#x445;.png"
         alt=""
         itemprop="">


        <figcaption>
            Временное отключение уведомлений в&nbsp;Windows
        </figcaption>
</figure>

<h2>Punto Switcher</h2>
<p><a href="https://yandex.ru/soft/punto/win/"><u>Punto Switcher</u></a><span> </span>– это&nbsp;удобная тулза для&nbsp;тех, кому постоянно нужно переключаться между раскладками клавиатуры. Продукту уже&nbsp;много лет, но&nbsp;не&nbsp;все&nbsp;его&nbsp;используют. Да, при&nbsp;условии печатания вслепую, конечно, сразу замечаешь, что&nbsp;вместо нужных слов, не&nbsp;переключив раскладку, начинаешь печатать околесицу. Однако даже если непрожатая смена раскладки была замечена на&nbsp;первой паре букв, все&nbsp;равно нужно совершать микродействия, чтобы откатиться, переключиться и&nbsp;начать заново. А&nbsp;если напечатал целое предложение в&nbsp;другой раскладке? Не&nbsp;перепечатывать ведь его&nbsp;полностью 😢 «Из коробки» в&nbsp;Punto Switcher также есть автоисправление регистра.</p>

<div class="umb-macro-highlights">
    <strong>Дисклеймер:</strong>
    Могут возникнуть вопросы по&nbsp;поводу безопасности использования Punto Switcher-а, так&nbsp;как&nbsp;он&nbsp;может куда&#8209;то&nbsp;отправлять введенные на&nbsp;клавиатуре данные. В&nbsp;этом случае можно ограничить доступ этой программы к&nbsp;интернету через Брандмауэр Windows или&nbsp;антивирус.
</div>



<figure class="umb-macro-image">
    


    <img src="/Media/3110/6-&#x43F;&#x435;&#x440;&#x435;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;-&#x440;&#x430;&#x441;&#x43A;&#x43B;&#x430;&#x434;&#x43A;&#x438;-&#x432;-puntoswitcher.gif"
         alt=""
         itemprop="">


        <figcaption>
            Переключение раскладки Punto Switcher-ом
        </figcaption>
</figure>

<p><span>Удобство Punto Switcher за&nbsp;рамками его&nbsp;основной функциональности еще&nbsp;и&nbsp;в&nbsp;том, что&nbsp;его&nbsp;можно гибко настроить. Кажется, что&nbsp;все, кто&nbsp;пробовал этот инструмент, а&nbsp;потом подгорел и&nbsp;бросил, просто не&nbsp;смогли удобно сконфигурировать его&nbsp;под&nbsp;себя. Однозначно нужно задать программы-исключения, для&nbsp;которых автосвитч работать не&nbsp;будет (например IDE&nbsp;или&nbsp;игры).</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/3117/7-&#x43D;&#x430;&#x441;&#x442;&#x43E;&#x439;&#x43A;&#x438;-puntoswitcher.png"
         alt=""
         itemprop="">


        <figcaption>
            Исключение программ в&nbsp;Punto Switcher
        </figcaption>
</figure>



<figure class="umb-macro-image">
    


    <img src="/Media/3118/8-&#x43D;&#x430;&#x441;&#x442;&#x43E;&#x439;&#x43A;&#x438;-puntoswitcher-2.png"
         alt=""
         itemprop="">


        <figcaption>
            Правила переключения в&nbsp;Punto Switcher
        </figcaption>
</figure>

<p><span>Также можно вручную вызвать изменение языка даже в&nbsp;тех&nbsp;программах, которые добавлены в&nbsp;исключение. Например, когда в&nbsp;коде нужно написать комментарий на&nbsp;русском языке, то&nbsp;часто забываешь переключить раскладку. В&nbsp;этом случае можно перевести раскладку только что&nbsp;напечатанного текста хоткеем </span><code>Pause Break</code><span>, либо выделить нужный текст и&nbsp;использовать хоткей </span><code>Shift + Pause Break</code><span>. Клавиша </span><code>Pause Break</code><span> используется по&nbsp;умолчанию, но&nbsp;в&nbsp;настройках ее&nbsp;можно сменить на&nbsp;другую.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/3116/9-&#x43F;&#x440;&#x438;&#x43D;&#x443;&#x434;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x435;-&#x43F;&#x435;&#x440;&#x435;&#x43A;&#x43B;&#x44E;&#x447;&#x435;&#x43D;&#x438;&#x435;-&#x440;&#x430;&#x441;&#x43A;&#x43B;&#x430;&#x434;&#x43A;&#x438;.gif"
         alt=""
         itemprop="">


        <figcaption>
            Переключение раскладки для&nbsp;выбранного текста
        </figcaption>
</figure>

<p><span>Еще один вариант помощи с&nbsp;раскладкой – это&nbsp;достаточно древняя настройка для&nbsp;Windows – привязка раскладки к&nbsp;текущему окну. Это&nbsp;очень удобно, когда вы&nbsp;программируете в&nbsp;IDE&nbsp;и&nbsp;используете в&nbsp;ней&nbsp;английскую раскладку, а&nbsp;в&nbsp;рабочем чате используете русскую раскладку. Тогда при&nbsp;переключении между этими окнами не&nbsp;придется переключать раскладку. Это&nbsp;включается в&nbsp;настройках Windows следующим образом: <strong>Параметры &gt; Время и&nbsp;язык &gt; Ввод &gt; Дополнительные параметры клавиатуры &gt; Позволить выбрать метод ввода для&nbsp;каждого окна приложения.</strong></span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/3137/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-04-02_132903618.png"
         alt=""
         itemprop="">


        <figcaption>
            Настройки привязки раскладки
        </figcaption>
</figure>

<h2>Автозапуск</h2>
<p>Ускорение рабочего процесса начинается сразу со&nbsp;включения компьютера. Чтобы начать работать, мне&nbsp;нужно запустить ряд&nbsp;программ, а&nbsp;в&nbsp;некоторых из&nbsp;них&nbsp;сразу запустить определенные процессы. Часть программ не&nbsp;поддерживает автоматический запуск  «из коробки», а&nbsp;для&nbsp;другой части нужно указать конкретные настройки. Чтобы каждое утро не&nbsp;клацать мышкой, дозапуская все&nbsp;окружение вручную, я&nbsp;настроил автозапуск для&nbsp;следующих программ:</p>
<ul>
<li>Google Chrome с&nbsp;четырьмя вкладками: Google Почта, Google Календарь, Harvest и&nbsp;рабочая Jira;</li>
<li>Корпоративный Google Чат;</li>
<li>Fork (IDE&nbsp;для&nbsp;репозитория на&nbsp;GIT);</li>
<li>Rider (IDE&nbsp;для&nbsp;разработки на&nbsp;стеке .Net);</li>
<li>OpenVPN с&nbsp;автоматическим подключением к&nbsp;рабочему VPN.</li>
</ul>
<p>Для этого можно открыть Диспетчер задач (<code>Ctrl + Shift + Esc</code>), перейти на&nbsp;вкладку «Автозагрузка приложений», нажать кнопку «Запустить новую задачу», ввести команду<span> </span><code>shell:startup</code><span> </span>и выполнить. Откроется папка, в&nbsp;которую можно добавлять ярлыки любых приложений.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3111/1-&#x43F;&#x430;&#x43F;&#x43A;&#x430;-startup.png"
         alt=""
         itemprop="">


        <figcaption>
            Содержимое папки Startup
        </figcaption>
</figure>

<p>Например, в&nbsp;папку автозапуска можно добавить Chrome. Если у&nbsp;вас&nbsp;несколько аккаунтов, то&nbsp;можно запустить конкретный аккаунт, задав параметр «--profile-directory» в&nbsp;параметрах ярлыка.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3112/2-&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;-&#x445;&#x440;&#x43E;&#x43C;&#x430;-&#x441;-&#x43D;&#x443;&#x436;&#x43D;&#x44B;&#x43C;-&#x43F;&#x440;&#x43E;&#x444;&#x438;&#x43B;&#x435;&#x43C;.png"
         alt=""
         itemprop="">


        <figcaption>
            Ярлык запуска Chrome с&nbsp;определенным аккаунтом
        </figcaption>
</figure>

<p><a href="https://openvpn.net/community-downloads/">OpenVPN Community</a><span> я&nbsp;использую для&nbsp;подключения к&nbsp;сети заказчика. Его&nbsp;можно настроить так, чтобы он&nbsp;не&nbsp;требовал вашего участия для&nbsp;подключения к&nbsp;конкретному VPN. Для&nbsp;начала нужно добавить ярлык программы OpenVpn в&nbsp;папку автозагрузки и&nbsp;указать в&nbsp;параметре «--connect» имя&nbsp;необходимой конфигурации. Так, можно создать несколько ярлыков для&nbsp;автозагрузки с&nbsp;разными конфигурациями. Далее нужно вручную подключиться к&nbsp;VPN&nbsp;и&nbsp;при&nbsp;подключении запомнить логин и&nbsp;пароль. Последняя деталь – зайти в&nbsp;настройки OpenVpn, и&nbsp;на&nbsp;вкладке «Общие» включить «Тихое подключение», чтобы подключение происходило без&nbsp;вашего участия.</span></p>

<div class="umb-macro-highlights">
    <strong>Дисклеймер:</strong>
    Я&nbsp;провел небольшое исследование по&nbsp;поводу безопасности хранения паролей и&nbsp;пришел к&nbsp;выводу, что&nbsp;пароли хранятся в&nbsp;защищенном хранилище Windows для&nbsp;текущего пользователя. Но&nbsp;на&nbsp;официальном сайте я&nbsp;не&nbsp;смог найти достоверной информации об&nbsp;этом. Поэтому, если это&nbsp;критично для&nbsp;вас, то&nbsp;не&nbsp;используйте сохранение паролей.
</div>



<figure class="umb-macro-image">
    


    <img src="/Media/3114/4-&#x437;&#x430;&#x43F;&#x443;&#x441;&#x43A;-opevvpn-&#x441;-&#x43D;&#x443;&#x436;&#x43D;&#x43E;&#x439;-&#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x435;&#x439;.png"
         alt=""
         itemprop="">


        <figcaption>
            Ярлык запуска OpenVPN с&nbsp;подключением к&nbsp;определенному VPN&nbsp;
        </figcaption>
</figure>



<figure class="umb-macro-image">
    


    <img src="/Media/3115/5-&#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x438;-openvpn.png"
         alt=""
         itemprop="">


        <figcaption>
            Настройки OpenVpn
        </figcaption>
</figure>

<h2>Microsoft Power Toys</h2>
<p>Чтобы сделать свою работу гибче и&nbsp;удобнее, можно воспользоваться набором расширений для&nbsp;Windows под&nbsp;названием<span> </span><a href="https://learn.microsoft.com/ru-ru/windows/powertoys/install"><u>Power Toys</u></a>. Среди них&nbsp;вы&nbsp;найдете самые разные штуковины, поддерживающие и&nbsp;упрощающие рабочую рутину. Например есть цветоподборщик с&nbsp;возможностью настройки отображения цветов и&nbsp;палитр, который будет полезен для&nbsp;фронтедеров. Другой пример – шаблоны разделения экрана FancyZones, с&nbsp;которым просто сегментировать большие дисплеи на&nbsp;рабочие зоны под&nbsp;свои нужды. Есть также классные штуки для&nbsp;быстрого переименования файлов, быстрого запуска приложений.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3122/13-powertoys-&#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A;-&#x432;&#x441;&#x435;&#x445;-&#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x439;.png"
         alt=""
         itemprop="">


        <figcaption>
            Набор инструментов в&nbsp;Power Toys
        </figcaption>
</figure>


<div class="text-highlight">
  Если вы&nbsp;когда&#8209;то&nbsp;делали пранк по&nbsp;перемешиванию кнопок на&nbsp;клавиатуре и&nbsp;хотите повторить этот чудесный опыт, то&nbsp;для&nbsp;вас&nbsp;есть хорошие новости: с&nbsp;помощью Диспетчера клавиатуры можно поменять назначения клавиш или&nbsp;заменить хоткей Ctrl + C&nbsp;на&nbsp;Ctrl + V. Подсказка: лучше менять местами всего пару букв, стоящих рядом – так&nbsp;человек не&nbsp;сразу поймет, что&nbsp;происходит 🙂 Но&nbsp;есть и&nbsp;полезные сценарии: можно настроить действие «Play/Pause Media» на&nbsp;клавишу Scroll Lock или&nbsp;отключить кнопку Caps Lock.
</div>



<figure class="umb-macro-image">
    


    <img src="/Media/3123/14-&#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;-&#x43A;&#x43B;&#x430;&#x432;&#x438;&#x448;-&#x434;&#x43B;&#x44F;-&#x43F;&#x440;&#x430;&#x43D;&#x43A;&#x430;.png"
         alt=""
         itemprop="">


        <figcaption>
            Изменения привязки клавиш
        </figcaption>
</figure>



<figure class="umb-macro-image">
    


    <img src="/Media/3124/15-&#x43F;&#x435;&#x440;&#x435;&#x43D;&#x430;&#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x435;-&#x43A;&#x43B;&#x430;&#x432;&#x438;&#x448;-&#x434;&#x43B;&#x44F;-&#x43F;&#x440;&#x430;&#x43D;&#x43A;&#x430;-&#x432;&#x438;&#x434;&#x435;&#x43E;.gif"
         alt=""
         itemprop="">


</figure>

<p><span>В наборе инструментов есть еще&nbsp;одно полезное приложение – «Обзор». Оно&nbsp;включает быстрый просмотр файлов в&nbsp;Проводнике по&nbsp;сочетанию клавиш </span><code>Ctrl + Пробел</code><span>. Таким образом, можно быстро просмотреть картинку или&nbsp;текстовый файл, не&nbsp;открывая соответствующее приложение.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/3125/16-&#x431;&#x44B;&#x441;&#x442;&#x440;&#x44B;&#x439;-&#x43F;&#x440;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;-&#x444;&#x430;&#x439;&#x43B;&#x43E;&#x432;-&#x432;-&#x43F;&#x440;&#x43E;&#x432;&#x43E;&#x434;&#x43D;&#x438;&#x43A;&#x435;.gif"
         alt=""
         itemprop="">


        <figcaption>
            Быстрый просмотр файла в&nbsp;Проводнике
        </figcaption>
</figure>

<h2>WinMerge</h2>
<p>Если нужно сравнить два&nbsp;файла одного формата, то&nbsp;удобно делать это&nbsp;через<span> </span><a href="https://winmerge.org/"><u>WinMerge</u></a>. Инструмент позволяет быстро сравнить один с&nbsp;другим и&nbsp;выявить отличия. Можно и&nbsp;скопировать контент в&nbsp;интерфейс, и&nbsp;загрузить файлы для&nbsp;сравнения целиком. Не&nbsp;нужно выискивать ничего глазами. Например можно скопировать данные из&nbsp;двух excel-документов и&nbsp;найти все&nbsp;различия. «Из коробки», в&nbsp;том&nbsp;числе есть поддержка сравнения csv-файлов – данные из&nbsp;них&nbsp;будут красиво отформатированы в&nbsp;виде таблицы.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3127/17-winmerge.png"
         alt=""
         itemprop="">


        <figcaption>
            Поиск различий в&nbsp;csv-файлах через WinMerge
        </figcaption>
</figure>

<p>Для этих же&nbsp;целей есть и&nbsp;онлайн-вьюшки, но&nbsp;по&nbsp;соображениям безопасности мы&nbsp;такими не&nbsp;пользуемся. Да&nbsp;и&nbsp;в&nbsp;онлайне можно не&nbsp;получить возможности доформатировать найденные различия.</p>
<h2>Полезности для&nbsp;разработчиков</h2>
<h3>Fork</h3>
<p><a href="https://git-fork.com/"><u>Fork</u></a><span> </span>– это&nbsp;клиент для&nbsp;GIT-репозиториев. Это&nbsp;платный инструмент, который с&nbsp;некоторыми оговорками доступен для&nbsp;бесплатного пользования (пояснение ниже). В&nbsp;нем&nbsp;есть все&nbsp;GIT-фичи, позволяющие выполнять стандартные команды более наглядно и&nbsp;быстро. Из&nbsp;классного – есть автофетч. Его&nbsp;удобно использовать для&nbsp;Code Review – Fork каждую минуту затягивает информацию о&nbsp;новых комитах, поэтому, когда вам&nbsp;скинули задачу на&nbsp;ревью, можно моментально встать на&nbsp;последние изменения.</p>

<div class="text-highlight">
  На&nbsp;главной странице Fork&#8209;а&nbsp;написано, что&nbsp;программа платная и&nbsp;на&nbsp;данный момент стоит 59.99$. Но&nbsp;купить из&nbsp;России ее&nbsp;не&nbsp;получится – нужен Vpn&nbsp;и&nbsp;скорее всего зарубежная карта. На&nbsp;самом деле программа является условно платной, прямо как&nbsp;WinRar. Ее&nbsp;можно установить, начнется пробный период и&nbsp;раз&nbsp;в&nbsp;несколько недель будет появляться окно с&nbsp;просьбой о&nbsp;покупке. При&nbsp;этом никакого ограничения функциональности не&nbsp;будет. Себе я&nbsp;лицензию купил несколько лет&nbsp;назад, потому что&nbsp;Fork действительно крутой инструмент.
</div>



<figure class="umb-macro-image">
    


    <img src="/Media/3132/22-fork.png"
         alt=""
         itemprop="">


        <figcaption>
            Работа с&nbsp;репозиторием через Fork
        </figcaption>
</figure>

<h3>Remote Desktop Manager</h3>
<p><a href="https://devolutions.net/remote-desktop-manager/">Remote Desktop Manager</a><span> </span>незаменимая вещь для&nbsp;тех, кому приходится постоянно подключаться к&nbsp;удаленным рабочим столам. Программа поддерживает подключение к&nbsp;Windows и&nbsp;Unix-системам, а&nbsp;также интегрируется с&nbsp;широким набором технологий/протоколов (например FTP). В&nbsp;ней&nbsp;можно сохранять все&nbsp;данные подключения, в&nbsp;том&nbsp;числе логин и&nbsp;пароль, что&nbsp;особенно актуально в&nbsp;случае с&nbsp;Unix-системами. Все&nbsp;окна с&nbsp;активными сессиями открываются внутри программы, поэтому между ними удобно переключаться. Есть возможность группировать подключения по&nbsp;папкам и&nbsp;многое другое. Разработчики гарантируют<span> </span><a href="https://docs.devolutions.net/rdm/overview/security/">безопасность хранения паролей</a>.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3138/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-04-02_143312559.png"
         alt=""
         itemprop="">


        <figcaption>
            Remote Desktop Manager
        </figcaption>
</figure>

<h3>Ngrok </h3>
<p><a href="https://ngrok.com/"><u>Ngrok</u></a><span> </span>– тулза, позволяющая прокинуть локальный сервис в&nbsp;интернет. Может быть полезно, когда на&nbsp;компьютере разработчика надо протестировать интеграцию. Например, если сервис присылает колбэки, то&nbsp;на&nbsp;свой компьютер их&nbsp;никак не&nbsp;принять. Ngrok позволяет сгенерировать URL, который можно будет сконфигурировать в&nbsp;тестовой среде сервиса и&nbsp;потом принимать колбеки.<span> </span><strong>Однако ни&nbsp;в&nbsp;коем случае не&nbsp;используйте эту&nbsp;штуку на&nbsp;проде, не&nbsp;забывайте про&nbsp;безопасность!</strong><span> </span>На стейджинге также лучше не&nbsp;использовать.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3128/23-ngrok.png"
         alt=""
         itemprop="">


        <figcaption>
            Прокидывание локального сервиса в&nbsp;интернет через Ngrok
        </figcaption>
</figure>

<h3>Расширения для&nbsp;Docker Desktop</h3>
<p>Многие пользуются докером для&nbsp;локальной разработки. В&nbsp;последнее время команда разработки<span> </span><a href="https://www.docker.com/products/docker-desktop/"><u>Docker Desktop</u></a><span> </span>проделала большую работу над&nbsp;функциональностью приложения.</p>
<p>Уже довольно давно в&nbsp;Docker Desktop появилась поддержка расширений. Одним из&nbsp;самых полезных является «Disk usage» – в&nbsp;нем&nbsp;в&nbsp;пару кликов можно удалять ненужные данные, например неиспользуемые образы или&nbsp;build-кэш. Но&nbsp;если у&nbsp;вас&nbsp;интеграция через WSL, то&nbsp;после очистки место на&nbsp;диске может не&nbsp;освободиться, так&nbsp;как&nbsp;WSL&nbsp;использует виртуальный диск. Тогда можно настроить «разреженный» режим для&nbsp;виртуального диска (для&nbsp;WSL&nbsp;версии 2.0 и&nbsp;выше):</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3139/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-04-02_144200446.png"
         alt=""
         itemprop="">


</figure>

<h3>Windows Subsystem for&nbsp;Linux (WSL)</h3>
<p><a href="https://learn.microsoft.com/ru-ru/windows/wsl/about">WSL</a><span> </span>– это&nbsp;классная и&nbsp;удобная штука, но&nbsp;хотелось бы&nbsp;контролировать ее&nbsp;ресурсы. Многим знакома ситуация, когда запущенные docker-контейнеры выжирают всю&nbsp;оперативную память или&nbsp;проц уходит в&nbsp;100%. Особенно это&nbsp;заметно при&nbsp;разработке на&nbsp;ноутбуке. Для&nbsp;контроля ресурсов (и&nbsp;не&nbsp;только) существует возможность настройки WSL&nbsp;с&nbsp;помощью файла «.wslconfig», который лежит в&nbsp;папке текущего пользователя<span> </span><code>(%USERPROFILE%)</code>. Например с&nbsp;помощью следующих настроек можно ограничить использование памяти и&nbsp;процессора, а&nbsp;также настроить «разреженный» режим для&nbsp;всех виртуальных дисков:</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3140/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-04-02_144259151.png"
         alt=""
         itemprop="">


</figure>

<p>Найти все&nbsp;доступные настройки можно вот<span> </span><a href="https://learn.microsoft.com/en-gb/windows/wsl/wsl-config"><u>тут</u></a>.</p>
<p>Кстати, если вы&nbsp;активно используете Docker через WSL, то&nbsp;в&nbsp;Проводнике есть доступ к&nbsp;файловой подсистеме Linux дистрибутива. Очень удобно, если нужно просмотреть/подредактировать какие&#8209;то&nbsp;файлы.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3141/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-04-02_144418490.png"
         alt=""
         itemprop="">


</figure>

<p><span>Все эти&nbsp;фишки увеличивают производительность труда 📈 и&nbsp;сохраняют нервные клетки, которые, как&nbsp;известно, не&nbsp;восстанавливаются 💊</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/3133/1920x1080.png"
         alt=""
         itemprop="">


</figure>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Бенчмаркинг в .NET: как и зачем измерять производительность
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Что такое бенчмаркинг кода, зачем он нужен и как с его помощью оценить производительность C# проекта — разбираемся на практике.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/code-benchmarking/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/code-benchmarking/</guid>

                <pubDate>Fri, 16 May 2025 06:22:11 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Бенчмаркинг в .NET: как и зачем измерять производительность</h1>
                                <figure>
                                    <img src="/Media/ph4dponq/chatgpt-image-&#x43D;&#x430;&#x441;&#x442;&#x44F;-3d-render-apr-2-2025.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/953ab6c2053f61df0f38f0e8f334b438"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3d9598bb9b8a484e807082a15465e4b1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Итак, у&nbsp; вас&nbsp;есть решение какой&#8209;то&nbsp;задачи. И&nbsp; теперь вам&nbsp;нужно оценить оптимальность этого решения c&nbsp; точки зрения производительности. Самый очевидный вариант — использовать <a href="https://docs.microsoft.com/ru-ru/dotnet/api/system.diagnostics.stopwatch?view=net-6.0" title="Stopwatch Класс" data-anchor="?view=net-6.0">StopWatch</a> вот&nbsp;таким образом:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2713/1.png" alt="" itemprop="">


</figure>

<p> </p>
<p>Но с&nbsp; этим методом есть сразу несколько проблем:</p>
<ul>
<li>Он довольно не&nbsp; точен, поскольку оцениваемый код&nbsp;выполняется только один раз, и&nbsp; на&nbsp; время этого выполнения могут влиять различные сайд-эффекты (жёсткий диск, не&nbsp; прогретый кэш&nbsp;и&nbsp; переключение контекста процессора, другие приложения и&nbsp; т.д.).</li>
<li>Он не&nbsp; заставляет вас&nbsp;проверять приложение в&nbsp; Production-режиме. Во&nbsp; время компиляции <a rel="noopener" href="https://docs.microsoft.com/ru-ru/archive/msdn-magazine/2015/february/compilers-what-every-programmer-should-know-about-compiler-optimizations" target="_blank">значительная часть кода оптимизируется автоматически</a>, без&nbsp;нашего участия, и&nbsp; это&nbsp;может серьезно повлиять на&nbsp; финальный результат.</li>
<li>Ваш алгоритм может хорошо показать себя на&nbsp; маленьком наборе данных, но&nbsp; выдать недостаточную производительность на&nbsp; большом (или&nbsp;наоборот). Поэтому, чтобы проверить производительность в&nbsp; разных ситуациях с&nbsp; разными наборами данных, вам&nbsp;придется писать отдельный код&nbsp;для&nbsp;каждой из&nbsp; них.</li>
</ul>
<p>И какие же&nbsp;у&nbsp; нас&nbsp;есть другие варианты? Как&nbsp;правильно оценить производительность нашего кода? На&nbsp; помощь в&nbsp; этой ситуации нам&nbsp;придет <a rel="noopener" href="https://benchmarkdotnet.org/articles/overview.html" target="_blank">BenchmarkDotNet</a>.</p>
<h2>Настройка бенчмарка</h2>
<p>BenchmarkDotNet — это&nbsp;NuGet-пакет, который можно установить на&nbsp; любой тип&nbsp;приложения, а&nbsp; затем с&nbsp; его&nbsp;помощью оценить скорость выполнения кода. Для&nbsp;этого нам&nbsp;потребуется всего лишь две&nbsp;вещи — класс, который будет выполнять бенчмаркинг кода, и&nbsp; способ запустить runner для&nbsp;его&nbsp;выполнения.</p>
<p> </p>
<p>Вот как&nbsp;будет выглядеть класс для&nbsp;бенчмаркинга в&nbsp; простейшем виде:</p>
<p><img src="" alt=""></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2714/2.png" alt="" itemprop="">


</figure>

<p> </p>
<p>Давайте разбираться, что&nbsp;у&nbsp; нас&nbsp;в&nbsp; этом классе есть. Начнем с&nbsp; атрибутов класса.</p>
<p><em><strong>MemoryDiagnoser</strong></em> собирает информацию о&nbsp; работе Garbage Collector-а и&nbsp; выделяемой памяти во&nbsp; время выполнения вашего кода.</p>
<p><em><strong>Orderer</strong></em> определяет порядок вывода финальных результатов в&nbsp; таблице. В&nbsp; нашем случае стоит FastestToSlowest. Это&nbsp;значит, что&nbsp;самый быстрый вариант кода будет первым в&nbsp; результатах, а&nbsp; самый медленный — последним.</p>
<p><em><strong>RankColumn</strong></em> добавляет колонку в&nbsp; финальный отчёт и&nbsp; нумерует результаты от&nbsp; 1 до&nbsp; Х.</p>
<p>На самом методе у&nbsp; нас&nbsp;добавлен атрибут <em><strong>Benchmark</strong></em>. Он&nbsp; помечает метод, как&nbsp;один из&nbsp; тестовых кейсов, который нужно проверить. А&nbsp; параметр<em><strong> Baseline=true</strong></em> говорит, что&nbsp;производительность этого метода мы&nbsp; будем считать за&nbsp; 100%. А&nbsp; затем уже&nbsp;относительно него будем оценивать другие варианты алгоритмов.</p>
<p>Чтобы запустить бенчмарк нам&nbsp;необходима вторая часть пазла — Runner. С&nbsp; ним&nbsp;всё&nbsp;просто: идём в&nbsp; наш&nbsp;<em><strong>Program.cs</strong></em> (мы&nbsp; всё&nbsp;ещё&nbsp;говорим о&nbsp; консольном приложении) и&nbsp; добавляем одну строчку с&nbsp; <em><strong>BenchmarkRunner</strong></em>:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2715/3.png" alt="" itemprop="">


</figure>

<p> </p>
<p>После этого мы&nbsp; можем собрать наше приложение в&nbsp; Production-режиме и&nbsp; запустить код&nbsp;на&nbsp; выполнение.</p>
<h2>Анализ результатов</h2>
<p>Если выше мы&nbsp; всё&nbsp;сделали правильно, то&nbsp; после запуска мы&nbsp; увидим, как&nbsp;<em><strong>BenchmarkRunner</strong></em> выполняет наш&nbsp;код&nbsp;множество раз&nbsp;и&nbsp; в&nbsp; конце выдает вот&nbsp;такой отчет:</p>
<p><img src="" alt=""></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2716/4.png" alt="" itemprop="">


</figure>


<div class="umb-macro-highlights">
    <strong>Важно:</strong>
    любые аномальные выполнения кода (которые были сильно быстрее или&nbsp;сильно медленнее среднего выполнения) будут отсекаться из&nbsp;финального отчета. Отсечённые аномалии можно будет увидеть ниже под&nbsp;под&nbsp;результирующей таблицей.
</div>

<p>В отчёте довольно много данных о&nbsp; производительности кода, версии ОС, на&nbsp; которой выполнялся тест, об&nbsp; используемом процессоре и&nbsp; версии .Net. Но&nbsp; основная информация, которая нам&nbsp;интересна, — это&nbsp;последняя табличка. В&nbsp; ней&nbsp;мы&nbsp; видим:</p>
<ul>
<li>Mean — среднее время, за&nbsp; которое выполняется наш&nbsp;код;</li>
<li>Error — ошибку оценки (половина от&nbsp; 99.9 перцентиля);</li>
<li>StdDev — стандартное отклонение оценки;</li>
<li>Ratio — оценка в&nbsp; процентах улучшения или&nbsp;ухудшения производительности относительно Baseline — базового метода, который мы&nbsp; считаем за&nbsp; точку отсчёта (помните Baseline=true выше?);</li>
<li>Rank — ранкинг;</li>
<li>Allocated — выделенная память во&nbsp; время выполнения нашего метода.</li>
</ul>
<h2>Реальный тест</h2>
<p>Чтоб сделать финальные результаты чуть интереснее, давайте добавим ещё&nbsp;несколько вариантов нашего алгоритма и&nbsp; посмотрим, как&nbsp;изменятся результаты.</p>
<p>Теперь класс бенчмарка будет выглядеть таким образом:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2717/5.png" alt="" itemprop="">


</figure>

<p> </p>
<p>Наша задача сейчас — разобраться именно с&nbsp; бенчмаркингом. Сами алгоритмы, которые мы&nbsp; оцениваем, оставим пока в&nbsp; стороне — это&nbsp;тема для&nbsp;следующей статьи.</p>
<p>И вот&nbsp;результат выполнения такого бенчмаркинга:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2736/6.png" alt="" itemprop="">


</figure>

<p> </p>
<p>Тут мы&nbsp; видим что&nbsp;<em><strong>GetYearFromDateTime</strong></em>, который мы&nbsp; взяли за&nbsp; точку отсчёта, — самый медленный и&nbsp; выполняется порядка 218 наносекунд, в&nbsp; то&nbsp; время, как&nbsp;самый быстрый вариант <em><strong>GetYearFromSpanWithManualConversion</strong></em> требует всего лишь 6.2 наносекунды — в&nbsp; 35 раз&nbsp;быстрее, чем&nbsp;оригинальный метод.</p>
<p>Также мы&nbsp; можем видеть, сколько памяти было выделено для&nbsp;двух методов <em><strong>GetYearFromSplit</strong></em> и&nbsp; <em><strong>GetYearFromSubstring</strong></em>, и&nbsp; сколько времени потребовалось Garbage Collector-у на&nbsp; очистку этой памяти (что&nbsp;тоже снижает общую производительность системы).</p>
<h2>Работа с&nbsp; различными входными данными</h2>
<p>Напоследок я&nbsp; бы&nbsp;хотел рассказать о&nbsp; том, как&nbsp;можно оценивать результат работы своего алгоритма на&nbsp; больших и&nbsp; малых наборах данных. Для&nbsp;этого <em><strong>BenchmarkDotNe</strong></em>t предлагает нам&nbsp;два&nbsp;атрибута — <em><strong>Params</strong></em> и&nbsp; <em><strong>GlobalSetup</strong></em>.</p>
<p>Вот как&nbsp;будет выглядеть класс бенчмарка с&nbsp; использованием этих двух атрибутов:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2719/7.png" alt="" itemprop="">


</figure>

<p> </p>
<p>В нашем случае поле <em><strong>Size</strong></em> параметризованное и&nbsp; влияет на&nbsp; код, который выполняется в&nbsp; <em><strong>GlobalSetup</strong></em>.</p>
<p>В результате выполнения <em><strong>GlobalSetup</strong></em> у&nbsp; нас&nbsp;генерируется исходный массив из&nbsp; 10, 1000 и&nbsp; 10000 элементов для&nbsp;выполнения всех тестовых сценариев. Как&nbsp;я&nbsp; и&nbsp; говорил в&nbsp; начале статьи, некоторые алгоритмы могут вести себя эффективно только при&nbsp;большом или&nbsp;малом кол&#8209;ве&nbsp;элементов.</p>
<p>Попробуем выполнить такой бенчмарк и&nbsp; посмотрим на&nbsp; результаты:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2738/8.png" alt="" itemprop="">


</figure>

<p> </p>
<p>Тут мы&nbsp; уже&nbsp;чётко видим, как&nbsp;каждый метод был&nbsp;выполнен с&nbsp; 10, 1000 и&nbsp; 10000 элементами: метод <em><strong>Span</strong></em> лидирует вне&nbsp;зависимости от&nbsp; размерности входных данных, а&nbsp; метод <em><strong>NewArray</strong></em> работает все&nbsp;хуже и&nbsp; хуже с&nbsp; ростом количества данных.</p>
<h2>Графики</h2>
<p>Библиотека BenchmarkDotNet позволяет анализировать полученные данные не&nbsp;только в&nbsp;текстовом и&nbsp;табличном виде, но&nbsp;и&nbsp;в&nbsp;графическом - в&nbsp;виде графиков. </p>
<p>Для демонстрации мы&nbsp;создадим бенчмарк класс для&nbsp;измерения времени работы разных алгоритмов сортировки на&nbsp;платформе .NET8 и&nbsp;настроим его&nbsp;таким образом, чтобы он&nbsp;выполнился 3 раза для&nbsp;разного количества сортируемых элементов: 1000, 5000, 10000. Список используемых алгоритмов сортировки:</p>
<ul>
<li>DefaultSort - алгоритм сортировки, используемый по&nbsp;умолчанию в&nbsp;.NET8</li>
<li>InsertionSort - сортировка вставками</li>
<li>MergeSort - сортировка слиянием</li>
<li>QuickSort - быстрая сортировка</li>
<li>SelectSort - сортировка выбором</li>
</ul>
<p> </p>
<p><img src="/Media/3089/slide-16_9-123.png" alt=""></p>
<p> </p>
<p><span>В результате работы бенчмарка, мы&nbsp;получили </span><em>сводный результат в&nbsp;виде таблицы и&nbsp;графика:</em></p>
<p> </p>
<p><em><img src="/Media/3091/slide-16_9-125.png" alt=""></em></p>
<p> </p>
<p>Также BenchmarkDotNet сгенерировал графики по&nbsp;каждому бенчмарку отдельно (в&nbsp;нашем случае - по&nbsp;каждому алгоритму сортировки) в&nbsp;разрезе количества сортируемых элементов:</p>
<p><img src="/Media/3090/slide-16_9-124.png" alt=""></p>
<p> </p>
<h2>Заключение</h2>
<p>Итак, мы&nbsp; разобрались с&nbsp; основой работы с&nbsp; BenchmarkDotNet и&nbsp; тем, как&nbsp;он&nbsp; помогает нам&nbsp;оценивать результаты своей работы и&nbsp; принимать взвешенные решения — какой код&nbsp;оставить, а&nbsp; какой переписать или&nbsp;и&nbsp; вовсе удалить. Такой подход позволяет нам&nbsp;строить наиболее производительные системы, а&nbsp; значит — улучшать жизнь пользователей.</p>
<p> </p>
<hr>
<p><em><strong>Автор:</strong> Антон Воротынцев</em></p>
<p><em><strong>Редактура:</strong> Марина Медведева</em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как в 1.5 раза повысить производительность фронтенда высоконагруженного интернет-магазина на Next.js
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Разбираем кейс по ускорению крупного сайта и делимся полезными инструментами — пригодятся для повышения производительности и в ваших проектах.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/performance-boost/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/performance-boost/</guid>

                <pubDate>Tue, 06 May 2025 18:39:06 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как в 1.5 раза повысить производительность фронтенда высоконагруженного интернет-магазина на Next.js</h1>
                                <figure>
                                    <img src="/Media/u4mfvmdt/&#x43D;&#x430;&#x441;&#x442;&#x44F;-3d-&#x43C;&#x438;&#x43D;&#x438;&#x430;&#x442;&#x44E;&#x440;&#x430;-&#x430;&#x43F;&#x440;-2-2025.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6f5dfcc7d2c30a7675ddf5ba5db6e9a6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fa4c6051322c4bf7a117ff423b4fd8df"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Один из&nbsp;наших проектов – сайт крупной компании по&nbsp;продаже автозапчастей и&nbsp;комплектующих. Это&nbsp;интернет-магазин, аудитория которого насчитывает около 500 тысяч уникальных пользователей в&nbsp;месяц. Оптимизировать нужно было главную страницу этого интернет-магазина.</p>
<p>На сайте, на&nbsp;которым велась работа, используется<span> </span><a rel="noopener noreferrer nofollow" href="https://www.elastic.co/observability/application-performance-monitoring"><u>APM сервис elastic</u></a><span> </span>– система сбора метрик, согласно которым можно отследить производительность ресурса. Так&nbsp;как&nbsp;сайт долгое время не&nbsp;оптимизировался, а&nbsp;только дополнялся новыми фичами, показатели стали падать. </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/dafd46ee110741d3aba2c7e2c6ea5e9f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2973/slide-16_9-33.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c3bec17129f642efa219e58cb8175045"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Не все&nbsp;показатели пока удалось вытянуть в&nbsp;зеленую зону, но&nbsp;улучшение для&nbsp;многих из&nbsp;них&nbsp;получилось кратным. Пока дальнейшие работы планируются, расскажем, какие шаги предприняли для&nbsp;текущего результата.   </p>
<h3>TS-Prune</h3>
<p>Для начала используем<span> </span><a rel="noopener noreferrer nofollow" href="https://www.bam.tech/article/seek-and-destroy-dead-code-for-good-a-strategy-using-ts-prune"><u>сервис</u></a>, который позволяет быстро найти мертвые экспорты или&nbsp;код&nbsp;в&nbsp;проекте.</p>
<p>Пример команды для&nbsp;package.json:</p>
<pre><code class="language-javascript">
"deadcode-check": "npx --yes ts-"deadcode-check": "npx --yes ts-prune -s \"pages/[**/]?
(_app|_document|_error|index)|store/(index|sagas)|styles/global\""<br><br></code></pre>
<p>Такой результат получаем:</p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/112f8fa5b12c4c5e8294eaa635258095"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2980/frame-431.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b7124dd43d114d58b6991983c43e7f10"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>После отработки в&nbsp;консоле будет список проблемных мест. По&nbsp;ним&nbsp;проходимся вручную и&nbsp;удаляем мертвые сегменты. </p>
<h3>Depcheck</h3>
<p>Есть и<span> </span><a rel="noopener noreferrer nofollow" href="https://www.npmjs.com/package/depcheck"><u>другой пакет для&nbsp;оптимизации</u></a>. С&nbsp;его&nbsp;помощью получаем список неиспользуемых npm&nbsp;пакетов. Затем вручную проходимся по&nbsp;списку и&nbsp;удаляем все&nbsp;лишнее, тем&nbsp;самым уменьшая вес&nbsp;проекта и&nbsp;наводя порядок.  </p>
<p>Depcheck нужно использовать несколько раз, потому как&nbsp;после каждого прогона и&nbsp;удаления ненужных библиотек могут появится новые, которые становятся рудиментарными после первого прогона. Например, удаленная в&nbsp;первой очереди библиотека использовала другую, которая уже&nbsp;на&nbsp;втором прогоне определится как&nbsp;мертвая зависимость. </p>
<h3>Поиск дублирующих npm&nbsp;пакетов</h3>
<p>Используем<span> </span><a rel="noopener noreferrer nofollow" href="https://www.npmjs.com/package/@cerner/duplicate-package-checker-webpack-plugin"><u>плагин</u></a>, который анализирует проект и&nbsp;показывает список дублей с&nbsp;разными версиями.</p>
<p>Вот пример результата его&nbsp;работы на&nbsp;примере проекта сортировки:</p>
<p><img src="/Media/2982/правильный-425.png" alt=""></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ef6da2c3afa54adda550f1075dcdabee"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Однако от&nbsp;видов выдачи результатов может зависеть алгоритм дальнейших действий. </p>
<p>Например, вот&nbsp;такая выдача:</p>
<p><img src="/Media/2983/правильный-426.png" alt=""></p>
<p>Здесь явно понимаем, что&nbsp;нужно обновить пакеты. Обновив зависимости, можно будет уменьшить вес&nbsp;бандла. </p>
<p>Другой пример:</p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/5a207a476cc144939cdbc464b1e7a6f2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2981/&#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x439;-427.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c8f0eaf182554c129e2032b50f5d64fe"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span>В этом случае также требуются обновления. Если не&nbsp;понятно, что&nbsp;и&nbsp;где&nbsp;обновлять, в&nbsp;настройках вебпака добавляем alias, который подскажет сборщику, какую именно версию обновить и&nbsp;откуда ее&nbsp;взять. На&nbsp;примере redux:</span></p>
<p><img src="/Media/2977/frame-428.png" alt=""></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5f8c85baeb8543e0a8b884279e7838bc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Оптимизация картинок</h3>
<p>Картинки на&nbsp;сайте до&nbsp;оптимизации не&nbsp;масштабировались в&nbsp;зависимости от&nbsp;размеров экрана. Мы&nbsp;поменяли все&nbsp;картинки на&nbsp;next image. Затем поменяли приоритеты загрузки. Те, что&nbsp;первыми попадают во&nbsp;viewport, должны загружаться с&nbsp;высоким приоритетом и&nbsp;без&nbsp;lazyloading – то&nbsp;есть максимально быстро. Это&nbsp;влияет на&nbsp;скорость отрисовки сайта. </p>
<ul>
<li>Используем для&nbsp;всех картинок модуль<span> </span><a rel="noopener noreferrer nofollow" href="https://nextjs.org/docs/pages/api-reference/components/image"><u>next/image.</u></a></li>
<li>Добавляем современные форматы изображений вместо jpg&nbsp;и&nbsp;png. Получаем лучшее сжатие без&nbsp;потери качества и&nbsp;более быструю загрузку.</li>
</ul>
<pre><code class="language-javascript">
images: { 
formats: ['image/avif', 'image/webp'], 
}<br></code></pre>
<ul>
<li>Приоритезируем загрузку картинок above the&nbsp;fold (тех, что&nbsp;находятся в&nbsp;viewport при&nbsp;первоначальной загрузке страницы) - свойство Priority.</li>
<li>Для векторных картинок выставляем свойство unoptimized.</li>
</ul>
<h3>Code splitting</h3>
<p>Выяснилось, что, в&nbsp;коде на&nbsp;каждой странице много дубликатов. Элементы, которые должны один раз&nbsp;загрузиться, закэшироваться в&nbsp;браузере и&nbsp;использоваться всеми страницами, были вставлены в&nbsp;код&nbsp;каждой из&nbsp;страниц и&nbsp;потребляли ресурсы при&nbsp;загрузке снова и&nbsp;снова.</p>
<p><img src="/Media/2978/frame-429.png" alt=""></p>
<p>Дубликаты элементов в&nbsp;коде появились из&#8209;за&nbsp;отмены дефолтного разбиения кода на&nbsp;чанки в&nbsp;next.js. Прежние разработчики применили такое решение, чтобы работала<span> </span><a rel="noopener noreferrer nofollow" href="https://github.com/callstack/linaria"><u>Linaria</u></a>, которая призвана увеличивать производительность. Однако из&#8209;за&nbsp;отключения разбиения производительность наоборот падала. </p>
<p>В итоге мы&nbsp;убрали строку, которая блокирует разбиение чанков, и&nbsp;это&nbsp;дало практически 50% прирост в&nbsp;производительности. </p>
<p>В<a rel="noopener noreferrer nofollow" href="https://web.dev/granular-chunking-nextjs/"><u>строенный механизм next разбивки js&nbsp;кода на&nbsp;чанки</u></a><span> </span>протестирован и&nbsp;рекомендован для&nbsp;production. Отключать его&nbsp;не&nbsp;нужно, иначе код&nbsp;начинает дублироваться для&nbsp;каждой страницы, хотя переиспользуемые модули (react, react-dom, ui&nbsp;kit&nbsp;и&nbsp;т.д.) должны выноситься в&nbsp;отдельные (общие) чанки, а&nbsp;не&nbsp;грузиться заново на&nbsp;каждой странице. </p>
<h3>Убираем блокирующие ресурсы</h3>
<p>Далее использовали<span> </span><a rel="noopener noreferrer nofollow" href="https://www.webpagetest.org/"><u>webpagetest</u></a>, на&nbsp;котором можно запускать тесты на&nbsp;производительность сайтов и&nbsp;получать разные метрики. После теста выяснилось, что&nbsp;в&nbsp;коде сайта есть блокирующие скрипты. </p>
<p>Блокирующий скрипт стали загружать асинхронно и&nbsp;только на&nbsp;тех&nbsp;страницах, где&nbsp;это&nbsp;было необходимо. Синхронная загрузка блокирует очередь загрузки. Все&nbsp;скрипты должны быть не&nbsp;блокирующими.</p>
<p>Пример с&nbsp;aplaut:</p>
<p><img src="/Media/2979/frame-430.png" alt=""></p>
<h3>Компактные сборки</h3>
<p>Вместо Terser используем<span> </span><a rel="noopener noreferrer nofollow" href="https://nextjs.org/docs/architecture/nextjs-compiler#minification"><u>swcMinify<span> </span></u></a>для сжатия js&nbsp;(на&nbsp;крупном проекте экономия порядка 200Kb).</p>
<p><span>Собираем js&nbsp;только для&nbsp;современных браузеров. Список браузеров по&nbsp;умолчанию в&nbsp;Next, можно переопределить в&nbsp;своем </span><a rel="noopener noreferrer nofollow" href="https://browsersl.ist/"><u>browserslist</u></a><span>.</span></p>
<h3>Сторонние скрипты</h3>
<p>Чтобы сократить<span> </span><a rel="noopener noreferrer nofollow" href="https://web.dev/tbt/"><u>общее время блокировки (TBT)</u></a>, сторонние скрипты для&nbsp;сайта (например, Google analytics и&nbsp;Yandex metrika) должны быть подключены с&nbsp;использованием<span> </span><a rel="noopener noreferrer nofollow" href="https://nextjs.org/docs/pages/api-reference/components/script"><u>next/script</u></a><span> </span>и соответствующих стратегий загрузки (чаще всего afterInteractive).</p>
<p>Вот<span> </span><a rel="noopener noreferrer nofollow" href="https://github.com/vercel/next.js/tree/canary/examples/with-google-analytics"><u>пример подключения  Google Analytics c&nbsp;использованием next/script</u></a>.</p>
<h3>Скрытые компоненты</h3>
<p>На сайте есть компоненты, которые скрыты до&nbsp;того момента, пока пользователь не&nbsp;начнет с&nbsp;ними взаимодействовать. Например, это&nbsp;компоненты в&nbsp;модальных окнах и&nbsp;сайдбарах. Для&nbsp;них&nbsp;используем<a rel="noopener noreferrer nofollow" href="https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading"><u><span> </span>Dynamic Imports</u></a>, чтобы уменьшить объем js, необходимый для&nbsp;первоначальной загрузки страницы. Загрузка js&nbsp;скрытого компонента откладывается до&nbsp;момента пользовательской потребности – взаимодействия с&nbsp;компонентом. </p>
<h3>Ускорение билда</h3>
<p>Можно отключить проверку<span> </span><a rel="noopener noreferrer nofollow" href="https://nextjs.org/docs/pages/api-reference/next-config-js/eslint"><u>eslint<span> </span></u></a>в next.config.js. Если линт отрабатывает на&nbsp;этапе комита, делать линт при&nbsp;билде нет&nbsp;смысла. Этот нюанс не&nbsp;влияет на&nbsp;пользователя, но&nbsp;увеличивает скорость сборки.</p>
<p><img src="/Media/2984/изображение_2023-09-19_135452481.png" alt=""></p>
<p><span>Также можно использовать параметр --no-lint в&nbsp;package.json:</span></p>
<p><span><img src="/Media/2985/изображение_2023-09-19_135553876.png" alt=""></span></p>
<h3>Что еще&nbsp;полезно</h3>
<p>Если работа на&nbsp;проекте ведется регулярно, сопровождаясь частыми релизами, стоит подумать о&nbsp;настройке мониторингов производительности после каждого релиза. Так, после внедрения новых фич, можно будет сразу отрабатывать проседания показателей. Это&nbsp;гораздо удобнее, чем&nbsp;дожидаться критического падения производительности и&nbsp;оптимизировать все&nbsp;целиком.</p>
<p>А чтобы в&nbsp;целом держать руку на&nbsp;пульсе, советуем<a rel="noopener noreferrer nofollow" href="https://paper.dropbox.com/doc/Performance-Optimization-Strategy-in-2023-qWcr7orx2cEWHpLqoLeTC"><u><span> </span>чек-лист по&nbsp;улучшению производительности страниц</u></a><span> </span>от<span> </span><a rel="noopener noreferrer nofollow" href="https://www.smashingmagazine.com/author/vitaly-friedman/"><u>Виталия Фридмана</u></a>. Чек-лист меняется каждый год, поэтому советы и&nbsp;подходы в&nbsp;нем&nbsp;получаются максимально актуальными и&nbsp;пригодными для&nbsp;использования в&nbsp;проектах.</p>
<p><img src="/Media/2984/изображение_2023-09-19_135452481.png" alt=""></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Неочевидные моменты TypeScript и способы их решения
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Работаете с TypeScript, но не знаете всех тонкостей? Показываем реальные примеры, где это может сыграть с вами злую шутку.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/neochevidnye-momenty-typescript-i-sposoby-ikh-resheniya/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/neochevidnye-momenty-typescript-i-sposoby-ikh-resheniya/</guid>

                <pubDate>Tue, 06 May 2025 18:36:29 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Неочевидные моменты TypeScript и способы их решения</h1>
                                <figure>
                                    <img src="/Media/jpnc4vps/frame-5009630.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/58bf9554d68dbb6377edf2a15999ac35"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/96030d5188b04afb827d23fa7d62b1ed"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><em>Огромная благодарность за&nbsp; составление и&nbsp; помощь в&nbsp; подготовке материала разработчикам Дмитрию Бердникову и&nbsp; Александру Инкееву!</em></p>
<p>Если вам&nbsp;будет удобно сразу же&nbsp;проверять каждый пример, читая статью, можно это&nbsp;сделать в<span> </span><a href="https://www.typescriptlang.org/play">редакторе</a>. Он&nbsp; удобен тем, что&nbsp;версию TypeScript в&nbsp; нем&nbsp;можно переключать.</p>
<h3>Получение any&nbsp;вместо unknown</h3>
<p>Если используем тип&nbsp;any, то&nbsp; теряем типизацию — мы&nbsp; можем обратиться к&nbsp; любому методу или&nbsp;свойству такого объекта, и&nbsp; компилятор не&nbsp; предупредит нас&nbsp;о&nbsp; возможных ошибках. Если же&nbsp;мы&nbsp; используем unknown, то&nbsp; компилятор подскажет о&nbsp; них.</p>
<p>Некоторые функции и&nbsp; операции возвращают any&nbsp;по&nbsp; умолчанию — это&nbsp;не&nbsp; совсем очевидно, вот&nbsp;несколько примеров:</p>
<pre><code class="language-javascript">
// JSON.parse
const a&nbsp;= JSON.parse('{ a: 1 }'); // any&nbsp;
// Array.isArray
function parse(a: unknown) {
if&nbsp;(Array.isArray(a)) {
console.log(a); // a[any]
}
}
// fetch
fetch("/")
.then((res) =&gt; res.json())
.then((json) =&gt; {
console.log(json); // any&nbsp;
});
// localStorage, sessionStorage
const b&nbsp;= localStorage.a; // any&nbsp;
const c&nbsp;= sessionStorage.b // any<br></code></pre>
<p>Эту проблему может решить<span> </span><a href="https://github.com/total-typescript/ts-reset"><u>ts-reset</u></a>. </p>
<p><a href="https://github.com/total-typescript/ts-reset"><u>ts-reset</u></a><span> </span>– это&nbsp;библиотека, которая помогает решить некоторые неочевидные моменты, когда хотелось бы, чтобы TypeScript по&nbsp;умолчанию работал иначе.</p>
<h3>Методы массивов слишком строгие для&nbsp;конструкции as&nbsp;const</h3>
<p>Также это&nbsp;встречается в&nbsp;методах has&nbsp;у&nbsp;Set&nbsp;и&nbsp;Map.</p>
<p>Пример: создаем массив пользователей, присваиваем конструкцию as&nbsp;const, затем вызываем метод includes и&nbsp;получаем ошибку, потому что&nbsp;аргумент 4 не&nbsp;существует в&nbsp;типе userIds.</p>
<pre><code class="language-javascript">
const userIds = [1, 2, 3] as&nbsp;const;

userIds.includes(4);<br><br></code></pre>
<p>Избавиться от&nbsp;ошибки также поможет использование<span> </span><a href="https://github.com/total-typescript/ts-reset"><u>ts-reset</u></a>.</p>
<h3>Отфильтровать массив от&nbsp;undefined</h3>
<p>Предположим, у&nbsp;нас&nbsp;есть какой&#8209;то&nbsp;числовой массив, в&nbsp;котором может быть undefined. Чтобы избавиться от&nbsp;этих undefined, отфильтруем массив. Но&nbsp;массив newArr всё&nbsp;равно будет содержать тип&nbsp;массива number или&nbsp;undefined.</p>
<pre><code class="language-javascript">
const arr&nbsp;= [1, 2, undefined];
const newArr = arr.filter((item) =&gt; item !== undefined);</code></pre>
<p><span>Решить проблему можно следующим образом, тогда newArr2 будет иметь тип&nbsp;number:</span></p>
<pre><code class="language-javascript">
const newArr2 = arr.filter((item): item is&nbsp;number =&gt; item !== undefined);<br><br></code></pre>
<p>Также ts-reset может помочь, но&nbsp;только для&nbsp;случая, когда аргумент функции filter является типом BooleanConstructor.</p>
<pre><code class="language-javascript">
const filteredArray = [1, 2, undefined].filter(Boolean)<br><br></code></pre>
<h3>Сужение типа с&nbsp;помощью скобочной нотации</h3>
<p>Создаем объект с&nbsp;типом ключ строка, значение строка или&nbsp;массив строк. </p>
<p>Затем обращаемся к&nbsp;свойству объекта, используя скобочную нотацию и&nbsp;проверяем, что&nbsp;тип&nbsp;возвращаемого значения объекта является строкой. В&nbsp;typescript версии ниже 4.7 тип&nbsp;queryCountry будет строкой или&nbsp;массивом строк, т.е. автоматическое сужение типов не&nbsp;работает, хотя мы&nbsp;уже&nbsp;проверили условием. </p>
<p>Если же&nbsp;использовать typescript версии 4.7 и&nbsp;выше, сужение типа будет работать так, как&nbsp;мы&nbsp;этого ожидаем.</p>
<pre><code class="language-javascript">
const query: Record&lt;string, string | string[]&gt; = {};

const COUNTRY_KEY = 'country';

if&nbsp;(typeof query[COUNTRY_KEY] === 'string') {
    const queryCountry: string = query[COUNTRY_KEY];
}</code></pre>
<p><a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-7.html#control-flow-analysis-for-bracketed-element-access"><u>Ссылка на&nbsp;документацию</u></a><span>. </span></p>
<h3>Проблемы enum</h3>
<p>Создаем enum и&nbsp;явно не&nbsp;указываем значения, тогда у&nbsp;каждого ключа по&nbsp;порядку будут числовые значения от&nbsp;0 и&nbsp;далее.</p>
<p>С помощью этого enum затипизируем первый аргумент функции showMessage, в&nbsp;ожидании, что&nbsp;мы&nbsp;сможем передать только те&nbsp;коды, которые описаны в&nbsp;enum:</p>
<pre><code class="language-javascript">
enum LogLevel {
    Debug, // 0
    Log, // 1
    Warning, // 2
    Error // 3
}

const showMessage = (logLevel: LogLevel, message: string) =&gt; {
    // code...
}

showMessage(0, 'debug message');
showMessage(2, 'warning message');</code></pre>
<p>Если же&nbsp;передать не&nbsp;содержащееся в&nbsp;enum значение в&nbsp;качестве аргумента, мы&nbsp;должны увидеть ошибку "Argument of&nbsp;type '-100' is&nbsp;not&nbsp;assignable to&nbsp;parameter of&nbsp;type 'LogLevel'". Но&nbsp;в&nbsp;typescript ниже версии 5.0 такой ошибки нет, хотя по&nbsp;логике она&nbsp;должна быть: </p>
<pre><code class="language-javascript">
showMessage(-100, 'any message')</code></pre>
<p>Также мы&nbsp;можем создать enum и&nbsp;явно указать числовые значения. Константе a&nbsp;указываем тип&nbsp;enum и&nbsp;присваиваем любое несуществующее число, которого нет&nbsp;в&nbsp;enum, например, 1. При&nbsp;использовании TS&nbsp;ниже 5 версии ошибки не&nbsp;будет.</p>
<pre><code class="language-javascript">
enum SomeEvenDigit {
    Zero = 0,
    Two&nbsp;= 2,
    Four = 4
}

const a: SomeEvenDigit = 1;</code></pre>
<p>И еще&nbsp;момент: при&nbsp;использовании TypeScript ниже 5 версии, вычисляемые значения не&nbsp;могут быть использованы в&nbsp;enum.</p>
<pre><code class="language-javascript">
enum User {
  name = 'name',
    userName = `user${User.name}`
}</code></pre>
<p><a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#enum-overhaul"><u>Ссылка на&nbsp;документацию</u></a><span>.</span></p>
<h3>Функции, у&nbsp;которых явно указан возвращаемый тип&nbsp;undefined, должны иметь явный возврат</h3>
<p>В версиях TypeScript ниже 5.1 будет появляться ошибка в&nbsp;случаях, когда у&nbsp;функции явно указан тип&nbsp;undefined, но&nbsp;нет&nbsp;return.</p>
<pre><code class="language-javascript">
function f4(): undefined {}</code></pre>
<p>Ошибки не&nbsp;будет в&nbsp;следующих случаях:</p>
<pre><code class="language-javascript">
function f1() {}

function f2(): void {}

function f3(): any&nbsp;{}</code></pre>
<p>Закрепим. Если явным образом присвоить функции тип&nbsp;void или&nbsp;any, ошибки не&nbsp;будет. Она&nbsp;появится, если присвоить функции тип&nbsp;undefined, и&nbsp;только при&nbsp;использовании TypeScript версии ниже 5.1.</p>
<p><a href="https://devblogs.microsoft.com/typescript/announcing-typescript-5-1-rc/#easier-implicit-returns-for-undefined-returning-functions"><u>Ссылка на&nbsp;документацию</u></a>.</p>
<h3>Поведение enum’ов соответствует номинативной типизации, а&nbsp;не&nbsp;структурной</h3>
<p>И это&nbsp;несмотря на&nbsp;то, что&nbsp;у&nbsp;TypeScript типизация, наоборот, структурная.</p>
<p>Создадим enum и&nbsp;функцию, аргумент которой типизируем этим enum. Попробуем вызвать функцию, передав в&nbsp;качестве значения этого аргумента строку, которая идентична одному из&nbsp;значений enum. Получаем ошибку в&nbsp;showMessage тип&nbsp;аргумента 'Debug' не&nbsp;может быть присвоен, так&nbsp;как&nbsp;ожидается тип&nbsp;enum 'LogLevel'.</p>
<pre><code class="language-javascript">
enum LogLevel {
    Debug = 'Debug',
    Error = 'Error'
}

const showMessage = (logLevel: LogLevel, message: string) =&gt; {
    // code...
}

showMessage('Debug', 'some text')</code></pre>
<p>Даже если мы&nbsp;создадим новый enum с&nbsp;такими же&nbsp;значениями, это&nbsp;не&nbsp;сработает.</p>
<pre><code class="language-javascript">
enum LogLevel2 {
    Debug = 'Debug',
    Error = 'Error'
}
showMessage(LogLevel2.Debug, 'some text')</code></pre>
<p>Решение – использовать объекты со&nbsp;значением as&nbsp;const.</p>
<pre><code class="language-javascript">
const LOG_LEVEL = {
    DEBUG: 'debug',
    ERROR: 'error'
} as&nbsp;const

type ObjectValues = T[keyof T]

type LogLevel = ObjectValues;

const logMessage = (logLevel: LogLevel, message: string) =&gt; {
    // code...
}</code></pre>
<p>В таком случае можно передавать что&nbsp;угодно, и&nbsp;не&nbsp;будет ошибки, ведь работаем с&nbsp;простым значением, и&nbsp;не&nbsp;важно, откуда оно&nbsp;передается.</p>
<pre><code class="language-javascript">
logMessage('debug', 'some text')
logMessage(LOG_LEVEL.DEBUG, 'some text')</code></pre>
<h3>Возможность возврата неправильного типа данных в&nbsp;функции с&nbsp;перегрузкой</h3>
<p>Предположим, что&nbsp;хотим вернуть из&nbsp;функции строку, если 2 её&nbsp;аргумента являются строками. Создаём такие функции, затем проверяем, являются ли&nbsp;наши аргументы строками. При&nbsp;этом вернуть мы&nbsp;можем любой тип&nbsp;данных, несмотря на&nbsp;то&nbsp;что&nbsp;в&nbsp;первом шаге была указана строка.</p>
<pre><code class="language-javascript">
function add(x: string, y: string): string
function add(x: number, y: number): number
function add(x: unknown, y: unknown): unknown {

    if&nbsp;(typeof x&nbsp;=== 'string' &amp;&amp; typeof y&nbsp;=== 'string') {
                return 100;
    }

    if&nbsp;(typeof x&nbsp;=== 'number' &amp;&amp; typeof y&nbsp;=== 'number') {
        return x&nbsp;+ y&nbsp;
    }

    throw new&nbsp;Error('invalid arguments passed');
}</code></pre>
<p>Далее ожидаем, что&nbsp;const будет содержать тип&nbsp;string, но&nbsp;получаем число.</p>
<pre><code class="language-javascript">
const str&nbsp;= add("Hello", "World!");
const num&nbsp;= add(10, 20);</code></pre>
<p> </p>
<h3>Передача объекта как&nbsp;аргумент функции с&nbsp;лишним свойством</h3>
<p>Типизируя аргументы функций и&nbsp;классов, мы&nbsp;не&nbsp;можем добавлять лишние свойства, не&nbsp;указанные в&nbsp;типе или&nbsp;интерфейсе изначально. Ведь в&nbsp;таком случае мы&nbsp;просто передаём другую структуру в&nbsp;качестве аргумента.</p>
<p>Однако в&nbsp;typescript возможно нарушить это&nbsp;правило:</p>
<pre><code class="language-javascript">
type Func = () =&gt; {
  id: string;
};

const func: Func = () =&gt; {
  return {
    id: "123",
    name: "Hello!",
  };
};</code></pre>
<p>Для большей наглядности, создадим объект с&nbsp;настройками formatAmountParams, который передадим в&nbsp;функцию formatAmount. Как&nbsp;можно увидеть, объект с&nbsp;настройками может содержать лишние свойства и&nbsp;ошибки никакой не&nbsp;будет.</p>
<pre><code class="language-javascript">
type FormatAmount = {
  currencySymbol?: string,
  value: number
}

const formatAmount = ({ currencySymbol = '$', value }: FormatAmount) =&gt; {
  return `${currencySymbol} ${value}`;
}

const formatAmountParams = {
  currencySymbol: 'USD',
  value: 10,
  anotherValue: 20
}</code></pre>
<p>Нет ошибки, если передаем объект, который содержит лишние свойства: </p>
<pre><code class="language-javascript">
formatAmount(formatAmountParams);</code></pre>
<p>Получим ошибку, если создадим объект как&nbsp;аргумент функции и&nbsp;передадим с&nbsp;лишним свойством.</p>
<pre><code class="language-javascript">
formatAmount({ currencySymbol: '', value: 10, anotherValue: 12 });</code></pre>
<p>Можем столкнуться с&nbsp;неочевидным поведением, если захотим переименовать currencySymbol на&nbsp;currencySign.</p>
<p>Сначала изменим в&nbsp;типе, затем typescript подскажет, что&nbsp;надо изменить ключ в&nbsp;объекте с&nbsp;  currencySymbol на&nbsp;currencySign.</p>
<pre><code class="language-javascript">
type FormatAmount = {
  currencySign?: string,
  value: number
}

const formatAmount = ({ currencySign = '$', value }: FormatAmount) =&gt; {
  return `${currencySign} ${value}`;
}

const formatAmountParams = {
  currencySymbol: 'USD',
  value: 10
}

formatAmount(formatAmountParams);</code></pre>
<p>Ошибок нет&nbsp;– можно подумать, что&nbsp;рефакторинг прошел без&nbsp;проблем. Но&nbsp;в&nbsp;formatAmountParams осталось старое название currencySymbol и&nbsp;вместо ожидаемого результата 'USD 10' мы&nbsp;получим $10'. </p>
<h3>Потеря типизации при&nbsp;использовании Object.keys</h3>
<p>Создадим объект obj. С&nbsp;помощью Object.keys создадим массив с&nbsp;ключами объекта и&nbsp;проитерируемся по&nbsp;этому массиву. Если в&nbsp;цикле обратимся к&nbsp;объекту по&nbsp;ключу, typescript скажет, что&nbsp;не&nbsp;можем этого сделать, так&nbsp;как&nbsp;общий тип&nbsp;'string' не&nbsp;может быть использован в&nbsp;качестве ключа для&nbsp;объекта obj.</p>
<p>Возможное решение – скастовать тип&nbsp;с&nbsp;помощью конструкции as. Но&nbsp;это&nbsp;может быть небезопасно, потому что&nbsp;мы&nbsp;вручную устанавливаем, какой тип&nbsp;там&nbsp;будет находиться. Нужно привести к&nbsp;тому, чтобы [key] был&nbsp;не&nbsp;просто строкой, а&nbsp;ключом, и&nbsp;явно это&nbsp;указать.</p>
<pre><code class="language-javascript">
const obj&nbsp;= {a: 1, b: 2}

Object.keys(obj).forEach((key) =&gt; {
  console.log(obj[key])
  console.log(key as&nbsp;keyof typeof obj)
});</code></pre>
<p> </p>
<h3>TypeScript может не&nbsp;распознать изменение типа данных</h3>
<p>Создадим тип&nbsp;UserMetadata, как&nbsp;Map&nbsp;ключ-значение. На&nbsp;основе этого типа создаём cache и&nbsp;пытаемся получить значение по&nbsp;ключу 'foo' с&nbsp;помощью метода get. Всё&nbsp;работает как&nbsp;ожидается.</p>
<p>Затем создадим объект cacheCopy на&nbsp;основе cache. И&nbsp;также вызываем метод get. Typescript не&nbsp;подскажет, что&nbsp;что&#8209;то&nbsp;не&nbsp;так, но&nbsp;будет ошибка, так&nbsp;как&nbsp;у&nbsp;объекта нет&nbsp;метода get.</p>
<pre><code class="language-javascript">
type Metadata = {};

type UserMetadata = Map&lt;string, Metadata&gt;;

const cache: UserMetadata = new&nbsp;Map();

console.log(cache.get('foo'));

const cacheCopy: UserMetadata = { ...cache };

console.log(cacheCopy.get('foo'));</code></pre>
<p> </p>
<h3>Мерж интерфейсов</h3>
<p>Интерфейсы в&nbsp;отличии от&nbsp;типов могут мержиться. Если в&nbsp;одном файле будут интерфейсы с&nbsp;одинаковыми названиями, то&nbsp;когда мы&nbsp;назначим этот интерфейс он&nbsp;будет содержать свойства из&nbsp;всех интерфейсов с&nbsp;одинаковыми названиями.</p>
<pre><code class="language-javascript">
interface User {
    id: number;
}

interface User {
    name: string;
}

// Error: Property 'id' is&nbsp;missing in&nbsp;type '{ name: string; }' but&nbsp;required in&nbsp;type 'User', because User interfaces merged
const user: User = {
    name: 'bar',
}</code></pre>
<p>Более того, если у&nbsp;нас&nbsp;есть глобальные интерфейсы, например, предопределенные в&nbsp;самом typescript, они&nbsp;также смержатся. Например, если создадим интерфейс с&nbsp;именем comment, получим мерж интерфейсов, потому что&nbsp;comment уже&nbsp;существует в&nbsp;lib.dom.d.ts.</p>
<pre><code class="language-javascript">
interface Comment {
  id: number;
  text: string;
}

// Error: Type '{ id: number; text: string; }' is&nbsp;missing the&nbsp;following properties from type 'Comment': data, length, ownerDocument, appendData, and&nbsp;59 more.
const comment: Comment = {
  id: 5,
  text: "good video!",
};</code></pre>
<p><a href="https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces"><u>Ссылка на&nbsp;документацию</u></a>.</p>
<h3>Еще полезное</h3>
<p>Если вам&nbsp;хочется закрепить информацию по&nbsp;теме, но&nbsp;не&nbsp;хочется перечитывать статью, можно посмотреть несколько роликов на&nbsp;youtube:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=I6V2FkW1ozQ"><u>Be Careful With Return Types In&nbsp;TypeScript</u></a>;</li>
<li><a href="https://www.youtube.com/watch?v=jEWLhZ3ZJzQ"><u>ТОП 8 вещей которые я&nbsp;не&nbsp;люблю в&nbsp;TypeScript</u></a>;</li>
<li><a href="https://www.youtube.com/watch?v=jjMbPt_H3RQ"><u>Enums considered harmful</u></a>.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Технический аудит здорового человека: зачем он продукту, и в чем его польза
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Полностью «здоровых» IT-систем почти не бывает. Технический аудит помогает выявить слабые места. Зачем он нужен и как понять, что всё сделали как надо?
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/tech-inspection/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/tech-inspection/</guid>

                <pubDate>Tue, 06 May 2025 18:26:16 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Технический аудит здорового человека: зачем он продукту, и в чем его польза</h1>
                                <figure>
                                    <img src="/Media/dnggeb43/chatgpt-image-may-7-2025-3.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1a08712b217a99f142a4284690d828de"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/84b45b83ec274615a32dd0a84e3ac14c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>Профессиональный технический аудит от&nbsp;любительского (назовем его&nbsp;так) будет отличаться глубиной погружения. Конечно, можно формально запустить проверяющие код&nbsp;программы (их&nbsp;называют </span><a rel="nofollow noreferrer noopener" href="https://ru.hexlet.io/blog/posts/linter#:~:text=%D0%9B%D0%B8%D0%BD%D1%82%D0%B5%D1%80%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D0%B5%D1%82%20%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%20%D0%BA%D0%BE%D0%B4%20%D1%87%D0%B8%D1%89%D0%B5,%D0%BF%D1%80%D0%B8%20%D1%81%D0%BE%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BD%D0%BE%D0%B9%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5%20%D0%BD%D0%B0%D0%B4%20%D0%BA%D0%BE%D0%B4%D0%BE%D0%BC." target="_blank">линтеры</a><span>), и&nbsp;остановиться на&nbsp;этом, сказав: «Вася, все&nbsp;плохо, давай переделывать». Однако при&nbsp;таком подходе не&nbsp;станет понятно, что&nbsp;именно в&nbsp;продукте плохо работает, и&nbsp;как&nbsp;это&nbsp;чинить.</span></p>
<div class="l-island-a">
<p>Оговоримся, что&nbsp;речь тут&nbsp;пойдет не&nbsp;о&nbsp;формальном аудите, когда важен сам&nbsp;факт его&nbsp;проведения. Мы&nbsp;за&nbsp;пользу, поэтому аудит ради аудита не&nbsp;рассматриваем вообще. Все, что&nbsp;вы&nbsp;прочтете дальше, будет относиться к&nbsp;описанию проведения технического аудита продукта, результатом которого становится реальное улучшение системы, а&nbsp;не&nbsp;просто листок с&nbsp;ее&nbsp;недочетами.</p>
</div>
<h2>Когда нужен аудит</h2>
<div class="l-island-a">
<ul>
<li>Не ясно, как&nbsp;развивать продукт и&nbsp;делать его&nbsp;работающим на&nbsp;новые бизнес-цели</li>
<li>Сервис не&nbsp;выдает прежних результатов (конверсия, производительность, показатели в&nbsp;поиске), хотя все&nbsp;вроде работает</li>
<li>Нет времени на&nbsp;пересмотр системы, потому что&nbsp;команда занята другими более срочными задачами</li>
<li>Задачи, которые раньше разработчики закрывали за&nbsp;пару дней, теперь занимают по&nbsp;несколько недель</li>
</ul>
</div>
<div class="l-island-a">
<p>Внешний аудит – это&nbsp;свежий взгляд на&nbsp;разработку. Он&nbsp;помогает оценить текущее положение дел&nbsp;или&nbsp;то, как&nbsp;на&nbsp;продукт «прикладывается» стратегия его&nbsp;развития. Чтобы понять, как&nbsp;сделать продукт лучше, нужно объективно измерить его&nbsp;характеристики. Об&nbsp;этом и&nbsp;поговорим.</p>
</div>
<h2>Исследовательская задача и&nbsp;польза решения</h2>
<div class="l-island-a">
<p>Когда к&nbsp;нам&nbsp;приходят за&nbsp;аудитом, мы&nbsp;делаем его&nbsp;«как для&nbsp;себя». Дело в&nbsp;том, что&nbsp;после аудита отношения с&nbsp;заказчиками зачастую не&nbsp;заканчиваются – мы&nbsp;уже&nbsp;в&nbsp;качестве разработчиков подхватываем проект на&nbsp;развитие и&nbsp;начинаем заниматься его&nbsp;улучшением. Заказчик видит, что&nbsp;мы&nbsp;хорошо погружаемся в&nbsp;продукт, быстро понимаем его&nbsp;внутреннее устройство и&nbsp;можем предложить полезные изменения, которые принесут пользу бизнесу.Поэтому проведение технического аудита всегда нацелено не&nbsp;на&nbsp;формальную проверку системы, а&nbsp;на&nbsp;«что бы&nbsp;нас&nbsp;не&nbsp;устраивало, если бы&nbsp;продукт разрабатывали мы?».</p>
</div>
<div class="l-island-a">
<p>Основная часть нашей экспертизы построена на&nbsp;разработке, а&nbsp;не&nbsp;на&nbsp;аудите, и&nbsp;это&nbsp;плюс для&nbsp;наших заказчиков – после аудита они&nbsp;получают не&nbsp;просто список проблем, а&nbsp;еще&nbsp;и&nbsp;список возможных решений в&nbsp;предложенных обстоятельствах.</p>

<div class="umb-macro-highlights">
    <strong>Технический аудит, на&nbsp;наш&nbsp;взгляд, в&nbsp;целом должен быть про&nbsp;решения и&nbsp;улучшения.</strong>
    Мы&nbsp;смотрим на&nbsp;текущее состояние системы и&nbsp;предполагаем, какой она&nbsp;должна быть, чтобы бизнес достигал своих целей – сейчас и&nbsp;в&nbsp;будущем.
</div>

<div class="l-island-a">
<p>Например, один из&nbsp;наших недавних проектов – аудит для<span> </span><a rel="nofollow noreferrer noopener" href="https://buddy.ai/ru/" target="_blank">Buddy.ai</a>. Ребятам нужно было узнать, как&nbsp;сделать сервис готовым к&nbsp;расширению и&nbsp;привести на&nbsp;него больше органического трафика. Заказчик понимал, что&nbsp;сил&nbsp;и&nbsp;экспертизы внутренней команды перестало хватать для&nbsp;реализации желаемой функциональности и&nbsp;развития продукта. Мы&nbsp;изучили кодовую базу сервиса, протестировали его&nbsp;производительность и&nbsp;возможности к&nbsp;масштабированию.</p>
</div>
<div class="l-island-a">
<p>После исследования мы&nbsp;описали ряд&nbsp;несовершенств, прямо влияющих на&nbsp;«боли» заказчика, и&nbsp;предложили улучшения. Среди них: рефакторинг, подготовка к&nbsp;расширению сервиса – сегментирование и&nbsp;оптимизация кода, смена SPA-подход на&nbsp;статическую генерацию контента для&nbsp;приведения трафика и&nbsp;возможности SEO-оптимизации.</p>
</div>
<div class="l-island-a">
<p>Задачи по&nbsp;улучшению продукта, которые мы&nbsp;определили по&nbsp;результатам аудита, были нами же&nbsp;оценены и&nbsp;приоритезированы с&nbsp;оглядкой на&nbsp;бизнес-цели.</p>

<div class="umb-macro-highlights">
    <strong>Вообще в&nbsp;аудите указывать приоритеты по&nbsp;дальнейшим работам – критически важный шаг.</strong>
    
</div>

<div class="l-island-a">
<p>Заказчик должен понимать, что&nbsp;точно нужно сделать прямо сейчас, а&nbsp;что&nbsp;можно отложить на&nbsp;попозже, при&nbsp;этом не&nbsp;потеряв в&nbsp;эффективности и&nbsp;работоспособности продукта.</p>
</div>
<h2>Целеполагание: не&nbsp;распыляться на&nbsp;все&nbsp;подряд</h2>
<div class="l-island-a">
<p>Обычно продукты, которые уже&nbsp;зарекомендовали себя на&nbsp;рынке и&nbsp;кому&#8209;то&nbsp;приносят пользу, расширяются. Добавляются новые фичи, и&nbsp;количество потенциальных проблем и&nbsp;поломок растет. Если заняться исправлением всего и&nbsp;сразу, можно не&nbsp;закончить никогда, ведь совершенству предела нет.</p>
</div>
<div class="l-island-a">
<p>Чтобы не&nbsp;закапываться в&nbsp;аудите навечно, стоит его&nbsp;правильно осмыслить, поставив цель его&nbsp;проведения. Например, это&nbsp;может быть оценка возможностей сервиса к&nbsp;масштабированию (как&nbsp;в&nbsp;примере выше), или&nbsp;мы&nbsp;хотим улучшить пользовательский опыт с&nbsp;точки зрения какого&#8209;то&nbsp;отдельного процесса среди массы доступных юзерам. Словом, должно быть такое место в&nbsp;продукте, улучшение которого сильнее всего нужно компании на&nbsp;текущем этапе.</p>
<p> </p>
</div>
</div>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/43a74c69ba19400496f41672228cd73c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3018/slide-16_9-46.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/21d3a9acb0084f4d8c63ca43e2bcf4ad"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p>Четкая и&nbsp;понятная цель поможет сфокусироваться на&nbsp;критических проблемах и&nbsp;оставить на&nbsp;потом те, что&nbsp;не&nbsp;влияют на&nbsp;достижение цели. А&nbsp;правильная приоритезация задач – один из&nbsp;ключей к&nbsp;здоровому проекту. Поэтому вместе с&nbsp;отчетом по&nbsp;техническому аудиту заказчику нужно предоставить список решений с&nbsp;приоритетами. Возможно, на&nbsp;текущем этапе он&nbsp;захочет исправить только «горящие» проблемы, ведь уже&nbsp;после этого сервис начнет работать лучше.</p>
</div>
<h2>Пояснения и&nbsp;дообучение</h2>
<div class="l-island-a">
<p>Бывает так, что&nbsp;заказчик вместе со&nbsp;своей командой сразу видит связь между существующий в&nbsp;продукте проблемой и&nbsp;ее&nbsp;решением. Например, в&nbsp;нашем кейсе с<span>&nbsp;</span><a rel="nofollow noreferrer noopener" href="https://buddy.ai/ru/" target="_blank">Buddy.ai</a><span>&nbsp;</span>владелец продукта ясно понимал, что&nbsp;проблемы производительности сервиса связаны с&nbsp;отсутствием сегментации некоторых частей кода, которые были перенесены из&nbsp;конструктора когда-то. Поэтому мы&nbsp;быстро согласовали необходимость разделения и&nbsp;структуризации кодовой базы проекта для&nbsp;роста производительности. Тут&nbsp;связь была очевидной.</p>
</div>
<div class="l-island-a">
<p>Не всегда, однако, решение проблемы и&nbsp;его&nbsp;необходимость оказываются прозрачными. Порой нужно объяснить выводы аудита заказчику, потому что&nbsp;ему&nbsp;может недоставать технических знаний для&nbsp;понимания сути решения. Например, однажды среди проблем системы мы&nbsp;обнаружили слишком медленную скорость сборки проекта. Для&nbsp;владельца продукта это&nbsp;сперва показалось мелочью – ему&nbsp;не&nbsp;было понятно, зачем прицельно работать над&nbsp;этим показателем. Мы&nbsp;объяснили, что, если вместо нескольких секунд сборка занимает несколько минут, а&nbsp;команда разработчиков большая, умножаем одно на&nbsp;другое и&nbsp;получаем значительное замедление процесса разработки продукта в&nbsp;целом. Это&nbsp;пусть и&nbsp;не&nbsp;самый очевидный недочет, но&nbsp;его&nbsp;исправление необходимо для&nbsp;улучшения системы.</p>
<p><img src="/Media/3017/slide-16_9-45.png" alt=""></p>
</div>
<div class="l-island-a">
<p>Важно дать заказчику понять суть найденных проблем и&nbsp;их&nbsp;решений ровно настолько, чтобы он&nbsp;не&nbsp;допустил подобных недочетов в&nbsp;будущем и&nbsp;знал, что&nbsp;должна сделать команда для&nbsp;этого. Иначе говоря – чем&nbsp;более полной будет картина по&nbsp;результатам аудита, тем&nbsp;лучше и&nbsp;качественнее он&nbsp;проведен. Заказчик аудита, конечно, тоже должен быть готов к&nbsp;«погружению», но&nbsp;это&nbsp;уже&nbsp;другая сторона вопроса.</p>
</div>
<h2>Для чего мы&nbsp;это&nbsp;написали</h2>
<div class="l-island-a">
<p>Чтобы развеять предрассудки и&nbsp;сформировать ожидания. Само по&nbsp;себе понятие аудита кажется чем&#8209;то&nbsp;формальным и&nbsp;далеким от&nbsp;практического улучшения системы. Мы&nbsp;же&nbsp;считаем, что&nbsp;технический аудит качества ИТ-продукта нужно воспринимать как&nbsp;анализ крови у&nbsp;людей. Без&nbsp;анализа нельзя подобрать правильное лечение, а&nbsp;значит и&nbsp;по-настоящему помочь пациенту. Точно так&nbsp;же&nbsp;и&nbsp;без&nbsp;аудита вряд ли&nbsp;получится узнать, что&nbsp;именно сбоит в&nbsp;системе и&nbsp;мешает достичь желаемых результатов.</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Интересные возможности DevTools для QA
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Фишки DevTools, которые удобно применять при тестировании сайтов и приложений. Мы сами пользуемся — делимся тем, что реально помогает.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/interesting-devtools-features-for-qa/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/interesting-devtools-features-for-qa/</guid>

                <pubDate>Tue, 06 May 2025 18:23:45 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Интересные возможности DevTools для QA</h1>
                                <figure>
                                    <img src="/Media/v2yp2gce/chatgpt-image-may-7-2025-2-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1b072fc1e5bb0616eab2996f31388786"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/38b7f85448e4412494ff921f3c4ab4ab"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p>Chrome DevTools — это&nbsp;консоль разработчика, набор инструментов в&nbsp;браузере для&nbsp;создания и&nbsp;отладки сайтов и&nbsp;приложений. С&nbsp;их&nbsp;помощью можно просматривать код, оптимизировать производительность веб-страниц с&nbsp;точки зрения UI&nbsp;и&nbsp;тестировать уже&nbsp;разработанную функциональность. О&nbsp;последнем сегодня и&nbsp;поговорим.</p>
<p>Я&nbsp;собрал подборку полезных инструментов внутри DevTools, которые не&nbsp;очень распространены в&nbsp;QA, но&nbsp;при этом могут значительно упростить и&nbsp;ускорить вашу работу. Отмечу, что&nbsp;говорить мы&nbsp;будем именно о&nbsp;Chrome DevTools, хотя и&nbsp;в&nbsp;других браузерах есть аналогичные консоли разработчиков.</p>
<p>Итак, поехали!</p>
<h2>Снимки экрана при&nbsp;загрузке страницы</h2>
<p>Одна из&nbsp;самых полезных функций в&nbsp;DevTools&nbsp;— серия снимков в&nbsp;процессе загрузки страницы. С&nbsp;ее&nbsp;помощью можно отловить какие&#8209;то&nbsp;баги и&nbsp;нелогичное поведение элементов в&nbsp;процессе построения страницы. Или&nbsp;посмотреть, появляется&nbsp;ли при&nbsp;загрузке спиннер или&nbsp;прогресс-бар (если вдруг у&nbsp;вас такой шустрый интернет, что&nbsp;визуально вы&nbsp;этого отследить не&nbsp;можете).</p>
<h3>Как сделать серию снимков экрана при&nbsp;загрузке</h3>
<p><span style="color: #ca132a;">1.</span> Откройте панель разработчика (F12).</p>
<p><span style="color: #ca132a;">2.</span> Откройте вкладку Network.</p>
<p><span style="color: #ca132a;">3.</span> Нажмите на&nbsp;шестерёнку в&nbsp;правом верхнем углу панели.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2658/15.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">4.</span> Включите чекбокс Capture screenshots.</p>
<p><span style="color: #ca132a;">5.</span> Нажмите Ctrl+R.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2659/16.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="font-weight: 400;">Лента скриншотов появится в&nbsp;верхней части окна. Щелкнув по&nbsp;одному из&nbsp;них, вы&nbsp;сможете последовательно просмотреть все&nbsp;скриншоты с&nbsp;временными отметками и&nbsp;отследить, когда какой элемент появился на&nbsp;странице.</span></p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2660/17.png" alt="" itemprop="">


</figure>

<h2>Поиск неиспользуемых CSS&nbsp;и&nbsp;JS в&nbsp;вёрстке</h2>
<p>Еще одна интересная и&nbsp;незаменимая при&nbsp;тестировании производительности функция DevTools&nbsp;— обнаружение неиспользуемых в&nbsp;вёрстке CSS&nbsp;и&nbsp;JavaScript.</p>
<p>Чем плох «лишний» код? Весь код, в&nbsp;том числе и&nbsp;неиспользуемый, браузер проверяет при&nbsp;каждой загрузке страницы. И&nbsp;чем больше этого неиспользуемого кода, тем&nbsp;дольше страница может прогружаться. А&nbsp;если пользователь зашел на&nbsp;сайт со&nbsp;смартфона, на&nbsp;всё это&nbsp;ещё&nbsp;и&nbsp;лишний мобильный трафик тратится. Неприятно.</p>
<p>С&nbsp;помощью DevTools можно найти весь неиспользуемый код&nbsp;и&nbsp;передать эту&nbsp;информацию разработчику в&nbsp;баг-репорте. Возможно, там&nbsp;действительно есть что&#8209;то&nbsp;лишнее. Тогда, удалив это, разработчик повысит производительность сайта.</p>
<h3>Как найти неиспользуемые CSS&nbsp;и&nbsp;JS в&nbsp;вёрстке</h3>
<p><span style="color: #ca132a;">1. </span>Откройте панель разработчика (F12) и&nbsp;вызовите Command Menu (Ctrl+Shift+P).</p>
<p><span style="color: #ca132a;">2. </span>Введите Show Coverage и&nbsp;нажмите Enter. Откроется вкладка Coverage. Дальше будет работать в&nbsp;ней.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2661/11.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">3. </span>Нажмите на&nbsp;кнопку Start instrumenting coverage and&nbsp;reload page.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2662/12.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">4. </span>После этого в&nbsp;DevTool выведется таблица, где&nbsp;по&nbsp;функциям (или&nbsp;по&nbsp;блокам) будет отображено, сколько на&nbsp;странице неиспользуемого кода.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2663/13.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">5. </span>Кликните по&nbsp;одному из&nbsp;пунктов. После этого на&nbsp;вкладке Sources появится код&nbsp;с&nbsp;соответствующим цветным маркером.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2664/14.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p>Красным отмечен тот&nbsp;код, которые не&nbsp;используется на&nbsp;странице.</p>
<p>На&nbsp;одном из&nbsp;проектов этот способ помог мне&nbsp;отловить проблему с&nbsp;лишними Google-шрифтами. Они&nbsp;серьезно перегружали и&nbsp;утяжеляли страницу. В&nbsp;итоге разработчики оптимизировали код, удалив из&nbsp;него лишние шрифты.</p>
<h2>Сохранение изменений в&nbsp;Chrome при&nbsp;перезагрузке страниц</h2>
<p>Все знают, что&nbsp;через DevTools можно внести изменения в&nbsp;стили на&nbsp;странице, поменять шрифты, цвета, удалить изображения, добавить текст и&nbsp;т.д. Но&nbsp;не&nbsp;все знают, как&nbsp;сделать так, чтобы изменения эти&nbsp;сохранились даже после перезагрузки страницы. Тут&nbsp;помогут локальные переопределения. И&nbsp;работают они&nbsp;для&nbsp;большинства типа файлов за&nbsp;некоторыми исключениями. Но&nbsp;об&nbsp;этом поговорим чуть позже&nbsp;— в&nbsp;разделе «Ограничения».</p>
<h3>Как сохранять изменения локально</h3>
<p><span style="color: #ca132a;">1.</span> Откройте панель разработчика (F12).</p>
<p><span style="color: #ca132a;">2.</span> Откройте вкладку Sources.</p>
<p><span style="color: #ca132a;">3.</span> На&nbsp;панели файлов слева откройте вкладку Overrides.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2665/24.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">4.</span> Нажмите на&nbsp;кнопку Select folder for&nbsp;overrides.</p>
<p><span style="color: #ca132a;">5.</span> Выберите папку, в&nbsp;которой вы&nbsp;будете хранить изменения, которые вносите на&nbsp;страницу.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2666/25.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">6.</span> Во&nbsp;всплывающем окне разрешите доступ DevTools к&nbsp;выбранной папке.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2667/26.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">7.</span> Найдите файл с&nbsp;кодом страницы во&nbsp;вкладке Network. Для&nbsp;этого нужно перезагрузить страницу и&nbsp;сортировать все&nbsp;по&nbsp;Doс. Чаще всего этот файл называется index.html. В&nbsp;нашем примере ниже это&nbsp;Projects.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2668/27.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">8.</span> Кликните правой кнопкой по&nbsp;этому файлу и&nbsp;сохраните его&nbsp;Save for&nbsp;overrides.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2669/28.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p>Теперь можно вносить в&nbsp;код изменения, которые сохранятся и&nbsp;после перезагрузки страницы.</p>
<p><span style="color: #ca132a;">9.</span> Для&nbsp;этого найдите код&nbsp;нужного элемента во&nbsp;вкладке Elements с&nbsp;помощью специального инструмента (Ctrl+Shift+C) и&nbsp;скопируйте его.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2670/29.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">10.</span> Найдите скопированный элемент во&nbsp;вкладке Sources в&nbsp;документе с&nbsp;кодом страницы (чтобы открыть поисковую строку, нажмите Ctrl+F).</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2671/30.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">11.</span> Внесите в&nbsp;него изменения и&nbsp;нажмите Ctrl+S, чтобы сохранить&nbsp;их. Перезагрузите страницу.</p>
<p>Готово! Были просто «Наши работы», стали «Наши крутые работы». И&nbsp;они останутся таковыми, даже если мы&nbsp;перезагрузим страницу. Изменения сохраняются локально в&nbsp;папке, которую мы&nbsp;выбрали на&nbsp;шаге 5.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2672/31.png" alt="" itemprop="">


</figure>

<div class="umb-macro-highlights">
    <strong>Ограничения!</strong>
    DevTools не&nbsp;сохраняет изменения, сделанные в&nbsp;DOM-дереве на&nbsp;вкладке Elements. Редактировать можно только файл с&nbsp;кодом страницы во&nbsp;вкладке Sources. Но! Если CSS&nbsp;не&nbsp;зафиксирован в&nbsp;файле с&nbsp;кодом страницы, его&nbsp;получится отредактировать и&nbsp;сохранить и&nbsp;на&nbsp;вкладке Styles.
</div>

<p>Возвращаясь к&nbsp;разделу нашей статьи <strong>«Поиск неиспользуемых CSS&nbsp;и&nbsp;JS в&nbsp;вёрстке»</strong>, с&nbsp;помощью локальных переопределений вы&nbsp;можете самостоятельно удалить найденный «лишний код» и&nbsp;посмотреть, как&nbsp;это&nbsp;скажется на&nbsp;скорости загрузки страницы. А&nbsp;еще, если вы&nbsp;и&nbsp;сами своего рода разработчик, можно попробовать как&#8209;то&nbsp;оптимизировать уже&nbsp;существующий код. Например, изменить порядок блоков и&nbsp;посмотреть, как&nbsp;это&nbsp;отразится на&nbsp;производительности.</p>
<h2>Network Throttling - эмуляция медленного интернета</h2>
<p>В Devtools можно эмулировать медленное интернет-подключение, чтобы тестировать поведение в&nbsp;таких условиях.</p>
<ol>
<li>Откройте вкладку Network</li>
<li>Кликните на&nbsp;выпадающий список No&nbsp;Throttling</li>
<li>Выберете тип&nbsp;медленного интернета<br><br></li>
</ol>


<figure class="umb-macro-image">
    


    <img src="/Media/3082/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-03-29_142558318.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p>Либо, вы&nbsp;можете создать свой кастомный медленный интернет. Для&nbsp;этого необходимо:</p>
<ol>
<li>В выпадающем списке нажать опцию Add</li>
<li>Далее нажать на&nbsp;кнопку Add&nbsp;custom profile</li>
<li>Выбрать имя&nbsp;кастомного интернет-профиля и&nbsp;заполнить поля Download, Upload, Latency.&nbsp;</li>
<li>Кликнуть кнопку Add</li>
</ol>
<p>После этого ваш&nbsp;кастомный профиль появится в&nbsp;выпадающем меню, и&nbsp;вы&nbsp;сможете его&nbsp;выбрать.</p>
<h2>Возможность копировать запросы</h2>
<p>Если вам&nbsp;нужно скопировать запрос куда&#8209;то&nbsp;еще, можно это&nbsp;сделать так:</p>
<ol>
<li>Откройте панель разработчика (F12)</li>
<li>Зайдите во&nbsp;вкладку Network</li>
<li>Выберите нужный вам&nbsp;запрос</li>
<li>Нажмите на&nbsp;него правой кнопкой мыши</li>
<li>Выберите Copy и&nbsp;нужный вам&nbsp;вид&nbsp;(Fetch, cURL и&nbsp;тд)<br><br></li>
</ol>


<figure class="umb-macro-image">
    


    <img src="/Media/3083/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-03-29_142752279.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span>Дальше можно, например, взять запрос и&nbsp;запустить его&nbsp;через cURL, импортировать в&nbsp;Postman или&nbsp;подправить прямо во&nbsp;вкладке Console в&nbsp;виде fetch.</span></p>
<h2>Блокирование запросов</h2>
<p>Мы&nbsp;уже знаем, как&nbsp;увидеть, что&nbsp;происходит со&nbsp;страницей в&nbsp;процессе загрузки (раздел статьи <strong>«Снимки экрана при&nbsp;загрузке страницы»</strong>). А&nbsp;что, если какой&#8209;то&nbsp;контент не&nbsp;загрузится? Скажем, картинка, или&nbsp;какая&#8209;то&nbsp;ключевая анимация. Что&nbsp;тогда произойдет?</p>
<p>Чтобы протестировать это, можно через DevTools заблокировать какой&#8209;то&nbsp;конкретный запрос. Я&nbsp;так обычно проверяю, не&nbsp;забыли&nbsp;ли разработчики задать альтернативный текст для&nbsp;картинок, который появляется, если картинка сломалась/потерялась/не подгрузилась.</p>
<h3>Как заблокировать определённые запросы</h3>
<p><span style="color: #ca132a;">1.</span> Откройте панель разработчика (F12) и&nbsp;вызовите Command Menu (Ctrl+Shift+P).</p>
<p><span style="color: #ca132a;">2.</span> Введите Show Request Blocking и&nbsp;выберите Show Network Request Blocking. Ниже откроется панель Network Request Blocking.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2673/18.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">3.</span> На&nbsp;вкладке Network выберите элемент, запрос к&nbsp;которому вы&nbsp;хотите заблокировать.</p>
<p><span style="color: #ca132a;">4.</span> Из&nbsp;меню Headers скопируйте его&nbsp;и&nbsp;нажмите на&nbsp;кнопку Add&nbsp;Pattern в&nbsp;панели Network Request Blocking.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2674/19.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">5.</span> Вставить запрос в&nbsp;поле в&nbsp;меню Network Requesting Block и&nbsp;нажмите на&nbsp;кнопку Add.</p>
<p><span style="color: #ca132a;">6.</span> Убедитесь, что&nbsp;чек-боксы запроса и&nbsp;Enable network request blocking активированы.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2675/20.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">7.</span> Перезагрузите страницу и&nbsp;проверьте изменения.</p>
<p>Готово! Мы&nbsp;видим, что&nbsp;вместо картинок, запрос к&nbsp;которым мы&nbsp;заблокировали, появился альтернативный текст:</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2676/22.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<h2>Переопределение геолокации</h2>
<p>Через DevTools можно переопределить локацию пользователя, чтобы проверить, как&nbsp;сайт будет выглядеть для&nbsp;жителей разных городов/стран/часовых поясов. Показывает&nbsp;ли он&nbsp;челябинскую погоду жителю Челябинска? Учитывает&nbsp;ли часовой пояс посетителя из&nbsp;европы, который смотрит расписание игр&nbsp;на&nbsp;сайте канадского хоккейного клуба? Все&nbsp;это&nbsp;мы&nbsp;можем выяснить, просто переопределив геолокацию в&nbsp;DevTools.</p>

<div class="umb-macro-highlights">
    <strong>Внимание!</strong>
    Этот способ подойдет для&nbsp;сайтов и&nbsp;сервисов, которые определяют местоположение посетителя с&nbsp;помощью сервисов геолокации, а&nbsp;не, например, через IP-адрес.
</div>

<h3>Как сменить геолокацию в&nbsp;DevTools</h3>
<p><span style="color: #ca132a;">1.</span> Откройте консоль разработчика (F12) и&nbsp;вызовите Command Menu (Ctrl+Shift+P).</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2679/2.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span style="color: #ca132a;">2.</span> Введите команду Sensors и&nbsp;выберите в&nbsp;списке пункт Show Sensors. После этого в&nbsp;нижней части DevTools откроется вкладка Sensors.</p>
<p><span style="color: #ca132a;">3.</span> Продолжаем работать во&nbsp;вкладке Sensors. В&nbsp;поле Location из&nbsp;выпадающего списка можно выбрать уже&nbsp;имеющиеся города.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2680/3.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p>Если нужного города в&nbsp;списке не&nbsp;оказалось, кликайте по&nbsp;кнопке Manage справа от&nbsp;выпадающего списка с&nbsp;доступными локациями. Затем Add&nbsp;Location и&nbsp;добавляйте город сами&nbsp;— с&nbsp;названием, координатами и&nbsp;часовым поясом.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2681/4.png" alt="" itemprop="">


</figure>

<p><img src="/Media/2680/3.png" alt=""></p>
<p>&nbsp;</p>
<p>Мне эта&nbsp;возможность DevTools пригодилась, когда мы&nbsp;работали над&nbsp;сайтом одного из&nbsp;британский футбольных клубов. Нужно было проверить, учитывается&nbsp;ли геолокация посетителя на&nbsp;странице с&nbsp;расписанием будущих игр.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2682/5.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<h2>Подмена User-Agent</h2>
<p>User-Agent&nbsp;— это&nbsp;строка, передающая сайту информацию о&nbsp;том, какое программное обеспечение использует посетитель. В&nbsp;ней зафиксировано, каким устройством человек пользуется (ПК, планшет или&nbsp;смартфон), с&nbsp;какой операционной системой и&nbsp;через какой браузер. В&nbsp;зависимости от&nbsp;этих параметров сайт может выглядеть по-разному. Частно, например, дизайнеры адаптируют оформление и&nbsp;стили под&nbsp;мобильные версии, упрощают анимации&nbsp;— чтобы ничто не&nbsp;мешало знакомству с&nbsp;контентом на&nbsp;небольшом экране смартфона.</p>
<p>Чтобы проверить, меняются&nbsp;ли стили на&nbsp;сайте в&nbsp;зависимости от&nbsp;разных устройств, ОС&nbsp;и&nbsp;браузеров, не&nbsp;обязательно обкладываться маками, айфонами, разными планшетами и&nbsp;т.д. Можно просто сменить User-Agent в&nbsp;DevTools и&nbsp;проверить сайт с&nbsp;одного устройства.</p>
<h3>Как изменить User-Agent в&nbsp;DevTools</h3>
<p><span style="color: #ca132a;">1.</span> Откройте панель разработчика (F12) и&nbsp;вызовите Command Menu (Ctrl+Shift+P).</p>
<p><span style="color: #ca132a;">2.</span> Введите Show Network conditions и&nbsp;нажмите Enter. После этого в&nbsp;нижней части DevTools откроется вкладка Network conditions.<br><br></p>


<figure class="umb-macro-image">
    


    <img src="/Media/3086/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-03-29_143429035.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p>В&nbsp;поле User-Agent снимите галочку с&nbsp;Use browser default.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3087/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-03-29_143609208.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p>После этого из&nbsp;выпадающего списка ниже вы&nbsp;сможете выбрать нужный User-Agent.</p>
<p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/3088/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-03-29_143809129.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p>Если в&nbsp;списке нет&nbsp;нужного User-Agent, можно ввести данные вручную. Для&nbsp;этого в&nbsp;выпадающем списке выберите пункт Custom и&nbsp;пропишите параметры в&nbsp;строке ниже.</p>
<h3>Lighthouse – тест производительности сайта</h3>
<p>Один из&nbsp;способов протестировать производительность сайта, а&nbsp;также accessibility и&nbsp;SEO&nbsp;оптимизацию – это&nbsp;Lighthouse, который теперь встроен в&nbsp;DevTools.</p>
<ol>
<li>Откройте панель разработчика (F12).</li>
<li>Откройте вкладку Lighthouse.</li>
<li>Выберите параметры тестирования.</li>
<li>Нажмите Analyze page load.<br><br></li>
</ol>


<figure class="umb-macro-image">
    


    <img src="/Media/3084/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-03-29_143210129.png" alt="" itemprop="">


</figure>

<p><span><br>Пройдет некоторое время, необходимое для&nbsp;тестирования, и&nbsp;после этого вы&nbsp;увидите результаты теста.<br><br></span><span></span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/3085/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2024-03-29_143244185.png" alt="" itemprop="">


</figure>

<p>&nbsp;</p>
<p><span>А также увидите рекомендации по&nbsp;части того, что&nbsp;можно улучшить на&nbsp;сайте.<br><br></span></p>
<p><span><img src="https://habrastorage.org/getpro/habr/upload_files/eb7/72b/83e/eb772b83e14356aa1b9c45ad28993f60.png" alt=""></span></p>
<p>&nbsp;</p>
<h2>Заключение</h2>
<p><span>Фишки, о&nbsp;которых мы&nbsp;поговорили в&nbsp;статье, — лишь малая часть того, на&nbsp;что&nbsp;еще&nbsp;способен DevTools в&nbsp;умелых руках QA-специалиста. Там&nbsp;еще&nbsp;много интересного, что&nbsp;может быть полезно при&nbsp;тестировании сайтов и&nbsp;приложении. Но&nbsp;об&nbsp;этом — уже&nbsp;в&nbsp;следующих подборках.&nbsp;</span></p>
<p>А&nbsp;пока хочу напомнить всем причастным к&nbsp;QA, что&nbsp;в&nbsp;тестировании на&nbsp;самом-то деле нет&nbsp;рамок! Если какой&#8209;то&nbsp;инструмент, изначально созданный вовсе и&nbsp;не&nbsp;для тестирования, помогает вам&nbsp;оптимизировать вашу работу&nbsp;— используйте его! Это&nbsp;хороший инструмент :)</p>
<hr>
<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Курс «Основы веб-разработки»: зачем мы бесплатно учим студентов
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Во fuse8 прошёл второй сезон бесплатной школы по веб-разработке. Зачем мы её проводим, кому это нужно и что даёт — рассказываем по делу.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/why-we-need-developers-course/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/why-we-need-developers-course/</guid>

                <pubDate>Tue, 06 May 2025 13:45:42 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Курс «Основы веб-разработки»: зачем мы бесплатно учим студентов</h1>
                                <figure>
                                    <img src="/Media/2130/main-bg.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2a0a5e83c0285c69150b835d5d1f5569"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/eab2e710cb214a1eb2c891beef8083ce"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В начале октября во&nbsp;fuse8 завершился второй сезон бесплатной школы по&nbsp;программированию. В&nbsp;течение двух месяцев наши разработчики по&nbsp;вечерам учили студентов основам веб-разработки. Кому и&nbsp;зачем это&nbsp;нужно — расскажем в&nbsp;этой статье.</p>




    <div data-cp="carousel"
         style="background-color:;"
         class="swiper-container carousel typography__ignore-offset"
         data-settings=''>
        <div class="swiper-wrapper">
                <div class="swiper-slide">
	                    


    <img src="/Media/2142/&#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x430;-&#x43A;&#x443;&#x440;&#x441;&#x430;-1&#x441;&#x442;&#x440;.jpg"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/2137/&#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x430;-&#x43A;&#x443;&#x440;&#x441;&#x430;-2&#x441;&#x442;&#x440;.jpg"
         alt=""
         itemprop="">

                </div>
        </div>
            <button
                type="button"
                class="carousel__navigation carousel__navigation--prev swiper-button-prev"
                data-carousel-ref="prev"
                style="color:;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--l">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&lt;</span>
                </span>
            </button>
            <button type="button"
                    class="carousel__navigation carousel__navigation--next swiper-button-next"
                    data-carousel-ref="next"
                    style="color:;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--r">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&gt;</span>
                </span>
            </button>
    </div>

<h2>Что это&nbsp;за&nbsp;курс?</h2>
<p>Вот уже&nbsp;второй год&nbsp;во&nbsp;fuse8 проходит бесплатный курс «<a href="/course#main">Основы веб-разработки</a>». Он&nbsp;рассчитан на&nbsp;студентов-старшекурсников IT-специальностей и&nbsp;энтузиастов, решивших сменить работу и&nbsp;уже&nbsp;имеющих базовые навыки программирования. </p>
<p>В этому году программа курса состояла из&nbsp;23 занятий. За&nbsp;это&nbsp;время студенты с&nbsp;нуля создали сайт кинотеатра: с&nbsp;возможностью выбора сеанса, бронирования и&nbsp;покупки билета и&nbsp;с&nbsp;административной панелью, в&nbsp;которой можно добавлять фильмы и&nbsp;составлять расписание.</p>
<h2>Как и&nbsp;кем&nbsp;организован курс?</h2>
<p>Впервые курс «Основы веб-разработки» для&nbsp;студентов мы&nbsp;провели в&nbsp;2018 году. Его&nbsp;автор, тимлид Антон Воротынцев, делал все&nbsp;сам&nbsp;—  составлял учебный план, проводил занятия и&nbsp;проверял домашние задания. В&nbsp;этому году к&nbsp;нему присоединились еще&nbsp;два&nbsp;наши разработчика — бэкендеры Александр Медведев и&nbsp;Михаил Дервель.</p>
<p>Ребята поделили занятия между собой. Это&nbsp;снизило нагрузку на&nbsp;преподавателей — в&nbsp;среднем каждый проводил по&nbsp;одному занятию в&nbsp;неделю во&nbsp;внерабочее время. А&nbsp;ещё&nbsp;ребята получили педагогический опыт, который вполне можно применять в&nbsp;работе — при&nbsp;менторинге новых сотрудников или&nbsp;при&nbsp;ведении проекта в&nbsp;качестве тимлида.  </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2125/vmfweullg7y.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Первое занятие курса «Основы веб-разработки 2019»: ребята узнали, что&nbsp;такое репозиторий, создали проект, настроили IIS&nbsp;и&nbsp;приступили к&nbsp;разработке сайта кинотеатра
        </figcaption>
</figure>

<p>Занятия проводились три&nbsp;раза в&nbsp;неделю по&nbsp;вечерам в&nbsp;переговорной комнате fuse8. Часть студентов присутствовала на&nbsp;них&nbsp;лично. Другие присоединялись онлайн — все&nbsp;занятия мы&nbsp;транслировали на&nbsp;<a href="https://app.gotomeeting.com/?meetingId=968789901&amp;sessionTrackingId=ul-b35f360a-7d4c-47bc-89b4-abe7af132554">GoToMeeting.com</a> и&nbsp;опубликовали на&nbsp;нашем <a href="https://www.youtube.com/channel/UC9sARHJ-1Jj8y5ZnJi_5cwg">YouTube-канале</a>. </p>
<h2>Зачем нам&nbsp;бесплатный курс?</h2>
<p>Как говорит сам&nbsp;автор курса, Антон Воротынцев, курсы — это&nbsp;попытка компенсировать недостаток практики в&nbsp;IT-образовании. На&nbsp;собеседованиях со&nbsp;вчерашними студентами мы&nbsp;видим отсутствие ключевых навыков и&nbsp;знаний, которые помогли бы&nbsp;кандидатам быстро влиться в&nbsp;команду и&nbsp;начать работу над&nbsp;проектом: </p>



<blockquote>
    <div class="blockquote-body">
        Когда я&nbsp;учился, мне&nbsp;не&nbsp;хватало именно практических навыков. Я&nbsp;вышел из&nbsp;университета с&nbsp;большим багажом теории и&nbsp;абсолютным незнанием, как&nbsp;её&nbsp;применить. В&nbsp;веб-студиях, где&nbsp;непрерывно ведётся командная работа сразу над&nbsp;несколькими проектами, нет&nbsp;временного ресурса на&nbsp;обучение стажёра с&nbsp;нуля — в&nbsp;такой ситуации как&nbsp;минимум один разработчик будет полностью вырван из&nbsp;рабочего процесса, а&nbsp;этого мы&nbsp;себе позволить не&nbsp;можем. На&nbsp;курсе же&nbsp;мы&nbsp;в&nbsp;течение пары месяцев даём студентам все&nbsp;необходимые для&nbsp;старта в&nbsp;IT-карьере практические навыки программирования, учим их&nbsp;работать в&nbsp;команде, показываем внутреннюю кухню веб-студии.
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Антон Воротынцев, тимлид, автор и&nbsp;преподаватель курса «Основы веб-разработки»
                </cite>
            </div>
        </div>
    </footer>
</blockquote>


<p>Фактически, для&nbsp;нас&nbsp;курсы  — это&nbsp;шанс воспитать разработчиков под&nbsp;себя. Для&nbsp;студентов —  возможность до&nbsp;получения диплома в&nbsp;ВУЗе погрузиться в&nbsp;рабочую атмосферу и&nbsp;понять, что&nbsp;их&nbsp;ждет после выпускного. </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2128/dsc06298.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Преподаватели и&nbsp;выпускники курса «Основы веб-разработки 2019» — до&nbsp;конца дошли не&nbsp;все&nbsp;студенты
        </figcaption>
</figure>

<h2>Какие результаты дает курс? </h2>
<p>В 2018 году курс «Основы веб-разработки» посещали 12 человек. Для&nbsp;нас&nbsp;результатом стало прибавление в&nbsp;команде — в&nbsp;штат позвали тогда еще&nbsp;студента третьего курса ЮУрГУ Павла Южакова. Он&nbsp;продолжает работать во&nbsp;fuse8 в&nbsp;команде Антона Воротынцева над&nbsp;проектами для&nbsp;иностранных заказчиков. Этим летом, например, ребята запустили сайт международного чемпионата по&nbsp;гольфу <a rel="noopener" href="https://unrvld.com/work/the-open" target="_blank" title="Кейс проекта The&nbsp;Open на&nbsp;сайте UNRVLD">The Open</a>. </p>
<p>В этому году мы&nbsp;раздали студентам тестовое задание, не&nbsp;дожидаясь окончания курсов. Прособеседовали пять человек. Позвали в&nbsp;штат двоих — Кирилла Кодина и&nbsp;Павла Иванова.</p>
<p>А какой результат от&nbsp;курсов видят сами студенты? Мы&nbsp;провели опрос, чтобы это&nbsp;узнать. И&nbsp;вот, какие ответы получили:</p>

<div class="text-highlight">
  <p>— Именно после курсов у&nbsp;меня появилось хоть какое&#8209;то&nbsp;понимание того, как&nbsp;пишутся настоящие сайты. И&nbsp;свое первое работающее веб-приложение я&nbsp;написал именно с&nbsp;вами.</p> 

<p>— Получил навык работы с&nbsp;системой контроля версии, IIS, понимание Asp.net MVC, навык работы с&nbsp;базами данных MS&nbsp;SQL, HTTP, JSON, HTML , jQuery, Razor, REST и&nbsp;другими.</p>

<p>— Воочию увидел, что&nbsp;из&nbsp;себя представляет .Net, познакомился со&nbsp;схемой MVC, узнал подробнее о&nbsp;серверной архитектуре для&nbsp;высоконагруженных приложений, SQL, паттернах. </p>

<p>— В&nbsp;целом узнал много нового, в&nbsp;том&nbsp;числе и&nbsp;разобрался, как&nbsp;работать с&nbsp;C# и&nbsp;что&nbsp;такое Asp.net MVC.
</div>

<p>Что особенно приятно, все&nbsp;ребята решили продолжить изучать веб-разработку, и&nbsp;больше половины рассказали о&nbsp;своих планах устроиться на&nbsp;работу в&nbsp;IT-компанию. </p>
<h2>Что будет с&nbsp;курсом дальше? </h2>
<p>Это не&nbsp;последний наш&nbsp;курс. В&nbsp;следующем году мы&nbsp;продолжим обучать студентов. Но&nbsp;прежде — переработаем сам&nbsp;подход. Опрос студентов помог найти наши слабые стороны, понять, какие навыки стоит прокачать преподавателям, и&nbsp;узнать, над&nbsp;каким проектам начинающим программистам было бы&nbsp;интересно поработать.</p>
<p>О старте набора на&nbsp;новый курс сообщим, как&nbsp;всегда, на&nbsp;нашем сайте, в&nbsp;<a href="https://www.instagram.com/fuse8ru/">instagram</a> и&nbsp;в&nbsp;группах во&nbsp;«<a href="https://vk.com/fuse8">ВКонтакте</a>» и&nbsp;на&nbsp;<a href="https://www.facebook.com/fuse8ru/">Facebook</a>. А&nbsp;пока — смотрите записи предыдущих уроков на&nbsp;нашем <a href="https://www.youtube.com/channel/UC9sARHJ-1Jj8y5ZnJi_5cwg">YouTube-канале</a>. </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2141/final.jpg"
         alt=""
         itemprop="">


</figure>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Софт скиллы в IT-сфере: что прокачивать
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Что такое софт скиллы, зачем они нужны и как мы их развиваем внутри команды? Плюс — на какие гибкие навыки смотрят тимлиды при найме.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/soft-skills-in-it/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/soft-skills-in-it/</guid>

                <pubDate>Tue, 06 May 2025 13:45:15 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Софт скиллы в IT-сфере: что прокачивать</h1>
                                <figure>
                                    <img src="/Media/2169/justin-luebke-gcl6jcb1r9g-unsplash-2.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b84db6388e596cd92b00c52eb62de26d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d2f7a59a65d64264816fffc32bdac270"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>О том, что&nbsp;такое софт скиллы, я&nbsp;задумалась в&nbsp;начале октября — когда мы&nbsp;с&nbsp;нашим руководителем проектов Вениамином Мустафиным работали над&nbsp;статьей «<a href="/articles/how-to-become-a-front-end-developer" title="Статья о&nbsp;том, как&nbsp;за&nbsp;полгода стать фронтэндером">Как стать фронтенд разработчиком</a>». В&nbsp;ней&nbsp;Веня писал, что&nbsp;для&nbsp;успеха и&nbsp;развития карьеры мало технических знаний — нужно прокачивать гибкие навыки. Но&nbsp;что&nbsp;есть гибкие навыки именно для&nbsp;наших ребят? Что&nbsp;важно для&nbsp;них? На&nbsp;какие софт скиллы обращают внимание тимлиды, нанимая новых сотрудников? Чтобы понять это, я&nbsp;  решила провести опрос внутри нашей компании. </p>
<p>На основе ответов мне&nbsp;удалось сформулировать человечное определение понятия «софт скилл». Я&nbsp;выделила тот&nbsp;самый маст-хэв-набор гибких навыков для&nbsp;работы в&nbsp;IT-сфере. И&nbsp;теперь точно могу сказать, какие скиллы стоит прокачать, чтобы попасть в&nbsp;нашу команду и&nbsp;максимально быстро вырасти с&nbsp;позиции джуна до&nbsp;мидла или&nbsp;даже сеньора. </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2147/suzanne-d-williams-vmkbfr6r_jg-unsplash.jpg"
         alt=""
         itemprop="">


</figure>

<h2>Что такое софт скиллы? </h2>
<p>Если загуглить, что&nbsp;такое софт скиллы (soft skills — англ. гибкие навыки), мы&nbsp;получим довольно сухое определение: набор неспециализированных, но&nbsp;важных для&nbsp;развития карьеры надпрофессиональных навыков. Но&nbsp;что&nbsp;понимает под&nbsp;этим живой человек? </p>
<p>Наши ребята считают, что&nbsp;софт скиллы — это&nbsp;личные качества и&nbsp;навыки человека, которые:</p>
<ul>
<li>напрямую не&nbsp;связаны с&nbsp;должностными обязанностями;</li>
<li>повышают продуктивность и&nbsp;эффективность;</li>
<li>помогают коммуницировать внутри компании;</li>
<li>объединяют отдельных технических специалистов в&nbsp;команду. </li>
</ul>
<p>Такое определение мне&nbsp;нравится больше — оно&nbsp;понятное, простое и&nbsp;довольно обширное. </p>

<div class="text-highlight">
  <b>Вениамин Мустафин, руководитель проектов:</b> «Софт скиллы сложно приобрести, но&nbsp;это&nbsp;того стоит. Некоторые из&nbsp;них&nbsp;пригодятся на&nbsp;любой должности. Например, прокачанный тайм-менеджмент одинаково полезен для&nbsp;программиста, дизайнера, руководителя проектов, президента или&nbsp;повелителя морей».
</div>

<p>Еще одна особенность софт скиллов (уж&nbsp;простите за&nbsp;очевидность) — это&nbsp;их&nbsp;гибкость. Для&nbsp;меня, как&nbsp;для&nbsp;редактора, писательский навык — это&nbsp;хард скилл. Для&nbsp;руководителя проектов, разработчика или&nbsp;тестировщика — софт. </p>
<p>А ещё, по&nbsp;моему наблюдению, практически все&nbsp;софт скиллы связаны друг с&nbsp;другом: часто приобретение одного из&nbsp;них&nbsp;ускоряет процесс прокачки другого. </p>
<h2>Маст-хэв-набор гибких навыков для&nbsp;работы в&nbsp;IT&nbsp;(по&nbsp;версии fuse8)</h2>
<p>Сотрудники fuse8 выделили для&nbsp;себя шесть ключевых софт скиллов. Их&nbsp;условно можно разделить на&nbsp;две&nbsp;группы: коммуникативные (те, что&nbsp;связаны с&nbsp;любыми видами общения — с&nbsp;одним человеком или&nbsp;широкой публикой, устно или&nbsp;письменно) и&nbsp;организационно-целевые (те, что&nbsp;связаны с&nbsp;повышением личной эффективности, отлаживанием рабочего процесса и&nbsp;обучения). </p>
<p>Похожее разделение я&nbsp;встретила в&nbsp;статье «<a rel="noopener" href="https://habr.com/ru/company/epam_systems/blog/418621/" target="_blank" title="Ещё одна хорошая статья о&nbsp;софт скиллах">Зачем инженеру soft skills</a>» на&nbsp;«Хабре»: автор включает в&nbsp;понятие «гибкие навыки» два&nbsp;больших раздела – коммуникации и&nbsp;целеполагание.</p>
<h2>Коммуникативные гибкие навыки</h2>
<p>Все ребята, принявшие участие в&nbsp;опросе, упоминали о&nbsp;коммуникативных навыках. Общение — это&nbsp;то, что, по&nbsp;их&nbsp;мнению, помогает сформировать слаженную команду. </p>

<div class="text-highlight">
  <b>Екатерина Шевченко, QA-специалист:</b> «Софт-скиллы, связанные с&nbsp;коммуникациями, помогают объединить технических специалистов в&nbsp;команду / направление / компанию».
</div>



<figure class="umb-macro-image">
    


    <img src="/Media/2167/kfse-olkzt4.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Фронтенд-разработчик Данил Шилов и&nbsp;техдиректор Андрей Степанов развивают навыки коммуникации на&nbsp;корпоративе =)
        </figcaption>
</figure>

<p>Вот основные коммуникативные навыки, которые выделяют для&nbsp;себя наши ребята:</p>
<h3>Общение и&nbsp;умение слушать </h3>
<p><strong>Зачем развивать:</strong> чтобы говорить на&nbsp;одном языке, строить конструктивный диалог с&nbsp;коллегами и&nbsp;клиентами, доходчиво транслировать свои идеи. Когда коммуникация в&nbsp;команде налажена, задачи формулируются грамотно, понимаются правильно и&nbsp;выполняются точно. </p>
<p><strong>Как развивать:</strong> знакомиться, общаться и&nbsp;слушать!</p>

<div class="text-highlight">
  <b>Илья Селунский, QA-специалист:</b> «Научиться говорить на&nbsp;одном языке и&nbsp;понимать друг друга в&nbsp;работе также легко, как&nbsp;и&nbsp;в&nbsp;неформальной обстановке, помогают командные игры, любые small-talks на&nbsp;офисной кухне и&nbsp;верёвочные курсы на&nbsp;сплочение. Например, «паутина»: между деревьями натягивается хаотическая «сеть» с&nbsp;разными размерами ячеек, цель команды — по&nbsp;одному перейти на&nbsp;другую сторону, не&nbsp;прикасаясь к&nbsp;верёвкам».
</div>

<p><strong>Что почитать:</strong> Дейл Карнеги «Как завоёвывать друзей и&nbsp;оказывать влияние на&nbsp;людей», «Как перестать беспокоиться и&nbsp;начать жить». </p>
<h3>Публичные выступления </h3>
<p><strong>Зачем развивать:</strong> чтобы передавать знания и&nbsp;опыт другим, продвигать свою компанию и&nbsp;себя лично на&nbsp;IT-конференциях, круглых столах и&nbsp;экспертных клубах, приобретать полезные знакомства и&nbsp;связи. </p>
<p>В октябре наш&nbsp;директор Антон Пермяков примерил на&nbsp;себя роль спикера на&nbsp;конференции. Он&nbsp;заранее написал текст доклада, несколько раз&nbsp;отрепетировал его, устроил генеральный прогон в&nbsp;нашем офисе и&nbsp;уже&nbsp;на&nbsp;следующий день выступил перед аудиторией в&nbsp;500 человек.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2168/zzv9tzqztva-2.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Антон Пермяков на&nbsp;конференции START IT&nbsp;
        </figcaption>
</figure>

<p><strong>Как развивать:</strong> смотреть на&nbsp;других спикеров, анализировать их&nbsp;доклады и&nbsp;манеру речи, тренироваться и&nbsp;проявлять активность. У&nbsp;нас&nbsp;в&nbsp;компании, например, разработчики частенько проводят внутренние воркшопы, организуют курсы для&nbsp;студентов, выступают на&nbsp;конференциях.</p>

<div class="text-highlight">
  Андрей Степанов, наш&nbsp;технический директор, нарабатывает навык публичных выступлений, просматривая лекции TED&nbsp;и&nbsp;презентации Apple.
</div>

<p><strong>Что почитать:</strong>  Радислав Гандапас «Камасутра для&nbsp;оратора», Дейл Карнеги, «Как выработать уверенность в&nbsp;себе и&nbsp;влиять на&nbsp;людей, выступая публично».</p>
<h3>Переговоры и&nbsp;«трудные» диалоги</h3>
<p><strong>Зачем развивать:</strong> чтобы научиться разрешать конфликтные ситуации (с&nbsp;клиентом или&nbsp;внутри коллектива), обосновывать стоимость разработки сложного проекта, получать выгодные условия сотрудничества.   </p>
<p><strong>Как развивать:</strong> слушать, анализировать и&nbsp;тренироваться: напрашивайтесь на&nbsp;совещания и&nbsp;переговоры; ищите в&nbsp;коллективе небольшие конфликты и&nbsp;пробуйте их&nbsp;разрешить; не&nbsp;увиливайте от&nbsp;трудных разговоров — готовьтесь к&nbsp;ним&nbsp;и&nbsp;поднимайте на&nbsp;обсуждение непростые вопросы. </p>
<p><span style="font-weight: 400;">В прошлом году Антон Пермяков и&nbsp;Вениамин Мустафин прошли курс «</span><a rel="noopener" href="https://stratoplan.ru/constructive/" target="_blank" title="Курс «Стратоплана» о&nbsp;том, как&nbsp;экономить время и&nbsp;нервы, наладив коммуникацию с&nbsp;людьми вокруг"><span style="font-weight: 400;">Конструктивная конфронтация</span></a><span style="font-weight: 400;">» Школы менеджеров «Стратоплан». Они&nbsp;на&nbsp;практике в&nbsp;диалогах по&nbsp;определенным сценариям научились разрешать конфликты с&nbsp;пользой для&nbsp;всех сторон. </span></p>

<div class="text-highlight">
  <b>Вениамин Мустафин:</b> «При каждом конфликте я&nbsp;стараюсь не&nbsp;впадать в&nbsp;режим «берсерка», а&nbsp;разобраться,  что&nbsp;движет человеком, почему он&nbsp;сделал так, а&nbsp;не&nbsp;иначе, и&nbsp;как&nbsp;я&nbsp;могу ему&nbsp;помочь».
</div>

<p><strong>Что почитать:</strong> Керри Паттерсон, Джозеф Гренни, Рон&nbsp;Макмиллан и&nbsp;Эл&nbsp;Свитцлеp «Трудные диалоги», Джим Кэмп «Сначала скажите "НЕТ"». </p>
<h3>Писательское мастерство</h3>
<p><strong>Зачем развивать:</strong> чтобы уметь грамотно и&nbsp;понятно выражать свои мысли на&nbsp;бумаге (или&nbsp;в&nbsp;электронном виде), не&nbsp;обидеть коллегу или&nbsp;клиента в&nbsp;переписке, поделиться профессиональным опытом через текст  — экспертную статью. </p>
<p><strong>Как развивать:</strong> писать! Находить темы и&nbsp;поводы для&nbsp;текстов, пусть даже самых небольших. Набивать руку постами в&nbsp;личных соцсетях, или&nbsp;просто писать для&nbsp;себя. Поставить себе реальную цель — написать одну статью в&nbsp;месяц, разбить её&nbsp;на&nbsp;небольшие задачи и&nbsp;приступить к&nbsp;выполнению. </p>

<div class="text-highlight">
  Журналист Майя Богданова рекомендует каждый день начинать с&nbsp;«утренних страниц»: открываете документ/блокнот/заметки в&nbsp;телефоне и&nbsp;пишете всё, что&nbsp;придет в&nbsp;голову, не&nbsp;отвлекаясь на&nbsp;редактуру и&nbsp;подбор красивых оборотов. Это, как&nbsp;утверждает Майя, развивает воображение и&nbsp;снимает писательские блоки.
</div>



<figure class="umb-macro-image">
    


    <img src="/Media/2175/dsc06376-2.jpg"
         alt=""
         itemprop="">


</figure>

<p><strong>Что почитать:</strong> Максим Ильяхов и&nbsp;Людмила Сарычева «Пиши, сокращай», «Новые правила деловой переписки», «Простые правила сильного текста» (да, Ильяхова и&nbsp;Сарычеву мы&nbsp;любим), Майя Богданова «Школа контента», советы «Бюро Горбунова» о&nbsp;тексте. </p>
<h2>Организационно-целевые гибкие навыки</h2>
<p>Организационно-целевыми мы&nbsp;считаем софт скиллы, напрямую влияющие на&nbsp;личную продуктивность и&nbsp;развитие в&nbsp;профессиональной области. Это&nbsp;то, что&nbsp;помогает нам&nbsp;стать эффективнее и&nbsp;освоить новые приемы, которые ускоряют работу и, как&nbsp;следствие, приближают достижение цели. </p>
<h3>Самоорганизация или&nbsp;time-менеджмент</h3>
<p><strong>Зачем развивать:</strong> чтобы упорядочить свои задачи (а&nbsp;руководителям и&nbsp;тимлидам — ещё&nbsp;и&nbsp;чужие), понимать цели и&nbsp;правильно расставлять приоритеты, грамотно распределять собственные ресурсы. Проще говоря — чтобы делать больше за&nbsp;меньшее время.    </p>
<p><strong>Как развивать:</strong> отслеживайте, как&nbsp;и&nbsp;куда вы&nbsp;тратите рабочее время (неплохой инструмент для&nbsp;этого — <a rel="noopener" href="https://www.getharvest.com/" target="_blank" title="Таймтрекер Harvest— чтобы следить, на&nbsp;что&nbsp;уходит ваше время">Harvest</a>), ведите списки задач и&nbsp;проектов, читайте статьи и&nbsp;книги, учитесь у&nbsp;гуру продуктивности (см. пункт ниже).</p>

<div class="text-highlight">
  <b>Александр Медведев, разработчик:</b> «Умение концентрироваться на&nbsp;задаче — важная составляющая эффективного Self-менеджмента. Я&nbsp;использую <a href='https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BF%D0%BE%D0%BC%D0%B8%D0%B4%D0%BE%D1%80%D0%B0' target='_blank' title='Вики о&nbsp;«помидорной технике»'>«помидорную технику»</a>: концентрируюсь на&nbsp;задаче на&nbsp;25-30 минут, делаю пятиминутный перерыв и&nbsp;возвращаюсь к&nbsp;работе. Такой метод отлично лечит прокрастинацию. Временные интервалы отслеживаю расширением для&nbsp;браузера <a href='https://chrome.google.com/webstore/detail/marinara-pomodoro%C2%AE-assist/lojgmehidjdhhbmpjfamhpkpodfcodef' target='_blank' title='Расширение для&nbsp;Chrome'>Marinara: Pomodoro</a>».
</div>

<p><strong>Что почитать:</strong> абсолютный любимчик наших разработчиков — Максим Дорофеев. Все, кто&nbsp;развивают time-менеджмент, в&nbsp;опросе посоветовали его&nbsp;«Джедайские техники». Дэвид Аллен «Как привести дела в&nbsp;порядок». Глеб Архангельский «Тайм-драйв».</p>
<h3>Управление и&nbsp;делегирование </h3>
<p><strong>Зачем развивать:</strong> чтобы понимать мотивацию всех участников проекта, научиться планировать работу команды, делегировать и&nbsp;правильно ставить задачи — так, чтобы исполнитель не&nbsp;мучился в&nbsp;процессе, а&nbsp;руководитель был&nbsp;доволен результатом.  </p>
<p><strong>Как развивать:</strong> советоваться с&nbsp;тимлидами и&nbsp;руководителями, проявлять инициативу и&nbsp;не&nbsp;бояться брать на&nbsp;себя ответственность. А&nbsp;по&nbsp;окончанию проекта проводить ретроспективу — оглядываться назад и&nbsp;анализировать, что&nbsp;было сделано хорошо, что&nbsp;не&nbsp;очень, и&nbsp;как&nbsp;это&nbsp;можно изменить в&nbsp;будущем. </p>

<div class="text-highlight">
  <b>Екатерина Шевченко:</b> «Начинай думать как&nbsp;сеньор и&nbsp;станешь им. Нет&nbsp;ответственности — нет&nbsp;развития».
</div>

<p><strong>Что почитать:</strong> Том&nbsp;ДеМарко Deadline, электронный учебник Николая Товеровского «Управление проектами, людьми и&nbsp;собой» (Товеровский периодически проводит трехдневный <a rel="noopener" href="https://bureau.ru/educenter/fff/" target="_blank" title="Курс «Управление проектами, людьми и&nbsp;собой»">практический курс</a> на&nbsp;эту&nbsp;же&nbsp;тему), рассылка и&nbsp;блог Школы менеджеров «<a rel="noopener" href="https://stratoplan.ru/" target="_blank" title="Школа менеджеров «Стратоплан»">Стратоплан</a>». Много <a rel="noopener" href="https://bureau.ru/bb/soviet/kolan/" target="_blank" title="Советы Бюро">советов об&nbsp;управлении проектами</a> и&nbsp;делегировании есть у&nbsp;«Бюро Горбунова».   </p>
<h2>Знание английского языка</h2>
<p>Очевидно, что&nbsp;этот навык относится к&nbsp;коммуникативным. Но&nbsp;я&nbsp;выделила его&nbsp;в&nbsp;отдельную категорию. Ведь, строго говоря, для&nbsp;70% наших сотрудников знание английского — это&nbsp;скорее хард скилл. Сейчас объясню, почему. </p>
<p>Если вы&nbsp;хоть немного знакомы с&nbsp;<a href="/company" title="Немного о&nbsp;нашей компании">компанией fuse8</a>, то&nbsp;знаете, что&nbsp;все&nbsp;наши разработчики условно разделены на&nbsp;русскую и&nbsp;английскую команды. Первая осваивает российский рынок, вторая — работает с&nbsp;нашими <a href="/company/partnership-with-delete-agency" title="Что даёт партнёрство с&nbsp;Delete">британскими коллегами из&nbsp;Delete Agency</a> над&nbsp;проектами для&nbsp;европейских заказчиков. И&nbsp;вот&nbsp;для&nbsp;ребят из&nbsp;второй команды — english is&nbsp;definitely a&nbsp;hard skill. </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2146/photo_2019-04-16-121957-2.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Именно так&nbsp;общаются разработчики fuse8 с&nbsp;менеджерами Delete Agency: тимлид Антон Воротынцев вещает из&nbsp;Челябинска в&nbsp;Лидсе по&nbsp;видеосвязи. На&nbsp;английском, разумеется
        </figcaption>
</figure>

<p><strong>Зачем развивать:</strong> Разработчики из&nbsp;английской команды постоянно общаются и&nbsp;переписываются с&nbsp;менеджерами проектов (британцами — сотрудниками Delete) и&nbsp;клиентами. Очевидно, что&nbsp;тут&nbsp;без&nbsp;знания языка достичь понимания невозможно.   </p>
<p><strong>Как развивать:</strong> Погружайтесь в&nbsp;язык всегда и&nbsp;везде — смотрите фильмы и&nbsp;сериалы, читайте статьи и&nbsp;книги на&nbsp;английском, запишитесь на&nbsp;курсы, найдите друга по&nbsp;переписке из&nbsp;Англии, США&nbsp;или&nbsp;любой другой англоговорящей страны. </p>

<div class="text-highlight">
  Наши сотрудники осваивают теорию и&nbsp;увеличивают словарный запас в&nbsp;The&nbsp;English club. А&nbsp;чтобы преодолеть барьер и&nbsp;начать 
 говорить на&nbsp;английском, занимаются с&nbsp;Джеком, нейтив-спикером из&nbsp;Ливерпуля.
</div>

<p><strong>Что почитать:</strong> художественную литературу на&nbsp;английском языке: это&nbsp;увлекательно (есть интересный сюжет) и&nbsp;полезно (вы&nbsp;погружаетесь в&nbsp;язык — очевидно же&nbsp;=)). У&nbsp;SkyEng есть <a rel="noopener" href="https://skyeng.ru/articles/25-angliyskikh-knig" target="_blank" title="Тут можно выбрать книгу на&nbsp;английском языке">крутая подборка литературы на&nbsp;английском</a> для&nbsp;начального, среднего и&nbsp;продвинутого уровней. Выбирайте! </p>
<h2>И что&nbsp;со&nbsp;всем этим делать?</h2>
<p>Всё это&nbsp;выглядит несколько пугающе: столько всего нужно изучить, понять, сделать… Как&nbsp;найти время, с&nbsp;чего начать, как&nbsp;вообще организовать собственное обучение и&nbsp;структурировать полученные знания? Вот&nbsp;пара советов от&nbsp;наших ребят:</p>
<ul>
<li>запросите фидбек от&nbsp;коллег, найдите «проблемный» навык и&nbsp;начните с&nbsp;него; </li>
<li>пройдите бесплатный курс от&nbsp;Coursera «<a rel="noopener" href="https://www.coursera.org/learn/learning-how-to-learn/" target="_blank" title="Курс «Научитесь учиться: мощные умственные инструменты, которые помогут вам&nbsp;овладеть сложными предметами»">Научитесь учиться</a>»: он&nbsp;пополнит вашу копилку методами, приёмами и&nbsp;инструментами для&nbsp;быстрого и&nbsp;качественного получения новых знаний (курс на&nbsp;английском, но&nbsp;там&nbsp;есть русские субтитры);      </li>
<li>не читайте книги, а&nbsp;изучайте их: клейте стикеры-закладки, выделяйте маркером важное, составляйте <a rel="noopener" href="https://www.xmind.net/" target="_blank" title="Неплохая десктопная программа для&nbsp;создания ментальных карт">майнд-мэпы</a>.</li>
</ul>


<figure class="umb-macro-image">
    


    <img src="/Media/2149/&#x441;&#x43D;&#x430;&#x447;&#x430;&#x43B;&#x430;-&#x441;&#x43A;&#x430;&#x436;&#x438;&#x442;&#x435;-&#x43D;&#x435;&#x442;-&#x434;&#x436;&#x438;&#x43C;-&#x43A;&#x435;&#x43C;&#x43F;.png"
         alt=""
         itemprop="">


        <figcaption>
            Наш&nbsp;руководитель проектов, Веня Мустафин, прочитав главу из&nbsp;книги, открывает майнд&#8209;мэп&nbsp;и&nbsp;вносит в&nbsp;него самые важные, на&nbsp;его&nbsp;взгляд, мысли. Это&nbsp;помогает структурировать полученную информацию и&nbsp;использовать её&nbsp;в&nbsp;дальнейшем
        </figcaption>
</figure>

<h2>Бонус: софт скиллы, которые помогут вам&nbsp;получить работу во&nbsp;fuse8</h2>
<p>Если вы&nbsp;придёте к&nbsp;нам&nbsp;на&nbsp;собеседование, скорее всего, общаться будете с&nbsp;директором Антоном Пермяковым, руководителем проектов Вениамином Мустафиным, техническим директором Андреем Степановым или&nbsp;с&nbsp;кем&#8209;то&nbsp;из&nbsp;тимлидов. Я&nbsp;спросила у&nbsp;них, какие гибкие навыки они&nbsp;ценят в&nbsp;соискателях, и&nbsp;вот&nbsp;какой список в&nbsp;итоге получился:</p>
<ul>
<li>управленческие навыки: инициативность и&nbsp;готовность принять ответственность на&nbsp;себя;</li>
<li>межличностное общение: умение работать в&nbsp;команде, коммуницировать и&nbsp;четко доносить свои мысли;</li>
<li>самоорганизация: умение правильно распоряжаться собственным временем; </li>
<li>писательское мастерство: умение выражать свои мысли письменно;</li>
<li>скорость печати: слепой десятипальцевый метод прилично увеличивает скорость работы — вы&nbsp;сосредоточены на&nbsp;задаче, а&nbsp;не&nbsp;на&nbsp;поиске нужной буквы или&nbsp;исправлении опечаток (помогают освоить «<a rel="noopener" href="https://nabiraem.ru/" target="_blank" title="Клавиатурный тренажер">Соло на&nbsp;клавиатуре</a>» и&nbsp;<a rel="noopener" href="https://www.ratatype.ru/" target="_blank" title="Ещё один клавиатурный тренажер">Ratatype</a>).</li>
</ul>
<p>Это не&nbsp;требования, которым нужно строго соответствовать, а&nbsp;скорее ваш&nbsp;личный бонус. И&nbsp;если он&nbsp;у&nbsp;вас&nbsp;есть, не&nbsp;стесняйтесь заявить об&nbsp;этом. Если же&nbsp;нет&nbsp;— пора развивать! </p>
<p> </p>
<hr>
<p><strong>О софт скиллах рассказали:</strong> Владимир Лысов, Даниил Шилов, Антон Пермяков, Антон Воротынцев, Илья Селунский, Вениамин Мустафин, Александр Медведев, Андрей Степанов, Екатерина Шевченко. </p>
<p><strong>Записала и&nbsp;отредактировала:</strong> Марина Медведева.</p>
<p><em><strong>Авторы и&nbsp;источники фото:</strong> Justin Luebke, Suzanne D. Williams on&nbsp;<a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash.</a></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Советы тимлиду: что важно в командной работе
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Советы тимлидам и руководителям проектов — из личного опыта за 20 лет в вебе и десятков реализованных проектов. Только то, что реально работает.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/tips-for-teamleads/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/tips-for-teamleads/</guid>

                <pubDate>Tue, 06 May 2025 13:44:47 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Советы тимлиду: что важно в командной работе</h1>
                                <figure>
                                    <img src="/Media/2231/untitled-111.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b5951ceb021496ad2b2146981f670cb6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/23c7ff9c934c4ed7a2dbd382097dac2a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2><span style="font-weight: 400;">О чем&nbsp;статья</span></h2>
<p><span style="font-weight: 400;">Это — мои&nbsp;советы тимлиду или&nbsp;руководителю проектов. У&nbsp;нас&nbsp;в&nbsp;компании эти&nbsp;должности не&nbsp;так&nbsp;уж&nbsp;и&nbsp;отличаются. Без&nbsp;погружения в&nbsp;дебри проджект-менеджмента (для&nbsp;этого есть хорошие учебники, книги и&nbsp;статьи) описал то, что&nbsp;каким&#8209;то&nbsp;образом закрепилось и&nbsp;сидит внутри. То, что&nbsp;я&nbsp;использую сейчас. Часть советов подойдёт для&nbsp;всех, кто&nbsp;участвует в&nbsp;командной работе — где&nbsp;есть проект, исполнитель и&nbsp;заказчик.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2238/ckcym212_1.jpg"
         alt=""
         itemprop="">


</figure>

<h2><span style="font-weight: 400;"></span><span style="font-weight: 400;">Приноси пользу и&nbsp;не&nbsp;упускай ее&nbsp;из&nbsp;виду</span></h2>
<p><span style="font-weight: 400;">Это точно совет для&nbsp;всех. Очевидная, кажется, вещь. Но&nbsp;иногда мы&nbsp;об&nbsp;этом забываем. </span></p>
<p><span style="font-weight: 400;">Когда мы&nbsp;искренне желаем, чтобы проект получился успешным, чтобы все&nbsp;заработало, как&nbsp;нужно, чтобы заказчику и&nbsp;его&nbsp;клиентам стало действительно удобнее, проще — шансы на&nbsp;успех сильно возрастают.</span></p>
<p><span style="font-weight: 400;">Можно специально напоминать себе время от&nbsp;времени: так&nbsp;вот&nbsp;же&nbsp;зачем мы&nbsp;делаем этот проект, вот&nbsp;в&nbsp;чем&nbsp;польза, пусть у&nbsp;нас&nbsp;всё&nbsp;получится!</span></p>
<p><span style="font-weight: 400;">В процессе размышлений и&nbsp;прояснений для&nbsp;себя, в&nbsp;чем&nbsp;же&nbsp;истинная польза от&nbsp;проекта, неизбежно придётся вникать в&nbsp;суть проекта — ведь нужно быть уверенным, что&nbsp;то, что&nbsp;мы&nbsp;делаем, действительно полезно и&nbsp;важно, и&nbsp;что&nbsp;все&nbsp;получается именно так, как&nbsp;должно.</span></p>
<p><span style="font-weight: 400;">Помните притчу про&nbsp;людей, которые строили храм? Один из&nbsp;строителей ходил с&nbsp;унылым лицом и&nbsp;говорил, что&nbsp;сильно устаёт, потому что&nbsp;целый день таскает камни.  Другой — радостно и&nbsp;энергично делал ту&nbsp;же&nbsp;самую работу, потому что&nbsp;знал — он&nbsp;строит храм, который принесёт пользу многим людям. </span></p>
<p><span style="font-weight: 400;">Так же&nbsp;и&nbsp;с&nbsp;нашими проектами — если помнить, что&nbsp;и&nbsp;зачем мы&nbsp;делаем, вероятность того, что&nbsp;у&nbsp;нас&nbsp;действительно получится то, что&nbsp;нужно, намного увеличивается. Давайте строить храмы, а&nbsp;не&nbsp;таскать камни :)</span></p>
<h2><span style="font-weight: 400;">Повышай прозрачность</span></h2>
<p><span style="font-weight: 400;">Твоя прозрачность — это&nbsp;когда со&nbsp;стороны видно, что&nbsp;ты&nbsp;делаешь. Повышая её, ты&nbsp;автоматически увеличиваешь уровень доверия со&nbsp;стороны тех, с&nbsp;кем&nbsp;работаешь.</span></p>
<h3><span style="font-weight: 400;">Прозрачность для&nbsp;команды</span></h3>
<p><span style="font-weight: 400;">Максимально делись с&nbsp;командой информацией по&nbsp;проекту. На&nbsp;старте расскажи всё, что&nbsp;знаешь о&nbsp;проекте. В&nbsp;процессе держи коллег в&nbsp;курсе того, что&nbsp;ты&nbsp;делаешь (например: задал вопрос клиенту, жду&nbsp;реакции). Тогда команда знает, что&nbsp;происходит. Ребята видят, что&nbsp;ты&nbsp;им&nbsp;доверяешь, и&nbsp;в&nbsp;ответ больше доверяют тебе.</span></p>
<h3><span style="font-weight: 400;">Прозрачность для&nbsp;клиента</span></h3>
<p><span style="font-weight: 400;">Клиент тут&nbsp;— это&nbsp;хоть внешний, хоть внутренний заказчик. </span></p>
<p><span style="font-weight: 400;">Потрать чуть больше времени, когда пишешь письмо клиенту, добавь полезных деталей. Если нужно, напиши дополнительное письмо. Когда клиент знает, что&nbsp;происходит на&nbsp;проекте, он&nbsp;спокоен. Доверие к&nbsp;тебе и&nbsp;команде растёт.</span></p>
<h3><span style="font-weight: 400;">Прозрачность для&nbsp;босса</span></h3>
<p><span style="font-weight: 400;">В нашей культуре не&nbsp;принято хвалиться. Считается хорошим тоном скромно промолчать, когда ты&nbsp;сделал что&#8209;то&nbsp;хорошее. Но&nbsp;в&nbsp;работе такая установка может мешать. Начальник рад, когда все&nbsp;под&nbsp;контролем. Ему&nbsp;важно в&nbsp;любой момент времени понимать, что&nbsp;происходит на&nbsp;проекте и&nbsp;с&nbsp;твоей командой. Регулярно встречайся с&nbsp;начальником, общайся с&nbsp;ним&nbsp;в&nbsp;мессенджере, поддерживай коммуникацию любым удобным вам&nbsp;способом.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2228/hcselouskl72_1.jpg"
         alt=""
         itemprop="">


</figure>

<p><span style="font-weight: 400;"></span><span style="font-weight: 400;">И, конечно, новость не&nbsp;всегда будет похожа на&nbsp;хвастовство. Если на&nbsp;проекте дела идут неважно, сообщить об&nbsp;этом тоже придётся. Лучше дать негативную информацию, чем&nbsp;не&nbsp;дать никакой. По&nbsp;крайней мере, так&nbsp;  вы&nbsp;вместе с&nbsp;боссом найдёте выход из&nbsp;непростой ситуации. Если ты&nbsp;скрывал проблему, рассчитывать на&nbsp;поддержку начальства будет намного сложнее — ведь время упущено, и&nbsp;шансы что&#8209;то&nbsp;исправить значительно уменьшились.</span></p>
<h2><span style="font-weight: 400;">Контролируй</span></h2>
<p><span style="font-weight: 400;">Здесь я&nbsp;собрал скучноватые, но&nbsp;важные вещи, которые обязательно должны быть. Если вы&nbsp;знаете, что&nbsp;такое управление проектами в&nbsp;сфере веб-разработки, можете смело переходить к&nbsp;следующему совету.</span></p>
<h3><span style="font-weight: 400;">На старте проекта </span></h3>
<p><span style="font-weight: 400;">На старте должно быть максимально ясно: зафиксировано ли&nbsp;ТЗ&nbsp;по&nbsp;проекту, какой бюджет и&nbsp;когда дедлайн, хватает ли&nbsp;нам&nbsp;ресурсов, какие подходы и&nbsp;инструменты мы&nbsp;будем использовать. Важно также сразу определить возможные риски и&nbsp;понять, что&nbsp;делать, если они&nbsp;осуществятся и&nbsp;кто&nbsp;будет принимать решения в&nbsp;сложных ситуация. Но&nbsp;самое главное — понять, принимает ли&nbsp;команда сам&nbsp;проект и&nbsp;все&nbsp;условия по&nbsp;нему.  </span></p>
<h3><span style="font-weight: 400;">В процессе работ</span></h3>
<p><span style="font-weight: 400;">Хорошо, когда в&nbsp;любой момент ты&nbsp;понимаешь, что&nbsp;происходит с&nbsp;проектом: на&nbsp;все&nbsp;ли&nbsp;возникающие вопросы мы&nbsp;получаем ответы вовремя, не&nbsp;растёт ли&nbsp;объём работ, укладываемся ли&nbsp;мы&nbsp;в&nbsp;сроки, не&nbsp;образуется ли&nbsp;технический долг, доволен ли&nbsp;заказчик промежуточными результатами, и, главное, создаётся ли&nbsp;для&nbsp;него польза.</span></p>
<h3><span style="font-weight: 400;">Ближе к&nbsp;финишу</span></h3>
<p><span style="font-weight: 400;">Вообще-то, многое из&nbsp;этого должно быть ясно уже&nbsp;вначале: как&nbsp;и&nbsp;с&nbsp;кем&nbsp;будет происходить процесс приёмки, где&nbsp;результат будет жить (хостинг, SSL-сертификат, доменное имя), сколько времени займёт развёртывание, нужно ли&nbsp;обучать клиента и&nbsp;кто&nbsp;этим займётся, на&nbsp;кого ляжет поддержка и&nbsp;развитие.</span></p>
<h2><span style="font-weight: 400;">Делись ответственностью, а&nbsp;не&nbsp;раздавай задачи</span></h2>
<p><span style="font-weight: 400;">Никто не&nbsp;хочет быть роботом-исполнителем чужих поручений. Может, конечно, кто&#8209;то&nbsp;и&nbsp;хочет, но&nbsp;скорее всего, этот человек не&nbsp;из&nbsp;нашей истории.</span></p>
<h3><span style="font-weight: 400;">Пусть оценивает тот, кто&nbsp;будет делать</span></h3>
<p><span style="font-weight: 400;">Вот простой пример, как&nbsp;ты&nbsp;можешь разделить ответственность с&nbsp;командой. Попроси ребят перед началом спринта (или&nbsp;проекта) дать оценки по&nbsp;задачам. Это&nbsp;должна делать именно твоя команда, а&nbsp;не&nbsp;техдиректор или&nbsp;ведущий разработчик из&nbsp;другого отдела. </span></p>
<p><span style="font-weight: 400;">Если оценки давали одни люди, а&nbsp;делают задачи другие,  этим другим сложнее принять на&nbsp;себя ответственность и&nbsp;подписаться под&nbsp;навязанные сроки.</span></p>
<h3><span style="font-weight: 400;">Принимать решения вместе</span></h3>
<p><span style="font-weight: 400;">Другой пример, как&nbsp;можно делиться ответственностью — принимать решения вместе с&nbsp;командой. Когда ты&nbsp;единолично выбираешь тот&nbsp;или&nbsp;иной подход, будь готов к&nbsp;тому, что&nbsp;коллеги могут с&nbsp;тобой не&nbsp;согласиться.</span></p>
<h2><span style="font-weight: 400;">Защищай команду от&nbsp;ненужного стресса</span></h2>
<p><span style="font-weight: 400;">Когда руководишь командой, хорошо сделать так, чтобы твои коллеги не&nbsp;испытывали ненужного стресса. Здорово, когда единственное, о&nbsp;чем&nbsp;беспокоится разработчик, это&nbsp;его&nbsp;текущие задачи.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2237/&#x441;&#x442;&#x440;&#x435;&#x43B;&#x44B;.jpg"
         alt=""
         itemprop="">


</figure>

<p><span style="font-weight: 400;"></span><span style="font-weight: 400;"></span><span style="font-weight: 400;">Стресс может появиться от&nbsp;чего угодно: личные конфликты в&nbsp;команде, непосредственный доступ к&nbsp;разработчикам извне (клиент написал программисту напрямую, тот&nbsp;начал переживать и&nbsp;т.д.). Твоим коллегам будет сложно сосредоточиться, если голова занята мыслями вроде: «Блин, мне&nbsp;нужно успеть вот&nbsp;это&nbsp;и&nbsp;вот&nbsp;то, а&nbsp;еще&nbsp;сейчас клиент попросил вот&nbsp;это&nbsp;сюда добавить». Желания и&nbsp;просьбы клиента должны волновать в&nbsp;первую очередь тебя. Разработчик же&nbsp;должен максимально эффективно решать технические задачи.</span></p>
<h3><span style="font-weight: 400;">Что делать с&nbsp;внешними источниками стресса</span></h3>
<p><span style="font-weight: 400;">Чтобы защитить коллег от&nbsp;внешних воздействий, общение клиента с&nbsp;командой должно происходить через руководителя (тебя). По&nbsp;крайней мере, ты&nbsp;всегда должен быть в&nbsp;курсе всех коммуникаций (быть в&nbsp;копии). Главное, не&nbsp;переборщить, превратившись в&nbsp;бутылочное горлышко, когда вся&nbsp;работа тормозится, потому что&nbsp;ты&nbsp;не&nbsp;успеваешь обрабатывать корреспонденцию.</span></p>
<h3><span style="font-weight: 400;">Внутренние конфликты</span></h3>
<p><span style="font-weight: 400;">Защитой от&nbsp;внутренних стрессов служат регулярные встречи с&nbsp;командой. Их&nbsp;можно проводить в&nbsp;формате бесед «один на&nbsp;один» или&nbsp;просто вместе обедать. </span></p>
<p><span style="font-weight: 400;">Не все&nbsp;стрессовые ситуации получится легко разрешить. Советуйся со&nbsp;старшими товарищами, если они&nbsp;есть в&nbsp;вашей компании!</span></p>
<h3><span style="font-weight: 400;">Полезный стресс</span></h3>
<p><span style="font-weight: 400;">Иногда стресс может быть полезным, и&nbsp;защищаться от&nbsp;него не&nbsp;нужно. Например, когда на&nbsp;проекте возникли серьёзные проблемы. </span></p>
<p><span style="font-weight: 400;">Если клиент в&nbsp;бешенстве, потому что&nbsp;сайт работает вообще не&nbsp;так, как&nbsp;должен был, важно сразу рассказать об&nbsp;этом команде. Это&nbsp;поможет мобилизовать силы и&nbsp;быстрее найти выход из&nbsp;ситуации. </span></p>
<p><span style="font-weight: 400;">Тоже самое может касаться и&nbsp;внутренних ситуаций. Например, когда кто&#8209;то&nbsp;в&nbsp;команде вызывает крайне негативную реакцию окружающих. Если запрятать эту&nbsp;ситуацию «под ковёр», под&nbsp;воздействием стресса окажется вся&nbsp;команда. Правильно было бы&nbsp;взять удар на&nbsp;себя: поговорить с&nbsp;источником раздражения в&nbsp;команде, постараться локализовать конфликт и&nbsp;разрешить его.</span></p>
<h2><span style="font-weight: 400;">Выводы</span></h2>
<p><span style="font-weight: 400;">Желание принести пользу, повышение прозрачности, разделение ответственности с&nbsp;командой и&nbsp;защита от&nbsp;ненужных стрессов помогут тебе стать отличным тимлидом или&nbsp;руководителем проектов!</span></p>
<p><span style="font-weight: 400;">Успехов.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2235/untitled-456.jpg"
         alt=""
         itemprop="">


</figure>

<p><em><span style="font-weight: 400;"><strong>Источник иллюстраций:</strong> <a rel="noopener" href="https://shakespeareillustration.org/" target="_blank" title="Victorian Illustrated Shakespeare Archive">https://shakespeareillustration.org/</a></span></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    ChelHack-2019: по следам первого объединенного хакатона в Челябинске
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    30 ноября и 1 декабря, в Челябинске прошли первые городские соревнования разработчиков ChelHack. Организаторами стали местные IT-компании, включая fuse8. 
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/chelhack-2019-how-it-was/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/chelhack-2019-how-it-was/</guid>

                <pubDate>Tue, 06 May 2025 13:44:22 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>ChelHack-2019: по следам первого объединенного хакатона в Челябинске</h1>
                                <figure>
                                    <img src="/Media/2199/8.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/0f746a1f203c2cd2009c5dfa551badf7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/573a5246691f44cb86ce3554c8aeedcc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">30 ноября и&nbsp;1 декабря в&nbsp;Челябинске прошли первые городские соревнования разработчиков ChelHack. Организаторами стали местные IT-компании: мы&nbsp;(fuse8), Интерсвязь, Napoleon IT, Xpage и&nbsp;АНО&nbsp;«Центр кластерного развития Челябинской области». </span></p>
<p><span style="font-weight: 400;">Двое суток участники ChelHack решали интересные задачи по&nbsp;веб-разработке и&nbsp;машинному обучению, сражаясь за&nbsp;главный приз в&nbsp;100 000 рублей в&nbsp;каждой из&nbsp;номинаций. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2192/1.jpg" alt="" itemprop="">


</figure>

<p><span style="font-weight: 400;"></span><span style="font-weight: 400;">Мне посчастливилось поучаствовать в&nbsp;хакатоне в&nbsp;роли организатора. И&nbsp;я&nbsp;хотел бы&nbsp;рассказать о&nbsp;ChelHack тем, кто&nbsp;по&nbsp;каким&#8209;то&nbsp;причинам пропустил его. Поскольку я&nbsp;имел отношение в&nbsp;основном к&nbsp;треку по&nbsp;web-разработке, впечатления по&nbsp;большей части относятся к&nbsp;нему.</span></p>
<h2><span style="font-weight: 400;">Дебют</span></h2>
<p><span style="font-weight: 400;">Народу было много: ChelHack собрал 110 участников. Это&nbsp;33 команды: 22 в&nbsp;треке по&nbsp;web-разработке и&nbsp;11 — в&nbsp;Machine Learning. Большинство участников — студенты (информационная поддержка со&nbsp;стороны ВУЗов была на&nbsp;высоте). Также была солидная прослойка из&nbsp;программистов. Побороться за&nbsp;главный приз пришёл даже один технический директор!</span></p>
<p><span style="font-weight: 400;">ChelHack проходил в&nbsp;СПА-отеле «Мелиот» сразу в&nbsp;трех залах. В&nbsp;первом и&nbsp;самом просторном разместились большинство участников хакатона. Мы&nbsp;оборудовали зал&nbsp;самым необходимым: рабочими столами и&nbsp;мягкой зоной с&nbsp;креслами-мешками. Негромко, чтобы не&nbsp;отвлекать хакатонщиков, играла музыка. Ещё&nbsp;два&nbsp;зала, поменьше, облюбовали команды, которые предпочитают кодить в&nbsp;полной тишине. </span></p>
<p><span style="font-weight: 400;"><img src="/Media/2193/2.jpg" alt=""></span></p>
<p><span style="font-weight: 400;">Народ приступил к&nbsp;работе по-разному: одни сразу сели писать код, другие устроили небольшие брейнштормы внутри команд. Пожалуй, именно в&nbsp;начале хакатона у&nbsp;участников возникало больше всего вопросов — эксперты сновали между столами, неся мудрость в&nbsp;массы и&nbsp;стараясь не&nbsp;выдать лишнего. Параллельно в&nbsp;Телеграмме мы&nbsp;в&nbsp;режиме онлайн обновляли F.A.Q. для&nbsp;участников, стараясь выносить ответы на&nbsp;самые часто задаваемые вопросы на&nbsp;всеобщее обозрение.</span></p>
<p><span style="font-weight: 400;">К вечеру 30 ноября многие ребята уже&nbsp;выкатили вменяемые результаты, которые мы&nbsp;смогли протестировать на&nbsp;производительность и&nbsp;дать народу первые отзывы по&nbsp;работе их&nbsp;продуктов. Так&nbsp;что&nbsp;уже&nbsp;к&nbsp;концу дня&nbsp;сформировался первый (крайне предварительный) список лидеров.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2194/3.jpg" alt="" itemprop="">


</figure>

<h3><span style="font-weight: 400;"></span>Honorable mentions</h3>
<ul>
<li><span style="font-weight: 400;">Позитивный настрой. Периодически эксперты устраивали набеги на&nbsp;команды с&nbsp;вопросом «Ребята, как&nbsp;у&nbsp;вас&nbsp;дела?». Самый популярный ответ в&nbsp;первый день – «Дела супер, но&nbsp;пока нифига не&nbsp;работает».</span></li>
<li><span style="font-weight: 400;">На ночь остались около 40 человек, не&nbsp;пожелавших давать вдохновению ни&nbsp;малейшего шанса улизнуть. Особенно запомнились ребята, в&nbsp;команде которых из&nbsp;пяти человек четверо были несовершеннолетними. По&nbsp;правилам хакатона они&nbsp;не&nbsp;могли остаться на&nbsp;ночь. Поэтому они&nbsp;снабдили единственного обладателя взрослого статуса ценнейшими рекомендациями по&nbsp;подъёму линукса и&nbsp;уехали домой. А&nbsp;в&nbsp;8 часов утра уже&nbsp;будили завернутого в&nbsp;плед товарища и&nbsp;требовали немедленно оживить сервер.</span><span style="font-weight: 400;"></span><span style="font-weight: 400;"></span></li>
</ul>


<figure class="umb-macro-image">
    


    <img src="/Media/2195/4.jpg" alt="" itemprop="">


</figure>

<ul>
<li>Неизвестные мне&nbsp;герои с&nbsp;ML-трека, соорудив прототип программы распознавания госзнаков автомобилей, совершили ночное паломничество по&nbsp;дорогам города с&nbsp;целью расширить имеющийся датасет грязных номеров.</li>
<li><span style="font-weight: 400;">В целом, первый день выглядел более продуктивным. На&nbsp;второй у&nbsp;кого&#8209;то&nbsp;выдалась бессонная ночь, а&nbsp;кто&#8209;то&nbsp;просто устал — популярность кресел-мешков стремительно росла. </span></li>
</ul>
<h2><span style="font-weight: 400;">Миттельшпиль</span></h2>
<p><span style="font-weight: 400;">Второй день начался с&nbsp;почти стихийного конкурса носков. Голосование за&nbsp;самые креативные пары проходило в&nbsp;телеграмм-канале. Победителями стали носки-Гомеры и&nbsp;носки-яичницы. Их&nbsp;хозяева получили фирменные флешки ChelHack. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2202/img_20191201_110326.jpg" alt="" itemprop="">


</figure>

<p><span style="font-weight: 400;"></span><span style="font-weight: 400;">При более детальным рассмотрении яичница оказалась авокадо. Никогда бы&nbsp;не&nbsp;подумал, что&nbsp;это&nbsp;два&nbsp;настолько схожих продукта.</span></p>
<p><span style="font-weight: 400;">Приходящий и&nbsp;просыпающийся народ выглядел помятым, но&nbsp;не&nbsp;желающим сдаваться. За&nbsp;ночь накопились вопросы, участники и&nbsp;эксперты бодро втягивались в&nbsp;работу. Некоторые команды уже&nbsp;на&nbsp;этом этапе считали свои решения готовыми. Поэтому мы&nbsp;подсказали им, как&nbsp;можно расширить функционал и&nbsp;получить дополнительные баллы.</span></p>
<p><span style="font-weight: 400;">Страсти начали накаляться после обеда. Мы&nbsp;заранее отметили в&nbsp;расписании, что&nbsp;в&nbsp;16:00 отключим доступ к&nbsp;серверам и&nbsp;возможность деплоя, чтобы начать плотное тестирование проектов. </span></p>
<p><span style="font-weight: 400;">В 15:00 мы&nbsp;ещё&nbsp;раз&nbsp;прошлись по&nbsp;ребятам и&nbsp;попросили их&nbsp;выложить на&nbsp;серверы хоть какое&#8209;то&nbsp;решение — чтобы было понятно, что&nbsp;оно&nbsp;у&nbsp;них&nbsp;есть. В&nbsp;итоге у&nbsp;нас&nbsp;всё&nbsp;равно остались две&nbsp;команды, которые не&nbsp;успели к&nbsp;дедлайну и&nbsp;не&nbsp;предоставили работы к&nbsp;зачету. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2196/5.jpg" alt="" itemprop="">


</figure>

<h3><span style="font-weight: 400;">Honorable Mentions</span></h3>
<ul>
<li><span style="font-weight: 400;">Конкурс на&nbsp;лучшее фото на&nbsp;площадке. Совершенно неожиданно первое место по&nbsp;итогам голосования через гугл-форму занял весьма ординарный снимок. </span></li>
</ul>


<figure class="umb-macro-image">
    


    <img src="/Media/2203/photo_2019-12-01_16-46-43.jpg" alt="" itemprop="">


        <figcaption>
            Ребята хакнули голосовалку за&nbsp;лучшее фото
        </figcaption>
</figure>

<p><span style="font-weight: 400;">Авторы, используя социальную инженерию и&nbsp;крайне скрытные методы, умудрились накрутить себе голосов. Памятуя, что&nbsp;у&nbsp;нас&nbsp;все-таки хакатон, мы&nbsp;наградили ребят за&nbsp;хитрость и&nbsp;смекалку. Также награду получили авторы самого неординарного снимка.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2204/photo_2019-12-01_16-52-36.jpg" alt="" itemprop="">


        <figcaption>
            А&nbsp;это&nbsp;— законные победители конкурса фотографий. Спасаясь от&nbsp;перегрева мозгов и&nbsp;техники, ребята кодят прямо на&nbsp;улице
        </figcaption>
</figure>

<ul>
<li><span style="font-weight: 400;">Кросстрековая помощь участникам. Иногда ребята задавали вопросы прямо в&nbsp;телеграмм-канале мероприятия, и&nbsp;некоторые советы по&nbsp;web-разработке давали ребята с&nbsp;Machine Learning. Все&nbsp;восхищались чувствами плеча и&nbsp;товарищества.</span></li>
<li><span style="font-weight: 400;">У нас&nbsp;были запланированы две&nbsp;сессии с&nbsp;ответами на&nbsp;вопросы участников хакатона. Но&nbsp;поскольку эксперты работали на&nbsp;площадке в&nbsp;режиме реал-тайм, необходимость таких консультаций была под&nbsp;вопросом. В&nbsp;итоге мы&nbsp;решили организовать «Экспертный диван» (не&nbsp;путать с&nbsp;диванными экспертами), где&nbsp;бурно обсуждались критерии приёмки работ по&nbsp;функционалу.</span></li>
</ul>


<figure class="umb-macro-image">
    


    <img src="/Media/2201/1920.jpg" alt="" itemprop="">


</figure>

<h2><span style="font-weight: 400;">Эндшпиль</span></h2>
<p><span style="font-weight: 400;">Ближе к&nbsp;15:00 народ начал шлифовать свои решения. Было такое ощущение, что&nbsp;все&nbsp;хотели запихать в&nbsp;проект что-нибудь ещё, но&nbsp;дедлайн неумолимо приближался. Финалы на&nbsp;треках проходили немного по-разному. </span></p>
<p><span style="font-weight: 400;">В треке по&nbsp;Machine Learning была своя сложная трехступенчатая система определения победителя. После второго этапа часть команд отсеялась. Жюри оценивали скорость обработки и&nbsp;корректности распознавания номеров автомобилей. На&nbsp;завершающем третьем этапе ребята защищали свои решения перед экспертами.</span></p>
<h3><span style="font-weight: 400;">Machine Learning</span></h3>
<p>В треке по&nbsp;Machine Learning мы&nbsp;взяли боевую задачу из&nbsp;проекта «Умный транспорт» — распознавание регистрационного номера автомобиля по&nbsp;изображению, полученному с&nbsp;обычной IP-камеры. Такие решения могут использоваться в&nbsp;создании новых парковочных пространств в&nbsp;«Умном городе» и&nbsp;автостоянок с&nbsp;автоматизированной системой контроля доступа.</p>
<p>Датасет содержал более 6 тысяч изображений разного разрешения с&nbsp;реальных камер в&nbsp;Челябинске, полученных в&nbsp;разных погодных условиях и&nbsp;в&nbsp;разное время суток. Единственным требованием к&nbsp;фотографиям была возможность правильно распознать номер человеком.</p>



<blockquote>
    <div class="blockquote-body">
        Команды на&nbsp;хакатоне предложили несколько способов решения этой задачи. В&nbsp;одном случае ребята пытались адаптировать модели распознавания из&nbsp;проекта Nomeroff Net&nbsp;к&nbsp;нашему датасету. Убедившись, что&nbsp;детектор работает корректно, разработчики пытались дообучить на&nbsp;наших данных сверточные сети, решающие задачу OCR. По&nbsp;этому пути шла&nbsp;команда победителей хакатона «Хурма» и&nbsp;несколько других команд (включая команду организаторов, которые участвовали в&nbsp;ChelHack вне&nbsp;зачета). Второй подход заключался в&nbsp;реализации собственной нейросетевой модели без&nbsp;использования готовых открытых решений. К&nbsp;сожалению двух дней оказалось недостаточно, чтобы такой авторский подход показал значимые результаты. Но&nbsp;нам&nbsp;как&nbsp;организаторам было интересно наблюдать за&nbsp;ходом мыслей ребят (среди которых были и&nbsp;школьники) в&nbsp;этом направлении. Третий подход выбрали новички в&nbsp;машинном обучении. Он&nbsp;заключался в&nbsp;попытке улучшить базовое решение (kernel), предложенное организаторами в&nbsp;начале соревнования. В&nbsp;этом подходе использовалась библиотека OpenCV без&nbsp;нейронных сетей. Ребята разобрались с&nbsp;библиотекой и&nbsp;смогли показать результат, который позволил им&nbsp;занять третье место в&nbsp;хакатоне. Для&nbsp;команды, участники которой познакомилась в&nbsp;первый день на&nbsp;площадке хакатона, это&nbsp;большой успех.
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Дмитрий Ботов, куратор трека ML&nbsp;
                </cite>
            </div>
        </div>
    </footer>
</blockquote>




<figure class="umb-macro-image">
    


    <img src="/Media/2197/6.jpg" alt="" itemprop="">


</figure>

<p><span style="font-weight: 400;"></span><span style="font-weight: 400;">Главный приз в&nbsp;треке Machine Learning забрала «Хурма» — команда центра математического моделирования анализа данных ЧТПЗ.</span></p>
<p><span style="font-weight: 400;">Организаторы трека ML&nbsp;считают, что&nbsp;победу «Хурме» обеспечили разумное распределение времени и&nbsp;сил, а&nbsp;также максимальное использование открытых решений, идей и&nbsp;данных, доступных в&nbsp;интернете, что&nbsp;было разрешено правилами соревнования. </span></p>
<h3><span style="font-weight: 400;">Web-разработка</span></h3>
<p>Задача Web-трека выглядела обманчиво простой: нужно было поднять на&nbsp;линукс-сервере секцию «Черной пятницы» интернет-магазина, которая нормально работала бы&nbsp;под&nbsp;нагрузкой.</p>
<p>Мы предоставили участникам доступ к&nbsp;API, куда они&nbsp;могли делать запросы и&nbsp;получать информацию о&nbsp;товарах.</p>

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Чтобы усложнить задачу, мы&nbsp;немного «поломали» API. Вместо мгновенного ответа оно&nbsp;отвечало на&nbsp;запрос спустя 3 секунды, а&nbsp;каждый сотый ответ выдавало с&nbsp;ошибкой. Мы&nbsp;ждали, что&nbsp;участники, поняв принцип работы API, реализуют в&nbsp;своих решениях сохранение данных на&nbsp;своей стороне и&nbsp;сделают код&nbsp;устойчивым к&nbsp;ошибкам. Забегая вперед, скажу, что&nbsp;многие участники оправдали наши ожидания, реализовав кэширование.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Антон Воротынцев,
                </cite>
                <p class="blockquote-new__author-position">
                    куратор трека по&nbsp;Web-разработке
                </p>
            </div>
        </footer>
    </blockquote>
</div>

<p>В треке по&nbsp;web-разработке доступ к&nbsp;серверам отключился в&nbsp;16:00. В&nbsp;этот момент эксперты начали тестирование решений команд. Жюри оценивали решение в&nbsp;первую очередь со&nbsp;стороны функционала (возможность купить товар). Ведь если приложение не&nbsp;может выполнить свои основные функции, нет&nbsp;смысла оценивать его&nbsp;дизайн и&nbsp;скорость работы под&nbsp;нагрузкой.</p>
<p>Пяти лучшим командам эксперты предложили презентовать свои решения всем участникам хакатона: кратко рассказать о&nbsp;методах, которые они&nbsp;выбрали для&nbsp;реализации проекта, и&nbsp;сложностях, с&nbsp;которыми пришлось столкнуться в&nbsp;процессе. Примечательно, что&nbsp;проекты команд, занявших призовые места, работали под&nbsp;нагрузкой примерно на&nbsp;одном уровне.</p>
<p>Главным победителем в&nbsp;треке стала команда 4pt из&nbsp;Челябинского радиотехнического колледжа. Они&nbsp;не&nbsp;только хорошо реализовали функционал, но&nbsp;и&nbsp;прикрутили красивые заготовки для&nbsp;внешнего дизайна страниц.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2198/7.jpg" alt="" itemprop="">


</figure>

<p>Из моментов, на&nbsp;которые стоит обратить большинству участников — это&nbsp;деплой приложения на&nbsp;линукс-сервере. Было жаль ребят, которые не&nbsp;успели вовремя загрузить решения. Но&nbsp;дедлайн есть дедлайн.</p>
<h3><span style="font-weight: 400;">Honorable Mentions</span></h3>
<ul>
<li><span style="font-weight: 400;">Третье место в&nbsp;треке Machine Learning заняла команда из&nbsp;людей, которые не&nbsp;были знакомы друг с&nbsp;другом до&nbsp;хакатона. Мне&nbsp;кажется, в&nbsp;этом и&nbsp;есть магия ChelHack – в&nbsp;объединении людей для&nbsp;решения сложной задачи. Думаю, у&nbsp;ребят теперь есть много поводов продолжить дружбу. Да&nbsp;и&nbsp;в&nbsp;целом, было здорово наблюдать за&nbsp;общением хакатонщиков в&nbsp;кофейной зоне за&nbsp;поглощением печенюх и&nbsp;пирожков.</span></li>
<li><span style="font-weight: 400;">Радует, что&nbsp;победителями трека по&nbsp;web-разработке стали студенты — ребята утерли нос&nbsp;уже&nbsp;состоявшимся программистам. У&nbsp;челябинского IT&nbsp;большое будущее! </span></li>
<li><span style="font-weight: 400;">Интрига при&nbsp;объявлении победителей трека по&nbsp;web-разработке. Решения презентовали пять лучших команд, а&nbsp;призовых мест было три. И&nbsp;до&nbsp;последнего момента сохранялась мощнейшая интрига — кто&nbsp;же&nbsp;станет победителем? Презентации всех участников выглядели очень достойно. Наблюдая мандраж людей, по-настоящему понимаешь, сколько сил&nbsp;и&nbsp;надежд люди вкладывали в&nbsp;свои решения. </span></li>
</ul>
<p><span style="font-weight: 400;">Закончился ChelHack на&nbsp;позитивной ноте. Участники обсуждали решения победителей, организаторы рассказывали некоторые закулисные истории. После награждения участников ждали фотосессия и&nbsp;афтерпати.</span></p>
<h2><span style="font-weight: 400;">Постскриптум</span></h2>
<p><span style="font-weight: 400;">Это были чертовски насыщенные два&nbsp;дня. Несмотря на&nbsp;усталость и&nbsp;дух&nbsp;соперничества, атмосфера на&nbsp;хакатоне была просто невероятной. Мы&nbsp;физически ощущали свою причастность к&nbsp;созданию чего&#8209;то&nbsp;великолепного, нового и&nbsp;захватывающего. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2205/1920-2.jpg" alt="" itemprop="">


</figure>

<p><span style="font-weight: 400;"></span>Интересно было почитать отзывы ребят и&nbsp;сравнить их&nbsp;впечатления от&nbsp;мероприятия с&nbsp;нашими. Забегая вперед, скажу, что&nbsp;в&nbsp;целом мы&nbsp;получили позитивный фидбэк. Но&nbsp;есть и&nbsp;моменты, над&nbsp;которыми стоит поработать.</p>
<p>Многие отметили получение новых скиллов: будь то&nbsp;деплой приложения на&nbsp;Линуксе или&nbsp;работа в&nbsp;команде с&nbsp;людьми, которых видишь первый раз&nbsp;в&nbsp;жизни.</p>
<p>Почти все&nbsp;оценили «мягкий» формат мероприятия — ковролин и&nbsp;приглушенный свет явно способствуют работоспособности и&nbsp;спокойной обстановке.</p>
<p>НУЖНО. БОЛЬШЕ. КРЕСЕЛ-МЕШКОВ!!! И&nbsp;яблок! И&nbsp;соков! И&nbsp;морсики. Морсики определенно нужно подвезти к&nbsp;следующему мероприятию.</p>
<p>Огромное спасибо организаторам, партнёрам и&nbsp;участникам ChelHack за&nbsp;одно из&nbsp;самых эмоционально-мощных событий всего челябинского IT-сообщества в&nbsp;этом году.</p>
<p>Кстати, <a rel="noopener" href="https://geo.pro/reportage/36650-gorodskie-sorevnovaniya-razrabotchikov-chelhack/" target="_blank" title="ChelHack на&nbsp;«Геометрии»">большой фоторепортаж с&nbsp;ChelHack</a> ищите на&nbsp;«Геометрии» и&nbsp;в&nbsp;<a rel="noopener" href="https://vk.com/chel_hack" target="_blank" title="ChelHack во&nbsp;«Вконтакте»">официальной группе хакатона во&nbsp;«Вконтакте»</a>.</p>
<hr>
<p><strong>Организаторы</strong><span style="font-weight: 400;"><strong>:</strong> fuse8, Интерсвязь, Napoleon IT, Xpage и&nbsp;АНО&nbsp;«Центр кластерного развития Челябинской области». </span></p>
<p><strong>Образовательные партнеры:</strong><span style="font-weight: 400;"> ЧелГУ, ЮУрГУ, МИДиС. </span></p>
<p><strong>IT-партнёры</strong><span style="font-weight: 400;"><strong>:</strong> школа «Корпус», компании UNIT6 и&nbsp;Intec, школа робототехники «Лига Роботов», компьютерная академия «Шаг», Lukevium, детский клуб образовательной и&nbsp;спортивной робототехники RoboSportClub. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как избежать race condition при использовании JWT-авторизации с помощью Axios
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Разбираем авторизацию через токены: как с ними работать на фронте, обновлять без сбоев и решать проблемы, которые возникают при обновлении.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-avoid-race-condition/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-avoid-race-condition/</guid>

                <pubDate>Tue, 06 May 2025 13:43:40 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как избежать race condition при использовании JWT-авторизации с помощью Axios</h1>
                                <figure>
                                    <img src="/Media/2394/steven-lelham-atsaeoee8nk-unsplash-1.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f28eefd48841e2c2a28c2d0edb3f52b4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/302d54c6fbf4451d851742eb8332914f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">На одном из&nbsp;наших проектов, интранет-сервисе для&nbsp;работы большого отдела сотрудников, мы&nbsp;столкнулись с&nbsp;проблемой — иногда пользователей разлогинивало при&nbsp;переходе между страницами. </span></p>
<p><span style="font-weight: 400;">Проект реализован на&nbsp;Vue.js, авторизация — с&nbsp;помощью JSON Web&nbsp;Token и&nbsp;интерцепторов Axios, которые отслеживают валидность токенов. Когда приходило время обновления токена, и&nbsp;пользователь переходил на&nbsp; новую страницу, к&nbsp;серверу отправлялись несколько запросов. Между ними возникало состояние гонки — race condition. Первый запрос приводил к&nbsp;обновлению токена, а&nbsp;остальные доходили до&nbsp;сервера с&nbsp; невалидными данными в&nbsp;заголовке. Итог — разлогин пользователя. Сегодня расскажу, как&nbsp;этого избежать. </span></p>
<p>Начнем с&nbsp;принципов работы веб-токенов и&nbsp;сложностей с&nbsp;ними. Если вы&nbsp;с&nbsp; этим уже&nbsp;знакомы, можете сразу переходить к&nbsp;<a href="#solution">разделам о&nbsp;race condition и&nbsp; синхронизации  запросов через переменную с&nbsp;promise</a>.</p>
<h2><span style="font-weight: 400;">Что такое JWT, и&nbsp;почему их&nbsp;используют для&nbsp;авторизации?</span></h2>
<p><a rel="noopener" href="https://ru.wikipedia.org/wiki/JSON_Web_Token#:~:text=JSON%20Web%20Token%20(JWT)%20%E2%80%94,%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0%2C%20%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%BD%D0%B0%20%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B5%20JSON.&amp;text=%D0%A2%D0%BE%D0%BA%D0%B5%D0%BD%D1%8B%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%8E%D1%82%D1%81%D1%8F%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%BC%2C%20%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8B%D0%B2%D0%B0%D1%8E%D1%82%D1%81%D1%8F%20%D1%81%D0%B5%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D1%8B%D0%BC,%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D1%82%D0%B2%D0%B5%D1%80%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%81%D0%B2%D0%BE%D0%B5%D0%B9%20%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8." target="_blank" title="JSON Web&nbsp;Token — Википедия" data-anchor="#:~:text=JSON%20Web%20Token%20(JWT)%20%E2%80%94,%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0%2C%20%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%BD%D0%B0%20%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B5%20JSON.&amp;text=%D0%A2%D0%BE%D0%BA%D0%B5%D0%BD%D1%8B%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%8E%D1%82%D1%81%D1%8F%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%BC%2C%20%D0%BF%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8B%D0%B2%D0%B0%D1%8E%D1%82%D1%81%D1%8F%20%D1%81%D0%B5%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D1%8B%D0%BC,%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D1%82%D0%B2%D0%B5%D1%80%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%81%D0%B2%D0%BE%D0%B5%D0%B9%20%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8."><span style="font-weight: 400;">JSON Web&nbsp;Token (JWT)</span></a><span style="font-weight: 400;"> — это&nbsp;открытый стандарт для&nbsp;создания токенов доступа, основанный на&nbsp;JSON. Токены создаются сервером, подписываются секретным ключом и&nbsp;передаются клиенту. Клиентское приложение использует токен для&nbsp;подтверждения своей личности.</span></p>
<h3><span style="font-weight: 400;">Зачем нужны токены</span></h3>
<p><span style="font-weight: 400;">Токены позволяют не&nbsp;передавать по&nbsp;сети каждый раз&nbsp;логин и&nbsp;пароль для&nbsp; подтверждения авторизации. Пользователь вводит их&nbsp;один раз&nbsp;и&nbsp; получает токен, действующий ограниченное время. </span></p>
<p><span style="font-weight: 400;">Если токен заполучит злоумышленник, худшее, что&nbsp;может случиться, это&nbsp; доступ к&nbsp;сервису на&nbsp;время жизни токена. Пароль похититель не&nbsp; получит. Если пользователь понимает, что&nbsp;кто&#8209;то&nbsp;получил доступ к&nbsp; сервису, он&nbsp;логинится заново и&nbsp;получает новый токен. Старый при&nbsp; этом отзывается, и&nbsp;злоумышленник остается ни&nbsp;с&nbsp;чем.</span></p>
<h3><span style="font-weight: 400;">Преимущества JWT&nbsp;перед cookie</span></h3>
<p><span style="font-weight: 400;">Почему бы&nbsp;не&nbsp;использовать старые добрые cookie и&nbsp;вообще не&nbsp; заботиться об&nbsp;обновлении и&nbsp;подтверждении авторизации? Тому есть несколько причин. Но&nbsp;особенно я&nbsp;бы&nbsp;выделил три: </span></p>
<ul>
<li><span style="font-weight: 400;">Cookie привязана к&nbsp;домену, поэтому ее&nbsp;нельзя использовать в&nbsp;кросс-доменных запросах. При&nbsp;микросервисной архитектуре сервисы зачастую располагаются на&nbsp;разных доменах.</span></li>
<li><span style="font-weight: 400;">Cookie работает сразу только в&nbsp;браузере. Для&nbsp;консольных или&nbsp;нативных приложений для&nbsp;смартфонов у&nbsp;cookie нет&nbsp;поддержки из&nbsp;коробки. С&nbsp; токенами удобно работать в&nbsp;любом из&nbsp;вышеперечисленных случаев.</span></li>
<li><span style="font-weight: 400;">Используя JWT, мы&nbsp;видим проблему с&nbsp;безопасностью и&nbsp;стараемся предусмотреть механизмы контроля в&nbsp;случае кражи авторизационных данных. Используя cookie, программист зачастую даже не&nbsp; задумывается, что&nbsp;сессия может быть скомпрометирована, и&nbsp; рассчитывает на&nbsp; механизмы, предоставленные фреймворком.</span></li>
</ul>
<p><span style="font-weight: 400;">JWT — это&nbsp;более современный, масштабируемый и&nbsp;безопасный способ подтверждения авторизации с&nbsp;относительно простой интеграцией на&nbsp; разных платформах.</span></p>
<h3><span style="font-weight: 400;">Состав токена</span></h3>
<p><span style="font-weight: 400;">JWT — это&nbsp;строка из&nbsp;трех частей: заголовка, полезных данных и&nbsp;подписи.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/57fae65fc99b91ed6aac7944794670c1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--43177385 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--43177385 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1c6ce5156fdc4ef1a8cabf314293edc3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2399/frame-4.png"
         alt=""
         itemprop="">


</figure>

</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5beb2d61c7a4b6039ffd8ac7b3526955"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c426a81a0f56476784651743f3040c90"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>Заголовок</strong><span style="font-weight: 400;"> содержит алгоритм хеширования и&nbsp;тип&nbsp;токена. </span></p>
<p><strong>Полезные данные</strong><span style="font-weight: 400;"> содержат время окончания жизни токена, идентификатор пользователя и&nbsp;другое.</span></p>
<p><strong>Подпись</strong><span style="font-weight: 400;"> формируется сервером на&nbsp;основе заголовка и&nbsp;полезных данных.</span></p>
<p><span style="font-weight: 400;">Для уменьшения передаваемой информации, каждая часть кодируется с&nbsp; помощью Base64 и&nbsp;склеивается в&nbsp;строку, разделенную точками.</span></p>
<p><span style="font-weight: 400;">JWT не&nbsp;шифрует, а&nbsp;кодирует данные. Его&nbsp;задача — подтвердить, что&nbsp; данные отправлены авторизованным источником с&nbsp;помощью подписи. Поэтому в&nbsp;нем&nbsp;не&nbsp;следует передавать чувствительные данные — те&nbsp; данные, которые не&nbsp;содержат личную информацию явно, но&nbsp;могут раскрыть личность.</span></p>
<h3><span style="font-weight: 400;">Пара токенов для&nbsp;лучшей защиты</span></h3>
<p><span style="font-weight: 400;">В некоторых схемах авторизации используется два&nbsp;токена: access и&nbsp; refresh.</span></p>
<p><strong>Access token</strong><span style="font-weight: 400;"> используется при&nbsp;запросах к&nbsp;серверу. Он&nbsp;добавляется в&nbsp; заголовок каждого запроса к&nbsp;API. Access token многоразовый и&nbsp; короткоживущий. В&nbsp;нашем случае токен живет 10 минут с&nbsp;момента выдачи.</span></p>
<p><strong>Refresh token</strong><span style="font-weight: 400;"> используется для&nbsp;обновления пары токенов access и&nbsp; refresh. Он&nbsp;одноразовый и&nbsp;долгоживущий. Как&nbsp;только система использует refresh token, пользователю назначается новая пара, а&nbsp; старая отзывается. Наш&nbsp;refresh token действует 3 суток.</span></p>
<p><span style="font-weight: 400;">Пара токенов ограничивает время, на&nbsp;которое атакующий может получить доступ к&nbsp;сервису.</span></p>
<h2><span style="font-weight: 400;">Как пара токенов ограничивает время доступа атакующего</span></h2>
<p><span style="font-weight: 400;">Объясню на&nbsp;примере.</span></p>
<p><strong>Случай 1</strong><span style="font-weight: 400;">: Боб&nbsp;узнал оба&nbsp;токена Алисы и&nbsp;не&nbsp;воспользовался refresh.</span></p>
<p><span style="font-weight: 400;">В этом случае Боб&nbsp;получит доступ к&nbsp;сервису на&nbsp;время жизни access token — на&nbsp;10 минут. Как&nbsp;только оно&nbsp;истечет, и&nbsp;приложение, которым пользуется Алиса, воспользуется refresh token, сервер вернет новую пару токенов. А&nbsp; те, что&nbsp;узнал Боб, перестанут работать.</span></p>
<p><strong>Случай 2</strong><span style="font-weight: 400;">: Боб&nbsp;узнал оба&nbsp;токена Алисы и&nbsp;воспользовался refresh.</span></p>
<p><span style="font-weight: 400;">В этом случае оба&nbsp;токена Алисы перестают работать. Приложение предлагает ей&nbsp;авторизоваться логином и&nbsp;паролем, сервер возвращает новую пару токенов. А&nbsp;те, что&nbsp;узнал Боб, отзываются.</span></p>
<h2><span style="font-weight: 400;">Использование токенов на&nbsp;фронте</span></h2>
<p><span style="font-weight: 400;">При авторизации в&nbsp;приложении пользователь получает пару токенов. Мы&nbsp; дехешируем их&nbsp;и&nbsp;сохраняем в&nbsp;хранилище Vuex. Для&nbsp;общения с&nbsp; сервером мы&nbsp;используем http-клиент Axios. Мы&nbsp;добавляем access token в&nbsp; заголовок Authorization нашего клиента. Этот заголовок будет подтверждать авторизацию пользователя, пока токен не&nbsp;устареет.</span></p>
<p><span style="font-weight: 400;">Сконфигурируем модуль пользователя в&nbsp;хранилище:</span></p>
<pre><code class="language-js">// @/store/user.js
import { KJUR } from 'jsrsasign';
import { AUTH_LOGOUT, AUTH_REFRESH, AUTH_REQUEST, AUTH_SUCCESS } from '@/store/mutationTypes.js';
import { UNAUTHORIZED_ROUTE_NAME } from '@/settings.js';
import { login, refreshToken } from '@/api/user.js';
import router from '@/router/index.js';

const INITIAL_STATE = {
  accessTokenExpires: 0, // время в&nbsp;unix timestamp
  refreshTokenExpires: 0, // время в&nbsp;unix timestamp
};

const state = INITIAL_STATE;

// функции, которые понадобятся нам&nbsp;для&nbsp;проверки валидности токенов,
// now&nbsp;здесь — unix timestamp текущего момента
const getters = {
  isAccessTokenValid: (state) =&gt; (now) =&gt; now&nbsp;&lt; state.accessTokenExpires,
  isRefreshTokenValid: (state) =&gt; (now) =&gt; now&nbsp;&lt; state.refreshTokenExpires,
};

const mutations = {
  [AUTH_SUCCESS]: (state, { accessToken, refreshToken }) =&gt; {
    // дехешируем accessToken, достаем дату истечения
    const {
      payloadObj: { exp: accessTokenExpires },
    } = KJUR.jws.JWS.parse(accessToken);

    // дехешируем refreshToken, достаем дату истечения
    const {
      payloadObj: { exp: refreshTokenExpires },
    } = KJUR.jws.JWS.parse(refreshToken);

    // обновляем состояние
    state = Object.assign(state, {
      accessTokenExpires,
      refreshTokenExpires,
    });
  },

  [AUTH_LOGOUT]: (state) =&gt; {
    // сбрасываем состояние
    state = Object.assign(state, INITIAL_STATE);

    // перенаправляем на&nbsp;страницу логина
    if&nbsp;(router.currentRoute.name !== UNAUTHORIZED_ROUTE_NAME) {
      router.push({ name: UNAUTHORIZED_ROUTE_NAME });
    }
  },
};

const actions = {
  [AUTH_REQUEST]: async function ({ commit }, { login, password }) {
    const { data, success } = await login({ login, password });

    if&nbsp;(success) {
      commit(AUTH_SUCCESS, data);
    } else {
      commit(AUTH_LOGOUT);
    }

    return { success };
  },

  [AUTH_REFRESH]: async function ({ state, commit }) {
    const { data, success } = await refreshToken();

    if&nbsp;(success) {
      commit(AUTH_SUCCESS, data);
    } else {
      commit(AUTH_LOGOUT);
    }

    // возвращает токен строкой, чтобы обновить заголовок клиента axios
    return data.accessToken;
  },
};

export default {
  state,
  getters,
  mutations,
  actions,
};</code></pre>
<p> </p>
<p><span style="font-weight: 400;">Начальная конфигурация HTTP клиента:</span></p>
<pre><code class="language-js">// @/api/index.js
import axios from 'axios';

const apiClient = axios.create();

export { apiClient };</code></pre>
<p> </p>
<p><span style="font-weight: 400;">Создаем методы для&nbsp;работы с&nbsp;API&nbsp;пользователя:</span></p>
<pre><code class="language-js">// @/api/user.js
import { apiClient } from '@/api/index.js';

// access токен хранится в&nbsp;замыкании модуля webpack
// и&nbsp;не&nbsp;доступен извне
let&nbsp;accessToken = null;
const getAccessToken = () =&gt; accessToken;

// флаг skipAuth понадобится нам&nbsp;позднее,
// чтобы интерцептор игнорировал запросы на&nbsp;получение токенов,
// иначе попадем в&nbsp;рекурсию
async function login({ login, password }) {
  const { data } = await apiClient({
    method: 'post',
    url: '/api/user/login',
    data: { login, password },
    skipAuth: true,
  });
  accessToken = data.accessToken;
  return data;
}

// refresh токен хранится в&nbsp;httpOnly cookie, не&nbsp;доступен для&nbsp;js&nbsp;
// и&nbsp;не&nbsp;управляется с&nbsp;фронта
async function refreshToken() {
  const { data } = await apiClient({
    method: 'post',
    url: '/api/user/refreshToken',
    skipAuth: true,
  });
  accessToken = data.accessToken;
  return data;
}

export { login, refreshToken, getAccessToken };</code></pre>
<p> </p>
<p><span style="font-weight: 400;">В обычном режиме работы пользователю не&nbsp;нужно вводить логин и&nbsp; пароль для&nbsp;обновления авторизации. Приложение само обновляет пару токенов, если пользователь активен в&nbsp;течение срока действия refresh token — трех дней. Таким образом, пользователь остается залогиненным, пока не&nbsp;заболеет или&nbsp;не&nbsp;уйдет в&nbsp;отпуск.</span></p>
<h2><span style="font-weight: 400;">Как приложению понять, что&nbsp;токен устарел</span></h2>
<p><span style="font-weight: 400;">Для этого мы&nbsp;используем интерцепторы —  функции-перехватчики в&nbsp;Axios. Они&nbsp;вклиниваются в&nbsp;цикл обработки запроса и&nbsp;проверяют актуальность токенов. </span></p>
<p><span style="font-weight: 400;">Существуют перехватчики ответа от&nbsp;сервера и&nbsp;самого запроса перед отправкой.</span></p>
<p><strong>Перехват ответа от&nbsp;сервера</strong><span style="font-weight: 400;">.</span> <span style="font-weight: 400;">Приложение не&nbsp;следит за&nbsp;сроком жизни access token и&nbsp;получает отказ от&nbsp;сервера на&nbsp;запрос с&nbsp;устаревшим токеном в&nbsp;заголовке. В&nbsp;ответе сервер дает понять, что&nbsp;токен нужно обновить: возвращением статуса 401 или&nbsp;другим способом. Приложение пытается использовать refresh token, чтобы обновить пару токенов. В&nbsp; случае успеха приложение обновляет заголовок с&nbsp;новым access token и&nbsp; отправляет оригинальный запрос заново. В&nbsp;противном случае пользователя перекидывает на&nbsp;форму логина.</span></p>
<p><span style="font-weight: 400;">Вариант использования интерцепторов при&nbsp;перехвате ответа:</span></p>
<pre><code class="language-js">// @/api/index.js
import axios from 'axios';
import store from '@/store/index.js';
import { AUTH_LOGOUT, AUTH_REFRESH } from '@/store/mutationTypes.js';

const apiClient = axios.create();

// обрабатываем запрос после получения
apiClient.interceptors.response.use(
  // сюда попадает все, что&nbsp;валидируется успешным ответом status &lt; 500
  async (response) =&gt; {
    const { status } = response;

    if&nbsp;(status === 401) {
      // пытаемся обновить accessToken
      const accessToken = await store.dispatch(AUTH_REFRESH);
      if&nbsp;(accessToken) {
        // если удалось обновить токен, отправляем запрос заново с&nbsp;новым токеном в&nbsp;заголовке
        const _response = await apiClient({
          ...config,
          headers: {
            common: {
              ['Authorization']: `Bearer ${accessToken}`,
            },
          },
        });
        return _response;
      } else {
        // иначе разлогиниваем
        store.commit(AUTH_LOGOUT);
      }
    }

    return response;
  },
  (error) =&gt; Promise.reject(error),
);

export { apiClient };</code></pre>
<p><span style="font-weight: 400;">Недостаток этого подхода — лишние запросы. Но&nbsp;логика на&nbsp;фронте упрощается: не&nbsp;нужно следить за&nbsp;временем.</span></p>
<p><strong>Проверка срока жизни токена перед отправкой запроса</strong>. <span style="font-weight: 400;">Перед отправкой каждый запрос обрабатывается интерцептором. В&nbsp;нем&nbsp;текущее время сравнивается со&nbsp;временем конца жизни access token. Если его&nbsp;срок пришел, то&nbsp;приложение смотрит на&nbsp;срок жизни refresh token и, если это&nbsp;возможно, обновляет пару. Если нет&nbsp;—  разлогинивает пользователя.</span></p>
<p><span style="font-weight: 400;">Вариант использования интерцепторов при&nbsp;перехвате ответа:</span></p>
<pre><code class="language-js">// @/api/index.js
import axios from 'axios';
import { getAccessToken } from '@/api/user.js';
import store from '@/store/index.js';
import { AUTH_LOGOUT, AUTH_REFRESH } from '@/store/mutationTypes.js';
import { showErrors } from '@/utils/messages.js';

const apiClient = axios.create({
  // ошибки со&nbsp;статусом кода меньше 500 обрабатываем на&nbsp;фронте
  validateStatus: (status) =&gt; status &lt; 500,
});

// запросить валидный аксесс токен
async function requestValidAccessToken() {
  // сначала запоминаем текущий accessToken из&nbsp;хранилища
  let&nbsp;{ accessToken } = getAccessToken();

  // приводим текущее время к&nbsp;unix timestamp
  const now&nbsp;= Math.floor(Date.now() * 0.001);

  if&nbsp;(!store.getters.isRefreshTokenValid(now)) {
    // Если рефреш токен устарел, разлогиниваем пользователя
    store.commit(AUTH_LOGOUT);
  } else if&nbsp;(!store.getters.isAccessTokenValid(now)) {
    // если accessToken устарел, обновляем его&nbsp;и&nbsp;запоминаем
    accessToken = await store.dispatch(AUTH_REFRESH);
  }

  // возвращаем рабочий accessToken
  return accessToken;
}

// обрабатываем запрос перед отправкой
apiClient.interceptors.request.use(async (config) =&gt; {
  // если указан флаг skipAuth, пропускаем запрос дальше как&nbsp;есть
  // этот флаг указан у&nbsp;методов login и&nbsp;refreshToken, они&nbsp;не&nbsp;подкрепляются токенами
  if&nbsp;(config.skipAuth) {
    return config;
  }

  // иначе запрашиваем валидный accessToken
  const accessToken = await requestValidAccessToken();

  // и&nbsp;возвращаем пропатченный конфиг с&nbsp;токенов в&nbsp;заголовке
  return {
    ...config,
    headers: {
      common: {
        ['Authorization']: `Bearer ${accessToken}`,
      },
    },
  };
});

// обрабатываем запрос перед обработкой ответа от&nbsp;сервера
apiClient.interceptors.response.use(
  // сюда попадает все, что&nbsp;валидируется успешным ответом status &lt; 500
  (response) =&gt; {
    const {
      data: { errors },
      config: { skipErrors },
      status,
    } = response;

    // если пришла 401, разлогиниваем пользователя
    if&nbsp;(status === 401) {
      store.commit(AUTH_LOGOUT);
    } else if&nbsp;(errors &amp;&amp; !skipErrors) {
      // показываем ошибки сервера для&nbsp;фронта, если нет&nbsp;указаний пропустить их&nbsp;вывод
      showErrors(errors);
    }

    return response;
  },
  (error) =&gt; Promise.reject(error),
);

export { apiClient };</code></pre>
<p><span style="font-weight: 400;">Реализовать этот подход сложнее, но&nbsp;он&nbsp;поможет не&nbsp;допустить до&nbsp; сервера лишние запросы с&nbsp;устаревшим access token.  </span></p>
<p><span style="font-weight: 400;">Оба варианта обновления токенов имеют проблему с&nbsp;race condition, если отправляется больше одного запроса параллельно.</span></p>
<h2><span style="font-weight: 400;"><a id="solution"></a>Что такое race condition и&nbsp;из&#8209;за&nbsp;чего возникает</span></h2>
<p><span style="font-weight: 400;">Race condition — это&nbsp;нежелательный побочный эффект при&nbsp;параллельных асинхронных событиях, исключающих друг друга. В&nbsp;нашей ситуации это&nbsp; обновление пары токенов. Асинхронность здесь указывает на&nbsp;то, что&nbsp; выполнение события занимает неопределенное время. </span></p>
<p><span style="font-weight: 400;">Наши интерцепторы отлично работают до&nbsp;тех&nbsp;пор, пока не&nbsp;отправляется несколько запросов параллельно. </span></p>
<p><span style="font-weight: 400;">Допустим, пользователь ушел пить кофе, вернулся через 15 минут и&nbsp; нажал на&nbsp;ссылку в&nbsp;приложении. Access token уже&nbsp;устарел, а&nbsp; при&nbsp; переходе на&nbsp;новую страницу, появились несколько новых компонентов. И&nbsp; этим компонентам нужно подтверждение, что&nbsp;у&nbsp;пользователя действительно есть доступ к&nbsp;ним. И&nbsp;каждый из&nbsp;них, не&nbsp;зная об&nbsp;остальных, отправляет запрос к&nbsp;серверу.</span><span style="font-weight: 400;"><br></span><span style="font-weight: 400;">Запросы обрабатывается интерцептором, спешат обновить access token и&nbsp; пропатчить заголовок клиента. Первый запрос получит новый токен и&nbsp; обновит заголовок. А&nbsp;остальные придут на&nbsp;сервер с&nbsp;уже&nbsp;старыми токенами в&nbsp;заголовке, и&nbsp;пользователя выкинет из&nbsp;приложения:</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e18f6538613d19ac169623f4a1acd38a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--7054700 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--7054700 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/874e5ce83b084a1bae9073af9cbbaee8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2400/frame-3.png"
         alt=""
         itemprop="">


</figure>

</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/da8396b8a7af6dcabaafcd1da93b6b0f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/30b79a7e6b6341e491a01a802ae36c23"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2><span style="font-weight: 400;">Как синхронизировать запросы через переменную с&nbsp;promise</span></h2>
<p><strong>Решение</strong><span style="font-weight: 400;">: при&nbsp;параллельных запросах обновления токена мы&nbsp;отправляем только первый, а&nbsp;для&nbsp;остальных будем ждать его&nbsp;результата. Для&nbsp;этого перед отправкой проверяем, существует ли&nbsp;уже&nbsp;запрос? Если нет&nbsp;— сохраняем запрос, то&nbsp;есть promise, в&nbsp;переменную и&nbsp;ждем ответа. Если да, ждем ответа записанного запроса. Когда запрос выполнится, очищаем переменную для&nbsp;дальнейшего использования.</span></p>
<p><span style="font-weight: 400;">Конфигурируем интерцептор для&nbsp;разрешения race condition, запоминая запрос в&nbsp;переменную:</span></p>
<pre><code class="language-js">import axios from 'axios';
import { getAccessToken } from '@/api/user.js';
import store from '@/store/index.js';
import { AUTH_LOGOUT, AUTH_REFRESH } from '@/store/mutationTypes.js';
import { showErrors } from '@/utils/messages.js';

// переменная для&nbsp;хранения запроса токена
let&nbsp;refreshTokenRequest = null;

const apiClient = axios.create({
  // ошибки со&nbsp;статусом кода меньше 500 обрабатываем на&nbsp;фронте
  validateStatus: (status) =&gt; status &lt; 500,
});

// запросить валидный аксесс токен
async function requestValidAccessToken() {
  // сначала запоминаем текущий accessToken из&nbsp;хранилища
  let&nbsp;{ accessToken } = getAccessToken();

  // приводим текущее время к&nbsp;unix timestamp
  const now&nbsp;= Math.floor(Date.now() * 0.001);

  if&nbsp;(!store.getters.isRefreshTokenValid(now)) {
    // Если рефреш токен устарел, разлогиниваем пользователя
    store.commit(AUTH_LOGOUT);
  } else if&nbsp;(!store.getters.isAccessTokenValid(now)) {
    // если не&nbsp;было запроса на&nbsp;обновление
    // создаем запрос и&nbsp;запоминаем его&nbsp;в&nbsp;переменную
    // для&nbsp;избежания race condition
    if&nbsp;(refreshTokenRequest === null) {
      refreshTokenRequest = store.dispatch(AUTH_REFRESH);
    }

    // а&nbsp;теперь резолвим этот запрос
    accessToken = await refreshTokenRequest;

    // и&nbsp;очищаем переменную
    refreshTokenRequest = null;
  }

  // возвращаем рабочий accessToken
  return accessToken;
}

// обрабатываем запрос перед отправкой
apiClient.interceptors.request.use(async (config) =&gt; {
  // если указан флаг skipAuth, пропускаем запрос дальше как&nbsp;есть
  // этот флаг указан у&nbsp;методов login и&nbsp;refreshToken, они&nbsp;не&nbsp;подкрепляются токенами
  if&nbsp;(config.skipAuth) {
    return config;
  }

  // иначе запрашиваем валидный accessToken
  const accessToken = await requestValidAccessToken();

  // и&nbsp;возвращаем пропатченный конфиг с&nbsp;токенов в&nbsp;заголовке
  return {
    ...config,
    headers: {
      common: {
        ['Authorization']: `Bearer ${accessToken}`,
      },
    },
  };
});

// обрабатываем запрос перед обработкой ответа от&nbsp;сервера
apiClient.interceptors.response.use(
  // сюда попадает все, что&nbsp;валидируется успешным ответом status &lt; 500
  (response) =&gt; {
    const {
      data: { errors },
      config: { skipErrors },
      status,
    } = response;

    // если пришла 401, разлогиниваем пользователя
    if&nbsp;(status === 401) {
      store.commit(AUTH_LOGOUT);
    } else if&nbsp;(errors &amp;&amp; !skipErrors) {
      // показываем ошибки сервера для&nbsp;фронта, если нет&nbsp;указаний пропустить их&nbsp;вывод
      showErrors(errors);
    }

    return response;
  },
  (error) =&gt; Promise.reject(error),
);

export { apiClient };</code></pre>
<p> </p>
<p><span style="font-weight: 400;">Таким образом, внутри каждого параллельного асинхронного запроса будет резолвиться один и&nbsp;тот&nbsp;же&nbsp;promise, что&nbsp;позволит синхронизировать их&nbsp;и&nbsp;избежать race condition.</span></p>
<hr>
<h3>Источники и&nbsp;полезные ссылки</h3>
<p><a rel="noopener" href="https://ru.wikipedia.org/wiki/Base64" target="_blank" title="Про стандарт кодирования Base64">Base64 — Википедия</a></p>
<p><a rel="noopener" href="https://ru.wikipedia.org/wiki/JSON_Web_Token" target="_blank" title="Про JSON Web&nbsp;Token">JSON Web&nbsp;Token — Википедия</a></p>
<p><a rel="noopener" href="https://habr.com/ru/company/Voximplant/blog/323160/" target="_blank" title="Хабр: Зачем нужен Refresh Token, если есть Access Token">Зачем нужен Refresh Token, если есть Access Token</a></p>
<p><a rel="noopener" href="https://habr.com/ru/post/340146/" target="_blank" title="Хабр: Пять простых шагов для&nbsp;понимания JSON Web&nbsp;Tokens (JWT)">Пять простых шагов для&nbsp;понимания JSON Web&nbsp;Tokens (JWT)</a></p>
<p><a rel="noopener" href="https://gist.github.com/zmts/802dc9c3510d79fd40f9dc38a12bccfc#%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B2%D1%81%D0%B5-%D1%8D%D1%82%D0%BE--jwt-vs-cookie-sessions" target="_blank" title="Github: Зачем все&nbsp;это&nbsp;? JWT&nbsp;vs&nbsp;Cookie sessions" data-anchor="#%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B2%D1%81%D0%B5-%D1%8D%D1%82%D0%BE--jwt-vs-cookie-sessions">Зачем все&nbsp;это? JWT&nbsp;vs&nbsp;Cookie sessions</a></p>
<p><span style="font-weight: 400;"><strong>Фото в&nbsp;заголовке</strong>: Steven Lelham</span><span style="font-weight: 400;"> on</span><span style="font-weight: 400;"> Unsplash</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Трафик и конверсия: что это за показатели и как с их помощью повысить выручку с сайта
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Что такое трафик и конверсия, в чём разница и как эти метрики помогают оценить эффективность сайта и найти точки роста — простое объяснение для бизнеса.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/traffic-and-conversion/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/traffic-and-conversion/</guid>

                <pubDate>Tue, 06 May 2025 13:43:08 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Трафик и конверсия: что это за показатели и как с их помощью повысить выручку с сайта</h1>
                                <figure>
                                    <img src="/Media/2550/adam-nir-wto6mwpmrjk-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/cbfeefbfd3dc49329d8199817553ffb5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6309ccacbc2142faa405d4a0a9a4922c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В этой статье мы&nbsp;расскажем, что&nbsp;такое трафик и&nbsp;конверсия, разберемся, чем&nbsp;они&nbsp;отличаются и&nbsp;как&nbsp;помогают найти точки для&nbsp;развития бизнеса.</p>
<p>Описывать будем только верхний уровень понимания и&nbsp;простой алгоритм действий. Этого вполне хватит, чтобы сделать первые шаги по&nbsp;увеличению эффективности собственных продуктов.</p>
<p>Для наглядности рассказывать и&nbsp;показывать всё&nbsp;будем на&nbsp;примере интернет-магазина «Барашек».</p>
<p>Итак, наш&nbsp;гипотетический интернет-магазин «Барашек» продает вязаные шапки. Он&nbsp;приносит около 600 000 рублей в&nbsp;месяц. А&nbsp;нам&nbsp;хотелось бы&nbsp;больше.</p>
<p>Чтобы увеличить выручку, нам&nbsp;нужно оценить эффективность интернет-магазина и&nbsp;найти точки роста. И&nbsp;в&nbsp;этом нам&nbsp;помогут два&nbsp;показателя — <strong>трафик и&nbsp;конверсия.</strong></p>
<h2>Трафик</h2>
<p><span style="font-weight: 400;">Трафик — это&nbsp;количество посетителей сайта, которые зашли на&nbsp;него за&nbsp;определенный промежуток времени (день, неделю, месяц, год).</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    В&nbsp;интернет-магазин «Барашек» за&nbsp;прошлый месяц зашло 15 000 посетителей. <b>Это и&nbsp;есть наш&nbsp;трафик.</b>
</div>

<p>Трафик разделяют на&nbsp;виды, в&nbsp;зависимости от&nbsp;каналов, по&nbsp;которым люди приходят на&nbsp;сайт.</p>
<p><strong>Органический</strong> — посетители, которые зашли на&nbsp;сайт через поисковые системы. Например, человек загуглил фразу «купить вязаную шапку в&nbsp;Москве», в&nbsp;поисковой выдаче увидел наш&nbsp;сайт, кликнул по&nbsp;ссылке и&nbsp;зашел.</p>
<p><strong>Рекламный</strong> — посетители, которые зашли через рекламные объявления. <br>Для «Барашка» мы&nbsp;настроили рекламу в&nbsp;Яндекс.Директе. Все&nbsp;люди, которые перейдут на&nbsp;наш&nbsp;сайт по&nbsp;рекламной ссылке, попадут в&nbsp;этот вид&nbsp;трафика.</p>
<p><strong>Прямой</strong> — посетители, которые ввели url&nbsp;сайта в&nbsp;строке в&nbsp;браузере и&nbsp;напрямую зашли на&nbsp;него.</p>
<p><strong>Реферальный</strong> — пользователи, которые перешли на&nbsp;сайт по&nbsp;внешним ссылкам. Это&nbsp;могут быть ссылки в&nbsp;блоге компании на&nbsp;других ресурсах: vc.ru, Яндекс.Дзен и&nbsp;других. Обычно такие ссылки содержат в&nbsp;себе UTM-метки, по&nbsp;которым системы аналитики определяют, откуда пришли люди. </p>
<h2>Конверсия</h2>
<p><span style="font-weight: 400;">Конверсия — это&nbsp;процент пользователей от&nbsp;общего количества посетителей сайта (трафика), которые выполнили целевое действие . Например, купили что&#8209;то&nbsp;в&nbsp;интернет-магазине. </span></p>
<p><span style="font-weight: 400;">Узнать этот процент (его&nbsp;еще&nbsp;называют CR&nbsp;— conversion rate), можно по&nbsp;формуле:</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2552/&#x444;&#x43E;&#x440;&#x43C;&#x443;&#x43B;&#x430;-&#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x440;&#x441;&#x438;&#x438;.png"
         alt=""
         itemprop="">


</figure>


<div class="umb-macro-highlights">
    <strong></strong>
    В&nbsp;прошлом месяце в&nbsp;интернет-магазине «Барашек» покупку совершили 150 человек. Мы&nbsp;помним, что&nbsp;трафик в&nbsp;этом же&nbsp;месяце составил 15 000. Значит, <b>конверсия «Барашка» (CR) равна 1%.</b>
</div>

<p><span style="font-weight: 400;">Чтобы более точно отслеживать конверсию, ее&nbsp;разделяют на&nbsp;виды:</span></p>
<p><strong>Целевая конверсия</strong> <span style="font-weight: 400;">—</span> <span style="font-weight: 400;">главная конверсия нашего ресурса. Целевое действие, которое мы&nbsp;хотим, чтобы посетитель совершил. </span></p>
<p><span style="font-weight: 400;">Для «Барашка» это&nbsp;оформление заказа.</span></p>
<p><strong>Промежуточная конверсия</strong> <span style="font-weight: 400;">—</span> <span style="font-weight: 400;">действия, которые посетитель совершает, пока добирается до&nbsp;целевого действия.</span></p>
<p><span style="font-weight: 400;">Для «Барашка» это: </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">добавление товара в&nbsp;корзину;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">добавление товара в&nbsp;избранное;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">переход на&nbsp;страницу оформления заказа.</span><span style="font-weight: 400;"></span></li>
</ul>

<div class="umb-macro-highlights">
    <strong></strong>
    Отслеживать показатели трафика и&nbsp;конверсии можно в&nbsp;системах аналитики. Например, в&nbsp;Яндекс.Метрике или&nbsp;Google.Analytics.
</div>

<h2>Какая конверсия сайта считается хорошей</h2>
<p>Для разных сфер бизнеса разные показатели конверсии считаются хорошими. Так&nbsp;для&nbsp;онлайн-торговли одеждой и&nbsp;обувью, согласно исследованию <a rel="noopener" href="https://datainsight.ru/sites/default/files/DI_Fashion_2020_Public.pdf" target="_blank" title="Публичная версия исследования онлайн-рынка одежды и&nbsp;обуви">Data Insight</a> за&nbsp;2020 год, средний коэффициент конверсии — около 4,5%. То&nbsp;есть «нормальной» конверсией интернет-магазина можно считать показатель, близкий к&nbsp;этому значению.</p>
<p>Конечно, есть сайты и&nbsp;с&nbsp;показателем конверсии 10% и&nbsp;больше. Но&nbsp;это&nbsp;скорее исключение из&nbsp;правил. За&nbsp;этой цифрой стоят очень нишевые продукты и&nbsp;услуги или&nbsp;результаты огромной работы и&nbsp;многих потраченных денег. А&nbsp;может и&nbsp;просто везение. В&nbsp;любом случае, долго удерживать такой показатель очень сложно и&nbsp;затратно.</p>
<p>У «Барашка» конверсия 1%. Это&nbsp;ниже средней конверсии по&nbsp;сфере. А&nbsp;значит — нам&nbsp;есть куда расти!</p>
<p>Чтобы найти точки развития и&nbsp;способы увеличения выручки, проведем исследование воронки сайта.</p>
<h2>Воронка сайта</h2>
<p><span style="font-weight: 400;">Если рассмотреть путь посетителей от&nbsp;захода на&nbsp;сайт до&nbsp;целевого действия, можно отследить, как&nbsp;на&nbsp;каждом шаге уменьшается количество людей, которые проходят на&nbsp;следующий. Это&nbsp;и&nbsp;есть воронка вашего сайта.</span></p>
<h3>Воронка интернет-магазина «Барашек»</h3>
<p><span style="font-weight: 400;">В «Барашек» за&nbsp;месяц зашли 15 000 посетителей. Из&nbsp;них&nbsp;7 500 зашли на&nbsp;страницу товара, 3 000 положили товар в&nbsp;корзину, 1 500 перешли на&nbsp;страницу оформления заказа и&nbsp;только 150 купили — то&nbsp;есть достигли целевой конверсии.</span></p>
<p><span style="font-weight: 400;">Мы продаем вязаные шапки по&nbsp;4 000 рублей. В&nbsp;месяц с&nbsp;интернет-магазина мы&nbsp;получаем 600 000 рублей.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8676cfd342d619ece191aaf5297e93f3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--31311790 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--31311790 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/688231a2cd98406fa09d06e326d39173"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2559/&#x432;&#x43E;&#x440;&#x43E;&#x43D;&#x43A;&#x430;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2745d53b2b035f607806ab4a31d65094"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/88befd8304a44459a510b5a3e75394f8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Данные собрали. Теперь надо выбрать показатель, который будем растить.</span></p>
<p><span style="font-weight: 400;">У нас&nbsp;есть  три&nbsp;варианта:</span></p>
<ol>
<li><span style="font-weight: 400;">Повысить только трафик.</span></li>
<li><span style="font-weight: 400;">Повысить только конверсию.</span></li>
<li><span style="font-weight: 400;">Повысить и&nbsp;трафик, и&nbsp;конверсию.</span></li>
</ol>
<p><span style="font-weight: 400;">Чтобы выбрать подходящий нам&nbsp;вариант, посчитаем экономику каждого из&nbsp;них.</span></p>
<h2>Считаем экономику роста показателей</h2>
<h3>Вариант 1: повышаем трафик</h3>
<p><span style="font-weight: 400;">Если будет больше посетителей, а&nbsp;конверсия останется на&nbsp;прежнем уровне, то&nbsp;увеличится выручка нашего интернет-магазина.</span></p>
<p><span style="font-weight: 400;">Важно, чтобы трафик был&nbsp;релевантный вашему предложению. Если нагнать на&nbsp;наш&nbsp;сайт людей, которые ищут меховые ушанки, это&nbsp;не&nbsp;сработает. Такие посетители не&nbsp;купят вязаные шапки. Трафик увеличится, а&nbsp;конверсия уменьшится.</span></p>
<p><span style="font-weight: 400;">Увеличить трафик в&nbsp;два&nbsp;раза просто так&nbsp;не&nbsp;получится, поэтому посчитаем наиболее реалистичный вариант — приведем на&nbsp;сайт на&nbsp;5 000 посетителей больше, чем&nbsp;сейчас.</span></p>
<p><span style="font-weight: 400;">Как это&nbsp;отразится на&nbsp;воронке нашего интернет-магазина:</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/501d8b63c943e48c6e1baacab739d28f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--39445499 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--39445499 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/36d393ba9c944e50bcf3aea491cd6122"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2560/&#x442;&#x440;&#x430;&#x444;&#x438;&#x43A;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1287f34220f9250dea52c7fd490e6d19"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/698b5a9efe9f469da715d3d0997386d8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">С помощью повышения трафика нам&nbsp;удалось увеличить выручку сайта на&nbsp;</span>33%.</p>
<p><span style="font-weight: 400;">Чтобы увеличить трафик, надо привлекать специалистов, которые проанализируют существующие активности по&nbsp;продвижению и&nbsp;предложат пути улучшения. Стоимость этих услуг тоже надо учитывать в&nbsp;экономике вариантов.</span></p>
<h3>Вариант 2: повышаем конверсию</h3>
<p><span style="font-weight: 400;">Текущая конверсия сайта 1%. Исследования говорят, что&nbsp;средняя конверсия в&nbsp;сфере онлайн-торговли одеждой и&nbsp;обувью — 4,5%. Мы&nbsp;считаем, что&nbsp;для&nbsp;начала сможем повысить конверсию в&nbsp;2 раза —  до&nbsp;2%.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/564d2c4b5caddab338a952152217d671"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--25968065 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--25968065 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ec2ad6672d92442ca66b3b3e8b008067"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2561/&#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x440;&#x441;&#x438;&#x44F;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f6ac0471232973c2989a5b39f1a09735"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bd08abc650b34e26ad2e8a9f82ebc868"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">С помощью повышения конверсии на&nbsp;1% нам&nbsp;удалось повысить выручку интернет-магазина на&nbsp;100 %.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    <p><span style="font-weight: 400;">Повышением конверсии сайта занимаются UX-специалисты. Сперва они&nbsp;проведут </span><a rel="noopener" href="/articles/how-we-conduct-ux-audit" target="_blank" title="Статья «Что такое UX-аудит и&nbsp;как&nbsp;мы&nbsp;его&nbsp;проводим»"><span style="font-weight: 400;">анализ существующего интерфейса</span></a><span style="font-weight: 400;">. А&nbsp;затем с&nbsp;помощью изменений в&nbsp;нем&nbsp;добьются </span><a rel="noopener" href="/site-conversion-increase" target="_blank" title="Услуга «Повышаем конверсию сайта через редизайн»"><span style="font-weight: 400;">целевых показателей конверсии</span></a><span style="font-weight: 400;">.</span></p>
</div>

<p><span style="font-weight: 400;">Например, мы&nbsp;повысили  конверсию интернет-магазина сантехники 47.ru, до&nbsp;3,38%. Тогда, как&nbsp;средний показатель CR&nbsp;для&nbsp;этой сферы бизнеса — </span><a rel="noopener" href="https://datainsight.ru/sites/default/files/DI-DIY_2020_Public.pdf" target="_blank" title="Публичная версия исследования онлайн-рынка товаров для&nbsp;дома"><span style="font-weight: 400;">2,8%</span></a><span style="font-weight: 400;">. Делали мы&nbsp;это&nbsp;пошагово — сперва </span><a rel="noopener" href="/projects/fors" target="_blank" title="Кейс «Редизайн страницы товара в&nbsp;интернет-магазине сантехники» 47.ru"><span style="font-weight: 400;">провели редизайн страницы товара</span></a><span style="font-weight: 400;">, а&nbsp;затем и&nbsp;</span><a rel="noopener" href="/projects/47-redesign" target="_blank" title="Кейс «Редизайн интернет-магазина сантехники 47.ru»"><span style="font-weight: 400;">всех остальных</span></a><span style="font-weight: 400;">. </span></p>
<h3>Вариант 3: работаем и&nbsp;с&nbsp;трафиком, и&nbsp;с&nbsp;конверсией</h3>
<p><span style="font-weight: 400;">Комбинированный подход. Увеличиваем трафик и&nbsp;конверсию на&nbsp;те&nbsp;же&nbsp;величины, которые были в&nbsp;прошлых примерах.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6f2e1dc0b47639b82f349967ce48ece4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--51888039 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--51888039 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/980eb859d5e74f5a8948bb6d21c6b1f3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2562/&#x442;&#x440;&#x430;&#x444;&#x438;&#x43A;-&#x438;-&#x43A;&#x43E;&#x43D;&#x432;&#x435;&#x440;&#x441;&#x438;&#x44F;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/86c6b7ed4b1c0edbca1eb051fea8c701"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/441ef04036be4240924d6406c43aca54"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">При комбинированном подходе мы&nbsp;увеличили выручку интернет-магазина на&nbsp;166%. Причем, мы&nbsp;получили результат даже лучше, чем&nbsp;если бы&nbsp;по&nbsp;отдельности складывали показатели выручки из&nbsp;предыдущих примеров. В&nbsp;этом случае работает принцип 1 + 1 &gt; 2.</span></p>
<p><span style="font-weight: 400;">При выборе этого варианта нам&nbsp;придется искать исполнителей и&nbsp;под&nbsp;повышение трафика, и&nbsp;для&nbsp;повышения конверсии. Причем обычно это&nbsp;разные люди, и&nbsp;стоимость таких улучшений будет выше, чем&nbsp;в&nbsp;предыдущих вариантах.</span></p>
<h2>Что выбрать «Барашку»</h2>
<p>Очевидно, что&nbsp;самый прибыльный вариант — комбинированный, когда мы&nbsp;повышаем и&nbsp;трафик, и&nbsp;конверсию. Он&nbsp;же&nbsp;и&nbsp;самый затратный — финансово и&nbsp;по&nbsp;времени на&nbsp;поиск исполнителей. А&nbsp;мы&nbsp;сейчас не&nbsp;готовы сильно тратиться и&nbsp;долго ждать.</p>
<p>Первый вариант нам&nbsp;тоже не&nbsp;подходит — трафик у&nbsp;«Барашка» хороший, его&nbsp;повышать не&nbsp;надо. А&nbsp;вот&nbsp;конверсия маленькая — всего 1%. С&nbsp;ней&nbsp;и&nbsp;будем работать. Тем&nbsp;более, что&nbsp;даже с&nbsp;небольшим повышением до&nbsp;2% мы&nbsp;увеличим прибыль в&nbsp;два&nbsp;раза — до&nbsp;1 200 000 рублей.</p>
<p>Решено — повышаем «Барашку» конверсию через улучшения интерфейса!</p>
<h2>Общий чек-лист поиска точек роста</h2>
<p>С «Барашком» все&nbsp;понятно, а&nbsp;что&nbsp;делать остальным?<br>Вот краткий чек-лист по&nbsp;поиску точек роста для&nbsp;вашего сайта и&nbsp;бизнеса:</p>
<ol>
<li><strong>Зафиксируйте точку А</strong> — основные показатели воронки сайта — трафик и&nbsp;конверсию, и&nbsp;выручку с&nbsp;него на&nbsp;данный момент.</li>
<li><strong>Определите точку Б</strong> — каких показателей вы&nbsp;хотите достичь.</li>
<li><strong>Посчитайте экономику подходов</strong>. Для&nbsp;этого надо понять, какой вариант принесет больше пользы и&nbsp;будет экономически-целесообразным.</li>
<li><strong>Найдите исполнителей</strong> под&nbsp;ваши цели и&nbsp;бюджет.</li>
<li><strong>Замерьте показатели успеха</strong> — чтобы понять, удалось ли&nbsp;достичь целей, которые вы&nbsp;ставили. Если удалось — пора задумываться о&nbsp;поиске новых точек роста!</li>
</ol>
<p>Если нет&nbsp;— значит, работа еще&nbsp;не&nbsp;закончена. Или&nbsp;же&nbsp;вы&nbsp;изначально запланировали слишком большой рост. Помните: конверсия в&nbsp;10% — это&nbsp;можно, но&nbsp;очень сложно, дорого и&nbsp;недолговечно. Ставьте реалистичные цели!</p>
<h2>Заключение</h2>
<p><span style="font-weight: 400;">В этой статье мы&nbsp;описали только верхний уровень понимания основных показателей сайта — трафика и&nbsp;конверсии. И&nbsp;это&nbsp;тот&nbsp;самый минимум, который позволяет собственникам бизнеса развивать и&nbsp;изменять свои сайты, основываясь на&nbsp;конкретных данных, а&nbsp;не&nbsp;абстрактных теориях или&nbsp;веяниях моды. <br></span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Если вам&nbsp;интересно узнать, как&nbsp;мы&nbsp;работаем над&nbsp;повышением конверсии сайтов — заходите в&nbsp;раздел <a href='https://fuse8.ru/site-conversion-increase/' target='_blank' title='Сайт fuse8'>«Повышаем конверсию сайта через редизайн»</a>.
</div>

<hr>
<p><em><strong>Редактура:<span> </span></strong>Марина Медведева</em></p>
<p><em><strong>Фото в&nbsp;заголовке:</strong><span> Adam Nir&nbsp;on&nbsp;Unsplash</span></em></p>
<p> </p>
<h3>Что почитать еще:</h3>
<p><a href="/articles/how-we-conduct-ux-audit" title="Статья"><span style="font-weight: 400;">Что такое UX-аудит сайта и&nbsp;как&nbsp;мы&nbsp;его&nbsp;проводим</span></a></p>
<p><a href="/site-conversion-increase" title="Раздел на&nbsp;сайте «Повышаем конверсию сайта через редизайн»"><span style="font-weight: 400;">Как мы&nbsp;повышаем конверсию сайта через редизайн</span></a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как собрать фидбек с клиента после проекта
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Зачем нам отзывы, как они прокачивают клиентский сервис и что помогает собирать фидбек быстро и без боли — делимся опытом и рабочими приёмами.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-get-feedback/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-get-feedback/</guid>

                <pubDate>Tue, 06 May 2025 13:42:27 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как собрать фидбек с клиента после проекта</h1>
                                <figure>
                                    <img src="/Media/2624/group-3-2.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6b76a4d4621b0cb89770a3f7a9a82dd3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/16074fc23e674dda988d3b80917108e2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Последний год&nbsp;мы&nbsp;всей нашей маркетинг-командой налаживаем процесс сбора фидбека с&nbsp;клиентов после проекта. Отзывы мы&nbsp;публикуем на&nbsp;нашем сайте, в&nbsp;кейсах, на&nbsp;сторонних площадках, вроде сайтов рейтингов и&nbsp;digital-конкурсов, в&nbsp;соцсетях и&nbsp;т.д. И&nbsp;порой их&nbsp;сбор может быть очень утомительным и&nbsp;долгим. </span></p>
<p><span style="font-weight: 400;">В этой статье мы&nbsp;расскажем, какую пользу мы&nbsp;видим в&nbsp;отзывах, как&nbsp;они&nbsp;помогают нам&nbsp;развиваться и&nbsp;улучшать клиентский сервис, а&nbsp;также поделимся наработками, которые упрощают и&nbsp;ускоряют сбор фидбека.</span></p>
<h2>Зачем нужен фидбэк </h2>
<p><span style="font-weight: 400;">Мы считаем, что&nbsp;отзывы нужны отнюдь не&nbsp;для&nbsp;того, чтобы потешить самолюбие или&nbsp;похвастаться успехами. Для&nbsp;нас&nbsp;фидбек — источник важной информации, которая помогает двигаться вперед. И&nbsp;мы&nbsp;верим, что&nbsp;отрицательный отзыв может быть не&nbsp;менее полезен, чем&nbsp;положительный. </span></p>
<p><span style="font-weight: 400;">Вот несколько основных полезных действий, которые мы&nbsp;видим для&nbsp;себя в&nbsp;фидбеке от&nbsp;клиентов, в&nbsp;порядке приоритета:  </span></p>
<p><strong>Помогает определить точки роста.</strong> <span style="font-weight: 400;">Когда клиент говорит, чего ему&nbsp;не&nbsp;хватило в&nbsp;работе с&nbsp;нами, какие услуги он&nbsp;еще&nbsp;хотел бы&nbsp;от&nbsp;нас&nbsp;получить. </span></p>

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Вы&nbsp;сделали для&nbsp;нас&nbsp;очень классный сайт! Жаль, что&nbsp;вы&nbsp;не&nbsp;занимаетесь продвижением — было бы&nbsp;удобно продолжить и&nbsp;эти&nbsp;работы с&nbsp;вами, а&nbsp;не&nbsp;искать другого подрядчика.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>

<p><span style="font-weight: 400;">Вот и&nbsp;точка роста — мы&nbsp;видим, что&nbsp;у&nbsp;наших клиентов есть спрос на&nbsp;услугу. Можно подумать о&nbsp;ее&nbsp;внедрении. </span></p>
<p><strong>Подсказывает, как&nbsp;улучшить клиентский сервис.</strong><span style="font-weight: 400;"> Когда клиент говорит о&nbsp;команде, коммуникациях внутри нее, качестве предоставляемых нами услуг и&nbsp;т.д. </span></p>

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Кажется, руководитель проекта был&nbsp;недостаточно вовлечен в&nbsp;работу. Из&#8209;за&nbsp;этого возникали проблемы. И&nbsp;чтобы их&nbsp;разрешить, мне&nbsp;приходилось принимать решения, которые, как&nbsp;мне&nbsp;казалось, должен был&nbsp;принимать именно руководитель проекта
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>

<p><span style="font-weight: 400;">Клиент остался недоволен организацией работы над&nbsp;его&nbsp;проектом и&nbsp;прямо заявил о&nbsp;том, что&nbsp;ему&nbsp;пришлось взять на&nbsp;себя часть наших задач. Наш&nbsp;ход&nbsp;— выяснить, почему руководитель проекта не&nbsp;уделил ему&nbsp;должного внимания, и&nbsp;что&nbsp;мы&nbsp;можем сделать, чтобы в&nbsp;будущем такого не&nbsp;повторилось. </span></p>
<p><span style="font-weight: 400;"><strong>Облегчает работу над&nbsp;ошибками</strong>. Когда клиент говорит о&nbsp;наших конкретных промахах и&nbsp;недоработках.</span></p>

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Иногда возникают проблемы с&nbsp;планированием ресурсов. Нужные люди могут какое&#8209;то&nbsp;время быть недоступны. Это&nbsp;приводит к&nbsp;коротким, но&nbsp;нежелательным задержкам.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>

<p><span style="font-weight: 400;">Это фрагмент реального отзыва от&nbsp;нашего клиента. После него мы&nbsp;пересмотрели процессы планирование команды: стали внимательнее следить, не&nbsp;выпадает ли&nbsp;у&nbsp;кого&#8209;то&nbsp;из&nbsp;разработчиков отпуск во&nbsp;время проекта и, если выпадает, можем ли&nbsp;мы&nbsp;его&nbsp;кем&#8209;то&nbsp;заменить, чтобы избежать простоя. </span></p>
<p><strong>Показывает сильные стороны.</strong><span style="font-weight: 400;"> Когда клиент хвалит нас&nbsp;за&nbsp;конкретные вещи. </span></p>

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Раньше нам&nbsp;сложно было работать с&nbsp;отдельным дизайнером: она&nbsp;сделала нам&nbsp;просто стиль, и&nbsp;воспользоваться им&nbsp;было невозможно. А&nbsp;вы&nbsp;создали готовый ПРОДУКТ, написали к&nbsp;нему инструкцию и&nbsp;показали, как&nbsp;им&nbsp;пользоваться.  Все&nbsp;ваши работы были СДАНЫ, а&nbsp;не&nbsp;просто отправлены заказчику.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>

<p><span style="font-weight: 400;">Это тоже реальный отзыв. Благодаря нему мы&nbsp;знаем, что&nbsp;продуктовый подход и&nbsp;презентации итогов работы — наши сильные стороны. И&nbsp;вполне можем использовать это, например, в&nbsp;рекламных кампаниях и&nbsp;прочих маркетинговых активностях.  </span></p>
<p><strong>Повышает доверие к&nbsp;нам, как&nbsp;к&nbsp;компании.</strong><span style="font-weight: 400;"> Когда отзыв настоящий, честный и&nbsp;несет полезную информацию.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/96ceedad21a70d207154dfb8070f0f4c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/98f8a070d3fe41949f7e74e7740caae4"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span style="color: #ff0000;">Нет </span></strong></p>
<p><em><span style="font-weight: 400;">«Узнал о&nbsp;компании «Картонный дирижабль» от&nbsp;знакомого. Он&nbsp;рассказал о&nbsp;них&nbsp;много хорошего — что&nbsp;они&nbsp;профессионалы и&nbsp;настоящие эксперты в&nbsp;своем деле! </span></em></p>
<p><em><span style="font-weight: 400;">Поэтому, когда мне&nbsp;понадобился сайт, обратился сразу к&nbsp;ним. И, в&nbsp;итоге, не&nbsp;пожалел! Ребята работают быстро и&nbsp;качественно, соблюдают сроки и&nbsp;договоренности! Да&nbsp;еще&nbsp;и&nbsp;скидки делают на&nbsp;все&nbsp;последующие сайты! Буду заказывать у&nbsp;них&nbsp;еще! </span></em></p>
<p><em><span style="font-weight: 400;">Всем советую: если вам&nbsp;нужен сайт — не&nbsp;думайте! Звоните сразу «Картонному дирижаблю»! Это&nbsp;просто 10 из&nbsp;10!!!» Пушка! Топ! Молодцы!</span></em></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/05d9c35451b34fdb9de18e38188df880"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span style="color: #38761d;">Да</span></strong></p>
<p><em><span style="font-weight: 400;">«Мы обратились в&nbsp;«КосмоСайты» за&nbsp;редизайном интернет-магазина. После редизайна сайт выглядит свежо и&nbsp;современно. Пользователи довольны — отмечают, что&nbsp;в&nbsp;интернет-магазине стало легко ориентироваться и&nbsp;находить нужные товары. </span></em></p>
<p><em><span style="font-weight: 400;">В целом, работой с&nbsp;«КосмоСайтами» мы&nbsp;довольны. Понравилось, как&nbsp;они&nbsp;проводят переговоры и&nbsp;фактически конспектируют их, а&nbsp;затем отправляют результаты встречи на&nbsp;согласование. Руководитель проектов спокойно и&nbsp;с&nbsp;пониманием относится к&nbsp;замечаниям и&nbsp;правкам, а&nbsp;дизайнер хорошо подает себя на&nbsp;переговорах. </span></em></p>
<p><em><span style="font-weight: 400;">Но есть и&nbsp;минус: команда у&nbsp;«КосмоСайтов» очень уж&nbsp;маленькая и&nbsp;занятая — мы&nbsp;не&nbsp;смогли сразу  приступить к&nbsp;следующему проекту, потому что&nbsp;не&nbsp;было свободных специалистов».</span></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/bc310353f4029e2b71ab582a04a8c709"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/468ed680c7f04874b42944eadec3c7e4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Первый комментарий говорит только о&nbsp;том, что&nbsp;у&nbsp;компании «Картонный дирижабль» есть деньги на&nbsp;проплаченные отзывы. </span></p>
<p><span style="font-weight: 400;">Второй даёт понять, чем&nbsp;занимается компания «КосмоСайты», как&nbsp;она&nbsp;это&nbsp;делает, кому может быть полезна и&nbsp;предупреждает о&nbsp;подводных камнях — команда маленькая, и, возможно, старта работ по&nbsp;проекту придется ждать долго. </span></p>
<p><span style="font-weight: 400;">Какая компания вызывает у&nbsp;вас&nbsp;больше доверия? </span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Очень классно о&nbsp;том, <a href='https://maximilyahov.ru/blog/all/false/' target='_blank' title='Блог Максима Ильяхова'>как отличить фальшь в&nbsp;рекламе и&nbsp;отзывах</a>, написал Максим Ильяхов в&nbsp;своем блоге.
</div>

<h2>Что такое полезный фидбек</h2>
<p><span style="font-weight: 400;">Мы считаем отзыв полезным, если он&nbsp;заключает в&nbsp;себе хотя бы&nbsp;один пункт из&nbsp;списка выше. </span></p>
<p><span style="font-weight: 400;">Например, если клиент в&nbsp;целом хорошо отозвался о&nbsp;нашей работе, но&nbsp;поругал за&nbsp;недостаточную прозрачность  — это&nbsp;успех! Благодаря такому фидбеку мы&nbsp;точно знаем, что&nbsp;нам&nbsp;нужно улучшить — </span><strong>п.3 «Облегчает работу над&nbsp;ошибками»</strong><span style="font-weight: 400;">. </span></p>
<p><span style="font-weight: 400;">Или, скажем, мы&nbsp;заметим, что&nbsp;в&nbsp;отзывах клиенты частенько сетуют на&nbsp;то, что&nbsp;мы&nbsp;не&nbsp;предоставляем услугу по&nbsp;разработке фирменного стиля. Возможно, это&nbsp;станет толчком к&nbsp;нашему развитию — расширению дизайн-отдела и&nbsp;перечня услуг — </span><strong>п.1 «Помогает определить точки роста»</strong><span style="font-weight: 400;">.</span></p>
<h2>Как получить полезный фидбек</h2>
<p><span style="font-weight: 400;">Если просто запросить у&nbsp;клиента отзыв, есть риск получить абзац абстрактного текста на&nbsp;официальном бланке с&nbsp;печатью и&nbsp;подписью. Это&nbsp;может быть хорошо с&nbsp;точки зрения пиара, но&nbsp;не&nbsp;дает информации, которая помогла бы&nbsp;компании-исполнителю вырасти, измениться к&nbsp;лучшему или&nbsp;исправить какие&#8209;то&nbsp;ошибки и&nbsp;недочеты.  </span></p>
<p><span style="font-weight: 400;">Вот пример такого отзыва:</span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2625/a4-1-1.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p><span style="font-weight: 400;">Классно, что&nbsp;заказчик оценил работу исполнителя и&nbsp;написал благодарственное письмо. Но&nbsp;чтобы превратить абстрактную похвалу в&nbsp;реальную пользу, нужно этот отзыв еще&nbsp;немного докрутить. И&nbsp;вот, как&nbsp;это&nbsp;можно сделать: </span></p>
<p><strong>Составить список вопросов.</strong> <span style="font-weight: 400;"> Чтобы получить любую полезную информацию, нужно её&nbsp;запросить. Хотите знать, как&nbsp;ваш&nbsp;ПМ&nbsp;проявляет себя на&nbsp;переговорах — спросите об&nbsp;этом. Не&nbsp;знаете, какую услугу еще&nbsp;добавить в&nbsp;свой арсенал — узнайте, чего не&nbsp;хватило заказчику. </span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2626/image-4.png"
         alt=""
         itemprop="">


        <figcaption>
            Пример опросника для&nbsp;отзыва: вполне можно взять за&nbsp;основу  и&nbsp;дополнить конкретным вопросами под&nbsp;конкретный проект
        </figcaption>
</figure>

<p> </p>
<p><strong>Договариться с&nbsp;клиентом на&nbsp;интервью.</strong><span style="font-weight: 400;"> Мы&nbsp;просим клиентов выделить на&nbsp;общение не&nbsp;меньше получаса. За&nbsp;это&nbsp;время можно в&nbsp;спокойном темпе задать обязательный минимум вопросов и&nbsp;получить на&nbsp;них&nbsp;вдумчивые ответы. Меньше получаса нельзя. Больше — можно. Иногда клиенты и&nbsp;сами рады подольше пообщаться и&nbsp;подвести вместе с&nbsp;нами итоги проекта.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Не&nbsp;всегда клиент хочет/может общаться устно. В&nbsp;таких ситуациях можно попросить его&nbsp;заполнить опросник. Но&nbsp;не&nbsp;забудьте предупредить, что&nbsp;если в&nbsp;ответах клиента вам&nbsp;будет что&#8209;то&nbsp;непонятно, вы&nbsp;свяжетесь с&nbsp;ним&nbsp;для&nbsp;уточнений.
</div>

<p><strong>Объяснить клиенту, в&nbsp;чем&nbsp;польза.</strong> <span style="font-weight: 400;">Прежде, чем&nbsp;приступить к&nbsp;интервью, мы&nbsp;объясняем клиенту, что&nbsp;его&nbsp;отзыв поможет нам&nbsp;стать лучше, чтобы в&nbsp;  будущем мы&nbsp;могли предложить ему&nbsp;(клиенту) еще&nbsp;более качественный сервис. Проще говоря, мы&nbsp;помогаем ему&nbsp;увидеть в&nbsp;этом разговоре пользу для&nbsp;себя. </span></p>
<p><strong>Добиться ответов.</strong> <span style="font-weight: 400;">Если на&nbsp;один из&nbsp;вопросов клиент затрудняется ответить, мы&nbsp;перефразируем его, приведем пример или&nbsp;вернемся к&nbsp;этому же&nbsp;вопросу через какое&#8209;то&nbsp;время. В&nbsp;самом крайнем случае можно попросить клиента подумать над&nbsp;этим позже и&nbsp;связаться с&nbsp;вами, если ответ придет в&nbsp;голову. </span></p>
<h2>Что делать с&nbsp;полученной информацией</h2>
<p><span style="font-weight: 400;">Полученную информацию мы&nbsp;обрабатываем в&nbsp;несколько шагов. </span></p>
<ol>
<li><span style="font-weight: 400;">Если отзыв брали в&nbsp;формате интервью, расшифровываем его&nbsp;в&nbsp;отдельном документе и&nbsp;делими на&nbsp;логические блоки (мухи-недостатки отдельно, котлеты-достоинства отдельно). </span></li>
<li><span style="font-weight: 400;">Если клиент сам&nbsp;написал фидбек на&nbsp;основе нашего опросника, мы&nbsp;вычитываем его, если нужно, исправляем грамматические и&nbsp;пунктуационные ошибки, разбиваем на&nbsp;логические блоки. </span></li>
<li><span style="font-weight: 400;">Определяемся, где&nbsp;мы&nbsp;будем размещать этот отзыв. </span></li>
<li><span style="font-weight: 400;">Масштабируем отзыв для&nbsp;каждой конкретной площадки. Например, на&nbsp;нашем сайте (в&nbsp;кейсе, новости или&nbsp;на&nbsp;главной странице в&nbsp;блоке «Отзывы») мы&nbsp;можем не&nbsp;ограничивать объемом отзыва. А&nbsp;вот&nbsp;на&nbsp;том&nbsp;же&nbsp;</span><a rel="noopener" href="https://ruward.ru/catalog/fuse8-ru/#common" target="_blank" title="Профиль fuse8 на&nbsp;Ruward" data-anchor="#common"><span style="font-weight: 400;">Ruward</span></a><span style="font-weight: 400;"> нужно обязательно вписаться в&nbsp;300 знаков. </span></li>
<li><span style="font-weight: 400;">Согласуем итоговые тексты отзывов и&nbsp;площадки для&nbsp;их&nbsp;размещения с&nbsp;клиентом. Это&nbsp;важно, даже если вы&nbsp;почти не&nbsp;редактировали речь/текст клиента. Так&nbsp;вы&nbsp;убедитесь, что&nbsp;правильно поняли клиента и&nbsp;не&nbsp;переврали его&nbsp;слова.</span></li>
</ol>

<div class="umb-macro-highlights">
    <strong></strong>
    Еще&nbsp;немного про&nbsp;редактуру отзывов. Мы&nbsp;считаем, что&nbsp;допустимо исправлять орфографические, пунктуационные и&nbsp;логические ошибки. Стилистику и&nbsp;суть отзыва мы&nbsp;не&nbsp;трогаем. Во-первых, это&nbsp;проявление уважения к&nbsp;клиенту и&nbsp;тому, что&nbsp;и&nbsp;как&nbsp;он&nbsp;говорит. Во-вторых, у&nbsp;каждого свой стиль общения и&nbsp;письма. Сохранив его, мы&nbsp;получим живой, честный и&nbsp;уникальный отзыв, которому можно доверять.
</div>

<h2>Кто должен собирать фидбэк</h2>
<p><span style="font-weight: 400;">Мы считаем, что&nbsp;лучше всего фидбек соберет человек, который не&nbsp;состоял в&nbsp;команде проекта — с&nbsp;ним&nbsp;клиент сможет без&nbsp;стеснения обсудить не&nbsp;только результат работы но&nbsp;и&nbsp;команду, которая над&nbsp;ним&nbsp;работала, — поругать ее&nbsp;или&nbsp;похвалить. </span></p>
<p><span style="font-weight: 400;">Во fuse8 отзывы с&nbsp;клиентов собирают чаще всего редактор (и, по&nbsp;совместительству, автор этой статьи) Марина Медведева, или&nbsp;же&nbsp;генеральный директор Антон Пермяков.</span></p>
<h2>Вывод</h2>
<p><span style="font-weight: 400;">Подводя итог, мы&nbsp;выделили пять основных правил сбора фидбека от&nbsp;клиентов. Когда у&nbsp;нас&nbsp;получается соблюсти их&nbsp;все, мы&nbsp;получаем максимально полезные отзывы, которые помогают нам&nbsp;стать лучше. </span></p>

<div class="umb-macro-highlights">
    <strong><h3>Пять золотых правила сбора фидбека</h3>
<p></p></strong>
    <p><strong>Не спешите</strong><span style="font-weight: 400;"><strong>.</strong> Если проект еще&nbsp;только близится к&nbsp;завершению, не&nbsp;дергайте клиента с&nbsp;отзывом. Зарелизьтесь, пару недель подежурьте на&nbsp;проекте, чтобы убедиться, что&nbsp;ничего не&nbsp;сломалось, получите полный расчет и&nbsp;только после этого попросите клиента рассказать, как&nbsp;ему&nbsp;с&nbsp;вами работалось.  </span></p>
<p><strong>Не затягивайте.</strong><span style="font-weight: 400;"> В&nbsp;противовес первому правилу, не&nbsp;откладывайте сбор фидбека. Чем&nbsp;свежее воспоминания клиента о&nbsp;совместной работе, тем&nbsp;живее и&nbsp;полнее будет отзыв — с&nbsp;конкретными примерами, ситуациями и&nbsp;решениями. Через полгода вспомнить что&#8209;то&nbsp;конкретное будет уже&nbsp;сложнее. Есть риск получить фидбек, состоящий из&nbsp;общих фраз и&nbsp;абстракций, вроде  «всё было хорошо» и&nbsp;«мы довольны результатами сотрудничества». </span></p>
<p><strong>Задавайте вопросы.</strong> <span style="font-weight: 400;">Только так&nbsp;вы&nbsp;узнаете то, что&nbsp;вас&nbsp;интересует. Эффективно ли&nbsp;сработала команда? Как&nbsp;показал себя ваш&nbsp;руководитель проекта? Что&nbsp;еще&nbsp;вы&nbsp;могли бы&nbsp;сделать для&nbsp;клиента? Подумайте, что&nbsp;для&nbsp;вас&nbsp;действительно важно, и&nbsp;спросите об&nbsp;этом. </span></p>
<p><strong>Согласовывайте.</strong><span style="font-weight: 400;"> Если вы&nbsp;редактировали отзыв, обязательно покажите итоговый текст клиенту  и&nbsp;расскажите, где&nbsp;вы&nbsp;собираетесь его&nbsp;опубликовать. Размещайте отзыв только если клиента все&nbsp;устраивает. </span></p>
<p><strong>Берите в&nbsp;работу.</strong> <span style="font-weight: 400;">Анализируйте каждый отзыв, думайте, что&nbsp;вы&nbsp;можете в&nbsp;связи с&nbsp;ним&nbsp;сделать — расширить команду, внедрить новую услугу, поработать над&nbsp;коммуникациями с&nbsp;клиентом и&nbsp;т.д. Воспринимайте каждый отзыв как&nbsp;подсказку — что&nbsp;вам&nbsp;изменить</span><span style="font-weight: 400;">, чтобы стать лучше. </span><span style="font-weight: 400;">И используйте эту&nbsp;подсказку.</span></p>
</div>

<hr>
<p><em><strong>Фото в&nbsp;заголовке:</strong> <a rel="noopener" href="https://unsplash.com/photos/8pOTAtyd_Mc" target="_blank" title="Adam Jang on&nbsp;Unsplash"><span style="font-weight: 400;">Adam Jang on&nbsp;Unsplash</span></a></em></p>
<p> </p>
<h3>Что почитать еще:</h3>
<p><a rel="noopener" href="/articles/tips-for-teamleads" target="_blank" title="Статья «Советы тимлиду: что&nbsp;важно в&nbsp;командной работе»">Советы тимлиду: что&nbsp;важно в&nbsp;командной работе</a></p>
<p><a href="/articles/soft-skills-in-it" title="Статья «Софт скиллы в&nbsp;IT-сфере: что&nbsp;прокачивать»">Софт скиллы в&nbsp;IT-сфере: что&nbsp;прокачивать</a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как быстро и просто написать вакансию
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как мы готовили вакансии до появления HR и какие шаблоны теперь экономят время всей команде? Делимся наработками, которые до сих пор работают.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-write-a-vacancy/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-write-a-vacancy/</guid>

                <pubDate>Tue, 06 May 2025 13:08:26 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как быстро и просто написать вакансию</h1>
                                <figure>
                                    <img src="/Media/2647/eric-prouzet-b3ufxwcvbc4-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d10cdb2c4a80cdffc038ec8f93ddf97c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c3ae18ea6bf54e0298b08e693cb6bf7e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Долгое время в&nbsp;нашей компании не&nbsp;было HR-менеджера. Наймом новых сотрудников занимались в&nbsp;основном топы компании и&nbsp;тимлиды — готовили требования для&nbsp;кандидатов, размещали вакансии на&nbsp;hh&nbsp;и&nbsp;других отраслевых сайтах, составляли тестовые задания и&nbsp;проводили собеседования. </span></p>
<p><span style="font-weight: 400;">Сказать, что&nbsp;никто из&nbsp;вышеперечисленных не&nbsp;любил писать вакансии, это&nbsp;ничего не&nbsp;сказать. Вроде бы&nbsp;понятно, что&nbsp;ты, как&nbsp;тимлид, ждешь от&nbsp;кандидата. Но&nbsp;структурировать это&nbsp;все&nbsp;и&nbsp;представить в&nbsp;виде текста — долго, сложно, неохота. </span></p>
<p><span style="font-weight: 400;">Поэтому когда в&nbsp;команду пришла я, мне, как&nbsp;редактору, поручили разобраться с&nbsp;этим. Я&nbsp;должна была подготовить какие&#8209;то&nbsp;стандарты текстов вакансий fuse8, а&nbsp;еще&nbsp;лучше — шаблон, с&nbsp;которым было бы&nbsp;удобно и&nbsp;легко работать. И&nbsp;вот, что&nbsp;у&nbsp;меня получилось. </span></p>
<h2>О чем&nbsp;писать в&nbsp;вакансии</h2>
<p><span style="font-weight: 400;">Итак, первое, что&nbsp;мы&nbsp;сделали, это&nbsp;вместе с&nbsp;топами и&nbsp;тимлидами определились, о&nbsp;чем&nbsp;же&nbsp;обязательно нужно рассказать соискателю в&nbsp;вакансии. Тут&nbsp;важно было соблюсти баланс — дать всю&nbsp;необходимую информацию, но&nbsp;при&nbsp;этом не&nbsp;перегрузить и&nbsp;не&nbsp;превратить текст в&nbsp;нечитаемую портянку.</span></p>
<p><span style="font-weight: 400;">Для этого мы&nbsp;мысленно вернулись во&nbsp;времена, когда сами искали работу, и&nbsp;вспомнили, что&nbsp;нам, как&nbsp;соискателям, было важно узнать о&nbsp;работодателе. Получился вот&nbsp;такой список вопросов: </span></p>
<ol>
<li><span style="font-weight: 400;">На какую именно должность компания ищет сотрудника? </span></li>
<li><span style="font-weight: 400;">Что это&nbsp;за&nbsp;компания, чем&nbsp;занимается, есть ли&nbsp;у&nbsp;нее&nbsp;какая&#8209;то&nbsp;история? </span></li>
<li><span style="font-weight: 400;">Над какими проектами мне&nbsp;предстоит работать, с&nbsp;какими клиентами? </span></li>
<li><span style="font-weight: 400;">Я буду работать один или&nbsp;в&nbsp;команде? </span></li>
<li><span style="font-weight: 400;">Что именно я&nbsp;буду делать, чего от&nbsp;меня ждут?</span></li>
<li><span style="font-weight: 400;">Что компания может предложить мне, кроме зарплаты? Смогу ли&nbsp;я&nbsp;там&nbsp;вырасти?  </span></li>
</ol>
<p><span style="font-weight: 400;">Это тот&nbsp;обязательный минимум информации, который, на&nbsp;наш&nbsp;взгляд, важно знать кандидату в&nbsp;первом приближении. Остальное можно уточнить при&nbsp;созвоне или&nbsp;уже&nbsp;на&nbsp;собеседовании. </span></p>
<p><span style="font-weight: 400;">И вот&nbsp;из&nbsp;списка вопросов выше у&nbsp;нас&nbsp;родилась короткая и&nbsp;понятная структура вакансии. </span></p>
<h2>Структура и&nbsp;шаблон вакансии</h2>
<p><span style="font-weight: 400;">Итак, что&nbsp;же&nbsp;всегда есть в&nbsp;вакансиях fuse8: </span></p>
<p><strong>Конкретизированное название вакансии</strong><span style="font-weight: 400;">, чтобы точно попасть в&nbsp;цель и&nbsp;сэкономить время — наших кандидатов на&nbsp;прочтении вакансии (PHP-разработчик не&nbsp;будет читать текст вакансии .Net-разработчика), наше — на&nbsp;отсев неподходящих по&nbsp;стеку кандидатов. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/8fc796025afacc5a3575b7c26b31d73e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/42fd8a1706bd419c91ec18957d63ce49"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span style="color: #ff0000;">Нет </span></strong></p>
<p><span style="font-weight: 400;">Программист</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/826ea4548efc468f954691d51970d12e"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong><span style="color: #38761d;">Да</span></strong></p>
<p><span style="font-weight: 400;">Ведущий backend-разработчик C#</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/02758a035279f3798747343186125858"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2b53949dde3c4b068f7e39958eb35cf2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><strong>Небольшой рассказ о&nbsp;нашей компании.</strong> <span style="font-weight: 400;">Кто мы, чем&nbsp;занимаемся, с&nbsp;какими сферами бизнеса работаем. Здесь же&nbsp;мы&nbsp;можем рассказать немного о&nbsp;наших клиентах. Эта&nbsp;информация дает соискателю понять, кто&nbsp;мы&nbsp;такие, помогает составить первое впечатление и&nbsp;представить, над&nbsp;какими проектами ему&nbsp;предстоит работать. </span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2648/1.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p><strong>Информация о&nbsp;том, кого мы&nbsp;ищем, и&nbsp;в&nbsp;какой команде человек будет работать и&nbsp;что&nbsp;делать</strong>. <span style="font-weight: 400;"> Это&nbsp;нужно чтобы у&nbsp;соискателя сложилось понимание, в&nbsp;какую среду он&nbsp;попадет. Будет ли&nbsp;он&nbsp;работать один или&nbsp;с&nbsp;командой, в&nbsp;подчинении или&nbsp;на&nbsp;руководящей должности, как&nbsp;и&nbsp;с&nbsp;кем&nbsp;ему&nbsp;предстоит контактировать, какие задачи перед ним&nbsp;будут стоять. </span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2649/2.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p><strong>Список требований к&nbsp;кандидату.</strong> <span style="font-weight: 400;">Его мы&nbsp;условно разбиваем на&nbsp;три&nbsp;части (не&nbsp;обязательно во&nbsp;всех вакансиях, но&nbsp;все-таки в&nbsp;большинстве):</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">то, что&nbsp;мы&nbsp;ждем от&nbsp;кандидата (обязательные требования);</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">список навыков и&nbsp;знаний, которые нам&nbsp;важны;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">список того, что&nbsp;желательно, но&nbsp;вовсе необязательно.</span></li>
</ul>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2650/3.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p><strong>Условия работы, информация об&nbsp;офисе, плюшках и&nbsp;т.д.</strong> <span style="font-weight: 400;">Стандартный раздел для&nbsp;всех вакансий. Мы&nbsp;через него стараемся показать, что&nbsp;работать во&nbsp;fuse8 — это&nbsp;не&nbsp;про&nbsp;«пахать от&nbsp;звонка до&nbsp;звонка», а&nbsp;про&nbsp;развитие, повышения уровня знаний в&nbsp;программировании, английском языке и&nbsp;чем&nbsp;угодно еще, что&nbsp;поможет сделать нашу работу еще&nbsp;более эффективной и&nbsp;впечатляющей. </span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2651/4.png"
         alt=""
         itemprop="">


        <figcaption>
            Это&nbsp;еще&nbsp;доковидный блок об&nbsp;условиях работы, Tuck-Shop, к&nbsp;сожалению, пришлось закрыть, когда большая часть команды перешла на&nbsp;удалёнку
        </figcaption>
</figure>

<p> </p>
<p><span style="font-weight: 400;">Вот так&nbsp;мы&nbsp;определились, что&nbsp;обязательно должно быть в&nbsp;нашей вакансии, и&nbsp;написали пример-подсказку. А&nbsp;затем на&nbsp;его&nbsp;основе сделали шаблон, чтобы работать с&nbsp;новыми вакансиями стало еще&nbsp;проще. </span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Делимся нашим <a href='https://docs.google.com/document/d/1MGJp6w5AfcBhVc39_UD1Qn6usiLtIggl8P0DqCjkf60/edit' target='_blank' title='Шаблон вакансии fuse8'>шаблоном вакансии</a>,  а&nbsp;также <a href='https://docs.google.com/document/d/15bAiTyGAyFDZB_vYbEv3c8SxM6_eUK8UEEradFQYwZ8/edit' target='_blank' title='Пример вакансии fuse8»'>примером уже&nbsp;написанной вакансии</a>. Будем рады, если эти&nbsp;документы вам&nbsp;пригодятся. Только точь-в-точь не&nbsp;списывайте ;)
</div>

<p><span style="font-weight: 400;">Теперь чтобы написать новую вакансию, нужно просто: </span></p>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">скачать себе шаблон вакансии;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">опросить по&nbsp;нему тимида, в&nbsp;чью&nbsp;команду требуется новый специалист;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">написать вакансию по&nbsp;примеру.  </span></li>
</ol>
<p><span style="font-weight: 400;">Сделать это&nbsp;может кто&nbsp;угодно — HR-менеджер, его&nbsp;помощник, редактор или&nbsp;даже сам&nbsp;тимлид. О&nbsp;структуре и&nbsp;содержании думать уже&nbsp;не&nbsp;нужно, и&nbsp;это&nbsp;здорово экономит время. </span></p>
<p><span style="font-weight: 400;">Чуть позже мы&nbsp;провели опрос среди сотрудников, которые пришли в&nbsp;компанию за&nbsp;последний год&nbsp;— они&nbsp;в&nbsp;свое время откликались именно на&nbsp;вакансии, написанные с&nbsp;помощью шаблона. Нам&nbsp;важно было понять, хватает ли&nbsp;соискателям ли&nbsp;той&nbsp;информации, которую мы&nbsp;даем в&nbsp;тексте, и&nbsp;можем ли&nbsp;мы&nbsp;добавить в&nbsp;него еще&nbsp;что&#8209;то&nbsp;полезное.</span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2653/7.png"
         alt=""
         itemprop="">


        <figcaption>
            Фрагмент из&nbsp;опроса новых сотрудников. Мы&nbsp;постарались учесть ответы ребят при&nbsp;следующем обновлении шаблона вакансии
        </figcaption>
</figure>

<h2>Эволюция структуры и&nbsp;шаблона вакансии</h2>
<p><span style="font-weight: 400;">Как и&nbsp;любой рабочий документ, которым регулярно пользуются, шаблон вакансии периодически требует обновления. Например, может измениться описание компании, когда появятся новые партнёры и&nbsp;клиенты. Или&nbsp;список в&nbsp;разделе об&nbsp;условиях работы дополнится еще&nbsp;чем&#8209;то&nbsp;приятным. </span></p>
<p><span style="font-weight: 400;">В наших шаблонах и&nbsp;примерах самое масштабное изменение произошло в&nbsp;январе 2022 года, когда мы&nbsp;запустили свой hr-сайт — </span><a rel="noopener" href="https://hr.fuse8.ru/" target="_blank" title="https://hr.fuse8.ru/"><span style="font-weight: 400;">hr.fuse8.ru</span></a><span style="font-weight: 400;">. </span></p>
<p><span style="font-weight: 400;">Мы убрали из&nbsp;текста рассказ о&nbsp;самой компании. Этому, по&nbsp;сути, посвящен весь сайт. К&nbsp;чему повторяться в&nbsp;каждой вакансии? А&nbsp;еще&nbsp;добавили пару фишек. Например, большой информационный блок о&nbsp;том, что&nbsp;ждет кандидата после отклика: </span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2654/5.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p><span style="font-weight: 400;">Также в&nbsp;каждой вакансии появилось напутственное слово от&nbsp;тимлида с&nbsp;  рекомендациями, что&nbsp;почитать/вспомнить перед собеседованием.</span></p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2655/6.png"
         alt=""
         itemprop="">


</figure>

<p><span style="font-weight: 400;">Сообщения от&nbsp;тимлидов мы&nbsp;тоже шаблонизировали. Сперва составили список тех&nbsp;вакансий, которые у&nbsp;нас&nbsp;появляются регулярно (бэкенд- и&nbsp;фронтенд-разработчики, QA-инженеры). Затем за&nbsp;каждой из&nbsp;них&nbsp;закрепили ответственных тимлидов и&nbsp;попросили их&nbsp;дать рекомендации соискателям. Теперь, когда в&nbsp;команду потребуется тот&nbsp;или&nbsp;иной специалист, у&nbsp;нас&nbsp;уже&nbsp;есть шаблон вакансии под&nbsp;его&nbsp;должность и&nbsp;готовое сообщение-совет. </span></p>
<h2>Заключение</h2>
<p><span style="font-weight: 400;">Шаблоны здорово облегчают жизнь и&nbsp;сокращают количество </span><a rel="noopener" href="https://lifehacker.ru/dzhedajskie-tehniki/" target="_blank" title="https://lifehacker.ru/dzhedajskie-tehniki/"><span style="font-weight: 400;">мыслетоплива</span></a><span style="font-weight: 400;">, затраченного на&nbsp;подготовку того или&nbsp;иного документа. Но, на&nbsp;наш&nbsp;взгляд, важно помнить, что&nbsp;шаблон — это&nbsp;не&nbsp;что&#8209;то&nbsp;железное. Это&nbsp;просто инструмент в&nbsp;помощь. И&nbsp;то, как&nbsp;и&nbsp;в&nbsp;каком объеме его&nbsp;использовать — ваше решение. </span></p>
<p><span style="font-weight: 400;">Не бойтесь менять и&nbsp;перекраивать шаблоны. Берите только то, что&nbsp;полезно и&nbsp;помогает выполнить поставленную задачу — написать вакансию, составить резюме, подготовить текст КП. А&nbsp;то, что&nbsp;не&nbsp;нужно — смело отбрасывайте! </span></p>
<hr>
<p><em><strong>Фото в&nbsp;заголовке: </strong>by <a href="https://unsplash.com/es/@eprouzet?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Eric Prouzet</a> on&nbsp;<a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></em></p>
<p> </p>
<h3>Что почитать еще:</h3>
<p><a href="/articles/how-to-get-feedback" title="Статья «Как собрать фидбек с&nbsp;клиента после проекта»"><span style="font-weight: 400;">Как собрать фидбек с&nbsp;клиента после проекта</span></a></p>
<p><a href="/articles/tips-for-teamleads" title="Статья «Советы тимлиду: что&nbsp;важно в&nbsp;командной работе»"><span style="font-weight: 400;">Советы тимлиду: что&nbsp;важно в&nbsp;командной работе</span></a></p>
<p><a href="/articles/soft-skills-in-it" title="Статья «Софт скиллы в&nbsp;IT-сфере: что&nbsp;прокачивать»"><span style="font-weight: 400;">Софт скиллы в&nbsp;IT-сфере: что&nbsp;прокачивать</span></a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Чего хочет клиент: бриф на аудит и редизайн сайтов и сервисов
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Какие вопросы задать клиенту перед редизайном сайта? Собрали список, который поможет понять задачу, оценить объём работ и спланировать команду.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/brief-for-site-audit-and-redesign/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/brief-for-site-audit-and-redesign/</guid>

                <pubDate>Tue, 06 May 2025 13:07:34 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Чего хочет клиент: бриф на аудит и редизайн сайтов и сервисов</h1>
                                <figure>
                                    <img src="/Media/2703/aaron-boris-vxbmtmtrg5q-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/68baee6af43fcc90f21d12343dd0debb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9d82732b899b4555af7785a2f552c93f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В последнее время к&nbsp; нам&nbsp;часто обращаются за&nbsp; повышением эффективности сайтов и&nbsp; сервисов. При&nbsp;каждом таком запросе, чтобы предложить клиенту оптимальное решение, нам&nbsp;приходится обрабатывать много информации. Если мы&nbsp; забудем что&#8209;то&nbsp;спросить на&nbsp; первой встрече, придется назначить ещё&nbsp;одну. А&nbsp; это&nbsp; — уже&nbsp;лишнее время, которое вынуждены будем потратить и&nbsp; мы, и&nbsp; клиент. В&nbsp; итоге, старт проекта сдвигается, бизнес теряет деньги.</p>
<p>Чтобы избежать этого, мы&nbsp; стараемся оптимизировать все&nbsp;процессы внутри компании. В&nbsp; данном случае — процесс сбора требований по&nbsp; проекту.</p>
<p>Мы собрали в&nbsp; одном документе все&nbsp;основные вопросы, которые нужно задать клиенту, обратившемуся к&nbsp; нам&nbsp;за&nbsp; редизайном сайта и&nbsp; повышением его&nbsp;эффективности. Ответов на&nbsp; них&nbsp;будет достаточно, чтобы сформировать решение для&nbsp;задачи клиента, оценить объём работ и&nbsp; забронировать команду.</p>
<h2>Бриф</h2>
<p>Бриф мы&nbsp; разделили на&nbsp; смысловые блоки. Каждый из&nbsp; них&nbsp;углубляет понимание задачи и&nbsp; приближает нас&nbsp;к&nbsp; формированию лучшего решения для&nbsp;клиента.</p>
<h3>Бизнес клиента</h3>
<p>В начале разговора мы&nbsp; стараемся вникнуть в&nbsp; бизнес клиента и&nbsp; нащупать его&nbsp;боли. Это&nbsp;поможет нам&nbsp;точно определить проблему и&nbsp; предложить для&nbsp;неё&nbsp;лучшее решение. Бывало, что&nbsp;клиент приходил к&nbsp; нам&nbsp;за&nbsp; разработкой сложного онлайн-сервиса, а&nbsp; после нашей встречи выяснялось, что&nbsp;на&nbsp; самом деле ему&nbsp;нужен лендинг, который рассказывает об&nbsp; услуге и&nbsp; собирает заявки.</p>

<div class="umb-macro-highlights">
    <strong>Вопросы о&nbsp;бизнесе клиента:
<p></p></strong>
    <p>- Расскажите о&nbsp;вашем бизнесе?</p>
<p>- Какая у&nbsp;вас&nbsp;бизнес модель?</p>
<p>- На&nbsp;чём&nbsp;вы&nbsp;зарабатываете?</p>
<p>- Продаете ли&nbsp;вы&nbsp;(получаете ли&nbsp;заявки) сейчас в&nbsp;нужном количестве?</p>
<p>- Какие цели стоят перед вашим бизнесом на&nbsp;ближайшее время (год)?</p>
<p>- Какая команда будет работать над&nbsp;этим проектом с&nbsp;вашей стороны?</p>
</div>

<h3>Целевая аудитория и&nbsp; конкуренты</h3>
<p>Далее мы&nbsp; обсуждаем, для&nbsp;кого работает бизнес клиента и&nbsp; какие у&nbsp; него есть конкуренты. Здесь всё&nbsp;понятно. Но&nbsp; есть два&nbsp;интересных вопроса про&nbsp;желательных и&nbsp; нежелательных клиентов. Они&nbsp;помогают уточнить потребности бизнеса в&nbsp; целевой аудитории.</p>
<p>Если клиент на&nbsp; вопрос про&nbsp;описание ЦА&nbsp;по&nbsp; привычке отвечает «люди в&nbsp; возрасте от&nbsp; 25–40 лет», то&nbsp; эти&nbsp;два&nbsp;вопроса заставят его&nbsp;порассуждать, кто&nbsp;именно из&nbsp; этой группы подходит, а&nbsp; кто&nbsp; — нет. В&nbsp; дальнейшем эта&nbsp;информация очень поможет дизайнеру в&nbsp; проработке визуального стиля и&nbsp; интерфейсных решений.</p>

<div class="umb-macro-highlights">
    <strong>Вопросы о&nbsp;ЦА&nbsp;и&nbsp;конкурентах:
<p></p></strong>
    <p>- Для&nbsp;кого работает бизнес? Кто&nbsp;ваши клиенты?</p>
<p>- Опишите вашего клиента: кто&nbsp;он&nbsp;такой, чем&nbsp;занимается, демографические показатели?</p>
<p>- А&nbsp;есть ли&nbsp;группы ЦА, которых бы&nbsp;хотелось больше видеть клиентами? Почему именно их?</p>
<p>- Какие группы ЦА&nbsp;нежелательные? Почему именно они?</p>
<p>- Какие конкуренты есть на&nbsp;рынке?</p>
<p>- Чем&nbsp;отличается ваш&nbsp;бизнес от&nbsp;бизнеса конкурентов?</p>
</div>

<h3>Задача и&nbsp; цели</h3>
<p>Уточняем задачу, определяем цели и&nbsp; узнаем, насколько у&nbsp; клиента эта&nbsp;задача в&nbsp; приоритете.</p>
<p>Это блок вопросов помогает синхронизировать наше понимание задачи с&nbsp; потребностью клиента. Если клиент говорит «Мне нужен редизайн», мы&nbsp; уточняем, что&nbsp;он&nbsp; под&nbsp;этим подразумевает. Дизайн-макеты? Разработку и&nbsp; тестирование? Новый сайт под&nbsp;ключ? А&nbsp; может, точечные улучшения интерфейса?</p>
<p>Здесь же&nbsp;мы&nbsp; аккуратно спрашиваем у&nbsp; клиента, что&nbsp;ему&nbsp;нравится/не нравится в&nbsp; старом сайте. Это&nbsp;будет полезно в&nbsp; будущем — поможет попасть в&nbsp; ожидания и&nbsp; не&nbsp; сломать то, что&nbsp;и&nbsp; до&nbsp; этого было хорошим. Например, если клиента полностью устраивает каталог на&nbsp; существующем сайте, а&nbsp; мы&nbsp; его&nbsp;переделаем — можем ловить негатив.</p>
<p>Важно показать клиенту, что&nbsp;мы&nbsp; уважаем его&nbsp;мнение и&nbsp; будем вносить изменения в&nbsp; дорогую ему&nbsp;функциональность аргументировано и&nbsp; только при&nbsp;наличии веских на&nbsp; то&nbsp; причин.</p>
<p>Не забудьте проговорить с&nbsp; клиентом и&nbsp; зафиксировать количественные цели проекта. Это&nbsp;поможет лучше проработать решение, точнее оценить затраты и&nbsp; попасть в&nbsp; ожидания клиента в&nbsp; конце проекта.</p>

<div class="umb-macro-highlights">
    <strong>Вопросы о&nbsp;цели и&nbsp;задачах:
<p></p></strong>
    <p>- С&nbsp;какой задачей вы&nbsp;пришли к&nbsp;нам?</p>
<p>- Что&nbsp;хотите получить в&nbsp;итоге?</p>
<p>- Почему существующая версия сайта не&nbsp;устраивает? Какие проблемы есть сейчас по&nbsp;вашему мнению? Почему вы&nbsp;считаете это&nbsp;проблемой?</p>
<p>- Получали ли&nbsp;вы&nbsp;отзывы о&nbsp;сайте от&nbsp;клиентов? Какими были эти&nbsp;отзывы?</p>
<p>- Какие цели вы&nbsp;ставите перед обновленным сайтом? Что&nbsp;мы&nbsp;должны сделать, чтобы вы&nbsp;сказал, что&nbsp;все&nbsp;получилось?</p>
<p>- Если с&nbsp;сайтом ничего не&nbsp;делать, сможете ли&nbsp;вы&nbsp;достичь своих бизнес-целей? Как?</p>
</div>

<p>На больших проектах мы&nbsp; организуем отдельную встречу с&nbsp; клиентами для&nbsp;определения целей и&nbsp; границ проекта. Для&nbsp;этого хорошо подходит <a href="/articles/impact-mapping" title="Impact Mapping: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех">импакт маппинг</a>.</p>
<h3>Информация по&nbsp; сайту</h3>
<p>Этот блок вопросов для&nbsp;определения точки А, примерного объёма работ и&nbsp; процесса, по&nbsp; которому мы&nbsp; будем работать с&nbsp; клиентом.</p>
<p>Например, если у&nbsp; клиента не&nbsp; подключены системы аналитики, то&nbsp; мы&nbsp; либо убираем из&nbsp; процесса этап анализа поведения пользователей на&nbsp; сайте, либо просим клиента подключить системы аналитики. В&nbsp; последнем случае мы&nbsp; также переносим старт проекта на&nbsp; срок, достаточный для&nbsp;накопления данных.</p>
<p>Также на&nbsp; этом этапе переговоров мы&nbsp; узнаем у&nbsp; клиента, что&nbsp;происходит после того, как&nbsp;посетитель совершит целевое действие не&nbsp; сайте: как&nbsp;дальше работает бизнес с&nbsp; заявками, планируется ли&nbsp;изменить этот процесс.</p>
<p>На первый взгляд, это&nbsp;не&nbsp; наша зона влияния. Но&nbsp; если мы&nbsp; не&nbsp; учтём бизнес-процессы клиента при&nbsp;проектировании и&nbsp; редизайне, ему&nbsp;придётся подстраиваться под&nbsp;наши решения. Мы&nbsp; стараемся такого избегать и&nbsp; считаем, что&nbsp;это&nbsp;продукты должны подстраиваться под&nbsp;бизнес, а&nbsp; не&nbsp; бизнес под&nbsp;продукты.</p>

<div class="umb-macro-highlights">
    <strong>Вопросы о&nbsp;сайте клиента:
<p></p></strong>
    <p>- Есть ли&nbsp;системы аналитики на&nbsp;сайте? Какие?</p>
<p>- Какой трафик сейчас на&nbsp;сайт?</p>
<p>- Используете ли&nbsp;вы&nbsp;рекламу для&nbsp;повышения трафика? Какую, какие каналы?</p>
<p>- Какой источник трафика для&nbsp;вас&nbsp;самый приоритетный?</p>
<p>- Какое целевое действие на&nbsp;сайте? Что&nbsp;должен сделать посетитель, чтобы бизнесу было хорошо?</p>
<p>- Какая конверсия в&nbsp;целевое действие?</p>
<p>- Опишите путь клиента на&nbsp;сайте: какие действия должен проделать посетитель, чтобы достичь целевого действия?</p>
<p>- Какая группа ЦА&nbsp;больше всего совершает целевые действия? Почему именно эта?</p>
<p>- Что&nbsp;происходит с&nbsp;клиентом после совершения целевого действия? </p>
<p>- Какой бизнес-процесс работы с&nbsp;клиентом после целевого действия? Планируете ли&nbsp;вы&nbsp;менять этот бизнес-процесс?</p>
<p>- Есть ли&nbsp;гайдлайны по&nbsp;фирменному стилю сайта? Соответствует ли&nbsp;сайт этим гайдлайнам?</p>
</div>

<h3>Бюджет и&nbsp; сроки</h3>
<p>Здесь всё&nbsp;просто. Пытаемся понять, какие ожидания у&nbsp; клиента по&nbsp; стоимости и&nbsp; срокам, и&nbsp; подходят ли&nbsp;эти&nbsp;ожидания под&nbsp;наше предложение.</p>
<p>Будьте готовы к&nbsp; тому, что&nbsp;в&nbsp; 80% случаев клиенты не&nbsp; смогут озвучить свой бюджет. Это&nbsp;нормально. А&nbsp; ещё&nbsp;будут те, кто&nbsp;бюджет озвучат, но&nbsp; при&nbsp;этом не&nbsp; подойдут вам, как&nbsp;исполнителям. Это&nbsp;тоже нормально. Зато вы&nbsp; сэкономите время и&nbsp; деньги на&nbsp; проработке следующих этапов.</p>

<div class="umb-macro-highlights">
    <strong>Вопросы сроке и&nbsp;бюджете:
<p></p></strong>
    <p>- Какой бюджет заложен на&nbsp;аудит? А&nbsp;какой бюджет на&nbsp;весь проект?</p>
<p>- Когда хотите получить результат?</p>
</div>

<h3>Дополнительная информация</h3>
<p>В конце разговора стоит спросить у&nbsp; клиента, есть ли&nbsp;ещё&nbsp;что-то, о&nbsp; чём&nbsp;мы&nbsp; не&nbsp; поговорили на&nbsp; встрече — то, что&nbsp;он&nbsp; считает важным, но&nbsp; мы&nbsp; не&nbsp; покрыли это&nbsp;своими вопросами. Именно в&nbsp; этот момент можно получить очень полезную информацию по&nbsp; проекту, которая пригодится при&nbsp;проработке решения.</p>

<div class="umb-macro-highlights">
    <strong>Заключительные вопросы:
<p></p></strong>
    <p>-Есть что&#8209;то&nbsp;ещё&nbsp;о&nbsp;задаче, о&nbsp;чем&nbsp;мы&nbsp;не&nbsp;спросили, но&nbsp;вы&nbsp;хотели бы&nbsp;рассказать?</p>
<p>- Что&nbsp;ещё&nbsp;вы&nbsp;хотели бы&nbsp;обсудить, рассказать?</p>
</div>

<h2>Следующие шаги</h2>
<p>Обычно в&nbsp; конце брифа мы&nbsp; рассказываем, как&nbsp;работаем над&nbsp;проектами. Наш&nbsp;процесс может подходить не&nbsp; всем, поэтому мы&nbsp; сразу стараемся донести это&nbsp;до&nbsp; клиента. Для&nbsp;этого мы&nbsp; обязательно проговариваем:</p>
<ul>
<li>как мы&nbsp; работаем с&nbsp; такими задачами;</li>
<li>как у&nbsp; нас&nbsp;происходит оценивание таких задач;</li>
<li>сколько времени нам&nbsp;понадобится на&nbsp; оценку и&nbsp; формирование КП;</li>
<li>что будет в&nbsp; КП.</li>
</ul>
<p>Затем мы&nbsp; выделяем ещё&nbsp;немного времени, чтобы ответить на&nbsp; вопросы клиента. А&nbsp; в&nbsp; самом конце встречи обязательно назначаем дату и&nbsp; время презентации КП, добавляем её&nbsp; в&nbsp; Google-календарь и&nbsp; приглашаем клиента и&nbsp; команду.</p>
<h2>Заключение</h2>
<p>Этот список вопросов в&nbsp; брифе — не&nbsp; догма. В&nbsp; разговоре всегда будут возникать дополнительные вопросы, которые зависят от&nbsp; бизнеса клиента и&nbsp; его&nbsp;потребностей. Используйте этот документ как&nbsp;шпаргалку, а&nbsp; не&nbsp; как&nbsp;скрипт, и&nbsp; он&nbsp; здорово сэкономит вам&nbsp;время и&nbsp; мыслетопливо при&nbsp;подготовке к&nbsp; встрече с&nbsp; клиентом.</p>

<div class="umb-macro-highlights">
    <strong></strong>
    Положил <a href='https://docs.google.com/document/d/1_nZy7yd_zOoEQAeFWYd5QWQEBz_Sqla7gD_tkoOg_uA/edit' target='_blank' title='Шаблон вопросов по&nbsp;аудиту и&nbsp;редизайну сайта'>весь текст брифа на&nbsp;аудит и&nbsp;редизайн</a> на&nbsp;Google Диск. Если он&nbsp;кажется вам&nbsp;полезным — скачивайте себе и&nbsp;пользуйтесь :)
</div>

<hr>
<p><em><strong>Автор статьи:</strong><span> Вениамин Мустафин</span></em></p>
<p><em><strong>Редактура:</strong><span> Марина Медведева</span></em></p>
<p><em><strong>Фото в&nbsp; заголовке:</strong><span> <a href="https://unsplash.com/@aaron_boris?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><span style="font-weight: 400;">aaron boris</span></a><span style="font-weight: 400;"> on</span><a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"> <span style="font-weight: 400;">Unsplash</span></a></span></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Искусство предсказаний, Или 12 правил для точной оценки разработки проекта
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как перестать бояться оценивать задачи и прокачать этот навык? Полезный разбор для тимлидов и руководителей разработки.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/12-rules-for-realistic-development-estimates/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/12-rules-for-realistic-development-estimates/</guid>

                <pubDate>Tue, 06 May 2025 13:07:06 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Искусство предсказаний, Или 12 правил для точной оценки разработки проекта</h1>
                                <figure>
                                    <img src="/Media/2742/jakub-dziubak-xtud5six464-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c8921af2312cd1692bba3635b37b6991"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/28c7e2b1deb746539fa582e90908f550"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Многие даже опытные тимлиды и&nbsp;руководители не&nbsp;любят оценивать разработку проектов. Часто это&nbsp;довольно сложная задача, в&nbsp;которой легко допустить ошибку. Но&nbsp;вместе с&nbsp;тем, оценка проектов — это&nbsp;объективная необходимость. На&nbsp;её&nbsp;основе бизнес планирует бюджеты и&nbsp;маркетинговые кампании, решает, инвестировать в&nbsp;проект или&nbsp;нет. В&nbsp;реальной жизни мало кто&nbsp;может позволить себе подход Джона Кармака, который, разрабатывая Doom 3, заявил: <a rel="noopener" href="https://quotepark.com/quotes/1753629-john-d-carmack-its-done-when-its-done/" target="_blank" title="Quotes of&nbsp;famous people">«Будет сделано, когда будет сделано»</a>.</p>
<p>Но у&nbsp;меня для&nbsp;вас&nbsp;хорошая новость! Оценка проектов — это&nbsp;навык, и&nbsp;его&nbsp;можно прокачать. Об&nbsp;этом и&nbsp;поговорим!</p>
<p>Для начала посмотрим, почему же&nbsp;мы&nbsp;так&nbsp;часто промахиваемся в&nbsp;оценке задач и&nbsp;проектов.</p>
<h2>Почему мы&nbsp;часто ошибаемся в&nbsp;оценке</h2>
<p>Если кратко: во&nbsp;всём виноват наш&nbsp;любимый мозг. Мозг — это&nbsp;мощный аналитический орган. Но&nbsp;он&nbsp;также имеет большое энергопотребление. Поэтому мозг старается максимально экономить энергию и&nbsp;для&nbsp;этого прибегает ко&nbsp;всяким трюкам.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2743/saygebq1-4i.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Автор иллюстрации: <a href='https://vk.com/brilevskyart' target='_blank' title='Brilevsky'>Brilevsky</a>
        </figcaption>
</figure>

<p> </p>
<p>Типичный трюк — это&nbsp;подмена сложного вопроса на&nbsp;более простой. При&nbsp;этом обычно человек сам&nbsp;не&nbsp;замечает эту&nbsp;подмену. Посмотрим на&nbsp;примере оценки проекта:</p>
<p><span style="font-weight: 400;">❓ </span>Вопрос: «Сколько займёт этот проект?»</p>
<p><span style="font-weight: 400;">🧠 </span>Мозг начинающего разработчика: «Сколько <strong>мне</strong> надо времени, чтобы это&nbsp;<strong>закодить</strong>?»</p>
<p><span style="font-weight: 400;">☝ </span>Ошибка: кроме программирования, вероятно, ещё&nbsp;надо разбираться с&nbsp;требованиями, тестировать, вести коммуникацию и&nbsp;прочее.</p>
<p> </p>
<p>Разработчик поопытнее не&nbsp;забудет включить все&nbsp;эти&nbsp;процессы в&nbsp;оценку. Но&nbsp;что, если мы&nbsp;сделаем его&nbsp;главным ответственным этот проект? Получится примерно следующее:</p>
<p><span style="font-weight: 400;">❓ </span>Вопрос: «Ты будешь разрабатывать этот проект. Сколько займёт по&nbsp;времени?»</p>
<p><span style="font-weight: 400;">🧠 </span>Мозг разработчика: «Ой, во&nbsp;сколько времени я&nbsp;<strong>ТОЧНО</strong> уложусь и&nbsp;не&nbsp;облажаюсь? Заложу&#8209;ка&nbsp;побольше…»</p>
<p><span style="font-weight: 400;">☝ </span>Ошибка: желание перестраховаться и&nbsp;полностью исключить риски заставляет давать сильно завышенные оценки.</p>
<p> </p>
<p>Противоположная история возникает, когда с&nbsp;нами проводят всякие психологические манипуляции. Или&nbsp;если мы&nbsp;сами склонны к&nbsp;излишнему оптимизму:</p>
<p><span style="font-weight: 400;">❓ </span>Вопрос: «Наш проект опаздывает, а&nbsp;ты&nbsp;наш&nbsp;самый лучший разработчик. Можешь нас&nbsp;выручить? Скажи, сколько тебе надо времени, чтобы закончить проект?»</p>
<p><span style="font-weight: 400;">🧠 </span>Мозг разработчика: «Да, я&nbsp;красавчик. Интересно, как&nbsp;максимально быстро я&nbsp;могу это&nbsp;запилить? Ща&nbsp;покажем этим джунам, как&nbsp;надо работать…»</p>
<p><span style="font-weight: 400;">☝ </span>Ошибка: желание спасти проект, заработать очки в&nbsp;глазах руководства или&nbsp;показаться экспертом заставляет давать слишком оптимистичные оценки.</p>
<p> </p>
<p>Теперь давайте разбираться, как&nbsp;избежать этих и&nbsp;подобных ошибок.</p>
<h2>Правило 1: поймите, для&nbsp;чего нужна оценка</h2>
<p>Важно понимать, что&nbsp;потом произойдёт с&nbsp;оценкой проекта и&nbsp;как&nbsp;её&nbsp;будут использовать.</p>
<p>Например:</p>
<ul>
<li><span style="font-weight: 400;">Оценка превратится в&nbsp;смету для&nbsp;внешнего заказчика. Если мы&nbsp;её&nbsp;превысим, наша компания потеряет деньги.</span></li>
<li><span style="font-weight: 400;">На основе оценки будет строиться план проекта либо вычисляться какой&#8209;то&nbsp;ключевой дедлайн.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Это примерная оценка. Её&nbsp;затем будут  использовать, чтобы разбить проект на&nbsp;крупные фазы.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">На основе оценки будут примерно приоритизироваться фичи или&nbsp;просчитываться ROI&nbsp;(return on&nbsp;investment) для&nbsp;фич.</span></li>
</ul>
<p>В зависимости от&nbsp;ответа на&nbsp;этот вопрос, станет понятно, насколько точной должна быть оценка и&nbsp;сколько на&nbsp;неё&nbsp;стоит тратить времени.</p>
<h2>Правило 2: возьмите время «на подумать»</h2>
<p>Правильный ответ на&nbsp;вопрос «Сколько это&nbsp;займёт времени?» всегда будет «Я подумаю и&nbsp;отвечу тебе тогда-то». Даже небольшую оценку не&nbsp;стоит давать сразу, когда вам&nbsp;вдруг позвонил менеджер проекта с&nbsp;такой просьбой. Вы&nbsp;будете более точными, если не&nbsp;будете торопиться.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2744/unnamed.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Оценка проекта — такая же&nbsp;важная работа, как&nbsp;разработка и&nbsp;тестирование, и&nbsp;она&nbsp;занимает время. Всегда закладывайте время на&nbsp;оценку для&nbsp;себя и&nbsp;своих сотрудников.</p>
<h2>Правило 3: задавайте правильный вопрос</h2>
<p>Правильный вопрос, который нужно задавать себе при&nbsp;оценке проекта, чтобы настроить мозг на&nbsp;нужный лад, такой:</p>
<p><em>Сколько времени <strong>обычно</strong> требуется <strong>нашей команде</strong>, чтобы сделать <strong>подобный</strong> проект?</em></p>
<p>Он помогает взглянуть на&nbsp;задачу не&nbsp;изнутри, а&nbsp;как&nbsp;бы&nbsp;со&nbsp;стороны, и&nbsp;обратить внимание на&nbsp;общие тенденции и&nbsp;ключевые факторы. Здесь также нужно учесть, какая команда скорее всего будет работать над&nbsp;проектом. Подробнее об&nbsp;этом — ниже.</p>
<h2>Правило 4: соберите команду оценки</h2>
<p>Так вы&nbsp;будете менее подвержены индивидуальным когнитивным искажениям и&nbsp;излишнему оптимизму. Включите в&nbsp;команду разных специалистов: тимлида, продакт-менеджера, бэкенд- и&nbsp;фронтенд-лидов и&nbsp;т.д.</p>
<p>Важно, чтобы у&nbsp;этих людей был&nbsp;опыт завершённых проектов — только тогда их&nbsp;интуитивные оценки будут максимально реалистичными.</p>
<p>Привлеките независимого тимлида — человека, который не&nbsp;будет отвечать за&nbsp;выполнение проекта. Он&nbsp;поможет взглянуть на&nbsp;оценки со&nbsp;стороны.</p>
<p>Чтобы люди не&nbsp;влияли друг на&nbsp;друга, используйте слепые независимые оценки или&nbsp;<a rel="noopener" href="https://en.wikipedia.org/wiki/Planning_poker" target="_blank" title="Wikipedia: Planning poker">planning poker</a>.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2745/crispplanningpokerdeck.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Карты для&nbsp;planning poker, в&nbsp;онлайне мы&nbsp;пользуемся <a href='https://scrumpoker.online/' target='_blank' title='scrumpoker.online'>scrumpoker.online</a> (источник фото: <a href='https://en.wikipedia.org/wiki/Planning_poker#/media/File:CrispPlanningPokerDeck.jpgt' target='_blank' title='Wikipedia Planning poker'>Wikipedia Planning poker</a>)
        </figcaption>
</figure>

<p> </p>
<h2>Правило 5: сделайте блиц-оценку</h2>
<p>Если у&nbsp;вас&nbsp;мало времени или&nbsp;высокая точность не&nbsp;нужна, соберите всю&nbsp;команду, расскажите им&nbsp;о&nbsp;проекте и&nbsp;обсудите ключевые вопросы. После этого попросите всех написать на&nbsp;листах бумаги свои оценки в&nbsp;формате «Х недель для&nbsp;Y&nbsp;разработчиков».</p>
<p>Возможно, оценки будут серьёзно расходиться. Это&nbsp;значит, что&nbsp;у&nbsp;команды всё&nbsp;ещё&nbsp;остались какие&#8209;то&nbsp;глобальные неразрешённые вопросы или&nbsp;риски. Но, скорее всего, после пары раундов вопросов-ответов-оценок вы&nbsp;придёте к&nbsp;пониманию и&nbsp;более точным и&nbsp;близким числам.</p>
<h2>Правило 6: задавайте вопросы и&nbsp;документируйте предположения</h2>
<p>Для начала задайте себе вопрос: «Что конкретно подразумевается под&nbsp;интеграцией с&nbsp;1С?» или&nbsp;«Как мы&nbsp;реализуем каталог товаров?». Если вы&nbsp;не&nbsp;можете ответить сами, задавайте вопросы другим — заказчику, продукт-менеджеру, дизайнеру и&nbsp;т.д.</p>
<p>Подумайте над&nbsp;тем, что&nbsp;заказчики могли забыть прописать в&nbsp;задании. Возможно, они&nbsp;не&nbsp;занимаются разработкой ПО&nbsp;ежедневно. Тогда вам&nbsp;придётся подумать за&nbsp;них. Заказчики оценят, если вы&nbsp;позаботитесь о&nbsp;них&nbsp;и&nbsp;зададите действительно ключевые вопросы, которые могут повлиять на&nbsp;проект.</p>
<p>Все ваши предположения («мы будем использовать СУБД X», «товары будут нам&nbsp;приходить в&nbsp;виде XML-файла на&nbsp;FTP»), все&nbsp;ответы от&nbsp;заказчика и&nbsp;все&nbsp;риски («мы не&nbsp;знаем, какая будет нагрузка на&nbsp;сайт») должны быть записаны и&nbsp;открыты для&nbsp;всей команды проекта. Это&nbsp;обязательно пригодится позже — когда вы&nbsp;будете показывать оценку кому&#8209;то&nbsp;ещё&nbsp;или&nbsp;если в&nbsp;будущем изменятся требования к&nbsp;продукту или&nbsp;проекту.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2746/6kaaagek5ua-960.jpg"
         alt=""
         itemprop="">


</figure>

<p> </p>
<h2>Правило 7: разбейте проект на&nbsp;понятные части</h2>
<p>Чётко пропишите, какие работы включены в&nbsp;оценку — дизайн, аналитика, бэкенд, фронтенд, коммуникация, тестирование и&nbsp;т.д. Если вы&nbsp;оцениваете их&nbsp;по&nbsp;отдельности, сделайте для&nbsp;каждого типа работ отдельную графу.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2747/5-4.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p> </p>
<p>Разделяйте на&nbsp;подразделы, модули, экраны, функции до&nbsp;тех&nbsp;пор, пока не&nbsp;станет понятно, что&nbsp;же&nbsp;вам&nbsp;предстоит сделать.</p>
<p>☝ <strong>Важно:</strong> не&nbsp;тратьте на&nbsp;это&nbsp;много времени и&nbsp;не&nbsp;старайтесь максимально всё&nbsp;детализировать. Это&nbsp;может завести вас&nbsp;в&nbsp;ловушку уверенности — когда вы&nbsp;думаете, что&nbsp;всё&nbsp;будет именно так, как&nbsp;вы&nbsp;прописали.</p>
<p>Для каждой подзадачи полезно иметь чек-лист того, что&nbsp;вы&nbsp;включаете в&nbsp;оценку, а&nbsp;также что&nbsp;считаете завершённой задачей — так&nbsp;называемый Definition of&nbsp;Done. Например:</p>
<p><span style="color: #ca132a;">✓</span> функциональность реализована в&nbsp;соответствии с&nbsp;техзаданием;</p>
<p><span style="color: #ca132a;">✓</span> код&nbsp;прошел код-ревью;</p>
<p><span style="color: #ca132a;">✓</span> юнит-тесты написаны и&nbsp;выполняются;</p>
<p><span style="color: #ca132a;">✓</span> окружения Staging и&nbsp;Production настроены;</p>
<p><span style="color: #ca132a;">✓</span> код&nbsp;залит на&nbsp;Staging и&nbsp;Production с&nbsp;помощью CI/CD;</p>
<p><span style="color: #ca132a;">✓</span> регрессионные тесты написаны;</p>
<p><span style="color: #ca132a;">✓</span> регрессионное тестирование на&nbsp;Staging и&nbsp;Production пройдено;</p>
<p><span style="color: #ca132a;">✓</span> документация по&nbsp;продукту обновлена;</p>
<p><span style="color: #ca132a;">✓</span> продукт продемонстрирован заказчику.</p>

<div class="umb-macro-highlights">
    <strong></strong>
    О&nbsp;том, что&nbsp;важно не&nbsp;забыть при&nbsp;оценке дизайна проекта, рассказал наш&nbsp;ведущий дизайнер Алексей Пилишков в&nbsp;статье <a href='https://fuse8.ru/articles/checklist-for-estimating-of-design-projects' target='_blank' title='Чек-лист оценки дизайна проекта'>«Чек-лист оценки дизайна проекта». </a>
</div>

<h2>Правило 8: используйте диапазон для&nbsp;оценки</h2>
<p>Одна цифра в&nbsp;часах не&nbsp;скажет ничего о&nbsp;рисках, заложенных в&nbsp;той&nbsp;или&nbsp;иной фиче. Чтобы показать, насколько вы&nbsp;уверены в&nbsp;оценке, используйте два&nbsp;числа:</p>
<ul>
<li><strong>Low</strong><span style="font-weight: 400;"> (50% вероятность). Бытовой смысл: «Я обычно доезжаю до&nbsp;работы за&nbsp;15 минут».</span></li>
<li style="font-weight: 400;" aria-level="1"><strong>High</strong><span style="font-weight: 400;"> (90% вероятность). Бытовой смысл: «Мне нужно на&nbsp;важную встречу к&nbsp;9, поэтому я&nbsp;выйду за&nbsp;40 минут, чтобы точно не&nbsp;опоздать».</span><span style="font-weight: 400;"></span></li>
</ul>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2748/6-2.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<h2>Правило 9: исследуйте сложные части до&nbsp;оценки</h2>
<p>Если вам&nbsp;нужно оценить то, что&nbsp;вы&nbsp;никогда не&nbsp;делали, например, хитрую интеграцию с&nbsp;незнакомым продуктом, проведите небольшое исследование. Например:</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">прочитайте документацию по&nbsp;продукту и&nbsp;посмотрите примеры;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">посмотрите на&nbsp;реальные данные в&nbsp;системе, кратко проверьте на&nbsp;чистоту и&nbsp;точность;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">соберите прототип — например, небольшую программу, которая сделает один запрос к&nbsp;API&nbsp;системы.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">если система создается сторонней командой, пообщайтесь с&nbsp;ней&nbsp;и&nbsp;посмотрите на&nbsp;их&nbsp;код.</span></li>
</ul>
<p>На одном из&nbsp;проектов мы&nbsp;разрабатывали интернет-магазин и&nbsp;должны были интегрироваться с&nbsp;системой управления складом. Прежде, чем&nbsp;оценить эту&nbsp;задачу, мы&nbsp;собрали прототип — программу, которая скачивала каталог товаров и&nbsp;меняла товарные остатки через API&nbsp;склада. Оказалось, что&nbsp;в&nbsp;системе много дубликатов товаров, и&nbsp;API&nbsp;не&nbsp;выдерживает необходимой нагрузки. В&nbsp;итоге подход к&nbsp;интеграции пришлось существенно пересмотреть. И, соответственно, оценить совершенно другой объём работ.</p>
<h2>Правило 10: сравните свои оценки с&nbsp;историческими данными</h2>
<p>Соберите данные по&nbsp;предыдущим подобным проектам или&nbsp;фичам, посмотрите, сколько у&nbsp;вас&nbsp;ушло на&nbsp;них&nbsp;времени. Для&nbsp;этого используйте данные из&nbsp;систем учёта времени или&nbsp;проектов. Если цифр не&nbsp;сохранилось, можно просто спросить коллег, работавших на&nbsp;этих проектах.</p>
<p>Скорректируйте оценку относительно предыдущих проектов. Мы&nbsp;обычно смотрим на&nbsp;следующие факторы:</p>
<ul>
<li><strong>Объём работ</strong>:<span style="font-weight: 400;"> то&nbsp;же&nbsp;самое, что&nbsp;на&nbsp;проекте Х, только есть ещё&nbsp;сложный раздел с&nbsp;возвратами товаров. Добавим +20%.</span></li>
<li><span style="font-weight: 400;"><strong>Возможность переиспользования кода</strong>: здесь есть готовая библиотека UI&nbsp;компонентов, не&nbsp;придётся её&nbsp;создавать с&nbsp;нуля. Сэкономим процентов 15%.</span></li>
<li style="font-weight: 400;" aria-level="1"><strong>Сложность предметной области</strong>:<span style="font-weight: 400;"> здесь нужна локализация и&nbsp;различные правила документооборота для&nbsp;пяти стран, а&nbsp;прошлый проект был&nbsp;только для&nbsp;одной страны. Добавим +30% к&nbsp;оценке. </span></li>
<li><span style="font-weight: 400;"><strong>Команда</strong>: на&nbsp;прошлом проекте были одни сеньоры, а&nbsp;здесь половина мидлов-новичков. Добавим +15% на&nbsp;адаптацию команды.</span></li>
<li><span style="font-weight: 400;"><strong>Технологический стек</strong>: возьмём проверенный простой фреймворк React вместо замороченного новомодного Remix. Будет быстрее на&nbsp;20%.</span></li>
</ul>
<h2>Правило 11: используйте удобные единицы времени</h2>
<p>В зависимости от&nbsp;масштаба проекта, выражайте его&nbsp;оценку в&nbsp;часах, днях, неделях или&nbsp;месяцах, чтобы показать правильный уровень точности. В&nbsp;ситуации, когда нужно дать оценку какому&#8209;то&nbsp;крупному блоку работ (разработка/дизайн) не&nbsp;стоит давать её&nbsp;в&nbsp;формате 256 часов. Удобнее для&nbsp;восприятия, честнее и&nbsp;правильнее будет сказать «разработка займет примерно 7 недель».</p>
<p>Оценивая фичи, ограничьте себя фиксированных набором значений — 1, 2, 4, 8, 16, 32 часа. Это&nbsp;поможет избежать planning paralysis (паралича планировщика), когда вы&nbsp;будете долго думать, сколько же&nbsp;займёт задача — 14 или&nbsp;18 часов? 6 или&nbsp;6.5 часов?</p>
<p>В реальности не&nbsp;существует идеально точных оценок. Да&nbsp;это&nbsp;и&nbsp;не&nbsp;нужно. Просто помните, что&nbsp;если задача занимает у&nbsp;вас&nbsp;больше 40 часов, скорее всего, её&nbsp;нужно уточнить и/или разбить на&nbsp;подзадачи.</p>
<h2>Правило 12: анализируйте, что&nbsp;получилось в&nbsp;итоге</h2>
<p>В конце проекта или&nbsp;спринта проведите ретроспективу и&nbsp;посмотрите, какие из&nbsp;ваших оценок оказались ошибочными. Подумайте, почему это&nbsp;произошло, что&nbsp;вы&nbsp;упустили. В&nbsp;будущем это&nbsp;поможет вам&nbsp;стать лучшими оценщиками.</p>
<p>И помните: оценка проектов — это&nbsp;навык, которому можно научиться. Главное только, чтобы был&nbsp;цикл обратной связи.</p>

<div class="umb-macro-highlights">
    <strong></strong>
    Хорошим дополнением к&nbsp;этой статье может стать запись моего выступления на&nbsp;конференции HighLoad++ — <a href='https://www.youtube.com/watch?v=fvNYgMft8G8' target='_blank' title='Искусство предсказаний'>«Искусство предсказаний»</a>. Приятного просмотра! 
<p>А ещё&nbsp; вы&nbsp;можете воспользоваться нашим <a href='https://docs.google.com/spreadsheets/d/1MjEb1SP7k2-2bC7SkwP2TAZLFF5C-s2kFiG7dTf7_aU/edit?usp=sharing' target='_blank' title='Пример таблицы для&nbsp;оценки проекта'>шаблоном для&nbsp;оценки времени и&nbsp;бюджета проекта по&nbsp;разработке ПО</a>.</p>
<p>Желаю успехов в&nbsp;оценке ваших проектов!</p>
</div>

<hr>
<p><em><strong>Фото в&nbsp;заголовке:</strong><span style="font-weight: 400;">  </span><a href="https://unsplash.com/@jckbck?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><span style="font-weight: 400;">Jakub Dziubak</span></a><span style="font-weight: 400;"> on&nbsp;</span><a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><span style="font-weight: 400;">Unsplash</span></a></em></p>
<p><em><strong>Фото и&nbsp;иллюстрации в&nbsp;статье:</strong> <a href="https://vk.com/brilevskyart"><span style="font-weight: 400;">Brilevsky</span></a><span style="font-weight: 400;">, </span><a href="https://en.wikipedia.org/wiki/User:Hkniberg"><span style="font-weight: 400;">Hkniberg</span></a><span style="font-weight: 400;"> at&nbsp;</span><a href="https://en.wikipedia.org/wiki/"><span style="font-weight: 400;">English Wikipedia</span></a><span style="font-weight: 400;">,  </span></em></p>
<p><em><strong>Автор статьи:</strong> <span style="font-weight: 400;">Андрей Степанов</span></em></p>
<p><em><strong>Редактура:</strong><span style="font-weight: 400;"> Марина Медведева</span></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Глубока ли кроличья нора, Часть 2: оценка сложности алгоритмов
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как оценивать сложность алгоритмов и зачем это нужно? Показываем на примерах, как она влияет на производительность и помогает писать эффективный код.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/algorithms-optimization/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/algorithms-optimization/</guid>

                <pubDate>Tue, 06 May 2025 13:06:37 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Глубока ли кроличья нора, Часть 2: оценка сложности алгоритмов</h1>
                                <figure>
                                    <img src="/Media/2721/joshua-sortino-lqkhndzsf-8-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a26c9bcb3e19e8b915199a895805c11b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0780dab67d0f414498968eba24d85986"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><a rel="noopener" href="/articles/code-benchmarking" target="_blank" title="«Глубока ли&nbsp;кроличья нора, Часть 1: бенчмаркинг кода»">В прошлой статье</a> мы&nbsp; разбирались,что такое бенчмаркинг кода и&nbsp; как&nbsp;с&nbsp; его&nbsp;помощью оценивать производительность кода. В&nbsp; этой же&nbsp;поговорим про&nbsp;оценку сложности алгоритмов. А&nbsp; чтобы всё&nbsp;было наглядно, вместе попробуем оценить алгоритмы, которые используются для&nbsp;решения задачки на&nbsp; собеседовании в&nbsp; Google.</p>
<p>Задач такого плана полным-полно на&nbsp; платформах типа LeetCode, CodeWars и&nbsp; других. И&nbsp; их&nbsp; ценность не&nbsp; в&nbsp; том, чтоб заучить различные алгоритмы сортировок, которые вы&nbsp; никогда не&nbsp; будете на&nbsp; практике писать самостоятельно, а&nbsp; в&nbsp; том, чтоб увидеть типичные проблемы, с&nbsp; которыми вы&nbsp; можете столкнуться в&nbsp; практических задачах при&nbsp;разработке.</p>
<h2>Оценка сложности алгоритмов</h2>
<p>Зачем вообще оценивать сложность алгоритмов и&nbsp; какие способы оценки бывают?</p>
<p>Понимать сложность алгоритмов важно и&nbsp; по&nbsp; следующим причинам:</p>
<ul>
<li>без этих знаний вы&nbsp; не&nbsp; сможете отличить суб-оптимальный код&nbsp;от&nbsp; оптимального и&nbsp; оптимизировать его;</li>
<li>каждый средний или&nbsp;большой проект рано или&nbsp;поздно будет оперировать большим объёмом данных. Важно, чтоб ваши алгоритмы это&nbsp;предусматривали и&nbsp; не&nbsp; стали бомбой замедленного действия;</li>
<li>если вы&nbsp; не&nbsp; понимаете концепции оценки сложности алгоритмов, вы, скорее всего, будете писать низкопроизводительный код&nbsp;по&nbsp; умолчанию.</li>
</ul>
<p> </p>
<p>Способы же&nbsp;оценки сложности существуют следующие:</p>
<p><strong>O большое (O(n))</strong> — позволяет оценить верхнюю границу сложности алгоритмов. Это&nbsp;отношение количества входных данных для&nbsp;алгоритма ко&nbsp; времени, за&nbsp; которое алгоритм сможет их&nbsp; обработать. Простыми словами, это&nbsp;максимальное время работы алгоритма при&nbsp;работе с&nbsp; большими объёмами данных.</p>
<p><strong>o малое (o(n))</strong> — позволяет оценить верхнюю границу, исключая точную оценку.</p>
<p><strong>Омега (Ω(n))</strong> — позволяет оценить нижнюю границу сложности.</p>
<p><strong>Тета (Θ&nbsp;())</strong> — позволяет получить точную оценку сложности.</p>
<p>В большинстве IT-компаний для&nbsp;оценки сложности используют только большое O&nbsp;(BigO notation), поскольку чаще всего достаточно представлять, как&nbsp;быстро будет расти количество операций при&nbsp;увеличении входных данных в&nbsp; худшем случае. Остальные типы оценок используются редко.</p>
<p>Если представить график распространённых сложностей алгоритмов, они&nbsp;будут выглядеть вот&nbsp;так:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2722/1.png"
         alt=""
         itemprop="">


        <figcaption>
            Источник: <a href='https://www.bigocheatsheet.com/' target='_blank' title='Big-O Cheat Sheet'>Big-O Cheat Sheet</a>
        </figcaption>
</figure>

<p> </p>
<p>Если условно разделить сложности на&nbsp; зоны, то&nbsp; сложности вида O(log n), O(1) или&nbsp; O(C) можно будет отнести к&nbsp; зоне <strong>Excellent</strong>. Такие алгоритмы вне&nbsp;зависимости от&nbsp; объёмов данных будут выполняться очень быстро — практически мгновенно.</p>
<p>Алгоритмы сложности O(n) можно отнести к&nbsp; зоне <strong>Fair</strong> — к&nbsp; алгоритмам, сложность которых растёт предсказуемо и&nbsp; линейно. Например, если 100 элементов ваш&nbsp;алгоритм обрабатывает за&nbsp; 10 секунд, то&nbsp; 1000 он&nbsp;обработает примерно за&nbsp; 100 секунд. Не&nbsp; лучший результат, но&nbsp; предсказуемый.</p>
<p>Алгоритмы из&nbsp; красной зоны <strong>Horrible</strong> со&nbsp; сложностями O(N^2) и&nbsp; выше трудно отнести к&nbsp; высокопроизводительным. НО!  Тут&nbsp;всё&nbsp;сильно зависит от&nbsp; объёмов входных данных. Если вы&nbsp; уверены, что&nbsp;у&nbsp; вас&nbsp;всегда будет небольшой объём данных (например, 100 элементов), и&nbsp; обрабатываться он&nbsp; будет в&nbsp; приемлемое для&nbsp;вас&nbsp;время, то&nbsp; всё&nbsp;в&nbsp; порядке, такие алгоритмы тоже можно использовать. Но&nbsp; если же&nbsp;вы&nbsp; не&nbsp; уверены в&nbsp; постоянности объёмов данных (может прийти и&nbsp; 10 000 элементов вместо 100) — лучше всё-таки задуматься над&nbsp;оптимизацией алгоритмов.</p>
<h2>Оценка сложности по&nbsp; времени и&nbsp; по&nbsp; памяти</h2>
<p>Оценку сложности алгоритмов следует проводить не&nbsp; только по&nbsp; времени выполнения, но&nbsp; и&nbsp; по&nbsp; потребляемой памяти. Например, для&nbsp;ускорения вычислений можно создать какую-нибудь промежуточную структуру данных типа массива или&nbsp;стека для&nbsp;ускорения алгоритма и&nbsp; кеширования результатов. Это&nbsp;приведёт к&nbsp; дополнительным затратам памяти, но&nbsp; при&nbsp;этом может существенно ускорить вычисления.</p>
<p>Однако если ваш&nbsp;алгоритм для&nbsp;выполнения будет требовать больше памяти, чем&nbsp;может предоставить ваш&nbsp; ПК, вы&nbsp; не&nbsp; получите ожидаемой производительности. А&nbsp; возможно код&nbsp;и&nbsp; вовсе будет выполнен некорректно.</p>
<h2>Немного практики:правила расчета сложности</h2>
<h3>Пример 1:</h3>
<p>Возьмём для&nbsp;начала простой алгоритм присвоения переменной:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2723/2.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Какова его&nbsp;сложность по&nbsp; времени и&nbsp; по&nbsp; памяти?</p>
<p>С одной стороны, нас&nbsp;может ввести в&nbsp; заблуждение массив данных <strong>data</strong> неизвестной размерности. Но&nbsp; брать его&nbsp;в&nbsp; расчёт при&nbsp;оценке сложности внутреннего алгоритма будет некорректно.</p>

<div class="text-highlight">
  Правило 1: внешние данные не&nbsp;учитываются в&nbsp;сложности алгоритма.
</div>

<p>Получается, наш&nbsp;алгоритм состоит только из&nbsp; одной строчки: <strong>var a&nbsp;= data[target];</strong></p>
<p>Доступ к&nbsp; элементу массива по&nbsp; индексу — известная операция со&nbsp; сложностью O(1) или&nbsp;O(C). Соответственно, и&nbsp; весь алгоритм по&nbsp; времени у&nbsp; нас&nbsp;займет O(1).</p>
<p>Дополнительная же&nbsp;память выделяется только под&nbsp;одну переменную. А&nbsp; значит, объём данных, которые мы&nbsp; будем передавать (хоть 1 000, хоть 10 000), не&nbsp; скажется на&nbsp; финальном результате. Соответственно, сложность по&nbsp; памяти у&nbsp; нас&nbsp;так&nbsp; же&nbsp; — O(1) или&nbsp;O(C).</p>

<div class="umb-macro-highlights">
    <strong></strong>
    Для&nbsp;упрощения записи дальше я&nbsp;везде буду писать O(C) вместо O(1), C&nbsp;в&nbsp;этом случае — это&nbsp;константа. Она&nbsp;может равняться 1, 2 или&nbsp;даже 100 — для&nbsp;современных компьютеров это&nbsp;число не&nbsp;принципиально, поскольку и&nbsp;1, и&nbsp;100 операций выполняются практически за&nbsp;одно и&nbsp;то&nbsp;же&nbsp;время.
</div>

<h3>Пример 2:</h3>
<p>Рассмотрим второй алгоритм, очень похожий на&nbsp; первый:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2724/3.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Влияет ли&nbsp;размерность входного массива data на&nbsp; количество операций в&nbsp; нём? Нет.</p>
<p>А на&nbsp; выделенную память? Тоже нет.</p>
<p>Сложность этого алгоритма по&nbsp; времени выполнения можно было бы&nbsp;оценить как&nbsp;O(2*C) — поскольку у&nbsp; нас&nbsp;выполняется в&nbsp; два&nbsp;раза больше операций, чем&nbsp;в&nbsp; предыдущем примере, 2 присваивания вместо 1. Но&nbsp; у&nbsp; нас&nbsp;и&nbsp; на&nbsp; этот счёт есть правило:</p>

<div class="text-highlight">
  Правило 2: опускать константные множители, если они&nbsp;не&nbsp;влияют на&nbsp;результат кардинальным образом.
</div>

<p>Если принять это&nbsp;правило в&nbsp; расчёт, сложность этого алгоритма будет такой же, как&nbsp;и&nbsp; в&nbsp; первом примере — O(C) по&nbsp; времени и&nbsp; O(C) по&nbsp; памяти.</p>
<h3>Пример 3:</h3>
<p>В третьем примере добавим в&nbsp; наш&nbsp;алгоритм цикл для&nbsp;обработки данных:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2725/4.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Как мы&nbsp; видим, количество операций, которые будет выполнять цикл, напрямую зависит от&nbsp; количества входных данных: больше элементов в&nbsp; data — больше циклов обработки потребуется для&nbsp;получения финального результата.</p>
<p>Казалось бы, если взять в&nbsp; учёт каждую строчку кода нашего алгоритма, то&nbsp; получилось бы&nbsp;что&#8209;то&nbsp;такое:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2726/5.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>И тогда финальная сложность алгоритма получится O(C)+O(n). Но&nbsp; тут&nbsp;опять вмешивается новое правило:</p>

<div class="text-highlight">
  Правило 3: опускать элементы оценки, которые меньше максимальной сложности алгоритма.
</div>

<p>Поясню: если у&nbsp; вас&nbsp;O(C)+O(n), результирующая сложность будет O(n), поскольку O(n) будет расти всегда быстрее, чем&nbsp;O(C).</p>
<p>Еще один пример — O(n)+O(n^2). При&nbsp;такой сложности у&nbsp; нас&nbsp;N^2 всегда растёт быстрее, чем&nbsp; N, а&nbsp; значит O(n) мы&nbsp; отбрасываем и&nbsp; остаётся только O(n^2).</p>
<p>Итак, сложность нашего третьего примера — O(n).</p>
<h3>Пример 4:</h3>
<p>В четвёртом примере добавим на&nbsp; вход уже&nbsp;двумерный массив.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2727/6.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>И для&nbsp;его&nbsp;обработки нам&nbsp;теперь нужно два&nbsp;цикла. Оба&nbsp;этих цикла будут зависеть от&nbsp; размерности входных данных data.</p>

<div class="text-highlight">
  Правило 4: вложенные сложности перемножаются.
</div>

<p>Сложность внешнего цикла в&nbsp; нашем примере — O(N), сложность внутреннего цикла — O(N) (или&nbsp;O(M), если массив не&nbsp; квадратный). Согласно правилу, две&nbsp;эти&nbsp;сложности должны быть умножены. В&nbsp; результате максимальная сложность всего алгоритма будет равна O(N^2).</p>
<h3>Пример 5:</h3>
<p>А что&nbsp;мы&nbsp; видим тут? Цикл — уже&nbsp;известная нам&nbsp;сложность O(n), но&nbsp; внутри вызывается функция Alg4() из&nbsp; предыдущего примера:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2728/7.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Если мы&nbsp; вспомним её&nbsp; сложность O(n^2), а&nbsp; также правило 4, то&nbsp; получим, что&nbsp;сложность этого алгоритма — O(n^3) при&nbsp;всей его&nbsp;визуальной минималистичности.</p>

<div class="text-highlight">
  Правило 5: включайте в&nbsp;оценку общей сложности алгоритма оценки всех вложенных вызовов функций.
</div>

<p>Именно поэтому важно понимать сложность методов синтаксического сахара вроде LINQ — чтоб была возможность оценить, как&nbsp;метод будет вести себя при&nbsp;увеличении объёмов данных. При&nbsp;использовании их&nbsp; в&nbsp; коде без&nbsp;понимания внутреннего устройства вы&nbsp; рискуете получить очень высокую сложность алгоритма, который будет захлебываться при&nbsp;увеличении входящих данных.</p>
<p>Приведу пример минималистичного алгоритма, который выглядит хорошо и&nbsp; компактно (ни&nbsp; в&nbsp; коем случае не&nbsp; претендует на&nbsp; эталонный код), но&nbsp; станет бомбой замедленного действия при&nbsp;работе с&nbsp; большими объёмами данных:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2729/8.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Что мы&nbsp; тут&nbsp;видим? Цикл = O(n), Where = от&nbsp; O(1) до&nbsp; O(n), в&nbsp; зависимости от&nbsp; типа хранящихся внутри данных, Contains = O(n).</p>
<p>Итого сложность такого алгоритма будет от&nbsp; O(n^2) до&nbsp; O(n^3) по&nbsp; времени выполнения.</p>
<p>ToArray() будет выделять на&nbsp; каждой итерации дополнительную память под&nbsp;копию массива, а&nbsp; значит сложность по&nbsp; памяти составит O(n^2).</p>
<h2>Задачка от&nbsp; Google</h2>
<p>Возьмём для&nbsp;нашего финального оценивания задачку, которую дают на&nbsp; собеседовании в&nbsp; Google.</p>

<div class="umb-macro-highlights">
    <strong></strong>
    Подробный разбор задачи и&nbsp;алгоритмы решения можно посмотреть вот&nbsp;в&nbsp;этом <a href='https://www.youtube.com/watch?v=JtMuXmmDl9s' target='_blank' title='Задача из&nbsp;Собеседования на&nbsp;160,000 Евро в&nbsp;Год'>видео от&nbsp;Саши Лукина</a>. Рекомендую посмотреть его&nbsp;перед тем, как&nbsp;продолжить читать эту&nbsp;статью.
</div>

<p>Вкратце, цель алгоритма — найти в&nbsp; массиве два&nbsp;любых числа, которые в&nbsp; сумме дали бы&nbsp;нам&nbsp;искомое число target.</p>
<h3>Решение 1: полный проход по&nbsp; массиву</h3>


<figure class="umb-macro-image">
    


    <img src="/Media/2730/9.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p><strong>Сложность по&nbsp; времени:</strong> O(n^2)</p>
<p><strong>Сложность по&nbsp; памяти:</strong> O(С)</p>
<p>Это решение в&nbsp; лоб. Не&nbsp; самое оптимальное, поскольку время быстро растёт при&nbsp;увеличении количества элементов, но&nbsp; зато дополнительную память мы&nbsp; особо не&nbsp; потребляем.</p>
<h3>Решение 2: используем HashSet</h3>


<figure class="umb-macro-image">
    


    <img src="/Media/2731/10.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Проходимся по&nbsp; массиву и&nbsp; добавляем элементы, которые мы&nbsp; уже&nbsp;проверили, в&nbsp; HashSet. Если HashSet содержит недостающий для&nbsp;суммы элемент, значит всё&nbsp;хорошо, мы&nbsp; закончили и&nbsp; можем возвращать результат.</p>
<p><strong>Сложность по&nbsp; времени:</strong> O(n)</p>
<p><strong>Сложность по&nbsp; памяти:</strong> O(n)</p>
<p>Это как&nbsp;раз&nbsp;пример того, как&nbsp;можно выиграть в&nbsp; производительности, выделив дополнительную память для&nbsp;промежуточных структур.</p>
<h3>Решение 3: используем бинарный поиск</h3>


<figure class="umb-macro-image">
    


    <img src="/Media/2732/11.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Алгоритм бинарного поиска имеет известную сложность — O(log(n)). O(n) нам&nbsp;добавилась от&nbsp; внешнего цикла for, а&nbsp; всё, что&nbsp;внутри цикла while — это&nbsp;и&nbsp; есть алгоритм бинарного поиска. Согласно <strong>Правилу 4</strong> сложности перемножаются.</p>
<p><strong>Сложность по&nbsp; времени:</strong> O(n*log(n))</p>
<p><strong>Сложность по&nbsp; памяти:</strong> O(С)</p>
<h3>Решение 4: используем метод двух указателей</h3>


<figure class="umb-macro-image">
    


    <img src="/Media/2733/12.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Двигаем левый и&nbsp; правый указатели к&nbsp; центру, пока они&nbsp;не&nbsp; сойдутся или&nbsp;не&nbsp; найдется пара подходящих нам&nbsp;значений.</p>
<p><strong>Сложность по&nbsp; времени:</strong> O(n)</p>
<p><strong>Сложность по&nbsp; памяти:</strong> O(С)</p>
<p>И это&nbsp; — самый оптимальный из&nbsp; всех вариантов решения, не&nbsp; использующий дополнительной памяти и&nbsp; совершающий наименьшее количество операций.</p>
<h2>Бенчмаркинг решений</h2>
<p>Теперь, зная сложности всех четырёх вариантов решения, попробуем провести бенчмаркинг этого кода и&nbsp; посмотреть, как&nbsp;алгоритмы будут вести себя на&nbsp; различных наборах данных.</p>
<p>Результаты будут следующими:</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2735/13-1.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Что же&nbsp;мы&nbsp; тут&nbsp;видим?</p>
<p>За baseline решения мы&nbsp; берём прямой проход массиву <strong>FindPairWithFullWalkthrough</strong>. На&nbsp; 10 объектах он&nbsp; отрабатывает в&nbsp; среднем за&nbsp; 20 наносекунд и&nbsp; занимает второе место по&nbsp; производительности.</p>
<p>Быстрее на&nbsp; малом объёме данных выполняется только наш&nbsp;самый оптимальный вариант решения — <strong>FindPairUsingTwoPointersMethod</strong>.</p>
<p>Вариант же&nbsp;с&nbsp; <strong>HashSet</strong> занял в&nbsp; 8 раз&nbsp;больше времени для&nbsp;работы с&nbsp; малым объёмом данных и&nbsp; потребовал выделения дополнительной памяти, которую потом нужно будет собрать Garbage Collector-у.</p>
<p>На 1 000 же&nbsp;элементов вариант с&nbsp; полным проходом по&nbsp; циклу (<strong>FindPairWithFullWalkthrough</strong>) начал заметно отставать от&nbsp; остальных алгоритмов. Причиной этому — его&nbsp;сложность O(n^2), которая растёт заметно быстрее всех остальных сложностей.</p>
<p>На 10 000 элементах алгоритму с&nbsp; полным проходом потребовалось и&nbsp; вовсе 9,7 секунды для&nbsp;завершения расчетов, в&nbsp; то&nbsp; время как&nbsp;остальные справлялись за&nbsp; 0.1 секунды и&nbsp; меньше. А&nbsp; самый оптимальный вариант решения и&nbsp; вовсе нашёл решение за&nbsp; 3 миллисекунды.</p>
<h2>Заключение</h2>
<p>Мы разобрались, как&nbsp;оценивать сложность алгоритмов, а&nbsp; также узнали, как&nbsp;с&nbsp; помощью BenchmarkDotNet проследить связь между сложностью алгоритмов и&nbsp; временем выполнения кода. Это&nbsp;позволит нам&nbsp;ещё&nbsp;до&nbsp; выполнения бенчмаркинга приблизительно оценить — хороший код&nbsp;вы&nbsp; написали или&nbsp;нет.</p>
<p> </p>
<hr>
<p><em><strong>Фото в&nbsp; заголовке: <span style="font-weight: 400;">by </span><a href="https://unsplash.com/@sortino"><span style="font-weight: 400;">Joshua Sortino</span></a><span style="font-weight: 400;"> on&nbsp;</span><a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><span style="font-weight: 400;">Unsplash</span></a></strong></em></p>
<p><em><strong>Автор:</strong> Антон Воротынцев</em></p>
<p><em><strong>Редактура:</strong> Марина Медведева</em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Wagile: как смешать разные модели ведения проектов
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Мы объединили Waterfall и Agile, взяли лучшее от обоих — и выработали универсальный подход к разработке, который даёт результат и удобен бизнесу.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/wagile/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/wagile/</guid>

                <pubDate>Tue, 06 May 2025 13:05:41 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Wagile: как смешать разные модели ведения проектов</h1>
                                <figure>
                                    <img src="/Media/2791/pawel-czerwinski-yn97lny0bao-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/005df8482aed904d6e9b4cd393b4b715"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5353eb8aca9f4745880a5a6c7da7414a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>За почти 20 лет&nbsp;работы мы&nbsp;опробовали разные подходы и&nbsp;форматы сотрудничества с&nbsp;клиентами, разрабатывая для&nbsp;них&nbsp;IT-решения. Сейчас в&nbsp;fuse8 сформировался универсальный подход к&nbsp;разработке проектов, основанный на&nbsp;практиках Waterfall и&nbsp;Agile – моделях разработки ПО. Первая основана на&nbsp;структуре диаграммы Ганта и&nbsp;уже&nbsp;отметила полувековой юбилей. Вторая зародилась чуть больше 20 лет&nbsp;назад в&nbsp;ответ на&nbsp;неповоротливые в&nbsp;прошлом процессы работы в&nbsp;IT-компаниях. Рассказываем, как&nbsp;взяли лучшее из&nbsp;каждой для&nbsp;удобства работы в&nbsp;команде и&nbsp;клиентских выгод.</p>
<h2>Waterfall VS&nbsp;Agile: большая разница</h2>
<p>Waterfall и&nbsp;Agile различаются уровнем дозволенной гибкости. «Водопадная» или&nbsp;«Каскадная» система предполагает изначально четкий и&nbsp;структурированный план проекта на&nbsp;старте и&nbsp;исключает возможность вольностей по&nbsp;ходу разработки: то, что&nbsp;в&nbsp;плане не&nbsp;описано, не&nbsp;делаем. Все&nbsp;просто и&nbsp;понятно, но&nbsp;не&nbsp;слишком удобно: бизнес-требования к&nbsp;продукту могут поменяться в&nbsp;ходе разработки, когда фаза определения стартовых требований уже&nbsp;пройдет. Тогда мы&nbsp;получим нерезультативный продукт, если не&nbsp;проявим гибкость.</p>
<p><img src="/Media/2793/frame-2.png" alt=""></p>
<p>Например, мы&nbsp;взяли в&nbsp;работу проект по&nbsp;созданию сервиса доставки еды. Пока проектировали архитектуру решения по&nbsp;уже&nbsp;готовому ТЗ, у&nbsp;заказчика появилось три&nbsp;конкурента, запустивших аналогичные сервисы. Они&nbsp;уже&nbsp;радуют потребителей. Теперь недостаточно просто создать еще&nbsp;один такой же&nbsp;сервис – нужно сделать его&nbsp;уникальным, чтобы отбить клиентов у&nbsp;соседей по&nbsp;рынку. То&nbsp;есть, необходимо внести изменения в&nbsp;уже&nbsp;утвержденный план, что&nbsp;противоречит принципам Waterfall. Иначе не&nbsp;получится создать бизнес-ценность.</p>
<p>Agile предлагает работать гибче, предусматривая, что&nbsp;ситуация на&nbsp;проекте (и&nbsp;в&nbsp;мире) может измениться – нужно будет быстро подстроиться под&nbsp;новый контекст. Agile-философия породила множество подходов к&nbsp;построению процесса разработки ПО, но&nbsp;основные принципы&nbsp;в&nbsp;каждом из&nbsp;них&nbsp;неизменны. Нужно поставить клиенту работающий продукт и&nbsp;быть готовым к&nbsp;изменениям в&nbsp;ходе его&nbsp;создания.</p>
<p><img src="/Media/2792/frame-1.png" alt=""></p>
<p>Однако чем&nbsp;сильнее меняются требования к&nbsp;проекту, тем&nbsp;дольше двигаться до&nbsp;финального дедлайна – нужно будет вводить дополнительные итерации. Да&nbsp;и&nbsp;ресурсы команды конечны – придется растягивать бюджет. Снова неидеально, ведь бизнес всегда хочет знать заранее, сколько будет стоить разработка и&nbsp;сколько она&nbsp;займет времени.&nbsp;</p>
<h2>Наш подход на&nbsp;стыке методологий</h2>
<p>Работать исключительно по&nbsp;Waterfall мы&nbsp;не&nbsp;могли. Изначальный план, фиксированные сроки и&nbsp;бюджет хороши для&nbsp;любого проекта, вот&nbsp;только план может резко измениться, расширив и&nbsp;бюджет, и&nbsp;сроки. Что&#8209;то&nbsp;всегда идет не&nbsp;так, как&nbsp;задумано, и&nbsp;это&nbsp;нужно учитывать при&nbsp;разработке ПО. Это&nbsp;не&nbsp;обязательно вызвано плохим планированием на&nbsp;старте или&nbsp;недостаточной проработкой требований. Просто вначале сложно учесть все, и&nbsp;это&nbsp;правда для&nbsp;любого проекта.</p>
<p>С другой стороны, иметь общую структуру и&nbsp;план разрабатываемого решения в&nbsp;качестве артефактов на&nbsp;старте лучше, чем&nbsp;двигаться в&nbsp;условиях неопределенности. Так&nbsp;мы&nbsp;можем видеть функциональность целиком и&nbsp;сразу планировать построение контента внутри системы. Это&nbsp;полезно даже с&nbsp;условием возможных изменений по&nbsp;ходу разработки.</p>
<p>Классический Waterfall не&nbsp;предполагает участия клиента в&nbsp;разработке после выдачи ТЗ. Взять скоуп задач и&nbsp;уйти на&nbsp;условные полгода, чтобы по&nbsp;истечении этого времени выдать готовое решение, мы&nbsp;не&nbsp;можем. По&nbsp;ходу работы нужно презентовать реализуемую функциональность клиенту хотя бы&nbsp;для&nbsp;того, чтобы сверяться с&nbsp;его&nbsp;ожиданиями.</p>
<p>Полностью полагаться на&nbsp;Agile тоже не&nbsp;получается. Для&nbsp;удобства будем говорить о&nbsp;модели в&nbsp;контексте фреймворка Scrum, потому что&nbsp;используем в&nbsp;работе характерные для&nbsp;него артефакты.&nbsp;</p>
<p>Краткосрочное планирование открывает больше возможностей для&nbsp;гибкости, но&nbsp;часто провоцирует бесконечное вливание ресурсов в&nbsp;проект и&nbsp;неопределенные дедлайны. Пусть мы&nbsp;не&nbsp;просто клепаем продукты по&nbsp;ТЗ, а&nbsp;глубоко погружаемся в&nbsp;бизнес клиента, мы&nbsp;все&nbsp;еще&nbsp;остаемся исполнителями. Поэтому несоблюдения сроков и&nbsp;бюджетов допускать не&nbsp;можем.&nbsp;</p>
<p>Формировать работу по&nbsp;спринтам, добавляя в&nbsp;каждый новые требования, нельзя. Иначе снова растягиваем бюджет и&nbsp;время на&nbsp;реализацию.&nbsp;</p>
<p>Анализ всех «можно» и&nbsp;«нельзя» дал&nbsp;нам&nbsp;понять, что&nbsp;нужно использовать в&nbsp;работе адаптивный подход, который мы&nbsp;называем Wagile. Мы&nbsp;получили его, скорректировав и&nbsp;соединив принципы Waterfall и&nbsp;Agile.</p>
<p><img src="/Media/2798/frame-3.png" alt=""></p>
<h2>Change request: главная сложность и&nbsp;ключ к&nbsp;развитию проекта</h2>
<p>Мы смешали Waterfall и&nbsp;Agile в&nbsp;правильных пропорциях, чтобы коктейль «Wagile» был&nbsp;полезным и&nbsp;для&nbsp;нас, и&nbsp;для&nbsp;клиента. Изначально закладываем необходимую функциональность и&nbsp;бюджет. При&nbsp;этом допускаем, что&nbsp;в&nbsp;процессе разработки эти&nbsp;величины могут меняться, потому что&nbsp;одна влияет на&nbsp;другую.&nbsp;</p>
<p>Если появляются новые требования, которые выходят за&nbsp;рамки запланированного на&nbsp;старте скопа, мы&nbsp;даем клиенту возможность создавать change requests – запросы на&nbsp;изменение функциональности и&nbsp;внесение новых требований. Реализацию предлагаем либо в&nbsp;рамках оговоренного бюджета, но&nbsp;вместо какой&#8209;то&nbsp;части изначально запланированной функциональности, либо в&nbsp;рамках дополнительного бюджета, если заказчик готов его&nbsp;предоставить.</p>

<div class="umb-macro-highlights">
    <strong></strong>
    Change requests – это&nbsp;и&nbsp;добро и&nbsp;зло&nbsp;для&nbsp;проекта одновременно. С&nbsp;одной стороны, они&nbsp;помогают справиться с&nbsp;трудностями в&nbsp;ходе разработки и&nbsp;сделать правильный продукт. С&nbsp;другой – влекут за&nbsp;собой риски поломок и&nbsp;частые изменения скопа задач, если поступают регулярно и&nbsp;в&nbsp;большом количестве.
</div>

<p>Обычно, чем&nbsp;больше нюансов учтено на&nbsp;старте при&nbsp;составлении плана проекта, тем&nbsp;меньше будет поступать change requests на&nbsp;этапе разработки. Может еще&nbsp;оказаться, что&nbsp;не&nbsp;хватает какой&#8209;то&nbsp;функциональности, которую не&nbsp;описали на&nbsp;старте, потому что&nbsp;«думали, что&nbsp;это&nbsp;и&nbsp;так&nbsp;понятно». Словом, вариантов масса.&nbsp;Однако источники запросов на&nbsp;изменения могут находиться за&nbsp;рамками планирования. В&nbsp;таком случае предугадать их&nbsp;невозможно.</p>
<p>Например, на&nbsp;стороне заказчика меняется руководитель проекта или&nbsp;владелец продукта. Новый человек хочет распространить свое видение и&nbsp;вносит изменения в&nbsp;уже&nbsp;утвержденную функциональность, причем на&nbsp;разных уровнях. Или&nbsp;другой пример: в&nbsp;компании заказчика приняли верхнеуровневое решение перейти с&nbsp;привычной CRM&nbsp;(с&nbsp;которой мы&nbsp;делаем интеграцию) на&nbsp;другую. При&nbsp;этом условии может потребоваться переработка всей системы, и&nbsp;хорошо, если об&nbsp;этом узнали незадолго после старта разработки. А&nbsp;что, если это&nbsp;произошло в&nbsp;середине проекта или&nbsp;за&nbsp;пару недель до&nbsp;релиза?</p>
<p>Еще один источник change requests – демо. Обычно мы&nbsp;проводим его&nbsp;раз&nbsp;в&nbsp;несколько спринтов. Так&nbsp;процесс работы над&nbsp;продуктом становится прозрачнее для&nbsp;клиента: промежуточные результаты видны, понятно, на&nbsp;каком этапе находится команда.</p>
<p>Вот клиент «потрогал» очередной билд и&nbsp;понял, что&nbsp;представлял себе взаимодействие с&nbsp;решением иначе.&nbsp;</p>
<p>Например, как&#8209;то&nbsp;мы&nbsp;делали сайт с&nbsp;блоком новостей. Каждая новость на&nbsp;странице должна была отображаться на&nbsp;отдельной плашке, содержащей название, дату публикации и&nbsp;набор тегов. С&nbsp;последним пунктом возникло несоответствие. На&nbsp;плашке отображался только один тег, хотя новость была отмечена, например пятнадцатью.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/398702572034b57acd9c04af31635ccf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/b50851f37b6c4748b6279e0990ec0449"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2796/1.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5a110f49d60243be811119ea2358824d"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Оказалось, что&nbsp;утвержденные дизайн-макеты предполагали отображение только одного тега для&nbsp;новости. Дизайнерам пришлось перерабатывать макеты, а&nbsp;нам&nbsp;– переписывать код, чтобы реализовать функциональность для&nbsp;динамического отображения. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/fab011a8e9d4f897c9caf1e10a936d03"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/c902fdafcd2f4d43ae0d4d44a0d047b3"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2795/12.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9cb75436d34a482dbd273806289f030d"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Сделали так, чтобы полный список тегов для&nbsp;новости отображался с&nbsp;помощью дополнительного контрола на&nbsp;карточке новости. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7938d3b478386ea12ec15e032edce350"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e55ee8d19e2947e2936e1c8ccb9cee16"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как Wagile работает на&nbsp;бизнес</h2>
<p>Мы находим баланс между Waterfall и&nbsp;Agile, убивая двух зайцев. Первый – удобство настройки процессов разработки внутри команды fuse8. Второй – создание бизнес-ценности для&nbsp;клиента прозрачно и&nbsp;гибко. </p>
<ul>
<li aria-level="1">На старте важно выявить цели и&nbsp;метрики, по&nbsp;которым будем оценивать успех проекта. Подробнее об&nbsp;этом рассказали <a href="/articles/impact-mapping/" title="Impact Mapping: как&nbsp;на&nbsp;старте повысить шансы проекта на&nbsp;успех">в статье про&nbsp;Impact Mapping</a>. Пропустить этот шаг&nbsp;– лишиться ориентиров, которые помогают в&nbsp;ходе разработки. </li>
<li aria-level="1">Вместо составления многостраничного ТЗ&nbsp;проводим предпроектное исследование. Выясняем у&nbsp;бизнеса, какую функциональность нужно реализовать. Результат – понятная документация, которая описывает функциональность будущего решения на&nbsp;языке бизнеса. </li>
<li aria-level="1">Верхнеуровневый план развития проекта разбиваем на&nbsp;этапы и&nbsp;декомпозируем задачи. Так&nbsp;бизнесу удобнее отслеживать процесс и&nbsp;расход ресурсов. А&nbsp;наши разработчики в&nbsp;таком случае работают с&nbsp;разграниченными и&nbsp;осмысленными частями проекта по&nbsp;спринтам, четко зная, сколько времени нужно на&nbsp;выполнение задач. </li>
<li aria-level="1">Wagile упрощает и&nbsp;сверку промежуточных итогов с&nbsp;клиентом: показываем на&nbsp;демо не&nbsp;абстрактные доработки а&nbsp;проработанные сегменты создаваемого продукта. Клиент понимает, за&nbsp;что&nbsp;платит, не&nbsp;остается в&nbsp;неведении, пока идет разработка.</li>
<li aria-level="1">Меняющиеся требования приоритезируем и&nbsp;учитываем с&nbsp;оглядкой на&nbsp;изначальный план. Целостное видение функциональности закреплено с&nbsp;клиентом еще&nbsp;на&nbsp;старте. Поэтому change requests, возникающие далее, не&nbsp;берутся в&nbsp;разработку сразу же.</li>
<li aria-level="1">Сперва выясняем, насколько новые требования соотносятся с&nbsp;целями проекта, чтобы, например, ничего не&nbsp;сломать и&nbsp;не&nbsp;сойти с&nbsp;курса в&nbsp;целом. Затем распределяем изменения по&nbsp;итерациям или&nbsp;запрашиваем дополнительные ресурсы на&nbsp;реализацию, если получается слишком большой скоуп.<br><br></li>
</ul>

<div class="text-highlight">
  Мы&nbsp;научились смешивать коктейль Wagile, но&nbsp;хотим, чтобы вы&nbsp;знали, что&nbsp;идеальных пропорций не&nbsp;существует. Ровно как&nbsp;и&nbsp;идеальных проектов. На&nbsp;этапе планирования вы&nbsp;не&nbsp;можете предугадать, что&nbsp;изменится или&nbsp;пойдет не&nbsp;так, поэтому рецепт Wagile для&nbsp;вашего проекта может быть немного другим. По&nbsp;правде говоря, даже для&nbsp;проектов внутри fuse8 он&nbsp;всегда получается по-своему уникальным. Однако главные ингредиенты всегда неизменны: планирование, последовательность и&nbsp;гибкость.
</div>

<p> </p>
<p><em><strong>Фото в&nbsp;заголовке: by&nbsp;<a href="https://unsplash.com/@pawel_czerwinski">pawel_czerwinsk</a>i on&nbsp;<a href="https://unsplash.com">Unsplash</a></strong></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Аутстаф VS Аутсорс: что полезнее бизнесу и разработчикам
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Спрос на аутсорс падает, аутстаф не даёт прозрачности. Компании переходят к фокусу на бизнес-ценность. Рассказываем, как адаптироваться к смене подхода.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/outstaff-vs-outsource/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/outstaff-vs-outsource/</guid>

                <pubDate>Tue, 06 May 2025 13:04:40 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Аутстаф VS Аутсорс: что полезнее бизнесу и разработчикам</h1>
                                <figure>
                                    <img src="/Media/2815/piret-ilver-98mbuldcdjy-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6a5998ddbb625f936743fb2555884d7e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ef0039990aba4cf8aa247cf582402287"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Классический аутстаф сложно качественно оценить, а&nbsp;на&nbsp;чистый аутсорс спрос снижается: компании стремятся выращивать технологическую экспертизу внутри. Теперь подход нужно менять и&nbsp;ориентироваться не&nbsp;на&nbsp;модели сотрудничества, а&nbsp;на&nbsp;бизнес-ценность. Рассказываем как.</span></p>
<h2>Различия моделей</h2>
<p><span style="font-weight: 400;">Для компании-разработчика и&nbsp;аутсорс, и&nbsp;аутстаф предполагают продажу человеко-часов заказчику. Разница будет в&nbsp;величине ответственности сторон. Например, в&nbsp;контексте аутстафа мы&nbsp;выделяем разработчиков на&nbsp;проект заказчика. Наша ответственность только за&nbsp;факт выполнения работ ребятами. Менеджментом и&nbsp;отслеживанием успешности продукта занимаются люди на&nbsp;стороне заказчика, и&nbsp;об&nbsp;этих процессах мы&nbsp;можем вовсе не&nbsp;иметь представления. Иными словами мы&nbsp;«продаем руки», которыми не&nbsp;управляем.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/2a199e238c374f53aa9dfcbcab82639a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2817/frame-2.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5d1dfca74fe34f24be5e8eab905c86cf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Аутсорс – это&nbsp;когда заказчик приходит и&nbsp;говорит: «Сделайте мне&nbsp;продукт». Ну, или&nbsp;«часть продукта». Это&nbsp;значит, что&nbsp;нужно будет создать нечто такое, что&nbsp;принесет заказчику деньги. Чтобы это&nbsp;сделать, предстоит принять нужные решения, правильно выстроить и&nbsp;выполнить работу. При&nbsp;этом мы&nbsp;знаем, что&nbsp;должен «уметь» продукт, какую выгоду он&nbsp;должен принести, как&nbsp;должен работать и&nbsp;почему заказчику именно такой продукт нужен. Знаем мы&nbsp;это, потому что&nbsp;<a href="/articles/task-understanding/" title="Понимание задачи by&nbsp;fuse8: что&nbsp;такое и&nbsp;зачем  нужно">понимаем задачу</a>. Так, мы&nbsp;продаем не&nbsp;просто «руки», а&nbsp;экспертизу. Экспертиза – это, помимо умения качественно закрывать задачи, погружение в&nbsp;бизнес, проактивность и&nbsp;полная ответственность за&nbsp;результат. Ответственность заказчика здесь выражена в&nbsp;желании подробно описать свои ожидания и&nbsp;синхронизироваться с&nbsp;нами на&nbsp;демо. </span></p>
<h2>Везде важно понять задачу</h2>
<p><span style="font-weight: 400;">Не всегда при&nbsp;обсуждении работ на&nbsp;аутстафе клиент готов делиться подробностями проекта, на&nbsp;который нанимает внешние кадры. Просто есть задачи, и&nbsp;их&nbsp;просто нужно закрыть. Однако правда в&nbsp;том, что&nbsp;нет&nbsp;задач, которые не&nbsp;работали бы&nbsp;на&nbsp;оценимую пользу. </span></p>
<p><span style="font-weight: 400;">Даже если на&nbsp;проекте нужно «просто закрыть техдолг», по&nbsp;завершении работ можно будет оценить пользу. Например, если решение багов ведет к&nbsp;большей отказоустойчивости сервиса, то&nbsp;тем&nbsp;самым увеличивает лояльность пользователя. Тот&nbsp;с&nbsp;меньшей вероятностью столкнется с&nbsp;ошибкой. Больше довольных пользователей – больше выгод (пользы) для&nbsp;бизнеса. Подобные связи могут быть и&nbsp;менее очевидными, но&nbsp;важно раскопать их.</span></p>
<p><span style="font-weight: 400;">Классический аутстаф предполагает, что&nbsp;заказчик «рабочих рук» отсматривает резюме кандидатов из&nbsp;нашей команды, собеседует их. Он&nbsp;по-своему соотносит имеющиеся задачи и&nbsp;навыки условного разработчика, а&nbsp;после решает, кого нанять. При&nbsp;этом ребята все&nbsp;вместе и&nbsp;каждый по&nbsp;отдельности – эксперты. Они&nbsp;способны не&nbsp;только кодить, но&nbsp;еще&nbsp;погружаться в&nbsp;бизнес-цели продукта, а&nbsp;на&nbsp;их&nbsp;основе понимать, как&nbsp;изящнее реализовать функциональность, над&nbsp;которой работают. Они&nbsp;готовы проявлять инициативу. Иногда это&nbsp;заказчику просто не&nbsp;нужно, не&nbsp;хочется, поэтому он&nbsp;не&nbsp;раскрывает сути проекта. А&nbsp;иногда по&nbsp;окончании работ ни&nbsp;он, ни&nbsp;мы&nbsp;(даже при&nbsp;желании) не&nbsp;можем оценить эффективность ребят, потому что&nbsp;изначально не&nbsp;прояснили бизнес-цели. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/0b1741cea9ec4308bc6a1e14fc96f811"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2816/frame-52.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e0c981bed3bd463485d5d17832695a7f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p><span style="font-weight: 400;">Понимать задачу обоюдовыгодно. Если на&nbsp;старте знать, для&nbsp;чего нужны&nbsp;«рабочие руки», из&nbsp;большой команды специалистов проще подобрать наиболее подходящих – со&nbsp;схожим опытом, например. Это&nbsp;выгодно прежде всего для&nbsp;заказчика – он&nbsp;потратит меньше времени на&nbsp;онбординг вспомогательных кадров и&nbsp;быстрее увидит пополнение колонки «done».&nbsp;</span></p>
<p><span style="font-weight: 400;">Мы становимся эффективнее, когда понимаем, на&nbsp;какой результат работаем. Поэтому продавать просто «руки», которым не&nbsp;раскрыли сути проекта, нам&nbsp;не&nbsp;так&nbsp;интересно, а&nbsp;заказчикам – не&nbsp;так&nbsp;полезно.&nbsp;&nbsp;</span></p>
<h2>Важнее не&nbsp;формат, а&nbsp;бизнес-ценность</h2>
<p><span style="font-weight: 400;">В идеальном мире мы&nbsp;всегда знаем, каким должен быть результат работы, будь она&nbsp;в&nbsp;аутсорс- или&nbsp;аутстаф-формате. Так&nbsp;мы&nbsp;можем предложить не&nbsp;просто технические умения, а&nbsp;комплексную экспертизу в&nbsp;разработке продуктов, даже если нужно «просто закрыть техдолг».&nbsp;</span></p>
<p><span style="font-weight: 400;">Бизнес, который приходит за&nbsp;заказной разработкой, хочет знать, за&nbsp;что&nbsp;платит деньги. Если с&nbsp;аутсорсом это&nbsp;ясно с&nbsp;самого начала, то&nbsp;на&nbsp;аутстафе, если не&nbsp;прояснить цели на&nbsp;старте, сложно установить прямую связь между выполненной работой и&nbsp;тем, как&nbsp;изменился продукт.&nbsp;</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Приятнее платить не&nbsp;по&nbsp;факту отработанных часов, а&nbsp;за&nbsp;улучшенную функциональность. Да&nbsp;и&nbsp;нам, как&nbsp;разработчикам, приятнее отчитываться о&nbsp;комплексном результате, а&nbsp;не&nbsp;просто о&nbsp;закрытых задачах.
</div>

<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/51e043078fdb437ba407a4ea4016cd46"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Оптом выгоднее</h2>
<p><span style="font-weight: 400;">Можно выделять людей по&nbsp;отдельности. Тогда заказчик будет перебирать резюме, проводить собеседования с&nbsp;кандидатами, словом, отбирать личности. Еще&nbsp;можно выделять команды. Тогда подбор будет на&nbsp;«поставщике» кадров, то&nbsp;есть на&nbsp;компании-разработчике, а&nbsp;заказчик получит экспертизу, а&nbsp;не&nbsp;просто исполнителей. Получится своеобразная смесь из&nbsp;аутсорса и&nbsp;аутстафа.</span></p>

<div class="text-highlight">
  Ситуация применения: у&nbsp;заказчика есть запрос на&nbsp;ресурсы, которых в&nbsp;его&nbsp;компании не&nbsp;хватает. Например, на&nbsp;проекте укомплектованы все&nbsp;роли кроме фронтендеров. Мы&nbsp;после получения такого запроса понимаем задачу, оцениваем проект, время и&nbsp;выделяем нужное для&nbsp;работы количество человек. Заказчик покупает экспертную команду, а&nbsp;не&nbsp;личности по&nbsp;одной. Он&nbsp;не&nbsp;смотрит каждое резюме по&nbsp;отдельности и&nbsp;не&nbsp;проводит с&nbsp;каждым интервью. К&nbsp;тому же, если кто&#8209;то&nbsp;из&nbsp;команды не&nbsp;сможет в&nbsp;определенный момент работать, то&nbsp;мы&nbsp;сможем сделать замену без&nbsp;потери качества и&nbsp;долгих согласований.
</div>

<p><span style="font-weight: 400;">Такой подход берет от&nbsp;аутстафа покупку-продажу часов и&nbsp;«рабочих рук», а&nbsp;от&nbsp;аутсорса – продуктовое видение задачи и&nbsp;экспертизу для&nbsp;разработки с&nbsp;учетом целей проекта. Взять готовую команду с&nbsp;проверенным опытом проще, чем&nbsp;тратить время на&nbsp;HR-активности: поиск, найм и&nbsp;онбординг. Все&nbsp;это&nbsp;отдалит время релиза, получения прибыли и&nbsp;результатов. </span></p>
<h2>Секрет напоследок</h2>
<p><span style="font-weight: 400;">Рассказать компании-разработчику о&nbsp;целях проекта – не&nbsp;значит раскрыть все&nbsp;коммерческие тайны и&nbsp;скомпрометировать себя, да&nbsp;и&nbsp;вряд ли&nbsp;кто&#8209;то&nbsp;склонен так&nbsp;считать. Мы&nbsp;таких ребят не&nbsp;встречали. Приходя с&nbsp;запросами на&nbsp;аутстаф, например, заказчики часто не&nbsp;хотят распыляться на&nbsp;объяснения, потому что&nbsp;могут и&nbsp;сами не&nbsp;видеть четкой связи между тем&nbsp;самым условным «закрытием техдолга» разработчиками и&nbsp;получением дополнительной прибыли. При&nbsp;заказе аутсорс-разработки заказчик (который не&nbsp;разработчик, это&nbsp;важно) также может не&nbsp;учитывать особенностей реализации и&nbsp;их&nbsp;связей с&nbsp;целями бизнеса. Обе&nbsp;ситуации – норма жизни.</span></p>

<div class="umb-macro-highlights">
    <strong>Ключ к&nbsp;успеху здесь – эффективные переговоры</strong>
    , у&nbsp;которых две&nbsp;цели: познакомить заказчика со&nbsp;своей экспертизой и&nbsp;сделать так, чтобы заказчик познакомил нас&nbsp;со&nbsp;своим бизнесом и&nbsp;его&nbsp;ближайшими целями. Ну&nbsp;а&nbsp;что&nbsp;делать дальше, вы&nbsp;уже&nbsp;знаете.
</div>

</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/938c0eac0f25423dbdab95278cfd3970"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p> </p>
<p><em><strong>Фото в&nbsp;заголовке: by&nbsp;<a href="https://unsplash.com/@saltsup"><span>Piret Ilver</span></a></strong></em><span> </span><em><strong>on<span> </span><a href="https://unsplash.com/">Unsplash</a></strong></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как масштабировать IT-инфраструктуру, работая изнутри
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Нагрузка на IT-решение растёт и падает — важно, чтобы это не ударило по бизнесу. Почему масштабирование инфраструктуры — не опция, а необходимость?
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/it-infrastructure-scaling/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/it-infrastructure-scaling/</guid>

                <pubDate>Tue, 06 May 2025 13:03:54 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как масштабировать IT-инфраструктуру, работая изнутри</h1>
                                <figure>
                                    <img src="/Media/2836/frame-184.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e3dba039524add66559a2b2f1bc32e88"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3915dee0d7e0429f808aee92ef646e32"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Разрабатывая IT-продукты для&nbsp;бизнеса, </span><span style="font-weight: 400;">мы</span><span style="font-weight: 400;"> на&nbsp;старте работы над&nbsp;проектом закладываем предполагаемую нагрузку на&nbsp;продукт. После запуска продукта условия его&nbsp;использования могут меняться. Может меняться и&nbsp;сам&nbsp;бизнес. По&nbsp;этим причинам нагрузка на&nbsp;созданное решение тоже изменится: от&nbsp;падения на&nbsp;десятки до&nbsp;роста на&nbsp;сотни процентов относительно среднего уровня. Чтобы эти&nbsp;изменения не&nbsp;стали для&nbsp;бизнеса и&nbsp;его&nbsp;прибыльности критическими или&nbsp;фатальными, IT-инфраструктуру нужно масштабировать.</span></p>

<div class="text-highlight">
  Первое, что&nbsp;приходит на&nbsp;ум, когда происходит значительный рост нагрузки – горизонтальное или&nbsp;вертикальное масштабирование системы. То&nbsp;есть, чтобы обрабатывать большие потоки данных, требуется увеличить мощности: подключить новые сервера или&nbsp;расширить имеющиеся. Закупка или&nbsp;аренда дополнительных серверов – дело затратное, и&nbsp;не&nbsp;каждый бизнес готов на&nbsp;это&nbsp;идти в&nbsp;условиях финансового и&nbsp;экономического кризиса. Поэтому мы&nbsp;первым делом предлагаем взглянуть на&nbsp;возможности масштабирования проекта через внутреннюю, технологическую оптимизацию IT-решений.
</div>

<p><span style="font-weight: 400;">Наша практика показывает, что&nbsp;чаще всего находится какое&#8209;то&nbsp;место в&nbsp;системе, которое работает по&nbsp;</span><a href="https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9F%D0%B0%D1%80%D0%B5%D1%82%D0%BE"><span style="font-weight: 400;">принципу 80/20</span></a><span style="font-weight: 400;"> – львиная доля несовершенств произрастает из&nbsp;одного узкого места, оптимизировав которое, можно получить значительный буст в&nbsp;производительности. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9892bd0a6a8c7a89d509ac3b78cc8018"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a680df41674d4c08aaeb555bb5bdbb4e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Оптимизация баз&nbsp;данных</h2>
<p><span style="font-weight: 400;">Часто узким местом становится эффективность запросов в&nbsp;базы данных. Пример из&nbsp;практики: мы&nbsp;создавали систему документооборота для&nbsp;МФО. Через несколько лет&nbsp;компания расширилась путем покупки другой компании. В&nbsp;результате клиентов системы стало в&nbsp;разы больше, и&nbsp;существующая система уже&nbsp;не&nbsp;справлялась с&nbsp;нагрузкой. Пользователям приходилось ждать выполнения некоторых частых операций по&nbsp;несколько минут. Встал вопрос о&nbsp;масштабировании ИТ-инфраструктуры.</span></p>
<p><span style="font-weight: 400;">На проекте мы&nbsp;использовали ORM&nbsp;библиотеку, помогающую в&nbsp;объектно-ориентированном коде обращаться к&nbsp;базам данных (БД). Мы&nbsp;проанализировали запросы, которые генерировала библиотека и&nbsp;выделили неэффективные, где&nbsp;система берет из&nbsp;БД&nbsp;лишние данные или&nbsp;делает избыточные обращения к&nbsp;ней, не&nbsp;использует индексы.&nbsp;</span></p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/fc6e40e51a474170b6c4d16a7b90568b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2837/frame-210.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5ab79c00f5a6419588b4dc4fdb08b279"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Решение проблемы крылось в&nbsp;реструктуризации запросов в&nbsp;БД. Вообще, такого рода несовершенства часто встречаются при&nbsp;использовании ORM&nbsp;библиотек. Чтобы снизить нагрузку на&nbsp;инфраструктуру в&nbsp;таком случае можно перенастроить ORM, изменить структуру БД&nbsp;или&nbsp;настроить запросы напрямую в&nbsp;БД&nbsp;для&nbsp;меньшего потребления системой ресурсов. В&nbsp;результате проекта оптимизации удалось избежать увеличения ежемесячных расходов на&nbsp;инфраструктуру, а&nbsp;производительность системы вернулась в&nbsp;норму.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c18bee2785a07aca7d8002948c110ec3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/12efaa28133b448484fd4fde72b365b5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Строгое кэширование, serverless-вычисления и&nbsp;CDN</h2>
<p><span style="font-weight: 400;">Другой пример – продукты, у&nbsp;которых сильно неравномерный профиль нагрузки. Примеры – сервисы для&nbsp;спортивных клубов и&nbsp;организаций, коих в&nbsp;нашей практике немало. Нагрузка на&nbsp;них&nbsp;сосредоточена в&nbsp;определенные дни&nbsp;– например, когда проводится очередной матч. Есть также элемент непредсказуемости: внезапно появившаяся скандальная новость может привести на&nbsp;ресурс толпы пользователей. Аналогичный профиль нагрузки можно встретить у&nbsp;медиа и&nbsp;e-commerce проектов.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Чтобы сделать продукт прибыльным для&nbsp;заказчика, нужно предостеречь ресурсы от&nbsp;падения в&nbsp;моменты пиковых нагрузок и&nbsp;исключить растрату ресурсных мощностей впустую, когда нагрузка близка к&nbsp;нулю.
</div>

<p><span style="font-weight: 400;">Мы пользовались облачной инфраструктурой. Первоначально увеличивали ее&nbsp;в&nbsp;те&nbsp;дни, когда могли предсказать большую нагрузку. Прибегали к&nbsp;горизонтальным механизмам масштабирования проекта. Условно, в&nbsp;обычные дни&nbsp;работали 2 сервера, а&nbsp;в&nbsp;дни&nbsp;матчей было задействовано до&nbsp;8 серверов. Однако это&nbsp;не&nbsp;особенно решало проблему внезапного наплыва. Для&nbsp;таких случаев мы&nbsp;использовали другой вид&nbsp;оптимизации: при&nbsp;росте нагрузки автоматически включали более строгое кэширование данных. Таким образом получалось снизить нагрузку на&nbsp;сервера за&nbsp;счет небольшого снижения скорости обновления информации для&nbsp;пользователей.</span></p>
<p><span style="font-weight: 400;">Второй обязательный элемент масштабирования любых публичных онлайн-проектов – это&nbsp;сеть доставки контента («content delivery network», CDN). Это&nbsp;сеть взаимосвязанных серверов, которая ускоряет процесс загрузки веб-страниц приложений с&nbsp;высокой нагрузкой за&nbsp;счет кэширования отдельных запросов на&nbsp;них.</span></p>
<p><span style="font-weight: 400;">&nbsp;</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/43066275af6043dfb075464a626c49eb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2838/frame-211.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f66cdf1b3ac349938ecc223d731c1dcf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Современные CDN&nbsp;позволяют использовать адаптивные правила кэширования, дополнительно защищают от&nbsp;DDoS атак и&nbsp;ботов, а&nbsp;некоторые позволяют даже выполнять небольшой код&nbsp;на&nbsp;edge-серверах. Российские CDN&nbsp;пока отстают от&nbsp;зарубежных, но&nbsp;постепенно догоняют. С&nbsp;точки зрения расходов на&nbsp;хостинг это&nbsp;вложение окупается всегда. </span></p>
<p><span style="font-weight: 400;">Справиться с&nbsp;непредсказуемыми высокими нагрузками на&nbsp;систему также помогают serverless-вычисления. Это&nbsp;модель предоставления серверных услуг без&nbsp;аренды или&nbsp;покупки оборудования. Проще говоря, мы&nbsp;платим только за&nbsp;то&nbsp;количество запросов к&nbsp;сервису , не&nbsp;тратя дополнительные средства на&nbsp;поддержание его&nbsp;работы (функционирования серверов) в&nbsp;моменты нулевых нагрузок. Мы&nbsp;применяли их&nbsp;для&nbsp;процессов интеграции данных из&nbsp;сторонних сервисов с&nbsp;неравномерным потоком.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    При&nbsp;аудите подобных проектов мы&nbsp;часто встречаем ситуацию, когда огромное количество серверных ресурсов большую часть времени простаивает. Это&nbsp;происходит из&#8209;за&nbsp;того, что&nbsp;их&nbsp;купили и&nbsp;держат «с запасом». Благодаря оптимизации инфраструктуры и&nbsp;кода, применению умного кэширования нам&nbsp;удавалось сократить инфраструктурные расходы в&nbsp;10 раз.
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5c5c1fdb4a6145ea2c19ef7dd30eaf8c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/eb83820ab75443f9b13534d5c784f81c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Монолит и&nbsp;микросервисы</h2>
<p><span style="font-weight: 400;">Первоначально при&nbsp;разработке нового продукта часто делают монолитное приложение, потому что&nbsp;это&nbsp;более простой путь: все&nbsp;в&nbsp;одном месте и&nbsp;разработка идет быстрее. После запуска по&nbsp;ходу эксплуатации могут начаться проблемы с&nbsp;производительностью, и&nbsp;тогда возникает дилемма. Получается, что&nbsp;нужно либо масштабировать инфраструктуру, что&nbsp;дорого и&nbsp;неудобно, либо делить монолит на&nbsp;микросервисы. </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/c7d73b270bd2429393c6aa6ec6959fcc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2837/frame-210.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/87072133c3784b89a7df5eb7d24670e5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>
<p><span style="font-weight: 400;">Проще провести масштабирования ИТ-проекта, когда система построена на&nbsp;микросервисах. Поэтому даже при&nbsp;создании монолитного приложения стоит закладывать возможности для&nbsp;переведения его&nbsp;на&nbsp;микросервисную архитектуру.&nbsp;В&nbsp;любом случае, не&nbsp;обязательно всю&nbsp;систему «распиливать» сразу. Удобнее и&nbsp;разумнее делать это&nbsp;постепенно, отделяя небольшие кусочки функциональности по&nbsp;очереди. По&nbsp;отдельности начинаем «вырезать» сегменты и&nbsp;переводить их&nbsp;на&nbsp;микросервисы, и&nbsp;переключать потоки данных из&nbsp;старого приложения в&nbsp;новое. Логично строить этот процесс, опираясь на&nbsp;нужды бизнеса, чтобы каждая итерация приносила пользу или&nbsp;экономила средства бизнеса. Так&nbsp;получится сократить расходы и&nbsp;привести архитектуру в&nbsp;порядок.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Yandex Vision как сервис: распознавание нешаблонных документов и сложная интеграция
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Мы использовали Yandex Vision в двух продуктах — делимся опытом интеграции под нетиповые задачи и рассказываем, где сервис пока даёт сбои.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/yandex-vision-experience/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/yandex-vision-experience/</guid>

                <pubDate>Tue, 06 May 2025 13:03:26 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Yandex Vision как сервис: распознавание нешаблонных документов и сложная интеграция</h1>
                                <figure>
                                    <img src="/Media/2843/frame-185.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/488ac5d3c9826d20aad2976c05b17e36"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f3708f8196c94b45a00a200a2555be53"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Сервис привлекает низкой стоимостью, но&nbsp;заставляет танцевать с&nbsp;бубном, если задачи проекта выходят за&nbsp;рамки преднастроенных в&nbsp;нём&nbsp;шаблонов. Дело в&nbsp;специфическом формате ответов на&nbsp;запросы.</span></p>
<h2>Плюсы и&nbsp;странности Yandex Vision</h2>
<p><span style="font-weight: 400;">Пользоваться сервисом действительно дёшево: распознавание тысячи документов будет стоить всего 100 рублей. Есть преднастроенные шаблоны. Например, система безошибочно считывает паспорта и&nbsp;водительские удостоверения. Шаблон для&nbsp;паспорта мы&nbsp;встроили в&nbsp;форму регистрации пользователей на&nbsp;одной из&nbsp;разработанных платформ.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/c7057f75b3ad4f39ac442898b6b508c6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2844/image-95.png"
         alt=""
         itemprop="">


        <figcaption>
            Фрагмент ответа сервиса при запросе на распознавание основного разворота паспорта
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/099b0b4a65ca4e08a747f54b13cb5ea2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Работает сервис и&nbsp;с&nbsp;изображениями: распознает лица, умеет классифицировать контент (соответствие нужному качеству, наличие взрослого контента), может отследить вотермарку на&nbsp;изображении.</span></p>

<div class="umb-macro-highlights">
    <strong>Странности возникают при&nbsp;обработке результатов распознаваний.</strong>
    Например, цельный текст, распознанный через Yandex Vision возвращается в&nbsp;виде сегментов – пословно. При&nbsp;этом для&nbsp;каждого слова сервис указывает вероятность корректного распознавания в&nbsp;процентах.  Когда нужно не&nbsp;отдельное слово, а&nbsp;фраза или&nbsp;абзац в&nbsp;несколько строк, то&nbsp;на&nbsp;уровне кода приходится собирать их&nbsp;по&nbsp;кусочкам. Это&nbsp;неудобно и&nbsp;долго.
</div>

<p><span style="font-weight: 400;">С другой стороны, пословное распознавание с&nbsp;указанием точности будет кстати, когда нужно из&nbsp;большого документа фиксировать только определённые значения. Так&nbsp;у&nbsp;нас&nbsp;было на&nbsp;<a href="/projects/assignot/" title="assignot">«Цессионарии»</a>, но&nbsp;о&nbsp;нём&nbsp;позже. Можно задавать интервал корректности. Например, отображать в&nbsp;системе результат распознавания, только если его&nbsp;точность от&nbsp;90 до&nbsp;100 или&nbsp;не&nbsp;ниже определенного значения. Если результат хуже, проверять результат распознавания живым человеком. Такое бывает, например, если документ криво отсканирован.</span></p>
<p><span style="font-weight: 400;">На момент написания этого текста Yandex Vision работает с&nbsp;ограничениями. Среди прочего это&nbsp;касается распознавания языков. Сервис различает начертания, но&nbsp;в&nbsp;результате распознавания текста выводит только один язык, преимущественно встречающийся в&nbsp;документе. Это&nbsp;неудобно, если нужно распознать мультиязычный текст. </span></p>
<p><span style="font-weight: 400;">Бывает, что&nbsp;русское слово система может распознать как&nbsp;частично английское, если в&nbsp;нём&nbsp;есть буквы, которые пишутся идентично в&nbsp;обоих языках. Такое распознавание приходится корректировать вручную. </span></p>
<p><span style="font-weight: 400;">Результаты обнаружения лиц&nbsp;в&nbsp;Yandex Vision, на&nbsp;наш&nbsp;взгляд, избыточны, опять же, на&nbsp;уровне кода. Лица людей на&nbsp;картинке сервис выделяет прямоугольниками и&nbsp;в&nbsp;ответе на&nbsp;запрос возвращает их&nbsp;координаты.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ee3e61340dce4f2d9c805be7bd61dd9f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2845/image-96.png"
         alt=""
         itemprop="">


        <figcaption>
            Пример ответа с координатами обнаруженного лица
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/aca214a561be4339bdcf089a8122bdb4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Обычно при&nbsp;известных координатах всего двух углов выделения, остальные два&nbsp;угла прямоугольника легко найти. Yandex Vision прописывает все&nbsp;четыре, как&nbsp;будто подразумевается, что&nbsp;поле распознавания может быть не&nbsp;прямоугольником, а&nbsp;какой&#8209;то&nbsp;более сложной четырехугольной фигурой. Пока непонятно, может ли&nbsp;такое быть и&nbsp;зачем такая избыточность информации в&nbsp;координатах.</span></p>
<h2>Для чего мы&nbsp;использовали сервис</h2>
<p><span style="font-weight: 400;">Yandex Vision пригодился нам&nbsp;в&nbsp;двух продуктах. В&nbsp;одном с&nbsp;его&nbsp;помощью настроили распознавание паспортных данных для&nbsp;регистрации на&nbsp;платформе. Это&nbsp;тривиальная задача, с&nbsp;которой сервис на&nbsp;100% справляется.</span></p>
<p><span style="font-weight: 400;">Сложную интеграцию с&nbsp;Yandex Vision мы&nbsp;реализовали для&nbsp;<a href="/projects/assignot/" title="assignot">системы «Цессионарий»</a>. Она&nbsp;автоматизирует работу департамента судебного взыскания долгов. Распознавать предстояло сканы судебных приказов, чтобы минимизировать ручной труд и&nbsp;повысить степень автоматизации процессов в&nbsp;компании. Бизнесу дешевле оплачивать сервис, чем&nbsp;платить за&nbsp;ту&nbsp;же&nbsp;работу специалистам. </span></p>

<div class="text-highlight">
  Судебные приказы, распознавание которых нужно было автоматизировать, не&nbsp;имеют четкого шаблона для&nbsp;составления, в&nbsp;отличие от&nbsp;паспорта, например. Поэтому исходные возможности Yandex Vision не&nbsp;вполне отвечали требованиям задачи.
</div>

<p><span style="font-weight: 400;">Для таких нетривиальных задач стоит оценить и&nbsp;возможности создания специализированного ML&nbsp;под&nbsp;процессы компании. Однако, Yandex Vision тоже можно подстроить под&nbsp;запрос, дополнив его&nbsp;функциональность кастомной логикой.</span></p>
<h2>Опыт сложной интеграции: задачи, объём работ и&nbsp;результаты</h2>
<p><span style="font-weight: 400;">Главной задачей было избавить сотрудников компании клиента от&nbsp;ручного труда в&nbsp;ходе работы с&nbsp;судебными документами. Обрабатывать их&nbsp;нужно было в&nbsp;больших количествах, поэтому и&nbsp;автоматическое распознавание настроили так, чтобы загружать документы можно было «пачками».</span></p>
<p><span style="font-weight: 400;">Сначала для&nbsp;теста мы&nbsp;взяли API&nbsp;Yandex Vision без&nbsp;подключения к&nbsp;основной системе. Специалисты загружали архив отсканированных документов, а&nbsp;в&nbsp;ответ получали Excel-таблицу. В&nbsp;ней&nbsp;отображались распознанные данные для&nbsp;каждого файла из&nbsp;архива: ФИО, дата, номер кредитного договора, сумма задолженности и&nbsp;т.д. Так, в&nbsp;течение пары месяцев проверяли работоспособность технологии, а&nbsp;затем внедрили Yandex Vision непосредственно в&nbsp;«Цессионарий». </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/5d5e5a812ef740a4976a9aed03c9ce2d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2846/&#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x442;-&#x440;&#x430;&#x441;&#x43F;&#x43E;&#x437;&#x43D;.png"
         alt=""
         itemprop="">


        <figcaption>
            Кликнув на нужное поле, можно быстро сверить правильность распознавания. Система прикрепляет к каждому полю кусочек документа, из которого были взяты данные. Если данные для каких-то полей не распознались – не прошли пороговое значение вероятности, то они подсвечиваются красным, чтобы человек понял, что нужно вписать их вручную.
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/62eb5a601dad47c389a7cad94dc24d5d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Сложность этой интеграции была в&nbsp;нешаблонности распознаваемых документов. Нет&nbsp;единого стандарта для&nbsp;составления судебных приказов, поэтому в&nbsp;каждом суде их&nbsp;могут оформлять по-своему. Чтобы Yandex Vision корректно считывал нужные данные, мы&nbsp;разработали дополнительную логику работы сервиса. </span></p>
<p><span style="font-weight: 400;">Методом пристального взгляда выцепляли в&nbsp;документах нужные слова, за&nbsp;которыми следовали искомые данные, изменяющиеся от&nbsp;документа к&nbsp;документу. Например, после слов «взыскать с» должно идти ФИО, которое нам&nbsp;нужно. Или&nbsp;«задолженность по&nbsp;договору займа №», и&nbsp;дальше идет номер, который будет зафиксирован. Такие паттерны встроили в&nbsp;логику распознавания на&nbsp;уровне кода, загрузили тестовую пачку документов и&nbsp;смотрели, что&nbsp;не&nbsp;распозналось. Повторяли вышеописанные действия, пока не&nbsp;вывели схемы для&nbsp;распознавания подавляющего большинства документов. </span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Встройка API&nbsp;в&nbsp;нашу систему заняла около получаса. А&nbsp;вот&nbsp;накрутка дополнительной логики с&nbsp;паттернами документов потребовала уже&nbsp;около трёх недель. К&nbsp;тому же, нужно было настроить процесс сборки результатов распознавания из&nbsp;кусочков с&nbsp;вероятностями в&nbsp;читаемую информацию. Это&nbsp;тоже заняло примерно пару недель. Итого около месяца на&nbsp;интеграцию.
</div>

<p><span style="font-weight: 400;">На запуске мы&nbsp;добились корректного распознавания 80% всех документов. Остальные 20% – документы, составленные грубо говоря «своими словами», опять же&nbsp;из&#8209;за&nbsp;отсутствия шаблона. </span></p>
<p><span style="font-weight: 400;">Многие фичи  Yandex Vision до&nbsp;сих&nbsp;пор&nbsp;находятся в&nbsp;стадии Preview, о&nbsp;чем&nbsp;свидетельствуют соответствующие пояснения в&nbsp;документации. Однако это&nbsp;не&nbsp;мешает эффективно использовать сервис для&nbsp;решения задач, даже если они&nbsp;нестандартные. Теперь мы&nbsp;знаем, как&nbsp;это&nbsp;работает и&nbsp;с&nbsp;радостью поможем сделать интеграцию для&nbsp;вашего бизнеса! 🙂</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/19ff766688b04402b2b32de1ae877535"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><strong>Автор:</strong> Сергей Васнин</p>
<p><strong>Запись и&nbsp;редактура:</strong> Анастасия Мартынова</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Работа с британцами: тысяча извинений и другие правила коммуникации 
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как выстроить эффективную коммуникацию с зарубежными заказчиками? Опыт и советы от нашего директора по клиентскому сервису Татьяны Головачёвой.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/communication-with-british-colleagues/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/communication-with-british-colleagues/</guid>

                <pubDate>Tue, 06 May 2025 13:03:04 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Работа с британцами: тысяча извинений и другие правила коммуникации </h1>
                                <figure>
                                    <img src="/Media/2852/jon-tyson-plr-mbi8_yy-unsplash.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7fb3c94c9f2c7ee8c0f19b35059c41a0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d75bc05dacd44b45aa94dca1fadf0beb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Мы давно работаем с&nbsp;зарубежными англоговорящими заказчиками и&nbsp;за&nbsp;годы опыта насобирали заметок и&nbsp;особенностей, о&nbsp;которых полезно знать, если раньше у&nbsp;вас&nbsp;не&nbsp;было коллег англичан.</span></p>
<p><span style="font-weight: 400;">Наш директор по&nbsp;клиентскому сервису Татьяна Головачёва рассказала, как&nbsp;выстраивается коммуникация с&nbsp;зарубежными заказчиками и&nbsp;что&nbsp;можно сделать, чтобы её&nbsp;улучшить.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/83bc85bdec5040fcb170709fadfc8fba"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Пунктуальность и&nbsp;дружелюбие на&nbsp;встречах</h2>
<p><span style="font-weight: 400;">Англичане, скорее всего, придут в&nbsp;созвон раньше вас, даже если вы&nbsp;придёте вовремя. Часто они&nbsp;подключаются ко&nbsp;встрече за&nbsp;5-10 минут до&nbsp;её&nbsp;начала и&nbsp;не&nbsp;позволяют себе опаздывать без&nbsp;предупреждений. Наши британские коллеги вежливо уведомляют даже о&nbsp;пятиминутном опоздании на&nbsp;встречу и&nbsp;просят прощения за&nbsp;вынужденное ожидание. </span></p>
<p><span style="font-weight: 400;">Незаменимый атрибут встреч с&nbsp;британцами – улыбка. Да&nbsp;и&nbsp;в&nbsp;целом наши зарубежные коллеги стараются держать тон&nbsp;встречи дружелюбным, даже если приходится обсуждать не&nbsp;самые приятные вещи. Фокус в&nbsp;том, что&nbsp;в&nbsp;такую «улыбчивую» атмосферу вливаешься не&nbsp;сразу. Например, разработчик-новичок, прежде не&nbsp;работавший с&nbsp;зарубежными заказчиками, может первое время недоумевать, отчего тут&nbsp;все&nbsp;такие радостные, и&nbsp;сидеть с&nbsp;каменным лицом. Обычно это&nbsp;недопонимание исправляется после нескольких встреч, потому что&nbsp;есть всё-таки что&#8209;то&nbsp;в&nbsp;хорошем смысле заразительное в&nbsp;этой улыбке. </span></p>
<p><span style="font-weight: 400;">Однако не&nbsp;стоит, конечно, это&nbsp;дружелюбие принимать слишком близко к&nbsp;сердцу. Мы&nbsp;еще&nbsp;из&nbsp;школьного курса английского помним, что&nbsp;в&nbsp;ответ на&nbsp;английское «Как дела?» не&nbsp;стоит описывать свой житейский опыт за&nbsp;последний месяц. Достаточно ограничиться кратким «I’m great» и&nbsp;перейти к&nbsp;делу. </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/287accc4e25247feac81a0b4f7ec32b6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Agenda и&nbsp;Meeting recaps</h2>
<p><span style="font-weight: 400;">У британцев принято выходить на&nbsp;встречи с&nbsp;«аджендой». То&nbsp;есть, приглашая коллег на&nbsp;созвон-обсуждение, нужно отправить им&nbsp;план мероприятия и&nbsp;вопросы, которые будут на&nbsp;нём&nbsp;подниматься. Это&nbsp;желательный пункт, который показывает лучший уровень сервиса и&nbsp;заботы о&nbsp;клиентах. Такой подход привычен для&nbsp;западной деловой культуры в&nbsp;целом, но&nbsp;по&nbsp;нашим наблюдениям британцы соблюдают его&nbsp;более обязательно чем&nbsp;американцы или&nbsp;канадцы, например.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/17770341102f477ab1de8e4c5ad58fa7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2848/frame-201.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fd0180e6e31344999541654cd9350854"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Итог встречи должен быть закреплён в&nbsp;другом письме, которое называется meeting recap. Внутри могут быть договорённости, к&nbsp;которым пришли в&nbsp;ходе встречи, задачи, которые были определены на&nbsp;ней. Всё&nbsp;в&nbsp;том&nbsp;же&nbsp;вежливом и&nbsp;дружелюбном тоне – не&nbsp;нужно писать декларативное письмо с&nbsp;сухим перечислением задач. Meeting recap можно составить по&nbsp;шаблону, чтобы не&nbsp;выдумывать его&nbsp;после каждой новой встречи. </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/41e78354235d479ea6e9fdc7f54863e1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2849/frame-202.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ae1d6fcca52842bb92c37f6459d515bd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Эти практики, на&nbsp;наш&nbsp;взгляд, полезно перенимать и&nbsp;использовать почаще не&nbsp;только в&nbsp;контексте отношений с&nbsp;зарубежными коллегами. </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/94b1d14be5ca41a8a6dc94f8a09259a3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Английский юмор и&nbsp;другие непонятки</h2>
<p><span style="font-weight: 400;">У англичан действительно своеобразный юмор, который без&nbsp;опыта бывает сложно считать и&nbsp;научиться на&nbsp;него реагировать. Чем&nbsp;больше общения в&nbsp;работе, тем&nbsp;проще.</span></p>
<p><span style="font-weight: 400;">Часто из&#8209;за&nbsp;культурных различий компании подбирают аккаунтов в&nbsp;стране клиента. Наш&nbsp;кейс – противоположность. Несмотря на&nbsp;это, получается продуктивно развивать отношения с&nbsp;зарубежными заказчиками.</span></p>

<div class="text-highlight">
  Одно из&nbsp;главных качеств аккаунт менеджера – эмпатичность. А&nbsp;в&nbsp;работе с&nbsp;британцами его&nbsp;нужно умножать на&nbsp;5.
</div>

<p><span style="font-weight: 400;">Иногда в&nbsp;речи коллег попадаются образные выражения, не&nbsp;зная которых, сложно вообще понять, с&nbsp;чего человек такое вдруг ляпнул на&nbsp;встрече. Например, фраза «But i’m not&nbsp;holding my&nbsp;breath» – на&nbsp;первый взгляд тут&nbsp;что&#8209;то&nbsp;про&nbsp;задерживание дыхания. Реальный же&nbsp;смысл – «я бы&nbsp;не&nbsp;ждал больших результатов». Такие выражения появляются в&nbsp;языке время от&nbsp;времени, поэтому важно держать руку на&nbsp;пульсе и&nbsp;развивать свои познания в&nbsp;живом языке.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6e58ffdf39c648f294e2b27ab48e7627"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2850/frame-203.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/25981a7c0a4e4a3d99f44677c230bb5f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Чтобы ориентироваться в&nbsp;речи нейтивов быстрее, можно пользоваться сервисом </span><a href="https://wooordhunt.ru"><span style="font-weight: 400;">WooordHunt</span></a><span style="font-weight: 400;">. А&nbsp;если что&#8209;то&nbsp;всё&nbsp;равно остаётся непонятным – главное улыбайтесь! 🙂</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/988a94edfa8e4eddb445bfe441a03de0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Не перебивать и&nbsp;уточнять</h2>
<p><span style="font-weight: 400;">На созвонах с&nbsp;британцами вы&nbsp;вряд ли&nbsp;станете свидетелем того, как&nbsp;два&nbsp;человека говорят одновременно. Перебивать друг друга категорически запрещено. Ждём, пока предыдущий спикер закончит, ловим «окошко тишины» и&nbsp;только тогда начинаем говорить. </span></p>
<p><span style="font-weight: 400;">Важно, чтобы все&nbsp;всё&nbsp;правильно поняли, поэтому англичане не&nbsp;терпят предположений. Они&nbsp;всегда открыты к&nbsp;уточнениям, крайне внимательны к&nbsp;деталям и&nbsp;рады объяснить несколько раз, чтобы точно синхронизироваться. Поэтому, если вам&nbsp;случится обговаривать проект с&nbsp;британцами, не&nbsp;стесняйтесь переспрашивать и&nbsp;уточнять. Во-первых, так&nbsp;они&nbsp;поймут, что&nbsp;вам&nbsp;действительно интересно включиться в&nbsp;дело. Во-вторых, <a href="/articles/task-understanding/" title="Понимание задачи by&nbsp;fuse8: что&nbsp;такое и&nbsp;зачем  нужно">понимание задачи</a> станет качественнее. </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5ed1dfd69d9f4577bf92f94bbc344e4d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как читать обратную связь</h2>
<p><span style="font-weight: 400;">Помните про&nbsp;дружелюбный тон&nbsp;и&nbsp;всяческую вежливость? Они&nbsp;сохраняются и&nbsp;в&nbsp;процессе выдачи обратной связи, даже если она&nbsp;вышла так&nbsp;себе. Тут&nbsp;можно прямо сказать, что&nbsp;для&nbsp;русских обратная связь от&nbsp;британцев часто звучит странно, потому что&nbsp;всегда начинается с&nbsp;чего&#8209;то&nbsp;хорошего. </span></p>
<p><span style="font-weight: 400;">Они не&nbsp;скажут сразу «Нас не&nbsp;устроила работа с&nbsp;Петром Васильевым». Сначала его&nbsp;похвалят, скажут что&nbsp;он&nbsp;хороший парень и&nbsp;вообще молодец, а&nbsp;потом мягко, с&nbsp;соответствующими вводными начнут говорить о&nbsp;недостатках. Не&nbsp;будет формулировок вроде «Петр плохо работает». Вместо них&nbsp;– «Нам бы&nbsp;хотелось, чтобы Петр обратил внимание на&nbsp;уровень своей вовлеченности в&nbsp;проект», например. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/9172a3aa2dd441b7a5fa25b0b2691a6a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2851/frame-204.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9c497e54de444d4c89dcf31f3bc8c3e0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Чтобы вычленить суть такой обратной связи, читать нужно где&#8209;то&nbsp;с&nbsp;середины и&nbsp;очень внимательно, чтобы через смягчающие вводные понять, что&nbsp;именно в&nbsp;работе пошло не&nbsp;так.</span></p>
<p><span style="font-weight: 400;">Канадцы, например, в&nbsp;отличие от&nbsp;британцев, в&nbsp;плане обратной связи более прямолинейны – говорят о&nbsp;недостатках сразу в&nbsp;лоб. </span></p>
<p><span style="font-weight: 400;">Такая вежливая и&nbsp;несколько обтекаемая форма подачи создает и&nbsp;сложности в&nbsp;работе. Бывает непросто доподлинно понять, насколько мы&nbsp;и&nbsp;наш&nbsp;проект хороши. Одна из&nbsp;подсказок – присутствие в&nbsp;тексте обратной связи различных преувеличений: terrific, wonderful, amazing. Если проект описывается с&nbsp;обилием таких слов, то&nbsp;сработали круто. Если описание ограничивается словами fine, nice, great и&nbsp;OK&nbsp;(о&nbsp;ужас), то&nbsp;пора беспокоиться и&nbsp;скорее всего это&nbsp;работа на&nbsp;троечку. </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a774338cafc448aeb9b6a0031bfe707c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Правила деловой переписки</h2>
<p><span style="font-weight: 400;">Мало научиться читать письма зарубежных коллег, правильно отбирая нужную информацию. Письма нужно еще&nbsp;и&nbsp;составлять самостоятельно. В&nbsp;российской деловой культуре последние годы принято сокращать всё&nbsp;до&nbsp;смысла, избегая множества вводных и&nbsp;размывающей суть воды. Английская деловая переписка живёт по&nbsp;противоположным правилам.</span></p>

<div class="text-highlight">
  Это&nbsp;вообще львиная доля работы аккаунта – писать вежливые красивые письма англичанам.
</div>

<p><span style="font-weight: 400;">На письма от&nbsp;британских коллег мы&nbsp;отвечаем как&nbsp;можно скорее. Если случилось так, что&nbsp;письмо пришло вчера, а&nbsp;ответить получилось только сегодня – просим прощения за&nbsp;долгий ответ и&nbsp;благодарим за&nbsp;длительное ожидание. Только после этого переходим непосредственно к&nbsp;ответу. </span></p>
<p><span style="font-weight: 400;">Если на&nbsp;письмо с&nbsp;итогами прошедшей встречи, например, ответить что&#8209;то&nbsp;в&nbsp;духе «Спасибо, получила. Посмотрю в&nbsp;течение дня», можно сойти за&nbsp;грубияна. Правильнее будет сперва выразить свою признательность и&nbsp;поблагодарить за&nbsp;быструю отправку письма, а&nbsp;после написать небольшую обратную связь по&nbsp;содержанию письма.</span></p>

<div class="umb-macro-highlights">
    <strong>Разговорный язык в&nbsp;переписке нужно формализовывать.</strong>
    Вместо «tell» используем «inform». Вместо «make» – «create» или&nbsp;«develop» и&nbsp;так&nbsp;далее.
</div>

<h2>Что почитать по&nbsp;теме</h2>
<p><span style="font-weight: 400;">Будет здорово, если наш&nbsp;опыт, изложенный в&nbsp;этой статье поможет кому&#8209;то&nbsp;почувствовать себя увереннее в&nbsp;вопросах взаимодействия с&nbsp;иностранными коллегами. А&nbsp;чтобы еще&nbsp;лучше прокачать свои знания в&nbsp;этой области, рекомендуем ознакомиться с&nbsp;этими книгами.</span></p>
<p><a href="https://www.labirint.ru/books/644700/"><span style="font-weight: 400;">Всеволод Овчинников: Сакура и&nbsp;дуб. Ветка сакуры; Корни дуба</span></a></p>
<p><a href="https://www.labirint.ru/books/200103/"><span style="font-weight: 400;">Кейт Фокс: Наблюдая за&nbsp;англичанами. Скрытые правила поведения</span></a></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5bdc630216864597b3ec05ca81c8daf6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p> </p>
<p> </p>
<p><strong>Рассказала</strong><span> Татьяна Головачёва, директор по&nbsp;клиентскому сервису</span></p>
<p><strong>Записала и&nbsp;отредактировала</strong><span> </span>Анастасия Мартынова, редактор</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Асинхронность в JS: как выполнять долгие сетевые запросы без блокирования основного потока
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как в синхронном JavaScript вынести тяжёлые операции из основного потока и не блокировать выполнение остального кода — объясняем на практике.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/async-javascript/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/async-javascript/</guid>

                <pubDate>Tue, 06 May 2025 13:02:38 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Асинхронность в JS: как выполнять долгие сетевые запросы без блокирования основного потока</h1>
                                <figure>
                                    <img src="/Media/2888/frame-240.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/2a64bf6f575224f402ee5f39808e5e7b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/89d9f450694e4391a4b32d445d0215eb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Асинхронность – это&nbsp;способ координации поведения программы на&nbsp;протяжении какого&#8209;то&nbsp;временного отрезка. Разбираем, как&nbsp;в&nbsp;синхронном JavaScript вынести операции за&nbsp;рамки единого потока, чтобы не&nbsp;блокировать действие кода после тяжёлых операций. </span></p>
<p><span style="font-weight: 400;">JavaScript – это&nbsp;однопоточный язык программирования. JS&nbsp;исполняет одну строку кода в&nbsp;одну единицу времени и&nbsp;не&nbsp;предполагает мультитаскинга. Это&nbsp;отличает JS&nbsp;от&nbsp;многопоточного Java, например, где&nbsp;можно создавать отдельные потоки и&nbsp;переносить новый код&nbsp;в&nbsp;отдельно созданный поток. </span></p>

<div class="umb-macro-highlights">
    <strong>В JS&nbsp;при&nbsp;выполнении какой&#8209;то&nbsp;одной тяжелой операции, весь код, который следует после неё, может заморозиться.</strong>
    То&nbsp;есть скрипт блокируется, и&nbsp;страница, на&nbsp;которой в&nbsp;данный момент времени этот скрипт используется, становится неотзывчивой.
</div>

<p><span style="font-weight: 400;">Поскольку все&nbsp;операции проходят в&nbsp;одном потоке, ряд&nbsp;операций можно сделать асинхронными и&nbsp;вынести за&nbsp;рамки единого потока, чтобы не&nbsp;блокировать дальнейшее исполнение кода. Для&nbsp;этого могут использоваться коллбэки, промисы и&nbsp;асинхронные функции, но&nbsp;в&nbsp;современном JavaScript на&nbsp;практике используются только промисы и&nbsp;асинхронные функции.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/30bcd85296bd701e10f432d03727e125"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/51f204f979e7455d88199e72de6286de"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Рантайм JS&nbsp;в&nbsp;браузере: event loop</h2>
<p><span style="font-weight: 400;">Прежде чем&nbsp;разбирать структуру промисов, освежим в&nbsp;памяти процесс выполнения JS-кода в&nbsp;браузере. Чтобы код&nbsp;выполнялся, необходимо наличие ряда компонентов (движок, Web&nbsp;API, очереди и&nbsp;цикл событий или&nbsp;event loop). Рантайм – это&nbsp;по&nbsp;своей сути контейнер, который содержит все&nbsp;эти&nbsp;компоненты. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/199f8e7b1f004df7ee5bdf5993d66690"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ab4cc04128224cf59a496d00e048e3c9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2876/frame-216.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/60612be4f89c0798500a199e9d2cfd7b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0efbf6c724704ca9ae31995d2dae3fd7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Web API&nbsp;хранит в&nbsp;себе асинхронные операции и&nbsp;не&nbsp;является частью движка JS, но&nbsp;предоставляет окружение, набор API, предоставляемых движку JS&nbsp;для&nbsp;его&nbsp;взаимодействия с&nbsp;вебом. На&nbsp;схеме для&nbsp;примера изображены 4 сегмента API, но&nbsp;на&nbsp;деле их&nbsp;может быть неограниченное множество. </span></p>
<p><span style="font-weight: 400;">Очередь состоит из&nbsp;коллбэков –  операций, которые были отложены по&nbsp;времени ввиду асинхронного поведения JS.</span></p>
<p><span style="font-weight: 400;">Движок – сердце JS, без&nbsp;которого исполнение кода невозможно. </span></p>
<p><span style="font-weight: 400;">Куча (heap) содержит в&nbsp;себе ссылочные элементы. На&nbsp;взаимодействие с&nbsp;ними тратится больше ресурсов, чем&nbsp;на&nbsp;те, что&nbsp;в&nbsp;стеке, в&nbsp;котором содержатся статичные элементы. Стек помимо хранения примитивных данных выполняет поступающие к&nbsp;нему инструкции. Действует по&nbsp;принципу last in&nbsp;– first out. То&nbsp;есть когда приходит какой&#8209;то&nbsp;элемент, он&nbsp;накладывается сверху и&nbsp;будет исполнен в&nbsp;самую первую очередь.</span></p>
<p><span style="font-weight: 400;">Цикл событий (event loop) играет роль дирижёра, который делает корректным выполнение программы. </span></p>
<p><span style="font-weight: 400;">Когда стек пустой, ивент луп&nbsp;прокручивается, смотрит в&nbsp;очередь, обнаруживает, есть ли&nbsp;там&nbsp;колбэк, который можно было бы&nbsp;прокинуть в&nbsp;пустой стек. Если есть, то&nbsp;делает это. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/81a47238871bb8d25f85d682980cbad4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0c78ce0a6eae4a6eb511fc50fea7e08f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Микротаски и&nbsp;макротаски</h2>
<p><strong><img src="/Media/2877/frame-217.png" alt=""></strong></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3e9a60c2243744ad9ecc35f79f8f490e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Существуют две&nbsp;очереди асинхронных операций: очереди микро- и&nbsp;макротасок. Микротаски имеют более высокий приоритет исполнения. Поэтому когда event loop прокручивается, ему&nbsp;не&nbsp;важно, сколько в&nbsp;очереди макротасок – он&nbsp;возьмёт микротаску, даже если она&nbsp;в&nbsp;очереди единственная, а&nbsp;макротасок 500.</span></p>
<p><span style="font-weight: 400;">Можно сказать, что&nbsp;у&nbsp;JS&nbsp;нет&nbsp;никакого концепта времени, все&nbsp;асинхронные операции происходят вне&nbsp;движка. Call stack слепо исполняет те&nbsp;инструкции, которые ему&nbsp;передаёт event loop, координирующий работу всей программы. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6429adf0f0e0e6210c6abf2130d72d27"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ddf8a6f9ca18458495e5299cd08b89e5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Ад колбеков (callback hell)</h2>
<p><span style="font-weight: 400;">Асинхронности в&nbsp;JS-коде можно добиться, используя колбеки (обратные вызовы). Это&nbsp;такие функции-соглашения, которые возвращают результат не&nbsp;сразу, а&nbsp;спустя какое&#8209;то&nbsp;время. В&nbsp;колбеки вкладывается код, который должен выполняться после завершения определённой операции –  например, загрузки какого-нибудь изображения. То&nbsp;есть пользователь сразу увидит, например, текстовый контент на&nbsp;странице, а&nbsp;не&nbsp;будет ждать его&nbsp;появления только после прогрузки изображения, которое расположено выше. </span></p>
<p><span style="font-weight: 400;">Для обеспечения возможности общения клиента с&nbsp;сервером используются AJAX (от&nbsp;англ. Asynchronous JavaScript and&nbsp;XML) запросы. XML&nbsp;в&nbsp;этой связке сейчас уже&nbsp;нет&nbsp;– в&nbsp;ходу JSON-файлы, но&nbsp;название AJAX закрепилось и&nbsp;осталось неизменным.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/895ea8301792f399e11ca9af287996e9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e0f29f911dbe482f90a87836302bb5a9"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Ад колбэков можно узнать по&nbsp;вложенной структуре в&nbsp;коде. Получается что&#8209;то&nbsp;вроде «пирамидки». Такой код&nbsp;сложно читать и&nbsp;поддерживать. И&nbsp;чем&nbsp;пирамидальная структура глубже, тем&nbsp;сложнее. </span></p>
<p><span style="font-weight: 400;">Чтобы сделать структуру запросов плоской и&nbsp;упростить ее&nbsp;понимание, была внедрена конструкция промисов. </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/c3b40abe6df145a080f00d086b4f085e"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2881/&#x430;&#x434;-&#x43A;&#x43E;&#x43B;&#x43B;&#x431;&#x44D;&#x43A;&#x43E;&#x432;-&#x43F;&#x438;&#x440;&#x430;&#x43C;&#x438;&#x434;&#x43A;&#x430;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a7d7fc74cd81dc2946608c284f2449e2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/293bc769361445e09cc672920b1ee228"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Промисы: понятие и&nbsp;синтаксис</h2>
<p><span style="font-weight: 400;">Промисы помогают работать без&nbsp;ада&nbsp;колбэков. Сам&nbsp;по&nbsp;себе промис – это&nbsp;особый объект, используемый в&nbsp;качестве плейсхолдера для&nbsp;будущего значения завершенной асинхронной операции. Промис (англ. promise – обещать) как&nbsp;бы&nbsp;«обещает» создать это&nbsp;значение, которое на&nbsp;настоящий момент не&nbsp;установлено.</span></p>
<p><span style="font-weight: 400;">Внутри промиса находится исполнительская функция, которая берёт в&nbsp;себя 2 колбэка. Если функция выполняется  успешно, то&nbsp;отрабатывает колбэк resolve, который принимает в&nbsp;себя получившийся в&nbsp;результате аргумент. На&nbsp;примере это&nbsp;строка «Все прошло отлично». Если же&nbsp;промис отклоняется и&nbsp;возникает ошибка, получаем reject. На&nbsp;примере это&nbsp;строчка «Что-то пошло не&nbsp;так». Аргументами могуты быть строка, число функция, объект.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6c31bffb145e499288039f15ba4c9fbd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <pre><code class="language-javascript">{
 const promise = new&nbsp;Promise((resolve, reject) =&gt; {
if(allWentWell) {
resolve('Все прошло отлично!');
} else {
reject('Что-то пошло не&nbsp;так');
}
});
</code></pre>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/93444c28f65a4899838260a9eb55ed68"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Вот создали мы&nbsp;промис, и&nbsp;что&nbsp;дальше? Нужно настроить сценарии его&nbsp;работы. Чтобы получить его&nbsp;результат и&nbsp;взаимодействовать с&nbsp;ним, используем метод then. На&nbsp;случай ошибки можем использовать для&nbsp;отработки функции метод catch. А&nbsp;еще&nbsp;применим блок finally. Если представить, что&nbsp;промис – это&nbsp;вечеринка, то&nbsp;пройти она&nbsp;может хорошо либо плохо. Однако независимо от&nbsp;того, как&nbsp;она&nbsp;пройдёт, после неё&nbsp;нужно прибраться. Finally – это&nbsp;такой «уборщик» – он&nbsp;знает, что&nbsp;вечеринка закончилась – успешно или&nbsp;нет&nbsp;– он&nbsp;приберётся. Внутри у&nbsp;него нет&nbsp;аргумента, и&nbsp;вне&nbsp;зависимости от&nbsp;успешности операции он&nbsp;нам&nbsp;сообщит, что&nbsp;промис завершён. </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e81fe18b2da1400cbb763b3bd80a56dc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<pre><code class="language-javascript">{
 new&nbsp;Promise((resolve, reject) =&gt; {
  setTimeout(() =&gt; resolve("value"), 2000);
})
  .finally(() =&gt; alert("Промис завершен")) // finally отработает первым
  .then(result =&gt; alert(result)); // выводится "value"
</code></pre>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f21b3903de3948dab46658b383b20145"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <pre><code class="language-javascript">{
 new&nbsp;Promise((resolve, reject) =&gt; {
    throw new&nbsp;Error("error");
  })
    .finally(() =&gt; alert("Промис завершен")) // finally отработает первым
    .catch(err =&gt; alert(err)); // выводится ошибка
</code></pre>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8c489f8df6529e124b6d60f38f777979"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6b002ed27fff4b0c8dd5598946701642"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Разбираем на&nbsp;примере</h3>
<p> </p>
<pre><code class="language-javascript">{
 function loadScript(src) {
  return new&nbsp;Promise(function(resolve, reject) {
    let&nbsp;script = document.createElement('script');
    script.src = src;
    script.onload = () =&gt; resolve(script);
    script.onerror = () =&gt; reject(new Error(`Ошибка загрузки скрипта ${src}`));
    document.head.append(script);
  });
}
</code></pre>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c3de710b08a04bcbbaefc29c474dd909"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <pre><code class="language-javascript">{
let&nbsp;promise = loadScript("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js");


promise.then(
  script =&gt; alert(`${script.src} загружен!`),
  error =&gt; alert(`Ошибка: ${error.message}`)
);


promise.then(script =&gt; alert('Ещё один обработчик...'));
</code></pre>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3d87765b8d8c40b79fadec9ff22e118d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">На верхнем примере функция loadScript возвращает промис, который добавляет какой&#8209;то&nbsp;скрипт на&nbsp;сайт. Мы&nbsp;здесь предусматриваем 2 сценария, поэтому прописываем два&nbsp;колбека: resolve и&nbsp;reject. </span></p>
<p><span style="font-weight: 400;">На втором изображении видим, как&nbsp;это&nbsp;выглядит в&nbsp;коде. Мы&nbsp;вызываем промис и&nbsp;применяем блок then. В&nbsp;этом случае then может принимать не&nbsp;только успешный результат, но&nbsp;и&nbsp;второй аргумент – ошибку. Здесь можем обойтись без&nbsp;catch – это&nbsp;слегка перегружает код, но&nbsp;допустимо. К&nbsp;промису метод then можно применять неограниченное число раз, и&nbsp;каждый раз&nbsp;метод будет отрабатывать с&nbsp;одним и&nbsp;тем&nbsp;же&nbsp;результатом промиса. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5252e652513eb14ee6445cac9ea740db"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0d98eac455454380864dba56fbbf9098"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Возможные состояния промиса</h3>
<p><img src="/Media/2878/frame-218.png" alt=""></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6aadf31bb8e4471bba4b6194332c1cdb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Когда промис только создан, он&nbsp;находится в&nbsp;состоянии pending. Далее он&nbsp;устанавливается в&nbsp;код&nbsp;(settled), после чего выполняется функция. Из&nbsp;settled в&nbsp;другое состояние промис может перейти лишь единожды. Все&nbsp;попытки изменить состояние промиса после первого изменения будут проигнорированы. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ae43de860819457d8f7822f5d7313549"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h3>Промисы: цепочка</h3>
<p><span style="font-weight: 400;">Чтобы объединить несколько промисов в&nbsp;цепочку, нужно вызвать первый промис, а&nbsp;потом за&nbsp;счет использования then вызывать последующие промисы. Если первый вложенный в&nbsp;цепочку промис отработает успешно и&nbsp;вернет результат, то&nbsp;следующий за&nbsp;ним&nbsp;промис, вызванный через then будет работать с&nbsp;данными из&nbsp;предыдущего промиса. И&nbsp;так&nbsp;по&nbsp;цепочке.</span></p>
<p> </p>
<pre><code class="language-javascript">{
const promise1 = new&nbsp;Promise((resolve, reject) =&gt; {
  resolve('Promise1 выполнен');
});
const promise2 = new&nbsp;Promise((resolve, reject) =&gt; {
  resolve('Promise2 выполнен');
});
const promise3 = new&nbsp;Promise((resolve, reject) =&gt; {
  reject('Promise3 отклонен');
});
promise1
  .then((data) =&gt; { //в data - результат выполнения Promise1
    console.log(data);  // Promise1 выполнен
    return promise2;
  })
  .then((data) =&gt; { //в data - результат выполнения Promise2
    console.log(data);  // Promise2 выполнен
    return promise3;
  })
  .then((data) =&gt; { //в data - результат выполнения Promise3   
console.log(data);
  })
  .catch((error) =&gt; {
    console.log(error);  // Promise3 отклонен
  });

</code></pre>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/adc47476897f4922b98d84fa2f0f62af"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Таким образом, каждый следующий после первого промис в&nbsp;цепочке будет работать со&nbsp;значением того промиса, который был&nbsp;в&nbsp;цепочке перед ним.</span></p>
<p><span style="font-weight: 400;">В теории и&nbsp;методы then можно вложить друг в&nbsp;друга, и&nbsp;такой код&nbsp;будет работать, но&nbsp;делать так&nbsp;не&nbsp;стоит.</span></p>
<h3>Перехват ошибок</h3>
<p><span style="font-weight: 400;">Если в&nbsp;ходе выполнения операции возникает ошибка, она&nbsp;отправляется в&nbsp;ближайший обработчик onRejected. Его&nbsp;можно поставить через второй аргумент .then(..., onRejected).  Второй  способ - более читабельный – через использование .catch(onRejected).</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/46a83c0a88054edf800ac471afd4f07e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<pre><code class="language-javascript">{
function getFromServer(url) {
  return new&nbsp;Promise(function (resolve, reject) {
    let&nbsp;response
    /*...*/
    resolve(response)
  })
}

getFromServer('/api/users/1')
  .then((user) =&gt; getFromServer(`/api/photos/${user.id}/`))
  .then((photo) =&gt; getFromServer(`/api/crop/${photo.id}/`))
  .then((response) =&gt; console.log(response))
  .catch((error) =&gt; console.error(error))

</code></pre>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ecc577cad7d54e2cb7991294abd59f69"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Благодаря перехвату ошибок, если что&#8209;то&nbsp;пошло не&nbsp;так, то&nbsp;программа не&nbsp;упадёт, а&nbsp;управление перейдёт к&nbsp;последней строчке с&nbsp;catch(), причём независимо от&nbsp;того, в&nbsp;каком из&nbsp;запросов ошибка появится.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ffac2c5fd642a7063cc3ff166b3494e4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/79c359ce687f4ee98da10515c2b9bd9b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Функции Async/Await</h2>
<p><span style="font-weight: 400;">Альтернатива коду, который используют промисы – async-функции. По&nbsp;сути это&nbsp;те&nbsp;же&nbsp;промисы, но&nbsp;они&nbsp;позволяют организовать работу с&nbsp;асинхронным кодом в&nbsp;синхронном стиле. Используя конструкцию async/await можно полностью избежать использования цепочек промисов. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cef6091741434ef78fc666bd7a225ac8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><img src="/Media/2879/frame-219.png" alt=""></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3e6a0ce5c1f14e6699e99ff7d201f9cf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Если коротко, то&nbsp;асинхронная функция – это&nbsp;функция, которая возвращает промис. Если мы&nbsp;сравним функцию слева (изображение выше), которая нам&nbsp;явно возвращает промис, и&nbsp;функцию справа, то&nbsp;делают они&nbsp;одно и&nbsp;то&nbsp;же. За&nbsp;счет того, что&nbsp;во&nbsp;  второй функции есть ключевое слово async, она&nbsp;становится асинхронной. </span></p>
<p><span style="font-weight: 400;">Для случая слева, чтобы вывести hello в&nbsp;консоль, нам&nbsp;нужно будет написать вот&nbsp;какой код:</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8eb4acd9690b4c46ab88244a73a0598f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<pre><code class="language-javascript">{
function fn() {
return Promise.resolve('hello');
}
fn().then(console.log);
// hello 
</code></pre>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c21c018c0e3b48efad15e1d2ad45b55e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">То есть, чтобы промис отработал, используем метод then. </span></p>
<p><span style="font-weight: 400;">Для формулы справа, чтобы вывести в&nbsp;консоль hello, нужно написать вот&nbsp;что:</span></p>
<p> </p>
<pre><code class="language-javascript"><br>{
async function fn() {
return 'hello';
}
fn().then(console.log)
// hello
</code></pre>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/22076067ef71564e20b18c2ee8af1caa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2f4580796ad6455ca9441f2ebc2e5de9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Async/Await: синтаксис</h3>
<p> </p>
<pre><code class="language-javascript"><br>{
async function f() {
	let&nbsp;promise = new&nbsp;Promise((resolve, reject) =&gt; {
		setTimeout(() =&gt; resolve("готово"), 1000)
});
let&nbsp;result = await promise; // будет ждать, пока промис не&nbsp;выполнится (*)
alert(result); // "готово!"
}
f();<br><br></code></pre>
<p> </p>
<p><span style="font-weight: 400;">На примере выше появляется ключевое слово await. Оно&nbsp;находится внутри асинхронной функции. Await пишется перед любой основанной на&nbsp;промисе функцией. Когда она&nbsp;будет выполняться, на&nbsp;этой строчке парсер остановится и&nbsp;дождется, пока промис вернет результат. Результат запишется в&nbsp;переменную result, с&nbsp;которым затем можно будет работать. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c8f75013082f720bf8188783a41451d2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/3e214b77708642a8b7209b292ef43f49"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2882/frame-220.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/54d6e2961f244009a05dadeb696b5ed9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">На примерах выше показано сравнение синтаксиса в&nbsp;цепочке промисов и&nbsp;async/await функциях. По&nbsp;сути это&nbsp;один и&nbsp;тот&nbsp;же&nbsp;код, просто написан он&nbsp;по-разному. Используя async/await, избавляемся от&nbsp;нагромождения then. Это&nbsp;получается за&nbsp;счет последовательности промисов, которые вернут результат через await. Ошибки в&nbsp;исполнении операций здесь также можем отловить через catch.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/31330d14f175fcac4f85d84377dc02e1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0e27041c4bdb494d910617703ca8b290"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Параллельное выполнение промисов</h2>
<p><span style="font-weight: 400;">У промисов есть отдельные методы, позволяющие работать с&nbsp;параллельным выполнением и&nbsp;асинхронными запросами – это&nbsp;так&nbsp;называемые комбинаторы промисов. Всего существует 4 комбинатора промисов: Promise.all, Promise.any, Promise.allSettled, Promise.race.</span></p>
<p><span style="font-weight: 400;">Все эти&nbsp;комбинаторы используются одинаково с&nbsp;точки зрения их&nbsp;синтаксиса: принимают в&nbsp;себя массив промисов, но&nbsp;отличаются друг от&nbsp;друга форматом возвращаемых в&nbsp;.then данных.</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/7d00f897b6a74a40af3f548a798d485d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2875/frame-221.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/86c58953733c8186c46c56188a6d9e7b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b94eceef17c64229b58bb26e93ea7351"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">В случае с&nbsp;комбинаторами Promise.all и&nbsp;Promise.allSettled возвращаемым значением будет массив значений, полученных по&nbsp;результатам обработки промиса.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e59778dd737c43c7b1156baaa1c08638"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2883/&#x43A;&#x43E;&#x43C;&#x431;&#x438;&#x43D;&#x430;&#x442;&#x43E;&#x440;&#x44B;-&#x43F;&#x440;&#x43E;&#x43C;&#x438;&#x441;-&#x43E;&#x43B;&#x43B;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4cf75ee4406e82119001ddbb2a31be47"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2b1761898386495d90f27c9675d0e5f8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">При этом Promise.all отклоняется целиком, если был&nbsp;отклонен хотя бы&nbsp;один из&nbsp;переданных ему&nbsp;в&nbsp;качестве аргумента промисов.</span></p>
<p><span style="font-weight: 400;">Promise.all следует использовать, если для&nbsp;корректной работы программы нужны все&nbsp;успешно полученные значения разрешенных промисов, но&nbsp;при&nbsp;этом очередность их&nbsp;получения для&nbsp;логики программы не&nbsp;важна - важен лишь успешный результат каждого из&nbsp;них.</span></p>
<p><span style="font-weight: 400;">Promise.allSettled разрешается вне&nbsp;зависимости от&nbsp;того, был&nbsp;ли&nbsp;отклонен какой-либо из&nbsp;переданных ему&nbsp;промисов, и&nbsp;возвращает массив объектов, каждый из&nbsp;которых включает в&nbsp;себя, помимо самого значения обработанного промиса, также и&nbsp;статус обработки соответствующего промиса (‘fulfilled’ или&nbsp;‘rejected’).</span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/b054d18e60124df4bb2bcbf02ec7f50c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2884/&#x43A;&#x43E;&#x43C;&#x431;&#x438;&#x43D;&#x430;&#x442;&#x43E;&#x440;&#x44B;-&#x43F;&#x440;&#x43E;&#x43C;&#x438;&#x441;-&#x43E;&#x43B;&#x43B;-&#x441;&#x435;&#x442;&#x442;&#x43B;&#x434;.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/89c0e2891837496592b8d6dfe67c08e4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Promise.allSettled нужно использовать в&nbsp;тех&nbsp;случаях, когда для&nbsp;корректной работы программы не&nbsp;требуются все&nbsp;результаты каждого из&nbsp;промисов - достаточно лишь части из&nbsp;них.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/237b57f2d5c5bf91a00ea5a9f43aa87b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c81b1620399a4947bacdecbd899c6b57"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">При использовании Promise.any и&nbsp;Promise.race результатом всегда будет значение лишь одного из&nbsp;переданных в&nbsp;качестве аргумента промисов. Отличие между этими двумя комбинаторами в&nbsp;том, что&nbsp;Promise.any будет ждать первого успешно выполненного промиса и&nbsp;отклонится в&nbsp;том&nbsp;случае, если были отклонены все&nbsp;переданные ему&nbsp;промисы.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ce3d2f08787c4cb2b0cb3eda6fb98769"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2885/&#x43A;&#x43E;&#x43C;&#x431;&#x438;&#x43D;&#x430;&#x442;&#x43E;&#x440;&#x44B;-&#x43F;&#x440;&#x43E;&#x43C;&#x438;&#x441;-&#x44D;&#x43D;&#x438;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d415d5d3e3e8a37c0cbf51b62549665d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d861c501ba3f499eb387445de7546734"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Promise.any целесообразно использовать, когда нас&nbsp;интересует лишь значение самого быстрого разрешенного промиса.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/a073ee898a6d0df4920e568a47b774e7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/450421a2b79141119c1eede026d6ee9e"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Promise.race не&nbsp;ждет именно успешно выполненного промиса – ему&nbsp;важен лишь тот, который был&nbsp;обработан быстрее всех остальных, вне&nbsp;зависимости от&nbsp;того, был&nbsp;ли&nbsp;результат обработки успешным.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/8ab8db6172ec4c688f3417f450c23841"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2886/&#x43F;&#x440;&#x43E;&#x43C;&#x438;&#x441;-&#x440;&#x44D;&#x439;&#x441;.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6400c1d1e54b661225f21b16e7094400"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/27479e5dbc08484dbaf987686adcf4aa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Promise.race используют, когда для&nbsp;программы неважно, был&nbsp;ли&nbsp;самый быстрый промис разрешен или&nbsp;отклонен - важен сам&nbsp;факт завершения обработки самого быстрого из&nbsp;них.</span></p>
<p><span style="font-weight: 400;">Разница между комбинаторами промисов и&nbsp;множественными последовательными await/промисами в&nbsp;скорости запроса данных с&nbsp;сервера. Комбинаторы делают возможным параллельное выполнение запросов, а&nbsp;не&nbsp;последовательное, поэтому операции выполняются в&nbsp;разы быстрее. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ec2f19f7d6d4b7920e1012cf1a61ef29"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/59677321733f49c98e1e8e978410ed9b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Top-level await</h2>
<p><span style="font-weight: 400;">Раньше ключевое слово await можно было использовать только в&nbsp;async функциях, что&nbsp;иногда требовало прибегать к&nbsp;использованию конструкции IIFE (immediately invoked function expression).&nbsp;</span></p>
<p><span style="font-weight: 400;"><img src="/Media/2887/топ-левел-эвейт.png" alt=""></span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3d6b5f8477b64377afcf325370f3205a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">В стандарт ES2022 был&nbsp;включен верхнеуровневый await (top-level await), который доступен в&nbsp;скриптах типа module.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c65b7d166afc78c6d93fbe3d25b5cd0c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6f44ec37e4b64d5a9bd72c5460c13580"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Когда выбирать синхронное взаимодействие, а&nbsp;когда асинхронное?</h2>
<p><span style="font-weight: 400;">Синхронный код&nbsp;используется, когда нужно обеспечить выполнение кода в&nbsp;строго заданном порядке. Асинхронный – в&nbsp;тех&nbsp;случаях, когда код&nbsp;может занять продолжительное время прежде чем&nbsp;закончить свое выполнение, и&nbsp;при&nbsp;этом это&nbsp;его&nbsp;выполнение не&nbsp;должно блокировать исполнение другого кода. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как не надо проводить performance review
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Анти-топ ошибок в PR’ах, на которых мы учились. Используйте как чек-лист перед ревью — или распечатайте и повесьте на видное место.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/perfomance-review-mistakes/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/perfomance-review-mistakes/</guid>

                <pubDate>Tue, 06 May 2025 13:02:10 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как не надо проводить performance review</h1>
                                <figure>
                                    <img src="/Media/2902/frame-269.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/0506327c2fff0a163867c6b1cf45701b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/673fe21b988f40fda3ef7aba4a6c7312"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Performance review для&nbsp;сотрудников мы&nbsp;проводим более 10 лет, и&nbsp;проходили мы&nbsp;этот путь не&nbsp;без&nbsp;ошибок. Хорошо, что&nbsp;на&nbsp;ошибках можно учиться — из&nbsp;них&nbsp;мы&nbsp;сложили анти&#8209;топ&nbsp;и&nbsp;используем его&nbsp;как&nbsp;чек-лист для&nbsp;подготовки ревью.  </span></p>
<h2>Как мы&nbsp;проводим performance review</h2>
<p><span style="font-weight: 400;">Раз в&nbsp;6 месяцев (или&nbsp;после испытательного срока у&nbsp;новичков) мы&nbsp;собираем обратную связь о&nbsp;работе сотрудника у&nbsp;от&nbsp;него самого, коллег, руководителей и&nbsp;наших клиентов. Руководитель анализирует эту&nbsp;информацию и&nbsp;проводит встречу с&nbsp;сотрудником, на&nbsp;которой</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Оценивает результаты работы по&nbsp;проектам и&nbsp;предыдущим целям</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Обсуждает и&nbsp;проясняет с&nbsp;сотрудником результаты работы и&nbsp;обратную связь</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Даёт пояснения и&nbsp;рекомендации по&nbsp;поводу разрешения проблем в&nbsp;работе</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Обсуждает видение дальнейших карьерных планов и&nbsp;развитие сотрудника</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Ставит сотруднику цели по&nbsp;развитию на&nbsp;следующие 6 месяцев</span></li>
</ul>
<p><span style="font-weight: 400;">Результат встречи – отчёт о&nbsp;ревью, где&nbsp;описаны все&nbsp;эти&nbsp;пункты. Он&nbsp;отправляется сотруднику.</span></p>
<p><span style="font-weight: 400;">Теперь перейдем к&nbsp;ошибкам, которых мы&nbsp;насовершали.</span><span style="font-weight: 400;"></span><span style="font-weight: 400;"></span></p>
<h2>Ошибка 1 — Проводить performance review просто чтобы было</h2>
<p><span style="font-weight: 400;">Смешно, но&nbsp;иногда легко уйти в&nbsp;«</span><a href="https://lifehacker.ru/kargo-kult/"><span style="font-weight: 400;">карго-культ</span></a><span style="font-weight: 400;">». Чтобы это&nbsp;избежать, важно ответить на&nbsp;вопрос: «Зачем?».</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/700b31ca00984d539a94ec727200c2d5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2889/frame-256.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6b6ef767cadd410ba828eac8dd4c4f6b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Для нас&nbsp;это&nbsp;</span><strong>формальный цикл обратной связи</strong> между сотрудником и&nbsp;руководством,<span style="font-weight: 400;"> и&nbsp;вот&nbsp;зачем он&nbsp;нужен.</span></p>
<p><span style="font-weight: 400;"><strong>Для сотрудника:</strong> </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Получить ясное представление о&nbsp;том, насколько его&nbsp;работа соответствует ожиданиям. Понять, что&nbsp;получается хорошо и&nbsp;что&nbsp;можно улучшать.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Получить представление о&nbsp;дальнейшем развитии в&nbsp;команде и&nbsp;запланировать это&nbsp;развитие.</span></li>
</ul>
<p><strong>Для руководителя: </strong></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Целостно оценить вклад сотрудника за&nbsp;последний период в&nbsp;разрезе нескольких проектов.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Получить представление об&nbsp;актуальном грейде сотрудника, чтобы в&nbsp;будущем знать, за&nbsp;какого типа проекты он&nbsp;может браться и&nbsp;на&nbsp;какую зарплату претендовать.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Достигать целей компании за&nbsp;счет последовательного развития сотрудников.</span></li>
</ul>
<p><span style="font-weight: 400;">Это не&nbsp;значит, что&nbsp;обратной связью мы&nbsp;обмениваемся только на&nbsp;performance review  – это&nbsp;происходит и&nbsp;по&nbsp;ходу работы. Просто здесь есть четкая  структура и&nbsp;формальная  фиксация результатов. </span></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7a03523f404b494dbcf60328a96aa3a9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Ошибка 2 — Проводить не&nbsp;регулярно</h2>
<p><span style="font-weight: 400;">Легко отодвинуть HR&nbsp;процессы на&nbsp;второй план, когда горит проект. Чем&nbsp;больше пропущенных ревью, тем&nbsp;хуже соотношение ожиданий и&nbsp;реальности. Сотрудник не&nbsp;понимает, насколько хорошо он&nbsp;справляется с&nbsp;работой и&nbsp;растёт ли, а&nbsp;руководитель ждёт результатов, на&nbsp;которые сотрудник может вовсе не&nbsp;ориентироваться. Как&nbsp;итог – разочарование с&nbsp;обеих сторон.</span></p>
<p><span style="font-weight: 400;">Да и&nbsp;обратную связь сложно собрать, если все&nbsp;уже&nbsp;забыли, что&nbsp;там&nbsp;было на&nbsp;тех&nbsp;проектах… Сотрудники начинают думать, что&nbsp;про&nbsp;них&nbsp;забыли.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/adc010018a3441e3a624b4d353faa3f6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2890/frame-257.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/130312683a95432c885a66c87aa443a0"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 3 — Не&nbsp;готовиться</h2>
<p><span style="font-weight: 400;">Если не&nbsp;подготовиться к&nbsp;встрече заранее, в&nbsp;лучшем случае придётся на&nbsp;ходу анализировать, формулировать мысли, мычать, подбирать слова. Это&nbsp;криво, непонятно, долго и&nbsp;плохо. В&nbsp;худшем – фидбек по&nbsp;сотруднику будет состоять просто из&nbsp;зачитывания чужих сообщений as&nbsp;is, без&nbsp;анализа и&nbsp;конструктивных выводов. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/37a5ba603bf848dcaf305963c92c4d30"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2892/frame-259.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b877e3ada6e24fd2bcae3af0a7d0910d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Важно выделить время заранее и&nbsp;отрефлексировать: оценить вклад сотрудника в&nbsp;целости, вывести общие и&nbsp;наиболее важные достижения, отметить зоны роста, продумать речь.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1d7a5584ca2a415fae33294f3e6fa885"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 4 — Директивный стиль</h2>
<p><span style="font-weight: 400;">Руководитель зачитывает свое заключение-приговор и&nbsp;отпускает сотрудника переваривать. Так&nbsp;многие новички и&nbsp;представляют ревью.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/69d1ecb7683c4c19b85cd0ba9e02ee87"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2891/frame-258.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d641798cf54c494499671506d3a77d87"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Одна из&nbsp;наших ценностей – «Общение на&nbsp;равных». На&nbsp;трудовые отношения это&nbsp;тоже распространяется. Мы&nbsp;выстраиваем партнёрские отношения и&nbsp;договариваемся о&nbsp;взаимных ожиданиях на&nbsp;старте.  Важно сохранять этот диалог и&nbsp;после трудоустройства.</span></p>
<p><strong>Перед ревью</strong><span style="font-weight: 400;"> мы&nbsp;просим сотрудника самостоятельно оценить результаты, достижения, свой уровень, подумать над&nbsp;препятствиями в&nbsp;работе и&nbsp;тем, куда хочется развиваться.</span></p>
<p><strong>На ревью</strong><span style="font-weight: 400;"> обсуждаем и&nbsp;проясняем детали. Если наши оценки реальности отличаются, обсуждаем, что&nbsp;ждём друг от&nbsp;друга. Ревьювер даёт свои советы и&nbsp;рекомендации о&nbsp;том, как&nbsp;лучше спланировать развитие или&nbsp;избавиться от&nbsp;проблем в&nbsp;работе.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/257f98a7beca463cb2f8d858d5319819"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 5 — Не&nbsp;собрать нужные отзывы от&nbsp;ключевых людей</h2>
<p><span style="font-weight: 400;">Бывает, что&nbsp;HR&nbsp;собрал отзывы по&nbsp;сотруднику, и, не&nbsp;дождавшись отзывов от&nbsp;одного N, мы&nbsp;провели ревью с&nbsp;максимально положительным фидбеком. Позже оказалось, что&nbsp;этот N&nbsp;как&nbsp;раз&nbsp;руководил проектом, где&nbsp;работал сотрудник, и&nbsp;N&nbsp;очень негодует:  сотрудник совершенно не&nbsp;справился с&nbsp;задачами.</span></p>
<p><span style="font-weight: 400;">Если отзывы собирает HR, мы&nbsp;всегда указываем руководителей проектов от&nbsp;которых обязательно надо получить отзывы, иначе ревью не&nbsp;может состояться.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ea93ac1292e64782afe83af7570bc5d9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2893/frame-260.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/db272d0c03374a46ae4c48029bb8c2af"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 6 — Давать всем отзывам одинаковый вес</h2>
<p><span style="font-weight: 400;">Отзыв коллеги неравен отзыву руководителя проектов. Коллеги чаще не&nbsp;могут оценить, как&nbsp;человек справляется с&nbsp;задачами, ведь сами они&nbsp;задачи не&nbsp;ставят и&nbsp;возможностей для&nbsp;сравнения результатов у&nbsp;них&nbsp;нет. </span></p>
<p><span style="font-weight: 400;">В нашем случае отзывы руководителей и&nbsp;клиентов весомее. Они&nbsp;помогают оценить результаты и&nbsp;качество работы. Отзывы коллег помогают оценить навыки коммуникации и&nbsp;командной работы.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/3f455ad395244b35aedd0f691bdcee23"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2894/frame-261.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7d1a8f9a12e84e65b68984a56ed85dfe"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 7 — Поверхностные отзывы и&nbsp;самооценка</h2>
<p><span style="font-weight: 400;">Бывает, что&nbsp;в&nbsp;отзыве или&nbsp;самооценке вроде написано что&#8209;то&nbsp;важное, но&nbsp;не&nbsp;очень понятное. На&nbsp;этапе подготовки надо дополнительно такие моменты прояснить: попросить у&nbsp;автора примеры поведения или&nbsp;какие&#8209;то&nbsp;дополнительные комментарии.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ecb4cff89ab64060a2f759e4c9dc1e69"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2895/frame-262.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f84249c8e180492892ddd708c091e270"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 8 — Не&nbsp;проверять результаты </h2>
<p><span style="font-weight: 400;">Сотрудник говорит: «Я сделал ABC», а&nbsp;ревьюер ему&nbsp;верит на&nbsp;слово и&nbsp;говорит: «Вот и&nbsp;молодец!». </span></p>
<p><span style="font-weight: 400;">Это редкость в&nbsp;командах, где&nbsp;ревьювер плотно работает со&nbsp;всеми сотрудниками. У&nbsp;нас&nbsp;ревьювер – это, например, руководитель направления .NET разработки, который(ая) может напрямую не&nbsp;работать с&nbsp;сотрудником на&nbsp;проектах. Поэтому часто достижения и&nbsp;результаты мы&nbsp;просим подтвердить, например:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">отзывами руководителя или&nbsp;коллег;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">показателями и&nbsp;метриками проектов и&nbsp;работы;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">ссылками на&nbsp;конкретные артефакты (например, написанные статьи);</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Прохождением обучения, сертификацией на&nbsp;руках, сдачей экзаменов;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">внутренними аттестациями;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">для задач по&nbsp;развитию навыков часто просим сделать доклад на&nbsp;тему или&nbsp;провести обучение.</span></li>
</ul>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b10ee87024b2439ea0e8e400dcd4e828"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 9 — Заминать негативный фидбек</h2>
<p><span style="font-weight: 400;">Давать негативный фидбек и&nbsp;получать его&nbsp;не&nbsp;нравится никому. Но&nbsp;без&nbsp;него бывает не&nbsp;обойтись. </span></p>
<p><span style="font-weight: 400;">Здесь главное обсуждать не&nbsp;человека, а&nbsp;его&nbsp;работу и&nbsp;результаты.</span></p>
<p><span style="font-weight: 400;"><img src="/Media/2896/frame-263.png" alt=""></span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b5f11bcf4d104985af2d57102683aaec"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 10 — Забывать хвалить и&nbsp;благодарить</h2>
<p><span style="font-weight: 400;">«Вроде как&nbsp;Федя справляется со&nbsp;всем, всё&nbsp;нормально, ну&nbsp;так&nbsp;и&nbsp;должно быть, можно расходиться…»</span></p>
<p><span style="font-weight: 400;">Нет. Если всё&nbsp;и&nbsp;вправду хорошо, руководитель просто обязан поблагодарить Федю,  ведь на&nbsp;таких надёжных ребятах и&nbsp;команда и&nbsp;держится. Они&nbsp;должны знать, что&nbsp;их&nbsp;ценят и&nbsp;понимать, благодаря чему это&nbsp;у&nbsp;них&nbsp;получается. И&nbsp;вообще сильные стороны сотрудников важнее слабых!</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6cb1ab2cb3fc45baa243b9444dd55673"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2897/frame-264.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/382e20fce01641d282f892a690b937ba"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 11 — Давать неконструктивный абстрактный фидбек</h2>
<p><span style="font-weight: 400;">Такой фидбек давать легко. Для&nbsp;конструктивного и&nbsp;конкретного придётся заранее покопать и&nbsp;проанализировать информацию.</span></p>
<p><span style="font-weight: 400;">Свойства конструктивного и&nbsp;конкретного фидбека:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Ясно и&nbsp;прямо описывает результаты работы или&nbsp;поведение сотрудника, а&nbsp;не&nbsp;личность.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Приводит конкретные и&nbsp;недавние примеры из&nbsp;работы.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Дополнительно может описывать последствия поведения, чем&nbsp;помогло или&nbsp;повредило.</span></li>
</ul>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/391e0102fd8a40ab99d9a421e6c6ca69"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2898/frame-265.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fbb61bc34509452db4693ac5cb6ced46"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 12 — Ставить цели без&nbsp;учёта целей компании</h2>
<p><span style="font-weight: 400;">Отталкиваемся не&nbsp;от&nbsp;того, что&nbsp;кажется важным ревьюеру и&nbsp;не&nbsp;от&nbsp;того, что&nbsp;делалось в&nbsp;команде или&nbsp;на&nbsp;проекте раньше. Цели – это&nbsp;всегда что&#8209;то&nbsp;про&nbsp;будущее. Спросите своего руководителя о&nbsp;них.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/a4b4edc2bf984f6d9a1fab943e097db7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2899/frame-266.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9a7045a4205044408e6cba589a3bde72"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 13 — Ставить нечёткие цели для&nbsp;развития без&nbsp;понятных индикаторов</h2>
<p><span style="font-weight: 400;">Как мы&nbsp;поймем, когда цель достигнута? Не&nbsp;всегда получается </span><a href="https://yagla.ru/blog/marketing/celi-smart-kriterii-i-primery--2108u95038/"><span style="font-weight: 400;">ставить цели по&nbsp;SMART</span></a><span style="font-weight: 400;">, особенно трудно это&nbsp;даётся с&nbsp;целями по&nbsp;развитию навыков. Поэтому измеряем достижение целей индикаторами.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/cdb061b9f38740e39c2d4968091156cd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2900/frame-267.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ceead358bee14f08ba9519e26767e347"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Если этого не&nbsp;делать будет ошибка 8.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/269ae57d247d4bd78baaba3d86c139de"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 14 — Ставить не&nbsp;амбициозные цели </h2>
<p><span style="font-weight: 400;">Это, например: «Продолжать делать хорошую работу». Чаще это&nbsp;какие&#8209;то&nbsp;мелочи, которые просто делаются сотрудником такого уровня на&nbsp;раз&nbsp;(или&nbsp;делались в&nbsp;прошлом). Обычно это&nbsp;инициатива сотрудника.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e6bbf8c82e8f43c7a85ae3e7893da6dd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2901/frame-268.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f150187cbb4e4ca189ff6d6b8025d641"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h2>Ошибка 15 — Не&nbsp;выполнять задачи, определённые по&nbsp;итогам ревью</h2>
<p><span style="font-weight: 400;">Часто в&nbsp;ходе ревью руководитель получает фидбек или&nbsp;предлагает сотруднику помощь в&nbsp;решении проблем. Он&nbsp;понимает, что&nbsp;  должен сделать что-то. Все&nbsp;действия, определённые в&nbsp;итоге ревью, мы&nbsp;фиксируем в&nbsp;отчёте.</span></p>
<ul>
<li style="font-weight: 400;" aria-checked="false" aria-level="1"><span style="font-weight: 400;">Офис-менеджер: купить новое рабочее кресло.</span></li>
<li style="font-weight: 400;" aria-checked="false" aria-level="1"><span style="font-weight: 400;">Руководитель разработки: подключить сотрудника к&nbsp;следующему проекту на&nbsp;Next.js.</span></li>
<li style="font-weight: 400;" aria-checked="false" aria-level="1"><span style="font-weight: 400;">HR менеджер: забронировать и&nbsp;оплатить онлайн-курс по&nbsp;TypeScript.</span></li>
</ul>
<p><span style="font-weight: 400;">Важно потом не&nbsp;забыть всё&nbsp;сделать. У&nbsp;нас&nbsp;за&nbsp;этим следит HR. Иначе сотрудники подумают, что&nbsp;ревью это&nbsp;профанация.</span></p>

<div class="text-highlight">
  Делайте ревью полезным, и&nbsp;да&nbsp;поможет вам&nbsp;этот чек-лист!
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как рефакторинг помогает не потратить кучу денег на продукт
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Хочешь масштабировать продукт и расти в прибыли — готовься к росту кода. Почему без своевременного рефакторинга не обойтись — объясняем.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/refactoring-helps-to-save-budget/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/refactoring-helps-to-save-budget/</guid>

                <pubDate>Tue, 06 May 2025 13:00:43 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как рефакторинг помогает не потратить кучу денег на продукт</h1>
                                <figure>
                                    <img src="/Media/2941/frame-300000.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5c61ef26118e24f047f0cd8274df1f69"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/823bb5a3e34a46c69c081c245cdf3e68"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Не откладываем рефакторинг в&nbsp;долгий ящик, чтобы сэкономить на&nbsp;поддержании продукта. Иначе – риск израсходовать горы бюджета, когда рефакторить будет слишком поздно.</span></p>
<p><span style="font-weight: 400;">Рефакторинг – это&nbsp;улучшение качества кода без&nbsp;изменения его&nbsp;функциональности. При&nbsp;рефакторинге кодовая база программного продукта меняется: улучшается структура, код&nbsp;становится более читаемым и&nbsp;поддерживаемым, производительность растет, а&nbsp;сам&nbsp;продукт с&nbsp;точки зрения использования остается прежним. </span></p>
<p><span style="font-weight: 400;">Изменения происходят под&nbsp;капотом и, кажется, не&nbsp;влияют на&nbsp;прибыльность бизнеса, поэтому заказчики могут недооценивать необходимость рефакторинга. Ведь зачем тратить деньги и&nbsp;время, если ничего не&nbsp;меняется?</span></p>
<p><span style="font-weight: 400;">За тем, чтобы не&nbsp;пришлось тратить в&nbsp;разы больше денег и&nbsp;времени потом, когда из&#8209;за&nbsp;пренебрежения рефакторингом ваш&nbsp;продукт превратится в&nbsp;</span><a href="https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9_%D0%BA%D0%BE%D0%BC%D0%BE%D0%BA_%D0%B3%D1%80%D1%8F%D0%B7%D0%B8#:~:text=%D0%A2%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%20%D0%B1%D1%8B%D0%BB%20%D0%BF%D0%BE%D0%BF%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%20%D0%B2%20%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B5,%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%BB%D0%BE%D0%BA%D0%BE%D0%B9%2C%20%D0%B4%D0%B6%D1%83%D0%BD%D0%B3%D0%BB%D0%B8%20%D1%81%D0%BF%D0%B0%D0%B3%D0%B5%D1%82%D1%82%D0%B8-%D0%BA%D0%BE%D0%B4%D0%B0"><span style="font-weight: 400;">большой ком&nbsp;грязи</span></a><span style="font-weight: 400;">. В&nbsp;таком виде он&nbsp;как&nbsp;минимум потребует больших затрат на&nbsp;приведение себя в&nbsp;чувства, а&nbsp;как&nbsp;максимум еще&nbsp;и&nbsp;повлечет убытки из&#8209;за&nbsp;постоянных поломок кода и&nbsp;его&nbsp;кривой работы, порчи данных и&nbsp;простоев сервиса.</span></p>
<h2>Когда нужно проводить рефакторинг кода продукта</h2>
<p><span style="font-weight: 400;">Через год&#8209;два&nbsp;после запуска. Это&nbsp;если коротко. Но&nbsp;давайте поясним. Если продукт претендует на&nbsp;развитие, а&nbsp;бизнес – на&nbsp;увеличение прибыли от&nbsp;его&nbsp;использования, кодовая база продукта неизменно будет расширяться. </span></p>
<p><span style="font-weight: 400;">Со временем понадобится нарастить функциональность: улучшить существующую или&nbsp;добавить новую. Бизнес-требования к&nbsp;продукту могут измениться: потребуется переработать логику или&nbsp;процессы внутри. Поток пользователей возрастет: продукту потребуется возможность выдерживать увеличенные нагрузки. Добавляя новые функции, нужно «сращивать» их&nbsp;с&nbsp;прежними, и&nbsp;это&nbsp;может вызвать сложности, если заниматься только добавлением, закрывая глаза на&nbsp;рефакторинг. </span></p>
<p><img src="/Media/2937/frame-301.png" alt=""></p>
<p><span style="font-weight: 400;">Фреймворки и&nbsp;библиотеки, использованные в&nbsp;коде на&nbsp;старте, будут со&nbsp;временем устаревать. Если вовремя их&nbsp;не&nbsp;обновить, продукт может как&nbsp;минимум обзавестись уязвимостями, влияющими на&nbsp;безопасность его&nbsp;использования. Также несовместимости со&nbsp;старым фреймворком повлекут проблемы с&nbsp;использованием новых библиотек, которые могли бы&nbsp;существенно упростить разработку новой функциональности.</span></p>
<p><span style="font-weight: 400;">Разработчики, участвующие в&nbsp;развитии продукта, неизменно наращивают компетенции. С&nbsp;опытом они&nbsp;пишут более качественный код. Процедура регулярного рефакторинга помогает в&nbsp;уже&nbsp;написанный код&nbsp;внедрять более эффективные и&nbsp;изящные решения.</span></p>
<p><span style="font-weight: 400;">Как правило, повод для&nbsp;проведения рефакторинга – появление какой&#8209;то&nbsp;задачи, которая не&nbsp;вписывается в&nbsp;нынешние рамки проекта по&nbsp;разным причинам. Чтобы такую задачу решить, нужно в&nbsp;чем&#8209;то&nbsp;преобразовать уже&nbsp;существующую кодовую базу, условно говоря «создав место» для&nbsp;новой функциональности.</span></p>
<h2>Временные решения против рефакторинга</h2>
<p><span style="font-weight: 400;">К временным решениям прибегают зачастую в&nbsp;случаях, когда задержки могут привести к&nbsp;регуляторным рискам. Ситуация «Новую функциональность нужно сделать вот&nbsp;прямо сейчас». То&nbsp;есть фича будет работать, но&nbsp;механизм ее&nbsp;работы не&nbsp;будет продуман достаточно глубоко. Такие решения как&nbsp;раз&nbsp;называют костылями. Вот&nbsp;пример.</span></p>
<p><em><span style="font-weight: 400;">Один из&nbsp;наших проектов – <a href="/projects/assignot-new/" title="Индивидуальная ERP&nbsp;вместо Excel для&nbsp;бизнеса по&nbsp;взысканию долгов">«Цессионарий»</a> – создан для&nbsp;работы с&nbsp;просроченными задолженностями по&nbsp;кредитам. Сотрудники департамента судебного взыскания в&nbsp;этой системе регистрируют различные письма, приходящие по&nbsp;почте: оцифровывают документы и&nbsp;переносят в&nbsp;систему данные из&nbsp;них. </span></em></p>
<p><em><span style="font-weight: 400;">В рамках процесса судопроизводства по&nbsp;кредиту может приходить несколько десятков видов писем: от&nbsp;судебного приказа из&nbsp;суда до&nbsp;квитанции об&nbsp;оплате долга от&nbsp;клиента. Поэтому на&nbsp;старте проекта была сделана возможность через админ-панель добавлять в&nbsp;виде шаблонов новые типы писем с&nbsp;любыми наборами полей и&nbsp;редактировать текущие. </span></em></p>
<p><em><span style="font-weight: 400;">Со временем бизнесу понадобилось, чтобы система автоматически реагировала на&nbsp;регистрацию определенного типа письма. Например, если в&nbsp;системе регистрируется письмо с&nbsp;судебным приказом, система должна автоматически к&nbsp;сумме основного долга прибавлять сумму госпошлины. Подобные реакции системы сложно запрограммировать, когда письмо полностью хранится в&nbsp;базе данных, и&nbsp;нет&nbsp;никакой связи с&nbsp;кодом.</span></em></p>
<p><em><span style="font-weight: 400;">Нам нужно было связать письмо из&nbsp;базы данных с&nbsp;кодом, чтобы при&nbsp;его&nbsp;регистрации запускать нужные процессы. Есть простой путь – скорее временное решение: при&nbsp;настройке шаблона письма в&nbsp;админ-панели выбирать функциональность, которая будет запускаться при&nbsp;регистрации письма. Например, для&nbsp;шаблона письма «Судебный приказ» выбирать запуск функциональности «Начисление государственной пошлины». Это&nbsp;«костыль», ведь если пользователи системы случайно уберут запуск функциональности из&nbsp;настроек письма, то&nbsp;система сломается. </span></em></p>
<p><span style="font-weight: 400;"><em>Правильный путь – разобраться с&nbsp;бизнесовой частью и&nbsp;узнать, как&nbsp;«работают» эти&nbsp;письма: как&nbsp;часто появляются новые типы писем, как&nbsp;часто меняется состав вносимых в&nbsp;систему данных, нужно ли&nbsp;при&nbsp;добавлении нового письма или&nbsp;изменении текущего сразу же&nbsp;менять реакцию системы на&nbsp;письмо. После этого можно будет отрефакторить функциональность регистрации входящих писем. Например, убрать возможность добавления/редактирования писем через админ-панель и&nbsp;перенести все&nbsp;типы писем в&nbsp;код. Тогда реакции системы при&nbsp;регистрации определенных типов писем будут работать «правильно». Также можно будет добавить эффективную валидацию внесенных данных при&nbsp;регистрации письма. Такие решения и&nbsp;нужны продукту.</em></span></p>
<h2>Либо своевременный регулярный рефакторинг, либо монструозный техдолг</h2>
<p><span style="font-weight: 400;">Продукт развивается, поэтому нужно постоянно расширять и&nbsp;дополнять его, масштабировать. Часто запросы от&nbsp;заказчика строятся именно на&nbsp;этом: впиливаем новую функциональность, просто чтобы работало. </span></p>
<p><span style="font-weight: 400;">Зачастую поток бизнесовых задач непрерывный, все&nbsp;эти&nbsp;задачи с&nbsp;высоким приоритетами, и&nbsp;на&nbsp;рефакторинг как&nbsp;будто нет&nbsp;времени.</span></p>
<p><span style="font-weight: 400;"><img src="/Media/2939/frame-304.png" alt=""></span></p>
<p><span style="font-weight: 400;">Когда начинаем копаться в&nbsp;коде, чтобы прикрутить новые фичи, понимаем: «Ага, вот&nbsp;тут&nbsp;не&nbsp;вписывается, вот&nbsp;тут&nbsp;устарело, а&nbsp;вот&nbsp;здесь вообще можно внедрить только костыльное решение». </span></p>
<p><span style="font-weight: 400;">То есть не&nbsp;бывает такого, что&nbsp;кто&#8209;то&nbsp;когда&#8209;то&nbsp;специально написал плохой код, сознательно вставив палки в&nbsp;колеса проекта. Понимание о&nbsp;том, что&nbsp;где&#8209;то&nbsp;в&nbsp;проекте есть «плохой код», приходит тогда, когда мы&nbsp;снова возвращаемся к&nbsp;ранее написанному коду и&nbsp;осознаем, что&nbsp;для&nbsp;его&nbsp;расширения потребуется переработка уже&nbsp;написанного. </span></p>
<p><span style="font-weight: 400;">Можно выбирать один из&nbsp;двух путей. Первый: сразу же&nbsp;с&nbsp;расширением приложения думать о&nbsp;рефакторинге, чтобы создавать максимально рабочее решение в&nbsp;настоящий момент. Второй: копить себе техдолг на&nbsp;будущее, предпринимая более краткосрочные действия. Исход второго пути часто печальный: получается очень неподдерживаемая и&nbsp;тяжеловесная система, в&nbsp;которую в&nbsp;дальнейшем очень сложно будет вкатиться.</span></p>
<h2>Большой техдолг: почему отрабатывать его&nbsp;дороже, чем&nbsp;делать своевременный рефакторинг</h2>
<p><span style="font-weight: 400;">«Ну отложим мы&nbsp;задачи рефакторинга на&nbsp;потом. Сделаем, когда всю&nbsp;новую функциональность отработаем». Нечто похожее можно услышать, когда речь заходит о&nbsp;переработке кода для&nbsp;новых фич&nbsp;здесь и&nbsp;сейчас. На&nbsp;деле к&nbsp;этим задачам «на потом» возвращаются только тогда, когда все&nbsp;горит и&nbsp;падает.</span></p>
<p><span style="font-weight: 400;"><img src="/Media/2938/frame-302.png" alt=""></span></p>
<p><span style="font-weight: 400;">Чем больше в&nbsp;проекте неотрефакторенного кода, тем&nbsp;ближе он&nbsp;к&nbsp;неподдерживаемому состоянию. Серьезно, можно дотянуть до&nbsp;стадии, когда продукт просто придется выбросить в&nbsp;мусорку и&nbsp;написать заново, потому что&nbsp;обилие костылей и&nbsp;кое&#8209;как&nbsp;залитых фич&nbsp;ухудшает производительность и&nbsp;плохо влияет на&nbsp;работоспосбность решения в&nbsp;целом. </span></p>
<p><span style="font-weight: 400;">Так может и&nbsp;нечего беспокоиться, если продукт можно сделать заново? Если возникает такая мысль, то&nbsp;давайте расскажем, почему так&nbsp;не&nbsp;работает. </span></p>

<div class="umb-macro-highlights">
    <strong>Выделение денег на&nbsp;рефакторинг не&nbsp;равно их&nbsp;потере.</strong>
    Этот миф&nbsp;создается, потому что&nbsp;рефакторинг «не видно». Он&nbsp;требует какого&#8209;то&nbsp;времени, но&nbsp;не&nbsp;выливается в&nbsp;новую фичу. Тем&nbsp;не&nbsp;менее, если сейчас не&nbsp;использовать ресурсы для&nbsp;рефакторинга, в&nbsp;будущем их&nbsp;тратится еще&nbsp;больше.
</div>

<p><span style="font-weight: 400;">Например, спустя год&nbsp;существования проекта мы&nbsp;вносим новую функциональность, пренебрегая рефакторингом. Проходит еще&nbsp;год, мы&nbsp;снова возвращаемся к&nbsp;этому куску проекта, чтобы расширить функциональность, и&nbsp;понимаем, что&nbsp;рефакторить нужно не&nbsp;только изначальный код, но&nbsp;и&nbsp;прошлое нововведение, чтобы новая фича хорошо «встала» в&nbsp;продукт. </span></p>
<p><span style="font-weight: 400;">Откладывая рефакторинг, копим такие потребности в&nbsp;обновлении и&nbsp;наслаиваем их&nbsp;друг на&nbsp;друга. Потом, когда руки все-таки дойдут до&nbsp;закрытия техдолга, эту&nbsp;«матрешку» придется открывать снова и&nbsp;снова, затрачивая гору времени и&nbsp;денег.</span></p>
<h2>Легко ли&nbsp;переписать продукт с&nbsp;нуля</h2>
<p><span style="font-weight: 400;">Нет. Как&nbsp;минимум потому, что&nbsp;на&nbsp;это&nbsp;потребуется вдвое-втрое больше времени (и&nbsp;денег), чем&nbsp;ушло на&nbsp;первоначальную версию. В&nbsp;нашей практике был&nbsp;подобный случай.</span></p>
<p><span style="font-weight: 400;">Желательно, пересоздавая продукт, на&nbsp;некоторое время все&nbsp;же&nbsp;его&nbsp;работу приостановить. Однако, у&nbsp;нас&nbsp;был&nbsp;финтех-продукт, поэтому остановка работы была невозможна из&#8209;за&nbsp;зависимости от&nbsp;множества внешних обстоятельств. </span></p>

<div class="umb-macro-highlights">
    <strong>Когда текущий проект становится неподдерживаемым</strong>
    с&nbsp;точки зрения масштабирования и&nbsp;разработки, но&nbsp;все&nbsp;еще&nbsp;функционирует для&nbsp;пользователей, возникает потребность одновременно держать на&nbsp;плаву и&nbsp;его, и&nbsp;разрабатывать новый.
</div>

<p><span style="font-weight: 400;"><strong>Первая сложность</strong> – несколько команд. Нужна команда, которая отвечает за&nbsp;старый проект, и&nbsp;отдельная команда, которая будет разрабатывать новый проект. Нужно много людей. Работа этих людей стоит денег. А&nbsp;еще&nbsp;им&nbsp;нужно будет потратить время на&nbsp;онбординг, потому что&nbsp;даже при&nbsp;наличии «старичков» на&nbsp;проекте, вновь прибывшие не&nbsp;впитают знания о&nbsp;нем&nbsp;по&nbsp;щелчку. Кроме того, командам придется синхронизироваться на&nbsp;случай внесения изменений в&nbsp;проекты.</span></p>
<p><span style="font-weight: 400;"><strong>Вторая сложность</strong> – это&nbsp;миграция старых данных на&nbsp;новую систему. Структура базы полностью меняется: невозможно взять и&nbsp;запустить новую систему и&nbsp;работать только с&nbsp;новыми данными. Скорее всего, придется данные из&nbsp;предыдущей системы переместить в&nbsp;новую. Пока миграция не&nbsp;завершится, а&nbsp;данные со&nbsp;100% вероятностью не&nbsp;будут перенесены корректно, старую систему придется поддерживать.</span></p>
<p><span style="font-weight: 400;">Для разработки нового продукта чаще всего нужна мощная команда аналитиков, чтобы полностью задокументировать работу текущего проекта. На&nbsp;основе документации уже&nbsp;будет разрабатываться новый проект. Это&nbsp;очень большая работа, а&nbsp;старую документацию не&nbsp;получится использовать ввиду ее&nbsp;неактуальности.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    А&nbsp;еще&nbsp;придется полностью переписать  весь процесс деплоя и&nbsp;заново настроить метрики, по&nbsp;которым можно будет отследить «живость» проекта, потому что&nbsp;на&nbsp;старте неминуемо будут возникать проблемы.
</div>

<p><span style="font-weight: 400;">Когда все&nbsp;подготовительные стадии будут пройдены, нужно будет максимально незаметно для&nbsp;пользователей осуществить переход на&nbsp;новую систему. Процесс переключения нужно детально проработать, многократно симулировать. Но&nbsp;в&nbsp;даже это&nbsp;не&nbsp;может гарантировать отсутствие ошибок и&nbsp;падений при&nbsp;запуске. </span></p>
<h2>Что нужно, чтобы рефакторинг был&nbsp;проще и&nbsp;быстрее</h2>
<p><span style="font-weight: 400;">Если отвечать обобщенно, можно сказать: «Просто пишите хороший код». Но, как&nbsp;мы&nbsp;уже&nbsp;сказали, маловероятно, что&nbsp;кто&#8209;то&nbsp;специально будет писать плохой. Поэтому введем немного советов из&nbsp;практики. </span></p>
<p><span style="font-weight: 400;">К рефакторингу будет проще подойти, если <strong>код приложения будет легко поддерживать элементарное переименование свойств, методов</strong>. Правильное название этих сущностей сильно улучшит читаемость и&nbsp;понятность кода. Новым разработчикам, например, будет гораздо проще вкатиться в&nbsp;проект.</span></p>
<p><span style="font-weight: 400;"><strong>Введение тестов.</strong> Рефакторинг подразумевает изменение кода, и&nbsp;удобно сразу иметь возможность прогнать его&nbsp;через тесты. Это&nbsp;уверенность в&nbsp;том, что&nbsp;все&nbsp;работает правильно. Рефакторинг будет более надежным при&nbsp;наличии тестов.</span></p>
<p><span style="font-weight: 400;"><strong>Комментирование кода.</strong> Особенно комментарии важны в&nbsp;местах со&nbsp;сложной логикой. Иногда в&nbsp;код&nbsp;приходится вводить странности, вызванные не&nbsp;вредностью разработчика, а&nbsp;внешними обстоятельствами. Например, сервис может использовать какое-нибудь нестандартное API&nbsp;или&nbsp;найдутся какие&#8209;то&nbsp;нелогичные на&nbsp;первый взгляд бизнес-требования. Такие места в&nbsp;коде лучше отмечать комментариями.</span></p>
<p><span style="font-weight: 400;"><strong>Ну, и&nbsp;последнее – своевременность.</strong> Гораздо проще потратить чуть больше времени в&nbsp;моменте, чем&nbsp;доводить продукт до&nbsp;состояния, когда рефакторинг займет вечность. Регулярный рефакторинг кода в&nbsp;процессе развития продукта намного разумнее и&nbsp;экономичнее, чем&nbsp;решение проблем, возникающих из&#8209;за&nbsp;отсутствия такого подхода.   </span></p>
<h2>Тезисный итог</h2>
<p><span style="font-weight: 400;">К чему приводит несвоевременный рефакторинг:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">На переработку существующей функциональности целиком тратится намного больше времени, чем&nbsp;если бы&nbsp;она&nbsp;была своевременно переработана по&nbsp;кусочкам.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Становится страшно вносить правки в&nbsp;существующую функциональность: сложно оценить размер возможных поломок. Это&nbsp;типичная проблема legacy-проектов.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">При доработке функциональности баги постоянно доходят до&nbsp;продакшена, нет&nbsp;возможности оценить все&nbsp;риски.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Невозможно самостоятельно восстановить алгоритм работы определенной фичи. Для&nbsp;понимания работы приходится обращаться к&nbsp;документации по&nbsp;проекту, к&nbsp;аналитикам и&nbsp;другим разработчикам, отвлекая их&nbsp;от&nbsp;своих задач.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Тяжелый онбординг новичков: они&nbsp;не&nbsp;смогут самостоятельно разобраться с&nbsp;кодовой базой. Придется постоянно советоваться с&nbsp;коллегами, но&nbsp;и&nbsp;это&nbsp;не&nbsp;гарантирует отсутствие дефектов в&nbsp;работе.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Знания обо&nbsp;всех тонкостях работы проекта содержатся в&nbsp;головах разработчиков, поэтому расставаться с&nbsp;разработчиками очень страшно.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">У системы постоянно падает производительность.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Если все&nbsp;совсем плохо, придется выбросить текущее решение и&nbsp;написать все&nbsp;сначала. А&nbsp;это&nbsp;боль.</span></li>
</ul>
<p><span style="font-weight: 400;">Причины, по&nbsp;которым возникает необходимость рефакторинга:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Задача на&nbsp;этапе аналитики была проработана неверно.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Назначение функциональности со&nbsp;временем сильно поменялось.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Готовая функциональность постоянно дорабатывалась/расширялась, что&nbsp;привело к&nbsp;разрастанию и&nbsp;усложнению кода, появлению костылей.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Техническое задание было верным, но&nbsp;были допущены ошибки на&nbsp;этапе разработки. Например, была заложена излишняя универсальность. Либо была неправильно продумана архитектура.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Компетенции команды со&nbsp;временем улучшаются, поэтому становятся видны огрехи в&nbsp;ранее написанном коде.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Нагрузка на&nbsp;систему и&nbsp;(или) размер хранимых данных превосходят критическую отметку. Из&#8209;за&nbsp;этого падает производительность сервиса.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Необходимость в&nbsp;своевременном обновлении библиотек и&nbsp;фреймворка, чтобы исключить критические уязвимости безопасности и&nbsp;использовать современные библиотеки. Просто обновив определенную библиотеку или&nbsp;фреймворк можно улучшить производительность системы без&nbsp;необходимости вносить существенные изменения в&nbsp;код</span></li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Разработка фронтенда ИТ-продукта: какой подход выбрать исходя из задач бизнеса
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Выбор подхода к фронтенду — не вкусовщина, а способ решать бизнес-задачи. Показываем, как это работает в зависимости от цели продукта и на примерах.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/frontend-approach-2023/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/frontend-approach-2023/</guid>

                <pubDate>Tue, 06 May 2025 13:00:12 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Разработка фронтенда ИТ-продукта: какой подход выбрать исходя из задач бизнеса</h1>
                                <figure>
                                    <img src="/Media/2951/slide-16_9-6.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b9e4beebabd32e85227ee7522a44d794"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f1425a780b1346139d1734faf1c19cd6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Сразу оговоримся, что&nbsp;в&nbsp;этой статье не&nbsp;рассматриваются варианты использования конструкторов сайтов вроде Tilda или&nbsp;Webflow. Мы&nbsp;работаем с&nbsp;заказчиками, запросы которых эти&nbsp;инструменты покрыть не&nbsp;в&nbsp;состоянии. Поэтому речь пойдет о&nbsp;разработке более сложных ИТ-продуктов: highload проектов, личных кабинетов в&nbsp;B2B и&nbsp;автоматизации бизнеса.  </span></p>
<p><span style="font-weight: 400;">Подход к&nbsp;разработке фронтенда в&nbsp;продукте – уже&nbsp;давно не&nbsp;прихоть разработчика, а&nbsp;инструмент для&nbsp;решения бизнес-задачи и&nbsp;разработки современных веб&nbsp;приложений. Расскажем простыми словами, почему это&nbsp;так, как&nbsp;выбор подхода зависит от&nbsp;назначения продукта, и&nbsp;приведем примеры.</span></p>
<h2>Личные кабинеты, онлайн-сервисы, веб-приложения: клиентский рендеринг, рендеринг интерфейса </h2>
<p><span style="font-weight: 400;">Поговорим о&nbsp;приложениях, в&nbsp;которые пользователь заходит через логин: личный кабинет, внутренняя корпоративная система, CRM, ERP. Сюда же&nbsp;– интернет-банк, веб-интерфейс почты, личный кабинет на&nbsp;Озоне или&nbsp;Госуслугах, лента и&nbsp;переписка в&nbsp;соцсетях. Пользователь в&nbsp;таких приложениях видит данные, актуальные только для&nbsp;него. А&nbsp;индексация поисковиками для&nbsp;этих данных не&nbsp;нужна, поэтому используется метод клиентского рендеринга.  </span></p>
<p>Среди наших проектов, основанных на&nbsp;клиентском рендеринге, например, разработка личного кабинета пользователя для&nbsp;ЖК&nbsp;«Ньютон», система «Цессионарий».</p>
<p><span style="font-weight: 400;"><strong>Клиентский рендеринг (client side rendering) или&nbsp;SPA&nbsp;(Single Page Application)</strong> – метод, при&nbsp;котором браузер загружает основную структуру страницы и&nbsp;код&nbsp;приложения один раз&nbsp;и&nbsp;генерирует HTML код&nbsp;страницы в&nbsp;самом браузере на&nbsp;устройстве пользователя. </span></p>
<p><span style="font-weight: 400;">Далее при&nbsp;взаимодействии c&nbsp;пользователем браузер обращается в&nbsp;один или&nbsp;несколько API&nbsp;за&nbsp;дополнительными данными и&nbsp;динамически обновляет HTML без&nbsp;необходимости полной перезагрузки страницы. В&nbsp;результате, когда пользователь решит перейти в&nbsp;другой модуль, браузер откроет его&nbsp;практически мгновенно.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--50496994">
    


    <img src="/Media/2952/slide-16_9-10.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Фронтенд при&nbsp;клиентском рендеринге выполняется в&nbsp;браузере, а&nbsp;бекенд API&nbsp;поставляет данные. Организационной плюс в&nbsp;том, что&nbsp;фронтенд команда при&nbsp;таком подходе полностью контролирует всю&nbsp;логику интерфейса и&nbsp;может изменять ее&nbsp;без&nbsp;привлечения бекенда.</span></p>
<p><span style="font-weight: 400;">Когда такие приложения становятся достаточно большими, первая загрузка приложения может растянуться на&nbsp;несколько секунд. Это&nbsp;минус, если сервис вы&nbsp;открываете много раз&nbsp;день (почта или&nbsp;CRM). </span></p>

<div class="umb-macro-highlights">
    <strong>Ускорить процесс помогает кеширование кода приложения в&nbsp;браузере. Код&nbsp;сохраняется, и&nbsp;отпадает необходимость загружать его&nbsp;снова каждый раз.</strong>
    
</div>

<p><span style="font-weight: 400;">Можно загружать код&nbsp;и&nbsp;по&nbsp;частям. Например, сначала  – код&nbsp;для&nbsp;отображения открытого раздела приложения, с&nbsp;которым пользователь взаимодействует, а&nbsp;остальной код&nbsp;загружается уже&nbsp;после. </span></p>
<h2>PWA: вернуть пользователям мобильный сервис, даже если приложение удалили из&nbsp;сторов</h2>
<p><span style="font-weight: 400;">Отдельно отметим </span><strong>Progressive web&nbsp;apps (PWA)</strong>:<span style="font-weight: 400;"> набор технологий, позволяющий максимально приблизить веб-приложения к&nbsp;привычным мобильным приложениям. Такой подход актуален сейчас, когда приложения регулярного удаляются из&nbsp;App&nbsp;Store и&nbsp;Google Play, а&nbsp;ограничить установку PWA-приложения не&nbsp;может никто.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--7859484">
    


    <img src="/Media/2949/frame-366.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">PWA позволяет добавить ярлык приложения на&nbsp;рабочий стол телефона, работать без&nbsp;интернета, получать push-уведомления. Подход полезен также в&nbsp;случаях, когда делать отдельные мобильные приложения для&nbsp;iOS&nbsp;и&nbsp;Android в&nbsp;дополнение к&nbsp;веб-сервису слишком накладно или&nbsp;сложно. </span></p>
<p><span style="font-weight: 400;">С клиентским рендерингом одна проблема — он&nbsp;не&nbsp;годится для&nbsp;проектов, требующих SEO-оптимизации. Поисковики плохо индексируют страницы, которые рендерятся в&nbsp;браузере, поэтому для&nbsp;SEO&nbsp;стоит применять другую архитектуру фронтенда.</span></p>
<h2>Контентные порталы, медиа, блоги: статическая генерация сайта</h2>
<p><span style="font-weight: 400;">На какие проекты пользователи привлекаются с&nbsp;помощью SEO? Как&nbsp;правило, это&nbsp;контентные ресурсы, где&nbsp;новые материалы регулярно публикуются и&nbsp;затем хранятся в&nbsp;архиве, генерируя трафик. Примеры: онлайн-медиа, журналы, блоги, каталоги продукции компаний, тематические информационные порталы.</span></p>

<div class="umb-macro-highlights">
    <strong>Чтобы сайт хорошо индексировался поисковиками, в&nbsp;его&nbsp;разметке должны находиться данные, за&nbsp;которые поисковики будут «цепляться». Разметка – это&nbsp;гипертекстовые элементы на&nbsp;странице: заголовки разных порядков, названия изображений и&nbsp;метаинформация, о&nbsp;содержимом страниц. Благодаря им&nbsp;можно определить, что&nbsp;за&nbsp;контент пользователь найдет на&nbsp;странице.</strong>
    
</div>

<p><span style="font-weight: 400;">Чтобы поисковики лучше индексировали сайт, HTML разметка для&nbsp;каждой его&nbsp;страницы должна отдаваться с&nbsp;сервера. Быстрота загрузки, как&nbsp;и&nbsp;качественное наполнение веб-страницы, влияет на&nbsp;ее&nbsp;позицию в&nbsp;выдаче поисковика. Поэтому важно, чтобы сайт загружался быстро – и&nbsp;на&nbsp;сервере, и&nbsp;в&nbsp;браузере. Этим целям отвечает статическая генерация.</span></p>
<p><strong>Статическая генерация сайта (static site generation или&nbsp;SSG)</strong><span style="font-weight: 400;"> – подход, при&nbsp;котором HTML код&nbsp;страниц генерируется один раз&nbsp;в&nbsp;момент публикации и&nbsp;сохраняется на&nbsp;сервере. Изменения в&nbsp;этой публикации не&nbsp;появляются (либо появляются очень редко), поэтому генерация «статическая». Дальше сервер будет моментально отдавать HTML код&nbsp;готовой страницы пользователям и&nbsp;поисковикам, гарантируя быструю загрузку страницы.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--30212530">
    


    <img src="/Media/2954/slide-16_9-12.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Для отдачи статического сайта не&nbsp;нужен мощный сервер, ведь основная нагрузка происходит только в&nbsp;момент публикации статьи. Дополнительно можно выложить статический сайт на&nbsp;CDN, чтобы еще&nbsp;больше ускорить загрузку страниц. Подробнее о&nbsp;применении CDN&nbsp;в&nbsp;создании порталов читайте <a href="/articles/it-infrastructure-scaling/" title="Как масштабировать IT-инфраструктуру, работая изнутри">в другой нашей статье</a>.</span></p>
<p><span style="font-weight: 400;">Часть страниц ресурса со&nbsp;статической генерацией все-таки должна обновляться. Например, в&nbsp;онлайн-медиа динамичной будет главная страница, страница новостей. Для&nbsp;таких разделов можно настроить частоту обновления статического HTML кода или&nbsp;обновлять их&nbsp;при&nbsp;определенных событиях. Например, для&nbsp;срочных новостей.</span></p>
<h2>Headless CMS: конструктор и&nbsp;API&nbsp;для&nbsp;контента</h2>
<p><span style="font-weight: 400;">Портал, предназначенный для&nbsp;публикации большого количества индексируемого контента, с&nbsp;использованием статической генерации – это&nbsp;хорошо. Однако контент нужно редактировать и&nbsp;хранить. Для&nbsp;этого мы&nbsp;используем Headless CMS. Например, Strapi.</span></p>
<p><span style="font-weight: 400;">Отличие Headless CMS&nbsp;от&nbsp;предыдущего поколения CMS&nbsp;вроде Битрикс или&nbsp;WordPress в&nbsp;том, что&nbsp;они&nbsp;не&nbsp;генерируют HTML&#8209;код&nbsp;страниц сами, а&nbsp;просто предоставляют контент через API&nbsp;в&nbsp;структурированном виде.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--5373149">
    


    <img src="/Media/2950/slide-16_9-5.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Один и&nbsp;тот&nbsp;же&nbsp;контент из&nbsp;Headless CMS&nbsp;таким образом можно переиспользовать под&nbsp;различные каналы. Например, на&nbsp;сайте, в&nbsp;мобильном приложении или&nbsp;в&nbsp;email-рассылке.</span></p>

<div class="umb-macro-highlights">
    <strong>Headless CMS&nbsp;позволяет выбирать любой фронтенд-стек или&nbsp;технологии для&nbsp;создания пользовательского интерфейса, независимо от&nbsp;бэкенда.</strong>
    
</div>

<p><span style="font-weight: 400;">Другой плюс – проекты на&nbsp;Headless CMS&nbsp;может делать фронтенд- разработчик целиком. В&nbsp;нашей команде фронтенд разработчики сами настраивают структуру контента в&nbsp;Headless CMS&nbsp;и&nbsp;интегрируются с&nbsp;ней&nbsp;— этому достаточно легко научиться. Не&nbsp;нужно дополнительно привлекать, например, PHP&nbsp;бекенд-разработчика, как&nbsp;при&nbsp;разработке на&nbsp;Битрикс или&nbsp;WordPress. </span></p>
<h2>Динамические интернет-магазины и&nbsp;пользовательский контент: серверный рендеринг</h2>
<p><span style="font-weight: 400;">Контент, который часто публикуется и&nbsp;обновляется на&nbsp;портале, тоже может требовать индексации и&nbsp;непрерывного поддержания актуальности. Например, так&nbsp;происходит при&nbsp;разработке систем автоматизации бизнеса в&nbsp;онлайн-магазинах, где&nbsp;часто меняются цены, актуальные позиции или&nbsp;скидки (привет, Озон!). Другой пример – сайты, где&nbsp;в&nbsp;основе пользовательский контент — форумы и&nbsp;площадки с&nbsp;объявлениями, типа hh.ru или&nbsp;Авито. </span></p>
<p><span style="font-weight: 400;">Для таких сервисов статическая генерация не&nbsp;очень подходит, ведь важно всегда отображать самую актуальную информацию. Большое количество контента генерировать статически не&nbsp;практично: полная перестройка может занять часы и&nbsp;дни, а&nbsp;на&nbsp;хранение потребуются многие терабайты. Для&nbsp;таких случаев используется метод серверного рендеринга.</span></p>
<p><span style="font-weight: 400;"><strong>Серверный рендеринг (server side rendering / SSR)</strong> – подход, в&nbsp;котором страница генерируется на&nbsp;сервере при&nbsp;каждом запросе от&nbsp;пользователя.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--62401776">
    


    <img src="/Media/2953/slide-16_9-11.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Основная особенность серверного рендеринга – нужно значительно больше серверных ресурсов, чем&nbsp;при&nbsp;статической генерации, ведь каждый запрос обрабатывается отдельно. Для&nbsp;оптимизации использования ресурсов разумно применять различные стратегии кеширования. </span></p>
<p><span style="font-weight: 400;">Из этого вытекает потребность в&nbsp;более опытной и&nbsp;дорогой команде разработки.</span></p>
<h2>Гибридные подходы</h2>
<p><span style="font-weight: 400;">Не стоит думать, что&nbsp;при&nbsp;создании сложного сайта нужно ограничиваться только одним подходом к&nbsp;формированию и&nbsp;загрузке страниц. Можно и&nbsp;нужно порой делать гибридные модели. </span></p>
<p><span style="font-weight: 400;">Самый частый и&nbsp;простой случай: догрузить в&nbsp;браузере динамических или&nbsp;персонализированных данных на&nbsp;статически сгенерированную страницу.</span></p>
<p><span style="font-weight: 400;">Так, на&nbsp;сайте нашего проекта для&nbsp;Crystal Palace FC&nbsp;большинство контента генерируется статически. При&nbsp;этом отдельные блоки рендерятся в&nbsp;браузере. Это, например, индивидуальные для&nbsp;пользователя блоки  или&nbsp;очень динамические сегменты. </span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--36841417">
    


    <img src="/Media/2955/tabloid-1.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Другой пример – использовать статическую генерацию и&nbsp;клиентский рендеринг для&nbsp;различных разделов сайта. </span></p>
<p><span style="font-weight: 400;">На одном из&nbsp;наших фронтендерских проектов – <a href="/projects/emex-seller-drive-system-development/" title="Emex Seller Drive Development">Seller Drive</a> – портале для&nbsp;поставщиков Emex DWC, стартовая страница портала – индексируемая и&nbsp;общедоступная, поэтому реализована на&nbsp;статическом рендеринге. А&nbsp;вот&nbsp;личный кабинет, который становится доступен пользователю после аутентификации, мы&nbsp;построили уже&nbsp;на&nbsp;базе клиентского рендеринга. </span></p>
<p><span style="font-weight: 400;">Совмещение подходов при&nbsp;создании фронтенда помогает веб-сервису быть более производительным. Этой цели служат и&nbsp;другие решения, выходящие за&nbsp;рамки фронтенда – они&nbsp;помогают сервису стать более масштабируемым и&nbsp;устойчивым к&nbsp;высоким нагрузкам. Подробнее об&nbsp;этом читайте <a href="/articles/it-infrastructure-scaling/" title="Как масштабировать IT-инфраструктуру, работая изнутри">в другой нашей статье</a>. </span></p>
<h2>Что подойдет моему проекту</h2>
<p><span style="font-weight: 400;">Чтобы выбрать самый эффективный подход для&nbsp;  создания веб&nbsp;приложения, портала, сервиса или&nbsp;личного кабинета для&nbsp;бизнеса, стоит на&nbsp;этапе переговоров с&nbsp;подрядчиком быть максимально честным. Как&nbsp;на&nbsp;приеме у&nbsp;доктора. И&nbsp;здесь главное для&nbsp;клиента приходить с&nbsp;запросом не&nbsp;в&nbsp;виде решения («Разработайте мне&nbsp;новый сайт»), а&nbsp;в&nbsp;виде описания своей боли («Мой старый сайт совсем не&nbsp;приносит денег, помогите»).</span></p>
<p><span style="font-weight: 400;">Добросовестный подрядчик не&nbsp;станет слепо предлагать заказчику свою стандартную архитектуру фронтенда (или&nbsp;другой части решения) или&nbsp;«пакет услуг», а&nbsp;постарается понять задачу. Поэтому свою «боль» клиенту стоит описать честно и&nbsp;без&nbsp;утайки деталей. Так&nbsp;подрядчик с&nbsp;большей вероятностью сможет разобраться в&nbsp;проблеме и&nbsp;предложить решение, которое закроет потребность клиента.</span><span style="font-weight: 400;"></span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Удаленка и стресс: 4 способа поднять моральный дух команды и сплотить сотрудников
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как мы бодрим команду и снижаем стресс на удалёнке, даже когда не получается собраться вместе. Делимся опытом нестандартного тимбилдинга.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/remote-work-vs-stress/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/remote-work-vs-stress/</guid>

                <pubDate>Tue, 06 May 2025 12:57:49 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Удаленка и стресс: 4 способа поднять моральный дух команды и сплотить сотрудников</h1>
                                <figure>
                                    <img src="/Media/2972/5.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4ebad3390d795179fc5436b9f4a0c5e9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4451f32bcd574d698e1ccff458a9ce92"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Время сейчас непростое, и&nbsp;сохранять свое эмоциональное состояние в&nbsp;«зеленой зоне», избегая тревоги и&nbsp;стресса, удается не&nbsp;всегда. При&nbsp;этом нужно как&#8209;то&nbsp;работать и&nbsp;приносить результаты, хотя порой в&nbsp;задачи вовлекаться просто нет&nbsp;сил. Игнорировать это&nbsp;положение дел&nbsp;бессмысленно, поэтому мы&nbsp;решили по-особенному бодрить команду и&nbsp;избавлять ее&nbsp;от&nbsp;повседневного стресса.</span></p>
<p><span style="font-weight: 400;">Наш HR&nbsp;Generalist София Пронина рассказывает, какие практики можно внедрить, и&nbsp;каких результатов добиться. </span></p>

<div class="umb-macro-highlights">
    <strong>Сразу ремарка: не&nbsp;будет советов в&nbsp;духе «потрогайте траву» или&nbsp;«погладьте собаку». Не&nbsp;только потому, что&nbsp;не&nbsp;у&nbsp;всех есть доступ к&nbsp;траве и&nbsp;собакам, а&nbsp;еще&nbsp;потому что&nbsp;такие решения редко помогают по-настоящему.</strong>
    
</div>

<h2>Как мы&nbsp;поняли, что&nbsp;пора что&#8209;то&nbsp;делать</h2>
<p><span style="font-weight: 400;">В конце прошлого года наш&nbsp;HR&nbsp;Generalist София Пронина провела анкетирование, суть которого была в&nbsp;прояснении уровня удовлетворенности работой. Большая часть команды оказалась измучена фоновыми стрессами, которые были не&nbsp;связаны с&nbsp;работой, но&nbsp;понижали моральный дух&nbsp;в&nbsp;целом. Вовлеченность в&nbsp;какие-либо активности оставляла желать лучшего, а&nbsp;перфоманс-ревью проходили кое-как. </span></p>
<p><span style="font-weight: 400;">Команда у&nbsp;нас&nbsp;распределенная, поэтому видимся мы&nbsp;в&nbsp;основном на&nbsp;еженедельных митингах, а&nbsp;очно всем вместе собраться не&nbsp;получается. Раньше, когда все&nbsp;были в&nbsp;одном месте, было проще проводить вечера за&nbsp;настолками, или&nbsp;устраивать корпоративы. Сейчас ситуация изменилась, поэтому нужно было найти решения для&nbsp;удаленки.</span></p>
<h2>Добавить эмоций в&nbsp;рабочий процесс: правильные 1-to-1</h2>
<p><span style="font-weight: 400;">1-to-1 – это&nbsp;регулярные встречи руководителей и&nbsp;подчиненных, которые направлены больше не&nbsp;на&nbsp;обсуждение задач, а&nbsp;посвящены тому, как&nbsp;сотрудник чувствует себя на&nbsp;работе. </span></p>
<p><span style="font-weight: 400;">Часто встречи 1 на&nbsp;1 скатываются в&nbsp;формальность и&nbsp;сводятся как&nbsp;раз&nbsp;к&nbsp;обсуждению работы и&nbsp;рутины. Однако на&nbsp;самом деле такие встречи созданы, чтобы сотрудники получали взгляд со&nbsp;стороны на&nbsp;свои сильные и&nbsp;слабые стороны, могли дать обратную связь руководству и&nbsp;обсудить моменты, о&nbsp;которых было бы&nbsp;неуместно говорить на&nbsp;командных встречах. </span></p>

<div class="umb-macro-highlights">
    <strong>Наш подход в&nbsp;том, чтобы создать максимально доверительную атмосферу на&nbsp;1-to-1 встречах. Для&nbsp;этого, конечно, к&nbsp;ним&nbsp;стоит готовиться, чтобы суметь дать и&nbsp;принять качественную обратную связь. А&nbsp;еще&nbsp;очень помогают правильные и&nbsp;открытые вопросы, отвечая на&nbsp;которые можно порассуждать.</strong>
    
</div>

<p><span style="font-weight: 400;">Чтобы не&nbsp;тратить много времени на&nbsp;придумывание вопросов, наш&nbsp;техдир Андрей Степанов сделал </span><a href="https://1to1.cards"><span style="font-weight: 400;">специальные карточки</span></a><span style="font-weight: 400;">. Их&nbsp;можно использовать во&nbsp;время 1-to-1, выбирая нужные темы или&nbsp;отвечая в&nbsp;случайном порядке. Заодно получится подтянуть английский.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--60587126">
    


    <img src="/Media/2968/slide-16_9-1.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Говоря о&nbsp;регулярных встречах, не&nbsp;стоит забывать и&nbsp;о&nbsp;перфоманс ревью. Эти&nbsp;встречи больше, конечно, о&nbsp;работе, но&nbsp;качественное их&nbsp;проведение тоже помогает наладить контакт между сотрудниками. Об&nbsp;этом процессе у&nbsp;нас&nbsp;есть <a href="/articles/perfomance-review-mistakes/" title="Как не&nbsp;надо проводить performance review">другая статья</a>.</span></p>
<h2>Мемопятница</h2>
<p><span style="font-weight: 400;">Посмеяться любят все, и&nbsp;мемы уже&nbsp;давно стали удобным и&nbsp;быстрым способом получения эндорфинов. Нам&nbsp;показалось хорошей идеей в&nbsp;конце каждой недели устраивать деформализацию общекомандного чата. Обычно мы&nbsp;обсуждаем в&nbsp;нем&nbsp;какие&#8209;то&nbsp;насущные вопросы, но&nbsp;по&nbsp;пятницам он&nbsp;становится вместилищем мемов от&nbsp;всех желающих.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--34894142">
    


    <img src="/Media/2967/slide-16_9-23.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Сначала зачинщиком процесса была София, а&nbsp;теперь мемную цепочку у&nbsp;нас&nbsp;запускают другие члены команды, как&nbsp;только открывают общий чат&nbsp;пятничным утром. Может, от&nbsp;хронической усталости эта&nbsp;активность и&nbsp;не&nbsp;излечит, но&nbsp;юмор точно объединяет. Да&nbsp;и&nbsp;закрывать задачи в&nbsp;конце недели становится проще, когда в&nbsp;любой момент можно зайти в&nbsp;общий чат&nbsp;и&nbsp;улыбнуться от&nbsp;присланного.</span></p>
<p><span style="font-weight: 400;">Однако помним, что&nbsp;чувство юмора у&nbsp;всех нас&nbsp;разное, и&nbsp;порой на&nbsp;его&nbsp;почве могут возникать конфликты. Поэтому, если кажется, что&nbsp;в&nbsp;вашей команде есть особенно чувствительные люди, стоит сразу предупредить, что&nbsp;не&nbsp;нужно обижаться на&nbsp;картинки из&nbsp;интернета. А&nbsp;то&nbsp;мало ли.</span></p>
<h2>Power Point Party</h2>
<p><span style="font-weight: 400;">Чтобы восстановить контакт между ребятами, которых разделяют тысячи километров, мы&nbsp;сделали регулярные встречи в&nbsp;стиле Power Point Party. Суть их&nbsp;в&nbsp;том, чтобы участники создавали небольшие презентации на&nbsp;самые разные темы, которые им&nbsp;интересны. Проводим встречи регулярно раз&nbsp;в&nbsp;месяц. HR&nbsp;придумывает тематики и&nbsp;ищет спикеров – обычно их&nbsp;набирается 4-5 человек, а&nbsp;само выступление длится около 10 минут.</span></p>
<p><span style="font-weight: 400;">Тематикой первой нашей PPP&nbsp;был&nbsp;«Книжный клуб». Участники вечеринки поделились любимыми книгами и&nbsp;размышлениями на&nbsp;тему литературы и&nbsp;авторов. В&nbsp;другой раз&nbsp;наш&nbsp;техдиректор устроил интерактив: предложил мысленный аукцион, показывая разные произведения искусства. Зрителям нужно было отгадать, за&nbsp;какую сумму в&nbsp;свое время продали то&nbsp;или&nbsp;иное произведение. </span></p>

<div class="umb-macro-highlights">
    <strong>Отклик после первого опыта PPP&nbsp;был&nbsp;положительный, поэтому мы&nbsp;превратили такие встречи в&nbsp;традицию. На&nbsp;них, как&nbsp;правило, приходит 50-60% команды. Стопроцентная явка зачастую невозможна из&#8209;за&nbsp;разницы в&nbsp;часовых поясах.</strong>
    
</div>

<p><span style="font-weight: 400;"><strong>Главный плюс Power Point Party для&nbsp;нашей команды – это&nbsp;возможность узнать коллег с&nbsp;новой стороны и&nbsp;повеселиться вместе.</strong> Например, наш&nbsp;маркетолог Настя, оказалось, опытный ролевик – сама шьет себе костюмы и&nbsp;посещает тематические выезды. До&nbsp;PPP&nbsp;никто из&nbsp;команды не&nbsp;знал об&nbsp;этом. Или&nbsp;другой пример – после встречи по&nbsp;игровой тематике несколько наших разработчиков образовали команду, чтобы вместе играть в&nbsp;онлайне. Без&nbsp;PPP&nbsp;они, наверное, и&nbsp;не&nbsp;узнали бы&nbsp;о&nbsp;том, что&nbsp;интерес у&nbsp;них&nbsp;общий. </span></p>
<p><span style="font-weight: 400;">Введение РРР&nbsp;позволило нам&nbsp;раскрыться с&nbsp;разных сторон. Коллеги стали более участливы в&nbsp;жизни друг друга, у&nbsp;некоторых из&nbsp;них&nbsp;появился совместный досуг, да&nbsp;и&nbsp;в&nbsp;целом общение стало более открытым. К&nbsp;тому же, на&nbsp;таких встречах можно полностью переключиться с&nbsp;рабочего режима общения в&nbsp;совершенно неформальный и&nbsp;расслабленный.</span></p>
<h2>Кстати об&nbsp;играх</h2>
<p><span style="font-weight: 400;">Раз уж&nbsp;поиграть в&nbsp;настолки вживую невозможно, стоит подумать о&nbsp;настолках онлайн-формата. Если вы&nbsp;такой досуг в&nbsp;команде не&nbsp;пробовали, то&nbsp;стоит взять на&nbsp;заметку. Например, можно попробовать игру </span><a href="https://store.steampowered.com/app/880940/Pummel_Party/"><span style="font-weight: 400;">Pummel Party</span></a><span style="font-weight: 400;">. В&nbsp;игре есть основная механика в&nbsp;виде бросания кубика и&nbsp;хождения по&nbsp;игровому полю, но&nbsp;эмоции дарят в&nbsp;основном мини-игры, которые ждут вас&nbsp;на&nbsp;каждом ходу и&nbsp;определяют успешность каждого игрока в&nbsp;прохождении основного поля. Ниже баннер игры и&nbsp;несколько отзывов из&nbsp;Steam.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--31844683">
    


    <img src="/Media/2970/slide-16_9-22.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Целой командой из&nbsp;нескольких десятков человек разом сыграть, конечно не&nbsp;получится, но&nbsp;можно устраивать турниры. Дополнительный плюс – небольшая стоимость игры. Можно в&nbsp;целях сплочения коллектива попросить начальство купить желающим по&nbsp;копии ;)</span></p>
<p><span style="font-weight: 400;">Возможно, есть еще&nbsp;множество игр&nbsp;и&nbsp;способов улучшить настрой команды в&nbsp;условиях стрессовых исторических событий. Как&nbsp;только опробуем что-нибудь новое, непременно расскажем! <br></span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Летняя школа для джунов бекендеров за 1.5 млн ₽: что мы поняли, проведя стажировку
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Провели стажировку для джунов-бекендеров — наняли лучших и собрали грабли. Рассказываем, как не облажаться, если решите запускать такой курс сами.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/summer-internship-results/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/summer-internship-results/</guid>

                <pubDate>Tue, 06 May 2025 12:56:52 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Летняя школа для джунов бекендеров за 1.5 млн ₽: что мы поняли, проведя стажировку</h1>
                                <figure>
                                    <img src="/Media/2993/slide-16_9-25.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3d155bb7d55105a1e417aec9b5f7d7d4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f8db7b275f5b42e2bb31251d0e2302a2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Мы уже&nbsp;писали <a href="https://vc.ru/life/775107-kak-zapustit-stazhirovku-dlya-razrabotchikov-v-malenkoy-kompanii-i-ne-soyti-s-uma-no-eto-ne-tochno">статью</a> о&nbsp;том, как&nbsp;стартовали проект стажировки, как&nbsp;организовывали занятия и&nbsp;домашки, и&nbsp;что&nbsp;нам&nbsp;говорили наши стажеры по&nbsp;итогам первой половины курса. Для&nbsp;полноты картины можно ознакомиться сначала с&nbsp;первым материалом, в&nbsp;потом вернуться сюда. </span></p>
<h2>План и&nbsp;факт </h2>
<p><span style="font-weight: 400;">Курс рассчитывали на&nbsp;2 месяца и&nbsp;9 занятий, к&nbsp;6 из&nbsp;которых прилагались домашние задания, формирующие пет-проект. Старт планировали 3 июля. Ожидали, что&nbsp;соберем желающих поучаствовать человек 40, и&nbsp;возьмем на&nbsp;курс где&#8209;то&nbsp;15. Подведение итогов и&nbsp;интервью с&nbsp;лучшими учениками должны были случиться примерно на&nbsp;первой неделе сентября. За&nbsp;это&nbsp;время мы&nbsp;думали не&nbsp;только провести занятия и&nbsp;проверить домашние задания стажеров, но&nbsp;и&nbsp;подготовить эти&nbsp;самые занятия и&nbsp;задания в&nbsp;процессе. Спойлер: идея оказалась так&nbsp;себе. </span></p>
<p><span style="font-weight: 400;">Желающих пришло гораздо больше – анкету на&nbsp;участие заполнили 162 человека. Относительно проведения занятий в&nbsp;сроки мы&nbsp;уложились. Последняя лекция курса состоялась 24 августа – на&nbsp;восьмой неделе со&nbsp;старта стажировки. А&nbsp;вот&nbsp;с&nbsp;подведением итогов затянули. На&nbsp;проверку итоговых проектов ушло много времени, да&nbsp;и&nbsp;организовать интервью с&nbsp;лидерами курса получилось не&nbsp;сразу. В&nbsp;итоге оффер лучшему кандидату на&nbsp;место в&nbsp;команде выслали только в&nbsp;октябре. О&nbsp;том, почему такая временная пропасть образовалась, расскажем дальше.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e3e873e9070d4b938b6d98cb185b443b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2995/slide-16_9-39.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/60eaba386f704524aa0c14e5b358a4c9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Проверять итоговые проекты стажеров мы&nbsp;закончили примерно в&nbsp;середине сентября, хоть и&nbsp;дедлайн их&nbsp;сдачи был&nbsp;4 числа. Когда пришло время проверки, один из&nbsp;наших разработчиков-преподавателей ушел в&nbsp;отпуск, у&nbsp;другого была большая загрузка на&nbsp;проекте. Словом, пришлось успевать кое-как, поэтому процесс затянулся. Хоть и&nbsp;не&nbsp;быстро, но&nbsp;сделали все&nbsp;по&nbsp;совести: пяти лучшим студентам предложили интервью, остальным ребятам рассказали, что&nbsp;подтянуть, чтобы справляться лучше.</span></p>
<p><span style="font-weight: 400;">До «финала» дошли 10 ребят, с&nbsp;пятью из&nbsp;которых мы&nbsp;провели интервью. Студенты нам&nbsp;попались действительно крутые и&nbsp;талантливые. Некоторые по&nbsp;своей инициативе усовершенствовали пет-проект. Кто&#8209;то&nbsp;сделал автоматический запуск тестов при&nbsp;изменениях кода. Кто&#8209;то&nbsp;уже&nbsp;после проверки дорабатывал решение. Если кто&#8209;то&nbsp;из&nbsp;наших стажеров читает эту&nbsp;статью сейчас, знайте, что&nbsp;вы&nbsp;большие молодцы!</span></p>
<h2>Как строили курс</h2>
<p><span style="font-weight: 400;">Первым этапом было тестовое задание, которое из&nbsp;162 заявившихся на&nbsp;курс прислали человек 70-80. После проверки тестовых мы&nbsp;отобрали 29 ребят и&nbsp;пригласили их&nbsp;на&nbsp;стажировку.</span></p>
<p><span style="font-weight: 400;">Каждую неделю, начиная с&nbsp;6 июля проводили 1-2 занятия, дополняя их&nbsp;домашними заданиями, которые нужно было выполнять в&nbsp;GitHub. В&nbsp;конце курса стажерам нужно было сделать пет-проект, собрав все&nbsp;домашки вместе. Суть проекта – приложение для&nbsp;получения курсов валют, состоящее из&nbsp;двух сервисов. Один отвечает за&nbsp;получение, хранение и&nbsp;кэширование курсов валют. Второй – web&nbsp;API. Если интересно, можете </span><a href="https://github.com/Fuse8/school2023"><span style="font-weight: 400;">ознакомиться с&nbsp;заданиями</span></a><span style="font-weight: 400;">.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/bc591d7163f54f5e8fb0e978e57c170e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2997/slide-16_9-42.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5dc0e4dd232b4e569de63a416df19578"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Вопросы и&nbsp;спорные моменты решали в&nbsp;телеграм-чате, где&nbsp;также публиковались анонсы лекций, ссылки на&nbsp;ДЗ&nbsp;и&nbsp;другая важная информация. </span></p>
<p><span style="font-weight: 400;">Три раза за&nbsp;курс собирали обратную связь со&nbsp;стажеров через гугл-формы – после первого занятия, в&nbsp;середине и&nbsp;конце курса. Старались учитывать просьбы и&nbsp;пожелания.</span></p>
<p><span style="font-weight: 400;">Занятия, которые проводили наши бекенд-лиды, организовывали в&nbsp;гугл-мит. Записи занятий и&nbsp;презентации для&nbsp;них&nbsp;после присылали в&nbsp;тг&#8209;чат&nbsp;ребятам для&nbsp;повторного или&nbsp;самостоятельного изучения теми, кто&nbsp;не&nbsp;смог присутствовать на&nbsp;занятии онлайн.</span></p>
<p><span style="font-weight: 400;">Качество выполнения работ отслеживали в&nbsp;таблице, чтобы в&nbsp;конце быстро соотнести результаты и&nbsp;выявить лучших.</span></p>
<h2>Вопросы к&nbsp;формату</h2>
<p><span style="font-weight: 400;">Изначально наш&nbsp;курс мы&nbsp;позиционировали именно как&nbsp;стажировку. В&nbsp;итоге проект больше, конечно, походил именно на&nbsp;курс по&nbsp;разработке, потому что&nbsp;было всего два&nbsp;вида активностей: лекции и&nbsp;ДЗ. </span></p>
<p><span style="font-weight: 400;">Чтобы приблизиться к&nbsp;формату именно стажировки, нам&nbsp;стоило вводить более интерактивные занятия, на&nbsp;которых был&nbsp;бы&nbsp;некий мозгоштурм, например, имитирующий процесс командной работы на&nbsp;реальном проекте. Такой подход убил бы&nbsp;двух зайцев: ребята бы&nbsp;получили возможность профессионально проявить себя, а&nbsp;мы, памятуя о&nbsp;предстоящем найме, сразу оценили бы&nbsp;их&nbsp;коммуникацию и&nbsp;способность презентовать идеи.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/aca48737a23d4b6fb94988a0ccc04266"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2996/slide-16_9-40.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bdb46f04f30e4390a80cd9e7616cadce"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Чего точно не&nbsp;стоит делать – пренебрегать домашними заданиями на&nbsp;таком курсе. Это&nbsp;ценная штука для&nbsp;стажеров и&nbsp;для&nbsp;нас, как&nbsp;нанимателей – можно уже&nbsp;после первых проверок понять, как&nbsp;человек думает и&nbsp;решает задачи. Однако цена проверки этих заданий не&nbsp;менее высока – одновременно отсматривать задания и&nbsp;готовиться к&nbsp;лекциям оказалось непросто.</span></p>
<h2>Временные и&nbsp;финансовые затраты</h2>
<p><span style="font-weight: 400;">Мы действительно переоценили себя, предположив, что&nbsp;готовить курс и&nbsp;проводить его&nbsp;одновременно будет посильной ношей. Весь проект стажировки занял у&nbsp;нас&nbsp;порядка 500 часов разработчиков, PR&nbsp;и&nbsp;HR. В&nbsp;денежном эквиваленте это&nbsp;около 1.5 млн&nbsp;рублей, что&nbsp;сравнимо со&nbsp;стоимостью небольшого нашего проекта для&nbsp;заказчиков.</span></p>
<p><span style="font-weight: 400;">Боли добавил отпускной сезон. Одному из&nbsp;наших преподавателей-разработчиков где&#8209;то&nbsp;в&nbsp;середине курса пришлось в&nbsp;одиночку работать на&nbsp;проекте и&nbsp;при&nbsp;этом еще&nbsp;готовить занятия, потому что&nbsp;коллеги ушли в&nbsp;отпуск. Этого нюанса на&nbsp;старте мы&nbsp;не&nbsp;учли, а&nbsp;стоило бы.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/d515a262ef9b45ac9e30854fbb18e528"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2994/slide-16_9-43.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/931bf933027f423aa2ccaa2f603352b6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Зато теперь у&nbsp;нас&nbsp;есть </span><span style="font-weight: 400;">опыт</span><span style="font-weight: 400;"> готовая программа для&nbsp;обучения джунов на&nbsp;.NET. Использовать ее, добавляя минимальные корректировки, можно будет еще&nbsp;пару лет, повторяя опыт нашего курса, но&nbsp;уже&nbsp;без&nbsp;неизбежной потребности уложиться в&nbsp;сжатые сроки. </span></p>
<p><span style="font-weight: 400;">Ну и&nbsp;главный позитивный исход всех стараний – активный и&nbsp;продуктивный новичок в&nbsp;команде, который совсем скоро приступит к&nbsp;нашим внутренним и&nbsp;заказным проектам. Кроме того, мы&nbsp;выделили для&nbsp;себя еще&nbsp;пару ребят, которых не&nbsp;можем устроить на&nbsp;работу сейчас, но&nbsp;будем рады предложить им&nbsp;место в&nbsp;команде, когда начнем реализовывать наши новые проекты.</span></p>
<h2>Если вы&nbsp;тоже хотите сделать стажировку или&nbsp;курс для&nbsp;разработчиков</h2>
<p><strong>Пишите вводные, максимально объясняя все&nbsp;подряд – даже те&nbsp;моменты, которые вам&nbsp;кажутся очевидными.</strong><span style="font-weight: 400;"> У&nbsp;нас&nbsp;на&nbsp;этапе тестовых заданий в&nbsp;самом начале случалось, что&nbsp;кто&#8209;то&nbsp;решал задания на&nbsp;java, хотя курс у&nbsp;нас&nbsp;по&nbsp;C#. Кто&#8209;то&nbsp;присылал ответы в&nbsp;нечитаемых форматах, кто&#8209;то&nbsp;писал тему письма как&nbsp;попало, поэтому мы&nbsp;такие ответы просто теряли.</span></p>
<p><strong>Google Meet не&nbsp;подходит для&nbsp;проведения курса.</strong><span style="font-weight: 400;"> Стажеры жаловались, что&nbsp;нельзя отмотать видео назад, если опоздал на&nbsp;занятие (в&nbsp;случае трансляции на&nbsp;ютубе можно). Также были жалобы на&nbsp;качество записанных уроков – даже если выставлять 720р, не&nbsp;видны фрагменты кода на&nbsp;презентациях. Отчасти эта&nbsp;проблема решалась пересылкой презентаций стажерам, но&nbsp;на&nbsp;будущее нужно будет искать все&#8209;же&nbsp;другие способы.</span></p>
<p><strong>Можно сократить время на&nbsp;проверку ДЗ, если первые несколько ДЗ&nbsp;по&nbsp;основам дисциплин сделать автоматически проверяемыми</strong><span style="font-weight: 400;"><strong> – через тесты</strong>, которые были готовы вместе с&nbsp;проектом на&nbsp;этапе проектирования ДЗ. В&nbsp;таком случае проверяться будет работоспособность кода, а&nbsp;не&nbsp;его&nbsp;красота, но&nbsp;время на&nbsp;организацию процесса существенно сократится.</span></p>
<p><strong>Отдельное занятие по&nbsp;Git&nbsp;действительно нужно некоторым начинающим разработчикам.</strong><span style="font-weight: 400;"> Оказалось, что&nbsp;не&nbsp;все&nbsp;умеют им&nbsp;пользоваться, либо знают, но&nbsp;не&nbsp;понимают, зачем он&nbsp;нужен. Вследствие этого  несколько человек писали, что&nbsp;сломали ветку и&nbsp;удаляли по&nbsp;этой причине репозитории, а&nbsp;потом создавали их&nbsp;заново, соответственно запрашивая повторную проверку. Это&nbsp;тоже тратило наше время. </span></p>
<p><strong>Закладывайте время на&nbsp;подготовку до&nbsp;начала курса.</strong><span style="font-weight: 400;"> Особенно, если делаете его&nbsp;с&nbsp;нуля только на&nbsp;базе опорных материалов, а&nbsp;не&nbsp;берете уже&nbsp;готовую программу. </span></p>
<p><strong>Подбирайте для&nbsp;проведения курса ребят с&nbsp;разных проектов.</strong> <span style="font-weight: 400;">Так можно избежать рисков, связанных с&nbsp;нехваткой времени, когда все&nbsp;«зашиваются», и&nbsp;нет&nbsp;свободных рук, которые бы&nbsp;работали работу. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Где приятнее покупать автозапчасти: сравниваем интернет-магазины из афтермаркета с «Озоном» и друг с другом
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Автомаркетплейсы растут, а нишевые магазины сдают позиции. Как влияет производительность сайтов на продажи запчастей? Анализ 7 крупных игроков.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/aftermarket/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/aftermarket/</guid>

                <pubDate>Tue, 06 May 2025 12:56:21 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Где приятнее покупать автозапчасти: сравниваем интернет-магазины из афтермаркета с «Озоном» и друг с другом</h1>
                                <figure>
                                    <img src="/Media/3015/&#x43E;&#x431;&#x43B;&#x43E;&#x436;&#x43A;&#x430;.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9a03899fe099b5951dc3e0b146665eaa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1258e9bfd71c4fd4838898ae3051d8ed"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p><a rel="nofollow noreferrer noopener" href="https://aftermarket-data.ru/articles/ozon_mims_2023" target="_blank">Согласно исследованиям</a>, большинство автовладельцев покупают автозапчасти самостоятельно в&nbsp;интернете, а&nbsp;не&nbsp;на&nbsp;СТО. Они&nbsp;хотят сэкономить время и&nbsp;деньги, при&nbsp;этом не&nbsp;потеряв в&nbsp;возможности выбирать. Учитывая тенденцию на&nbsp;устаревание автопарка, тенденция к&nbsp;самостоятельной покупке может становиться все&nbsp;более актуальной.</p>
</div>
<div class="l-island-a">
<p>Если раньше профильные интернет-магазины автозапчастей лидировали по&nbsp;количеству продаж и&nbsp;клиентов, то&nbsp;сейчас их&nbsp;вытесняют маркетплейсы, работа с&nbsp;которыми за&nbsp;последние несколько лет&nbsp;стала совершенно привычной и&nbsp;удобной для&nbsp;пользователя.</p>
<p><span>Прирост покупателей-автомобилистов на&nbsp;маркетплейсах – результат работы над&nbsp;производительностью этих сервисов. Найти и&nbsp;купить товары с&nbsp;доставкой можно быстро и&nbsp;без&nbsp;задержек, чего не&nbsp;скажешь о&nbsp;некоторых профильных интернет-магазинах.</span></p>
<p><span>Кроме того, все&nbsp;больше покупателей склонны пользоваться смартфонами, заказывая запчасти для&nbsp;своих автомобилей. Маркетплейсы предусматривают такой сценарий, а&nbsp;вот&nbsp;профильные интернет-магазины – не&nbsp;всегда.</span><span></span></p>
<p> </p>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/f7af7f7837ae4a62ab368c8cbdf64caf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3016/&#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x435;_2023-12-25_093422627.png"
         alt=""
         itemprop="">


        <figcaption>
            Источник: https://datainsight.ru/avto_2h2020_1h2021
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2c47949da17d4878a59d72ff369bd958"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p>Согласно<span> </span><a rel="nofollow noreferrer noopener" href="https://www.thinkwithgoogle.com/marketing-strategies/app-and-mobile/mobile-page-speed-new-industry-benchmarks/" target="_blank">исследованию Google</a>, если загрузка длится на&nbsp;1-3 секунды дольше обычного, то&nbsp;шанс, что&nbsp;юзер покинет ресурс повышается на&nbsp;32%. Если задержка дольше на&nbsp;1-5 секунд – вероятность взлетает до&nbsp;90%. В&nbsp;таком случае пользователь закроет страницу и&nbsp;отправится искать более быструю альтернативу.</p>
</div>
<div class="l-island-a">
<p>Поэтому, чтобы выдержать конкуренцию, компаниям, продающим автозапчасти через сайт, нужно обращать внимание на&nbsp;показатели производительности своих интернет-магазинов. Плавность и&nbsp;быстрота работы с&nbsp;ресурсом и&nbsp;на&nbsp;десктопе, и&nbsp;на&nbsp;мобильном устройстве улучшает пользовательский опыт и&nbsp;удерживает покупателей.</p>
</div>
<h2>Методика исследования</h2>
<div class="l-island-a">
<p><span>Мы провели аудит производительности нескольких сайтов по&nbsp;продаже автозапчастей, сконцентрировавшись на&nbsp;опыте взаимодействия с&nbsp;ними B2C сегмента, чтобы проверить гипотезу об&nbsp;уходе пользователей из&#8209;за&nbsp;медленной работы ресурса.</span></p>
<p><span>В ходе исследования приближаемся к&nbsp;пониманию того, насколько классические интернет-магазины готовы к&nbsp;конкурентной борьбе с&nbsp;маркетплейсами, готовы ли&nbsp;они&nbsp;к&nbsp;увеличению B2C покупателей. По&nbsp;результатам тестов получилось выделить лидеров и&nbsp;выявить общие и&nbsp;частные проблемы, дать рекомендации по&nbsp;улучшению производительности.</span></p>
<p><strong>В сравнении участвовали 7 конкурсантов:</strong></p>
<ul>
<li><strong>Exist.ru</strong></li>
<li><strong>Autodoc.ru</strong></li>
<li><strong>Auto3N</strong></li>
<li><strong>Автостэлс</strong></li>
<li><strong>Автокомпас</strong></li>
<li><strong>Автоевро</strong></li>
<li><strong>Озон (категория автозапчасти)</strong></li>
</ul>
<p>Помимо вышеперечисленных сайтов, мы&nbsp;хотели исследовать <a rel="noopener noreferrer nofollow" href="https://autopiter.ru/">Автопитер</a> и&nbsp; <a rel="noopener noreferrer nofollow" href="https://emex.ru/">Emex.ru</a>, но&nbsp;зафиксировать показатели на&nbsp;них&nbsp;не&nbsp;смогли – ребята не&nbsp;пропускают к&nbsp;себе проверяющих роботов.</p>
<p>За основу для&nbsp;исследования производительности взяли стандартный сценарий работы пользователя с&nbsp;сайтом:</p>
<ul>
<li>заход на&nbsp;главную,</li>
<li>поиск,</li>
<li>выбор товара (страница конкретного товара).</li>
</ul>

<div class="umb-macro-highlights">
    <strong>Производительность для&nbsp;десктопной и&nbsp;мобильной версии сайтов анализировали с&nbsp;помощью сервисов Google Page Speed (GPS) и&nbsp;WebPageTest.</strong>
    В&nbsp;качестве ключевой метрики выбрали LCP&nbsp;— Largest Contentful Paint. Метрика показывает время отрисовки самой большой и&nbsp;видимой части контента на&nbsp;странице. Крайне допустимое значение здесь – 2,5 секунды. Если загрузка дольше, скорее всего, пользователь с&nbsp;сайта уйдет.
</div>

<p>Другие проанализированные показатели:</p>
<ul>
<li>FCP – время загрузки первого видимого для&nbsp;пользователя контента на&nbsp;сайте. До&nbsp;1.8 секунд – хорошо. Больше – есть проблемы. От&nbsp;3 секунд – плохо.</li>
<li>CLS – метрика, показывающая насколько контент сайта сдвигается из&#8209;за&nbsp;подгрузки других элементов страницы. Хороший показатель здесь – до&nbsp;0,1. 0,1-0,25 – есть проблемы, выше 0,25 – плохо.</li>
<li>INP – оценка общей отзывчивости страницы на&nbsp;действия пользователя, включая задержку нажатий, касаний и&nbsp;других взаимодействий с&nbsp;сайтом. 200 и&nbsp;менее миллисекунд – хорошо, между 200 и&nbsp;500 – есть проблемы, 500 и&nbsp;более – плохо.</li>
</ul>
<p>Показатели учитывали полевые, потому что&nbsp;они&nbsp;более достоверно иллюстрируют опыт взаимодействия с&nbsp;исследуемыми сайтами из&nbsp;России. Иначе говоря – используем полевые показатели, так&nbsp;как&nbsp;в&nbsp;них&nbsp;с&nbsp;меньшей вероятностью появятся погрешности из&#8209;за&nbsp;специфики работы аналитических систем, которые мы&nbsp;использовали.</p>
<p>Для полноты картины постарались определить с&nbsp;помощью инструмента BuildWith, на&nbsp;чем&nbsp;каждый из&nbsp;сайтов написан.</p>
<p>А теперь к&nbsp;результатам!</p>
<h2>Exist</h2>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/3f966df09135454ca81c8b1d0021a907"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3007/slide-16_9-61.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c62ee33729874fb9b67d828ab30ae49b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Написан на&nbsp;jQuery.</p>
<p>В ходе проведения тестов выяснилось, что&nbsp;показатели производительности десктопной версии лучше, чем&nbsp;на&nbsp;мобильных устройствах. Позже поймем, что&nbsp;такая проблема встречается у&nbsp;всех конкурсантов как&nbsp;минимум на&nbsp;одной из&nbsp;проанализированных страниц. Вот&nbsp;какие результаты у&nbsp;Экзист:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/134e9a16e12d42fd8ae60dc1707eea64"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2998/slide-16_9-41.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/29980342bf2442bcb7f7f09a7827d782"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><a rel="noopener noreferrer nofollow" href="https://www.exist.ru/">Exist.ru</a> адаптирован под&nbsp;мобильные устройства, и&nbsp;в&nbsp;целом показывает неплохие результаты, но&nbsp;кое&#8209;где&nbsp;производительность на&nbsp;мобилках требует доработок.</p>
<p>Что можно улучшить: избавиться от&nbsp;блокирующих ресурсов и&nbsp;неиспользуемого кода. Кроме того, скорость загрузки уменьшается за&nbsp;счет встраивания сторонних сервисов в&nbsp;работу сайта. У&nbsp;Exist это&nbsp;сервисы Яндекса – они&nbsp;загружаются перед основными ресурсами сайта, что&nbsp;негативно влияет на&nbsp;производительность.</p>
<h2>Автодок</h2>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/d391a8ad4fdd4c9ca3f1237a68435efb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3008/slide-16_9-62.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a8db4336a5f14fe392b2390e8bff1d02"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Сайт написан на&nbsp;Angular и&nbsp;не&nbsp;имеет выделенной страницы для&nbsp;поиска товара. Зато при&nbsp;вводе артикула пользователь перенаправляется сразу на&nbsp;страницу товара.</p>
<p>Из приятного – милый прогресс-бар в&nbsp;ходе загрузки страницы. В&nbsp;остальном результаты не&nbsp;впечатляют – особенно для&nbsp;главной.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/f8c3a3e6150c448293bb26f49202548d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2999/slide-16_9-42.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/43c1982bef1d447a9ee1f04662b77abe"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Множество проблем на&nbsp;сайте вызывают неоптимизированные изображения устаревших форматов. Они&nbsp;расходуют много трафика и&nbsp;из&#8209;за&nbsp;этого загружаются медленнее. Можно смело рекомендовать сменить формат используемых на&nbsp;сайте изображений на&nbsp;WebP и&nbsp;AVIF – уже&nbsp;только эта&nbsp;манипуляция на&nbsp;35-50% улучшит перфоманс.</p>
<p><a rel="noopener noreferrer nofollow" href="https://www.autodoc.ru/">Autodoc.ru</a> в&nbsp;некотором смысле уникальный конкурсант в&nbsp;нашем шорт-листе. Это&nbsp;единственный сайт, который не&nbsp;работает через SSR&nbsp;(серверный рендеринг). Это&nbsp;обычно ведет к&nbsp;неоптимальному ранжированию в&nbsp;поисковике.</p>
<h2>Auto3N</h2>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/6b0e836f90674a5c962633c748545e87"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3009/slide-16_9-63.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/402b0662fd234e8ab603b8ca2f0b41c6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Сайт написан на&nbsp;Vue. Главная страница оптимизирована хуже всего. Производительность мобильной версии для&nbsp;всех страниц отстает от&nbsp;десктопа, особенно сильно это&nbsp;видно в&nbsp;INP&nbsp;– отзывчивость страдает.</p>
<p>Основная проблема здесь – долгое время ответа сервера при&nbsp;загрузке. Также скорость загрузки замедляет неправильно настроенное кэширование данных и&nbsp;большое количество стороннего кода от&nbsp;внешних подключенных к&nbsp;сайту сервисов.</p>
<p>Лучший десктопный показатель у&nbsp; <a rel="noopener noreferrer nofollow" href="https://auto3n.ru/">Auto3N</a> на&nbsp;странице поиска товара:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e82e9655e9ce4b3ab36cea4d84be57b8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3000/slide-16_9-43.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1ebdeae5c1474fbeb6c178f5e1a622ac"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Основная проблема – большое количество неиспользуемого кода при&nbsp;загрузке сайта. Он&nbsp;блокирует загрузку нужного контента и&nbsp;зря&nbsp;расходует пользовательский трафик.</p>
<h2>Автостэлс</h2>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/c36cb1d8e121488ba91bd91e1dfe3fd9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3011/slide-16_9-65.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d017e69f747b47309d4e3dc19ba55eff"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Сразу оговоримся, что&nbsp;анализировали версию сайта, которая не&nbsp;требует логина для&nbsp;ее&nbsp;использования.</p>
<p><a rel="noopener noreferrer nofollow" href="https://www.autostels.ru/">Автостэлс</a> написан на&nbsp;jQuery, и&nbsp;среди проблем можно выделить моральное и&nbsp;техническое отставание от&nbsp;современных стандартов разработки. А&nbsp;еще&nbsp;отсутствие мобильной версии как&nbsp;таковой, что, конечно, большой минус (помним про&nbsp;конкуренцию с&nbsp;маркетплейсами). При&nbsp;этом отметим, что&nbsp;технологии пусть и&nbsp;старые, но&nbsp;на&nbsp;самом деле хорошо показывают себя с&nbsp;точки зрения производительности фронтенда как&nbsp;сами по&nbsp;себе, так&nbsp;и&nbsp;в&nbsp;сравнении с&nbsp;предыдущими примерами.</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/30ece11e8cc34089bf9e1ae49e4b6592"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3001/slide-16_9-44.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2d31168438024a7f841015b737755156"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Автокомпас</h2>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/3b75470058f34d599ea2a72fbd735853"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3010/slide-16_9-64.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0dfb9eff1bcb40fbbff8214370dd72da"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Почти идеальная производительность по&nbsp;результатам тестов! <a rel="noopener noreferrer nofollow" href="https://www.autocompas.ru/">Автокомпас</a> – наивысшие показатели по&nbsp;большинству критериев оценивания. Браво технической команде за&nbsp;высокие стандарты и&nbsp;скиллы в&nbsp;разработке!</p>
<p>Лучшие результаты в&nbsp;поиске и&nbsp;на&nbsp;странице товара:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/10d249f450bf4d68994a5a62446c5fd5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3002/slide-16_9-45.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6ab9dd0f230045479c613100fd8381be"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В отличие от&nbsp;предыдущих конкурсантов, у&nbsp; <a rel="noopener noreferrer nofollow" href="https://www.autocompas.ru/">Автокомпас</a>а CLS&nbsp;в&nbsp;мобильной версии даже лучше чем&nbsp;в&nbsp;десктопной. Впрочем, и&nbsp;на&nbsp;десктопе сдвиг контента минимален, что&nbsp;отлично. Если придираться, можно сказать, что&nbsp;отклик на&nbsp;мобилках можно немного улучшить, но&nbsp;пока это&nbsp;мелочи.</p>
<h2>Автоевро</h2>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/3f0cb25879d64493ae7088849b3104c9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3012/slide-16_9-66.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/10cf15fa5ef4491b8db3d85381d81a05"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span>Здесь страницы поиска и&nbsp;товара – самые слабые места. Загрузка сильно тормозит, что&nbsp;повышает риск закрытия страницы пользователем на&nbsp;90%. Также на&nbsp;этих страницах показатель отклика запредельный.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/f55ba8c5e16241e6b1d23d81cd16071a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3003/slide-16_9-46.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ec938127a0c3487eb88efc9478e873eb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Проблемы уже&nbsp;знакомые нам&nbsp;из&nbsp;результатов предыдущих конкурсантов: блокирующие ресурсы и&nbsp;неиспользуемый код, которые расходуют трафик и&nbsp;увеличивают ожидание загрузки нужного пользователю контента. Как&nbsp;видите, проблемы одни и&nbsp;те&nbsp;же, но&nbsp;их&nbsp;влияние на&nbsp;производительность ресурса может сильно отличаться ввиду разной степени запущенности.</p>
<p>Оптимизация под&nbsp;мобилки на&nbsp;сайте вообще отсутствует.</p>
<h2>Озон (категория автозапчасти)</h2>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/aa2c563cfccd44a09c60a7ee44b0c9ec"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3013/slide-16_9-67.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bdc745dd2fba47fc9261f48c087dbe44"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p>Озон перетягивает к&nbsp;себе клиентов компаний, продающих автозапчасти, уже&nbsp;не&nbsp;первый год&nbsp;– конкуренция только усиливается. Не&nbsp;так&nbsp;давно на&nbsp;Озоне появился поиск по&nbsp;оригинальным запчастям. Поэтому мы&nbsp;решили включить категорию в&nbsp;нашу выборку, чтобы посмотреть, насколько конкурентными окажутся показатели у&nbsp;профильных ресурсов по&nbsp;сравнению с&nbsp;маркетплейсом. Результаты следующие:</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/77f36ca86dda498583b29297c1e52e1f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3004/slide-16_9-47.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e9530746bee746379606dd50fa318698"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Сложно назвать это&nbsp;проблемой, но&nbsp;среди всех исследуемых ресурсов категория автозапчастей на&nbsp;Озоне выдает не&nbsp;самые высокие показатели по&nbsp;многим параметрам. Держим при&nbsp;этом в&nbsp;голове, что&nbsp;приложение это&nbsp;наиболее сложное среди всех нами исследованных представителей и&nbsp;имеет крупнейший охват. Поэтому, вероятно, показатели со&nbsp;временем будут расти. Однако отметим, что&nbsp;у&nbsp;Озона минимальные показатели LCP, что&nbsp;улучшает пользовательский опыт и&nbsp;обеспечивает высокую конверсию.</p>
<h2>Оффтоп – Autodoc.de</h2>
<p>Автодок есть и&nbsp;в&nbsp;Европе. Конечно, с&nbsp;российским тезкой он&nbsp;не&nbsp;имеет ничего общего, зато это&nbsp;крупнейший интернет-магазин автозапчастей в&nbsp;Европе. Наши клиенты считают ресурс хорошим примером для&nbsp;подражания с&nbsp;точки зрения привлечения трафика и&nbsp;SEO&nbsp;оптимизации. Посмотрим, все&nbsp;ли&nbsp;хорошо у&nbsp;него с&nbsp;производительностью.</p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/dbac83f8c3c34204b7a0aea6239fa0dc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3014/slide-16_9-68.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/03e16627741d4600b7caa0deee169927"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span>Сайт написан на&nbsp;AngularJS и&nbsp;отличается уникальной особенностью. Для&nbsp;мобильной версии сайта используется </span><a rel="noopener noreferrer nofollow" href="https://m.autodoc.de/">отдельный URL</a><span>. Сейчас так&nbsp;делают редко. Самостоятельность мобильной версии, однако, от&nbsp;проблем производительности не&nbsp;избавляет.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/406d99c932e645ff8714bf442be4e1e3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3005/slide-16_9-48.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a1b5a9a535dd4d9b93d5a918bd189e1b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Из особенностей – <a rel="noopener noreferrer nofollow" href="https://www.autodoc.de/">Autodoc</a> показывает наибольшее время загрузки при&nbsp;выполнении стандартного сценария поиска товара и&nbsp;помещения его&nbsp;в&nbsp;корзину. Это&nbsp;ухудшает общий пользовательский опыт и&nbsp;снижает конверсию сайта. Если проще – человек бесится и&nbsp;закрывает все&nbsp;это&nbsp;дело, потому что&nbsp;не&nbsp;хочет ждать, пока процесс прогрузится, и&nbsp;идет на&nbsp;другой сайт.</p>
<p>Если бы&nbsp;мы&nbsp;включали этот ресурс в&nbsp;топ, то&nbsp;он&nbsp;был&nbsp;бы&nbsp;на&nbsp;последнем месте, потому что&nbsp;показатели производительности здесь получились самые низкие.</p>
<h2>Выбираем лучших</h2>
<p><strong>Лидер по&nbsp;производительности – Автокомпас</strong></p>
<p><strong>2-е место – Озон</strong></p>
<p><strong>3-е место – Автостэлс</strong></p>
<p><strong>4-е место – Экзист</strong></p>
<p><strong>5-е место – Автодок</strong></p>
<p><strong>6-е место – Авто3N</strong></p>
<p><strong>7-е место – Автоевро</strong></p>
<h2>Общие проблемы, ухудшающие производительность</h2>
<p>Часто на&nbsp;исследуемых сайтах были замечены <strong>неоптимизированные изображения – форматы PNG&nbsp;или&nbsp;JPEG</strong>. Замена их&nbsp;на&nbsp;менее ресурсоемкие WebP и&nbsp;AVIF заметно улучшит производительность сайта.</p>
<p>Другая частая проблема – <strong>загрузка неиспользуемого кода (css, js)</strong>. Чем&nbsp;меньше кода загружается на&nbsp;странице, тем&nbsp;быстрее она&nbsp;загружается и&nbsp;тем&nbsp;лучше опыт пользователей. Неиспользуемый код&nbsp;– тот, что&nbsp;не&nbsp;участвует в&nbsp;отрисовке контента для&nbsp;загружаемой страницы. Уводим его&nbsp;оттуда, где&nbsp;он&nbsp;не&nbsp;нужен, и&nbsp;получаем прирост производительности.</p>
<p>Не раз&nbsp;шла&nbsp;речь о&nbsp; <strong>ресурсах, блокирующих первичные отображения наиболее важного контента</strong>. Это, например, могут быть встройки в&nbsp;сайт аналитических сервисов гугла или&nbsp;яндекса, сторонние API, которые помогают сайту функционировать или&nbsp;ресурсы иного назначения, как&#8209;то&nbsp;участвующие в&nbsp;работе сайта. Важно сделать так, чтобы их&nbsp;загрузка не&nbsp;блокировала загрузку необходимого пользователю контента. Тогда юзеру не&nbsp;придется ждать и&nbsp;негодовать.</p>
<p>Среди других частых проблем выявили у&nbsp;конкурсантов <strong>неэффективное использования кеша</strong>, в&nbsp;результате которого появляются повторные загрузки при&nbsp;переходах от&nbsp;страницы к&nbsp;странице, и<span> </span><strong>обилие устаревших технологий</strong>, осложняющих оптимизацию.</p>
<h2>Положительные особенности, общие для&nbsp;большинства конкурсантов</h2>
<p><strong>Мобильная версия сайта – это&nbsp;хорошо.</strong><span> </span>Сейчас ее&nbsp;наличие уже&nbsp;можно считать необходимостью.</p>
<p>У большинства конкурсантов сайты построены на&nbsp;SSR.<strong> Серверный рендеринг (server side rendering / SSR)</strong> – подход, в&nbsp;котором страница генерируется на&nbsp;сервере при&nbsp;каждом запросе от&nbsp;пользователя. Этот подход наиболее оптимален для&nbsp;ресурсов, содержащих контент, который часто публикуется и&nbsp;обновляется, требует индексации и&nbsp;непрерывного поддержания актуальности. Подробнее о&nbsp;разных подходах к&nbsp;реализации фронтенда можно почитать<span> </span><a href="/articles/frontend-approach-2023/" title="Разработка фронтенда ИТ-продукта: какой подход выбрать исходя из&nbsp;задач бизнеса">здесь</a>.</p>
<h2>Как решать проблемы производительности</h2>
<p>Решения проблем производительности зависят в&nbsp;первую очередь от&nbsp;специфики сайта, но&nbsp;можно выделить несколько общих рекомендаций:</p>
<ul>
<li>Используйте современные форматы изображений вида WebP и&nbsp;AVIF.</li>
<li>Реализуйте подгрузку изображений в&nbsp;зависимости от&nbsp;размера экрана пользователя, используя нативное API&nbsp;браузера вида srcset.</li>
<li>Минифицируйте ресурсы (JS, CSS, HTML) например используя различные плагины для&nbsp;Webpack.</li>
<li>Устраните ресурсы, блокирующие первичную отрисовку (загрузку).</li>
<li>Удалите неиспользуемый код.</li>
<li>Снизьте количество запросов к&nbsp;внешним ресурсам.</li>
<li>Используйте lazy load подход к&nbsp;загрузке ресурсов.</li>
<li>Используйте механизмы кэширования ресурсов.</li>
<li>Используйте векторную графику, а&nbsp;не&nbsp;растровую (где&nbsp;это&nbsp;имеет смысл).</li>
<li>Сжимайте файлы используя Gzip, Brotli (или&nbsp;другие аналогичные статьи).</li>
<li>Используйте HTTP2, вместо HTTP.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Продажа разработки: как получать доверие заказчика и проекты при большом цикле сделки
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Без воронок и CRM — только подходы и принципы, которые реально работают и применимы к любому проекту. Рассказываем, как мы делаем результат.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-sell-development/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-sell-development/</guid>

                <pubDate>Tue, 06 May 2025 12:54:01 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Продажа разработки: как получать доверие заказчика и проекты при большом цикле сделки</h1>
                                <figure>
                                    <img src="/Media/3019/slide-16_9-85.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b54578a1012ab70432c07bd037db9437"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/906fe5186db24a45be809ca709b93ea3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p>Мы делаем крупные, сложные и&nbsp;высоконагруженные проекты для&nbsp;бизнеса. Это&nbsp;значит, что&nbsp;помимо длительного времени разработки таких сервисов, много времени занимает и&nbsp;цикл сделки. С&nbsp;момента, когда заказчик заинтересовался нами как&nbsp;исполнителями, до&nbsp;фактической покупки разработки может пройти от&nbsp;3 до&nbsp;6 месяцев. Нюансы процесса продаж у&nbsp;нас&nbsp;опираются как&nbsp;раз&nbsp;на&nbsp;эту&nbsp;особенность работы.</p>
</div>
<div class="l-island-a">
<p>Продажу мы&nbsp;воспринимаем как&nbsp;часть проекта – первый его&nbsp;этап, когда за&nbsp;определенное время нужно прийти к&nbsp;намеченному результату. Для&nbsp;нас&nbsp;такое восприятие обусловлено стратегией развития компании: мы&nbsp;нацелены на&nbsp;долгосрочные контракты с&nbsp;LT&nbsp;от&nbsp;трех лет. Чем&nbsp;раньше начнем выстраивать партнерские отношения с&nbsp;клиентом, тем&nbsp;проще его&nbsp;выращивать – все&nbsp;на&nbsp;доверии.</p>
<div class="l-island-a">
<p>Заказчики очень разные, если учесть, что&nbsp;производство не&nbsp;конвейерное. У&nbsp;них&nbsp;разные уровни ожиданий, осведомленности и&nbsp;требований. Однако все&nbsp;то, о&nbsp;чем&nbsp;расскажем в&nbsp;статье, при&nbsp;любом заказчике и&nbsp;проекте позволит получить бонусов и&nbsp;отстроиться от&nbsp;конкурентов.</p>
</div>
<h2>Клиентский сервис начинается с&nbsp;этапа продаж: прозрачность и&nbsp;доверие</h2>
<div>
<p>Принцип кажется очевидным, но&nbsp;по&nbsp;рынку видно, что&nbsp;не&nbsp;все&nbsp;берут его&nbsp;на&nbsp;вооружение. С&nbsp;этапа продаж мы&nbsp;строим долгосрочные отношения с&nbsp;клиентом. Всегда в&nbsp;продажах участвует человек, который хорошо понимает бизнес. С&nbsp;самого начала нужно работать на&nbsp;доверие: держать заказчика в&nbsp;курсе, прозрачно рассказывать о&nbsp;себе и&nbsp;процессах, дать понять, как&nbsp;будет строиться работа.</p>
</div>
</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/71adc82a62d54e37932b6aadaab21ec3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3020/slide-16_9-79.png"
         alt=""
         itemprop="">


        <figcaption>
            Матрица доверия
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4541dbf67f5946c88e996cc88d73ac68"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="l-island-a">
<p>Когда заказчик приходит к&nbsp;нам&nbsp;впервые, доверие у&nbsp;него на&nbsp;нуле, даже если он&nbsp;прочитал все&nbsp;статьи и&nbsp;кейсы и&nbsp;услышал тысячу рекомендаций. На&nbsp;этапе продаж важно повысить доверие, а&nbsp;для&nbsp;этого – быть максимально прозрачными. Главная цель в&nbsp;продажах – довести до&nbsp;максимума уровень доверия. Делать это&nbsp;нужно постепенно, и&nbsp;один из&nbsp;инструментов здесь – «Продавать меньше, чтобы продавать больше».</p>
</div>
<h2>Продавать меньше, чтобы продавать больше</h2>
<div class="l-island-a">
<p>Когда циклы сделки длительные , а&nbsp;разрабатываемые продукты большие, бывает сложно оценить разработку всего и&nbsp;сразу. Заказчик при&nbsp;этом приходит не&nbsp;за&nbsp;оценкой и&nbsp;ТЗ, а&nbsp;за&nbsp;результатом – ИТ-продуктом. Между тем&nbsp;покупка любой разработки – большой риск. Фактически заказчик покупает обещание, что&nbsp;через какое&#8209;то&nbsp;время он&nbsp;получит продукт. Мы&nbsp;понимаем эту&nbsp;проблему, поэтому сначала продаем меньше, чтобы потом продавать больше.</p>

<div class="umb-macro-highlights">
    <strong>Сложно сразу отдать много денег людям, которых не&nbsp;знаешь.</strong>
    
</div>

<div class="l-island-a">
<p>Поэтому в&nbsp;любой продаже мы&nbsp;выделяем первый шаг, который будет полезен проекту, но&nbsp;потребует мало времени. По&nbsp;цене он&nbsp;будет комфортен для&nbsp;обеих сторон – этакий тест-драйв с&nbsp;понятным результатом для&nbsp;бизнеса.</p>
</div>
<div class="l-island-a">
<p>Например, у&nbsp;нас&nbsp;есть этап<span> </span><a rel="noopener" href="/articles/how-to-stop-writing-huge-documentation-and-start-development-faster/" target="_blank" title="Как перестать писать огромные ТЗ&nbsp;и&nbsp;быстрее стартовать разработку">предпроектной аналитики</a>, который длится один месяц вместо трех месяцев написания ТЗ. Есть еще<span> </span><a rel="noopener" href="/articles/tech-inspection/" target="_blank" title="Технический аудит здорового человека: зачем он&nbsp;продукту, и&nbsp;в&nbsp;чем&nbsp;его&nbsp;польза">технический аудит</a>. Через такие услуги снижаем планку входа для&nbsp;заказчика и&nbsp;сразу показываем, насколько мы&nbsp;крутые, чтобы повысить доверие.</p>
</div>
<div class="l-island-a">
<p>Почему лучше взять денег, а&nbsp;не&nbsp;сделать бесплатно? Это&nbsp;проверка заказчика на&nbsp;релевантность. Нужно убедиться, что&nbsp;человеку действительно нужен результат, и&nbsp;он&nbsp;не&nbsp;просто «похожу посмотрю» без&nbsp;явной цели начать работу.</p>
</div>
<div class="l-island-a">
<p>Такой шаг&nbsp;мы&nbsp;делали, например, для&nbsp;Emex – анализировали их&nbsp;существующую систему, чтобы в&nbsp;дальнейшем заняться масштабной переработкой. У&nbsp;нас&nbsp;есть<span> </span><a rel="noopener" href="/projects/emex-seller-drive-system-design/" target="_blank" title="Emex Seller Drive Analytics">материал об&nbsp;этом проекте</a>. За&nbsp;5 недель мы&nbsp;провели подробный анализ и&nbsp;наметили курс улучшений для&nbsp;продукта.</p>
<h2>Понимание задачи важнее всего</h2>
<div class="l-island-a">
<p>Нет ПЗ&nbsp;– нет&nbsp;КП. Помним, что&nbsp;продажи – первый этап проекта и&nbsp;создания ценности для&nbsp;заказчика, поэтому важно понять, что&nbsp;ему&nbsp;на&nbsp;самом деле нужно – без&nbsp;этого никакой пользы быть не&nbsp;может.</p>
</div>
<div class="l-island-a">
<p>Чтобы прояснить понимание задачи, мы&nbsp;организуем встречу с&nbsp;заказчиком, где&nbsp;узнаем про&nbsp;его&nbsp;бизнес и&nbsp;запрос, погружаемся в&nbsp;его&nbsp;проблемы и&nbsp;цели, после чего вместе формулируем ПЗ&nbsp;и&nbsp;согласовываем. Подробнее об&nbsp;этом процессе рассказали<a href="/articles/task-understanding/" title="Понимание задачи by&nbsp;fuse8: что&nbsp;такое и&nbsp;зачем  нужно"><span> </span>в другой нашей статье</a>.</p>

<div class="umb-macro-highlights">
    <strong>Реальная потребность заказчика не&nbsp;всегда равна запросу, с&nbsp;которым он&nbsp;приходит.</strong>
    
</div>

<div class="l-island-a">
<p>Например, как&#8209;то&nbsp;к&nbsp;нам&nbsp;обратился один из&nbsp;крупнейших дистрибьюторов 1С в&nbsp;РФ. Запрос – создать большущий маркетплейс для&nbsp;бизнесов, которым необходим 1С – что&#8209;то&nbsp;вроде узкопрофильной фриланс-биржи. Мы&nbsp;начали копать и&nbsp;поняли, что&nbsp;маркетплейс ребятам делать рано – нужно сперва понять, будет ли&nbsp;такой продукт востребован и&nbsp;набрать клиентскую базу. Поэтому мы&nbsp;не&nbsp;стали сразу оценивать разработку и&nbsp;требовать денег. Вместо этого помогли заказчику запустить процесс проверки гипотезы. Прошло время, и&nbsp;сейчас заказчик к&nbsp;нам&nbsp;вернулся. Гипотеза подтвердилась, и&nbsp;теперь можно обсуждать маркетплейс.</p>
</div>
<h2>Креативность в&nbsp;продажах – это&nbsp;подумать за&nbsp;заказчика</h2>
<div class="l-island-a">
<p>Даже когда есть настроенный и&nbsp;работающий процесс продаж – пресловутая воронка – на&nbsp;каждом этапе нужно пытаться придумать, что&nbsp;бы&nbsp;сделать такое прикольное, приносящее заказчику дополнительную пользу и&nbsp;помогающее продать.</p>
</div>
<div class="l-island-a">
<p>Например, можно пригласить заказчика с&nbsp;какого-нибудь текущего проекта поучаствовать в&nbsp;этапе продаж. Мы&nbsp;недавно провернули такой прием на&nbsp;переговорах с&nbsp;заказчиком из&nbsp;афтермаркета – позвали на&nbsp;встречу другого нашего заказчика из&nbsp;этой же&nbsp;сферы. Он&nbsp;рассказал, почему работает с&nbsp;нами уже&nbsp;три&nbsp;года, и&nbsp;погрузил в&nbsp;некоторые процессы потенциального покупателя. Новый проект мы&nbsp;в&nbsp;итоге получили.</p>

<div class="umb-macro-highlights">
    <strong>Креативность еще&nbsp;важно проявлять на&nbsp;этапе, когда заказчик уходит думать над&nbsp;вашим КП, чтобы через какое&#8209;то&nbsp;время вернуться с&nbsp;решением.</strong>
    
</div>

<div class="l-island-a">
<p>Многие компании просто напоминают о&nbsp;себе, но&nbsp;находятся в&nbsp;пассивном режиме ожидания. Наш&nbsp;подход – проявить активность и&nbsp;здесь.</p>
</div>
<div class="l-island-a">
<p>Вот пример. Сейчас мы&nbsp;делаем крупный сервис для&nbsp;заказчика, который в&nbsp;дальнейшем хочет растить свое ИТ-подразделение. Когда мы&nbsp;обсуждали, на&nbsp;каких технологиях будем делать фронтенд, ребята долго не&nbsp;могли определиться: React или&nbsp;Vue&nbsp;выбрать. Они&nbsp;рассуждали, отталкиваясь от&nbsp;того, на&nbsp;чем&nbsp;проще писать. Мы&nbsp;же&nbsp;предложили другой вариант: посмотреть, кого проще нанять.</p>
</div>
<div class="l-island-a">
<p>Мы провели быстрое исследование рынка соискателей и&nbsp;поняли, что&nbsp;резюме на&nbsp;React процентов на&nbsp;20% больше. Платят разработчикам React и&nbsp;Vue&nbsp;примерно одинаково, но&nbsp;вакансии на&nbsp;React закрываются быстрее. К&nbsp;тому же, на&nbsp;нем&nbsp;пишут в&nbsp;ряде крупных компаний из&nbsp;смежных отраслей – это&nbsp;значит, что&nbsp;можно будет нанимать с&nbsp;рынка специалистов с&nbsp;нужной отраслевой экспертизой. Через день после презентации этой информации заказчик выбрал нас&nbsp;как&nbsp;исполнителей и&nbsp;выбрал React для&nbsp;реализации фронтенда</p>
</div>
<h2>Лучше недообещать, чтобы потом не&nbsp;было мучительно больно</h2>
<div class="l-island-a">
<p>На последнем этапе продаж, когда заказчик «готовенький», и&nbsp;уже&nbsp;кажется, что&nbsp;до&nbsp;контракта рукой подать, велик соблазн согласиться на&nbsp;то, что&nbsp;рискуем не&nbsp;выполнить. Приходит заказчик и&nbsp;говорит «Ребята, все&nbsp;классно, а&nbsp;можем еще&nbsp;вот&nbsp;это&nbsp;и&nbsp;вот&nbsp;это&nbsp;прикрутить?». Всей командой радостно отвечаем: «Ну конечно, какие проблемы?» – все, лишь бы&nbsp;подписаться уже&nbsp;и&nbsp;начать работу.</p>

<div class="umb-macro-highlights">
    <strong>Всегда в&nbsp;продажах должны быть люди, которые здраво оценивают, что&nbsp;мы&nbsp;можем пообещать и&nbsp;чего сходу обещать не&nbsp;стоит.</strong>
    
</div>

<div class="l-island-a">
<p>Лучше недообещать и&nbsp;потом, когда станет понятно, что&nbsp;времени хватает, порадовать заказчика каким&#8209;то&nbsp;бонусом. Если не&nbsp;выйдет, ничего страшного – оговоренные обещания мы&nbsp;ведь выполнили, и&nbsp;никто не&nbsp;разочарован. Если получится сделать больше – великолепно, заказчик будет еще&nbsp;счастливее.</p>
</div>
<h2>Презентуем голосом</h2>
<div class="l-island-a">
<p>Скидывать оценки и&nbsp;КП&nbsp;на&nbsp;почту или&nbsp;в&nbsp;мессенджер без&nbsp;назначенной встречи – табу. На&nbsp;встрече с&nbsp;презентацией КП&nbsp;можно сразу отработать возражения, проконтролировать процесс презентации в&nbsp;целом. Можно сразу же&nbsp;пояснить что&#8209;то&nbsp;для&nbsp;заказчика, скорректировать его&nbsp;восприятие.</p>

<div class="umb-macro-highlights">
    <strong>Когда заказчик с&nbsp;материалом наедине, он&nbsp;может не&nbsp;так&nbsp;что&#8209;то&nbsp;понять, пропустить важные детали и&nbsp;вернуться с&nbsp;непонятной обратной связью и&nbsp;сбитыми ожиданиями.</strong>
    
</div>

<div class="l-island-a">
<p>Плюс мы&nbsp;на&nbsp;практике поняли, что&nbsp;при&nbsp;выборе между просто скинуть таблицу и&nbsp;презентацией на&nbsp;встрече «вживую» второй вариант повышает конверсию. Включенность в&nbsp;переговоры с&nbsp;самого начала и&nbsp;забота о&nbsp;заказчике повышают доверие.</p>
</div>
<h2>Гибкость vs&nbsp;Принципы: держать баланс</h2>
<div class="l-island-a">
<p>У заказчика свои процессы, у&nbsp;нас&nbsp;– свои. Баланс между этими двумя сущностями стоит находить, отталкиваясь от&nbsp;пользы для&nbsp;заказчика.</p>
</div>
<div class="l-island-a">
<p>После понимания задачи обычно становится понятно, какие процессы у&nbsp;заказчика настроены, а&nbsp;какие не&nbsp;очень или&nbsp;вообще отсутствуют. На&nbsp;основе этой информации и&nbsp;лавируем. Можем встроиться туда, где&nbsp;все&nbsp;уже&nbsp;удобно и&nbsp;работает, а&nbsp;там, где&nbsp;работает так&nbsp;себе, предложить свои настройки.</p>
</div>
<div class="l-island-a">
<p>Например, с&nbsp;одним из&nbsp;текущих клиентов мы&nbsp;договорились, что&nbsp;встроим свою команду в&nbsp;их&nbsp;процессы: ведение задач в&nbsp;jira и&nbsp;долгосрочное планирование. При&nbsp;этом свой процесс разработки мы&nbsp;не&nbsp;меняем: планируем спринты и&nbsp;артефакты в&nbsp;них&nbsp;по&nbsp;отлаженным внутри себя алгоритмам. А&nbsp;процессы, которых у&nbsp;заказчика не&nbsp;было, помогаем выстраивать. Сейчас это, например, тестирование.</p>
</div>
<div class="l-island-a">
<p>Получается, что&nbsp;заказчику мы&nbsp;поставляем результат и&nbsp;работаем так, чтобы ему&nbsp;было проще держать фокус на&nbsp;выполнении задач. А&nbsp;в&nbsp;более низкоуровневые механизмы работ над&nbsp;этими задачами заказчика не&nbsp;посвящаем – за&nbsp;детализацией следим сами.</p>
</div>
<h2>Команда продаж: продавать должны лучшие</h2>
<div class="l-island-a">
<p>Последнее, но&nbsp;не&nbsp;по&nbsp;значению. У&nbsp;нас&nbsp;нет&nbsp;отдельного подразделения продаж: продают те, кто&nbsp;будут заниматься проектом. Чтобы был&nbsp;синтез понимания бизнеса и&nbsp;предложения работающих технических решений, на&nbsp;встречи зовем ребят из&nbsp;разных подразделений. Это&nbsp;как&nbsp;раз&nbsp;про&nbsp;прозрачность, которая ведет к&nbsp;доверию – сразу знакомим клиента с&nbsp;основными людьми в&nbsp;команде, которые будут принимать решения на&nbsp;будущем проекте. Помимо пользы для&nbsp;заказчика, избавляем от&nbsp;неудобств себя: не&nbsp;нужно на&nbsp;встрече говорить: «Ой, ну&nbsp;я&nbsp;этот момент уточню со&nbsp;специалистом и&nbsp;вернусь с&nbsp;ответом завтра». Уточняем по&nbsp;факту, и&nbsp;все&nbsp;в&nbsp;выигрыше.</p>
</div>
<div class="l-island-a">
<p>Подводя итог, стоит сказать, что&nbsp;успех в&nbsp;продажах – результат всегда комплексный. Тут&nbsp;и&nbsp;про&nbsp;командную работу, и&nbsp;про&nbsp;способность слышать и&nbsp;понимать, анализировать, и&nbsp;про&nbsp;техники, которые у&nbsp;каждого свои. Наши подходы, о&nbsp;которых мы&nbsp;в&nbsp;этой статье рассказали, формировались не&nbsp;одномоментно и&nbsp;внедрялись в&nbsp;процесс постепенно, накапливались. И&nbsp;это&nbsp;нормально – шаг&nbsp;за&nbsp;шагом накапливать небольшие улучшения, чтобы однажды прийти к&nbsp;крутому и&nbsp;удобному процессу.<span> </span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Портал жилого комплекса комфорт-класса: добрососед&shy;ский клуб, интеграция с 1С и звездочки сантехникам
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/newtonclub/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/newtonclub/</guid>

                <pubDate>Fri, 21 Feb 2025 09:29:41 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>
                            <category>&#x412;&#x435;&#x431;-&#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Портал жилого комплекса комфорт-класса: добрососед&shy;ский клуб, интеграция с 1С и звездочки сантехникам</h1>
                                <figure>
                                    <img src="/Media/1122/newton-case.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/dcb04d191791beaec1d9652cd753a355"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e1db94bb81f444768c1b493afb57557a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Идея застройщика без&nbsp;технологического бэкграунда превратилась в&nbsp;удобное многофункциональное решение, избавляющее жителей ЖК&nbsp;и&nbsp;диспетчерскую службу от&nbsp;лишней головной боли.</span></p>
<p><span style="font-weight: 400;">Приложение для&nbsp;общения соседей в&nbsp;жилом комплексе – история давно не&nbsp;уникальная. Поэтому мы&nbsp;расскажем о&nbsp;сервисе на&nbsp;.NET, который помимо организации взаимодействия жильцов автоматизирует работу диспетчерской службы ЖК&nbsp;и&nbsp;упрощает расчеты за&nbsp;коммунальные услуги до&nbsp;пары кликов.</span></p>
<p><span style="font-weight: 400;"><img src="/Media/2946/two-phones.jpg" alt=""></span></p>
<h2>Запрос и&nbsp;функциональность</h2>
<p><span style="font-weight: 400;">Нужно было сделать портал для&nbsp;ЖК&nbsp;«Ньютон» в&nbsp;Челябинске. Девелопер – «Голос.Комфорт» (бывш. СК&nbsp;«Легион») – хотел вдобавок к&nbsp;квадратным метрам в&nbsp;ЖК&nbsp;комфорт-класса дать покупателям и&nbsp;другую ценность – добрососедское и&nbsp;технологичное комьюнити жильцов, которое получило название «Ньютон-клуб».&nbsp;</span></p>

<div class="umb-macro-highlights">
    <strong>Первоначально речь шла&nbsp;просто о&nbsp;личном кабинете для&nbsp;каждого собственника.</strong>
    
</div>

<p><span style="font-weight: 400;">Через его&nbsp;интерфейс жители «Ньютона» смогли бы&nbsp;общаться друг с&nbsp;другом, узнавать о&nbsp;мероприятиях и&nbsp;предложениях малых бизнесов, которые открывались на&nbsp;первых этажах домов. Например, булочная или&nbsp;парикмахерская, арендующие площади в&nbsp;ЖК, могли бы&nbsp;продвигать свои товары и&nbsp;услуги и&nbsp;предлагать специальные скидки жителям «Ньютона». Все&nbsp;эти&nbsp;возможности мы&nbsp;на&nbsp;портале реализовали.</span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;"><img src="/Media/2943/opera-снимок_2023-05-11_170907_newtonclubru.png" alt=""></span></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Личный кабинет также планировалось снабдить функцией оплаты коммунальных услуг прямо из&nbsp;портала. Для&nbsp;этого мы&nbsp;интегрировали в&nbsp;«Ньютон Клуб» банковский эквайринг —&nbsp;при&nbsp;оплате коммунальных услуг банк принимает средства, а&nbsp;затем переводит их&nbsp;на&nbsp;расчетный счет управляющей компании. </span></p>
<p><span style="font-weight: 400;">Данные об&nbsp;оплате квитанций появляются в&nbsp;личном кабинете сразу после обработки платежа банком, благодаря интеграции с&nbsp;1С бухгалтерии управляющей компании. Случаи, когда у&nbsp;одного человека в&nbsp;собственности более одной квартиры, не&nbsp;мешают быстрой оплате: все&nbsp;так&nbsp;же&nbsp;делается в&nbsp;рамках одного ЛК.</span></p>
<h2>Апгрейд пользы после начала разработки</h2>
<p><span style="font-weight: 400;">Когда обсуждения и&nbsp;проектирование продукта были завершены, мы&nbsp;приступили к&nbsp;разработке решения, и&nbsp;оказалось, что&nbsp;его&nbsp;можно сделать еще&nbsp;лучше.&nbsp;</span></p>
<p><span style="font-weight: 400;">ЖК «Ньютон» обслуживается аварийно-диспетчерской службой. В&nbsp;нее&nbsp;жители обращаются при&nbsp;бытовых поломках, когда требуется помощь сантехника, электрика или&nbsp;других подобных специалистов. Выяснилось, что&nbsp;работа такой службы – полнейший хаос. Жильцы могут обратиться туда только по&nbsp;телефону, а&nbsp;отслеживание выполнения запросов на&nbsp;починку лежит на&nbsp;операторе службы и&nbsp;происходит весьма беспорядочно.</span></p>
<p>&nbsp;</p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--51628306">
    


    <img src="/Media/2947/opera-&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;_2023-06-27_164357_fuse8ru.png" alt="" itemprop="">


</div>


<p>&nbsp;</p>
<p><span style="font-weight: 400;">Чтобы облегчить жизнь и&nbsp;жильцам, и&nbsp;операторам АДС, мы&nbsp;внедрили автоматизацию. Чтобы не&nbsp;тратить время на&nbsp;телефонные разговоры, жители ЖК&nbsp;могут оставить заявку в&nbsp;электронной форме через личный кабинет на&nbsp;портале, приложив фото поломки при&nbsp;необходимости.&nbsp;</span></p>
<p><span style="font-weight: 400;">Для операторов&nbsp;АДС&nbsp;предусмотрен специальный интерфейс, в&nbsp;котором реализована управленческая работа. Оператор регистрирует заявки, назначает исполнителей из&nbsp;списка возможных мастеров и&nbsp;время ремонта. После выполнения работ, житель ЖК&nbsp;оценивает качество оказанной услуги, формируя рейтинг специалиста: от&nbsp;1 до&nbsp;5 звезд.&nbsp;</span></p>
<h2>Подготовка, разработка и&nbsp;немного про&nbsp;SPA</h2>
<p><span style="font-weight: 400;">Выслушав идею заказчика, мы&nbsp;принялись анализировать рынок. Изучили похожие решения, описали компоненты системы, интеграции, которые в&nbsp;ней&nbsp;должны быть, проработали функциональность изнутри и&nbsp;снаружи и&nbsp;создали дизайн-концепцию портала.&nbsp;</span></p>
<p><span style="font-weight: 400;">Мысли и&nbsp;пожелания заказчика мы&nbsp;сначала преобразовывали в&nbsp;понятную документацию и&nbsp;только потом в&nbsp;готовый продукт. О&nbsp;том, как&nbsp;мы&nbsp;проводим предпроектное исследование для&nbsp;создание документации, понятной бизнесу, можно узнать </span><a href="/articles/how-to-stop-writing-huge-documentation-and-start-development-faster/" title="Как перестать писать огромные ТЗ&nbsp;и&nbsp;быстрее стартовать разработку"><span style="font-weight: 400;">в этой статье</span></a><span style="font-weight: 400;">.&nbsp;</span></p>
<p><span style="font-weight: 400;">Работа над&nbsp;дизайном состояла из&nbsp;двух частей: концепт-дизайн и&nbsp;стайлгайд. Концепт-дизайн сформировал внешний вид&nbsp;портала. В&nbsp;стайлгайде&nbsp;собраны все&nbsp;типовые элементы: цвета, заголовки, списки, кнопки, поля форм и&nbsp;т.д.&nbsp;</span></p>
<p>&nbsp;</p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--42207172">
    


    <img src="/Media/2948/&#x441;&#x442;&#x430;&#x439;&#x43B;&#x433;&#x430;&#x439;&#x434;.png" alt="" itemprop="">


</div>


<p>Появилась идея использовать в&nbsp;проекте фотографии жителей ЖК&nbsp;«Ньютон». Мы&nbsp;придумали сценарии и&nbsp;составили рекомендации для&nbsp;фотосессии. Заказчик организовал конкурс среди семей, живущих в&nbsp;микрорайоне. Фото победителей разместили на&nbsp;главной странице сайта</p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--47744352">
    


    <img src="/Media/2942/opera-&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;_2023-05-11_170149_newtonclubru.png" alt="" itemprop="">


</div>


<p>&nbsp;</p>
<p><span style="font-weight: 400;">Мы разрабатывали «Ньютон-клуб» по&nbsp;фикспрайс модели. Команда состояла из&nbsp;бекендеров, фронтендеров, дизайнеров и&nbsp;проджект-менеджера. Придерживались подхода Mobile First. Работу делили на&nbsp;двухнедельные спринты и&nbsp;работали по&nbsp;</span><a href="/articles/wagile/" title="Wagile: как&nbsp;смешать разные модели ведения проектов"><span style="font-weight: 400;">Wagile</span></a><span style="font-weight: 400;">. Пару недель помимо основной разработки провели в&nbsp;связке с&nbsp;1С специалистами заказчика, чтобы правильно интегрироваться и&nbsp;организовать систему оплаты коммунальных услуг.</span></p>

<div class="umb-macro-highlights">
    <strong>«Ньютон-клуб» – это&nbsp;SPA-портал, который работает быстро даже при&nbsp;медленном мобильном интернете.</strong>
    
</div>

<p>Когда пользователь открывает страницу, загружается сразу весь доступный код, но&nbsp;показывается только конкретный модуль — часть сайта, которая нужна пользователю в&nbsp;текущий момент. Когда пользователь решит перейти в&nbsp;другой модуль, тот&nbsp;откроется мгновенно, ведь браузер будет брать уже&nbsp;загруженные данные.</p>
<h2>Результаты и&nbsp;цифры</h2>
<p><span style="font-weight: 400;"><strong>«Ньютон Клуб» стал многофункциональной площадкой для&nbsp;жителей «Ньютона»</strong>, где&nbsp;можно пообщаться, найти, чем&nbsp;заняться вечером или&nbsp;в&nbsp;выходные, сообщить в&nbsp;УК&nbsp;о&nbsp;какой-либо поломке и&nbsp;оплатить коммунальные услуги.</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">770 мероприятий для&nbsp;детей и&nbsp;взрослых организовано и&nbsp;проведено с&nbsp;помощью портала «Ньютон Клуб» за&nbsp;два&nbsp;года.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">40 000 заявок, поступивших к&nbsp;ним&nbsp;сервиса обработала аварийно-диспетчерская служба.&nbsp;&nbsp;&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">41 организация размещается на&nbsp;витрине товаров и&nbsp;услуг.&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">80 предприятий стали партнерами сервиса, предложив скидки для&nbsp;жителей «Ньютона».</span></li>
</ul>
<p>&nbsp;</p>
<p><span>Ссылка на&nbsp;сайт: <a rel="noopener" href="https://newtonclub.ru/" target="_blank" title="Сайт «Ньютон Клуб»">https://newtonclub.ru/</a></span></p>
<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/209ab34fd2d34b6081958b2af2f9df70"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="awards"
            data-content-element-type-key="82cdbbd8-0baa-4271-a5b0-0f1aae3d3bed"
            data-element-udi="umb://element/7ccdf4f90292491c8fcf7c1cad091f6c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    10 миллионов пользователей за 4 дня и рекордные продажи билетов: как мы сделали платформу для британского гольф-турнира
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    sadfasfd
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/theopen/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/theopen/</guid>

                <pubDate>Mon, 11 Nov 2024 09:04:26 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>10 миллионов пользователей за 4 дня и рекордные продажи билетов: как мы сделали платформу для британского гольф-турнира</h1>
                                <figure>
                                    <img src="/Media/2966/slide-16_9-21.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4992b127f86f98834d8cb29bd1b86e40"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1ee6968dcfb0423186c31b67ce0e4f63"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Рассказываем на&nbsp;примере, как&nbsp;проходит разработка высоконагруженного продукта, и&nbsp;как&nbsp;к&nbsp;высоким нагрузкам готовиться, чтобы в&nbsp;момент Х&nbsp;ничего не&nbsp;сломалось.</span></p>

<div class="umb-macro-highlights">
    <strong>The Open, Открытый чемпионат, или&nbsp;Открытый чемпионат Великобритании по&nbsp;гольфу</strong>
    — старейшее соревнование по&nbsp;гольфу, входящее в&nbsp;число четырех крупнейших профессиональных турниров («мейджоров») и&nbsp;единственное соревнование, проходящее не&nbsp;на&nbsp;территории США.
</div>

<p><span style="font-weight: 400;">Сам турнир проводится раз&nbsp;в&nbsp;год&nbsp;и&nbsp;длится 4 дня. Помимо этих «самых важных» дней есть также различные квалификационные турниры, в&nbsp;результате которых отбираются игроки на&nbsp;главный турнир.</span></p>
<p><span style="font-weight: 400;">К нам&nbsp;The&nbsp;Open пришли с&nbsp;запросом на&nbsp;создание диджитал-платформы. До&nbsp;нашей встречи у&nbsp;них&nbsp;уже&nbsp;был&nbsp;сайт, но&nbsp;нужных результатов он&nbsp;не&nbsp;приносил. Нужно было увеличить продажи билетов и&nbsp;сделать так, чтобы фанаты и&nbsp;болельщики могли использовать платформу The&nbsp;Open как&nbsp;универсальную «точку соприкосновения» с&nbsp;чемпионатом: покупать билеты и&nbsp;мерч, следить за&nbsp;играми, отсматривать новости. </span></p>
<h2>Слона ели&nbsp;по&nbsp;кусочкам</h2>
<p><span style="font-weight: 400;">При разработке платформы мы&nbsp;придерживались подхода, при&nbsp;котором смогли бы&nbsp;как&nbsp;можно скорее принести пользу заказчику. То&nbsp;есть вместо того, уйти в&nbsp;работу на&nbsp;условные полгода и&nbsp;только по&nbsp;истечении этого времени выдать результат, мы&nbsp;разбили весь проект на&nbsp;небольшие итерации. По&nbsp;итогам каждой платформа обогащалась новой функциональностью.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--4659687">
    


    <img src="/Media/2960/slide-16_9-18.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">Проще говоря, мы&nbsp;«вытаскивали» блоки функциональности из&nbsp;старой платформы The&nbsp;Open, наделяли их&nbsp;новым флоу, ставили на&nbsp;максимально новую архитектуру, а&nbsp;затем «вставляли» обратно. Делали это&nbsp;бесшовно, чтобы пользователи не&nbsp;сталкивались с&nbsp;трудностями, пользуясь как&nbsp;бы&nbsp;«старым» сайтом, но&nbsp;с&nbsp;«новыми» функциональными блоками.</span></p>
<h2>Продажа билетов</h2>
<p><span style="font-weight: 400;">Первым делом реализовали переделку системы продажи билетов. Проработали новое визуальное отображение разных вариантов билетов и&nbsp;тарифов, сделали фронт-офис максимально оптимизированным, чтобы весь фронтенд работал быстро. «Под капотом» сервиса продажи билетов была билетная система, с&nbsp;которой мы&nbsp;проводили интеграцию. </span></p>

<div class="umb-macro-highlights">
    <strong>Этот первоначальный апгрейд помог заказчику продать все&nbsp;билеты за&nbsp;рекордный срок – первые 40 дней после запуска.</strong>
    
</div>

<h2>Аутентификация с&nbsp;<a href="https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html">Amazon Cognito</a></h2>
<p><span style="font-weight: 400;">Amazon Cognito – это&nbsp;платформа управления идентификацией для&nbsp;веб- и&nbsp;мобильных приложений. В&nbsp;ней&nbsp;собраны каталог пользователей, сервер аутентификации и&nbsp;служба авторизации. Мы&nbsp;интегрировались с&nbsp;платформой для&nbsp;реализации сервиса регистрации и&nbsp;аутентификации The&nbsp;Open.</span></p>
<p><span style="font-weight: 400;">Раньше у&nbsp;пользователей было несколько логинов для&nbsp;покупки билетов, мерча. Мы&nbsp;реализовали единый логин – single sign on&nbsp;(SSO). Поэтому, например, покупать билеты и&nbsp;мерч, вставать в&nbsp;лист ожидания за&nbsp;билетами и&nbsp;смотреть эксклюзивные видео турнира стало проще.</span></p>
<h2>4 дня&nbsp;в&nbsp;году и&nbsp;0 прав на&nbsp;ошибку</h2>
<p><span style="font-weight: 400;">Главным вызовом этого проекта было требование выдерживать огромные наплывы пользователей в&nbsp;период проведения турнира. В&nbsp;течение четырех дней портал The&nbsp;Open посещает огромное количество пользователей, и&nbsp;большинство из&nbsp;них&nbsp;проводят длительные сессии, а&nbsp;не&nbsp;просто заглядывают прочитать пару новостей.</span></p>
<p><span style="font-weight: 400;">Мы понимали, что&nbsp;если в&nbsp;течение этих заветных четырех дней что&#8209;то&nbsp;сломается – пиши пропало. Поэтому вместе с&nbsp;заказчиком мы&nbsp;организовали встречу, главным вопросом которой была критическая функциональность платформы. </span></p>
<p><span style="font-weight: 400;">Выяснили, что&nbsp;при&nbsp;любых обстоятельствах во&nbsp;что&nbsp;бы&nbsp;то&nbsp;ни&nbsp;стало должны работать четыре блока: регистрация, таблица лидеров,</span><a href="https://golfingjourney.com/what-exactly-is-a-tee-time-in-golf/#:~:text=A%20tee%20time%20is%20defined,will%20not%20interfere%20with%20another."><span style="font-weight: 400;"> tee-times</span></a><span style="font-weight: 400;"> и&nbsp;видеоплатформа The&nbsp;Open TV, на&nbsp;которой происходит стриминг турнира.</span></p>
<p><span style="font-weight: 400;">Дальше, чтобы обеспечить отказоустойчивость, мы&nbsp;смоделировали все&nbsp;возможные варианты отказов работы инфраструктуры: </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">падение серверов, </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">падение БД, </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">замедление работы и&nbsp;отказы отдельных внешних API, </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">деплой некорректных изменений в&nbsp;коде. </span></li>
</ul>
<p><span style="font-weight: 400;">На основе этого списка рисков спроектировали архитектуру, которая предусматривала </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">запасные сервера с&nbsp;“холодными” и&nbsp;“горячими” копиями данных, </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">автоматическое переключение между ними, </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">упрощенные варианты отдельных функций, которые смогли бы&nbsp;работать в&nbsp;случае внештатных ситуаций</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">план по&nbsp;отключению функций под&nbsp;нагрузкой. </span></li>
</ul>
<p><span style="font-weight: 400;">Дополнительно мы&nbsp;заранее обговорили и&nbsp;зафиксировали план реагирования и&nbsp;коммуникации на&nbsp;любую из&nbsp;возможных ситуаций. </span></p>
<p><span style="font-weight: 400;">Последним рубежом обороны стала минимальная статическая копия сайта, хранящаяся на&nbsp;отдельном сервере, и&nbsp;CDN&nbsp;с&nbsp;возможностью ручного редактирования ключевой информации в&nbsp;коде.</span></p>

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--23204753">
    


    <img src="/Media/2961/slide-16_9-19.png" alt="" itemprop="">


</div>


<p><span style="font-weight: 400;">API поставщика данных тоже находился в&nbsp;разработке, и&nbsp;этот момент был&nbsp;дополнительной сложностью проекта. Весь бэкенд с&nbsp;данными для&nbsp;освещения турниров, скорингом и&nbsp;платформой, поставляющей данные, тоже находился в&nbsp;стадии разработки. Нужно было интегрироваться с&nbsp;совершенно новым API&nbsp;в&nbsp;условиях постоянных изменений. Для&nbsp;этого мы&nbsp;тесно взаимодействовали с&nbsp;бекенд-разработчиками: выстраивали структуру взаимодействия, совместно поддерживали единый набор тестовых данных и&nbsp;</span><a href="https://dictionary.cambridge.org/ru/%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%80%D1%8C/%D0%B0%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9/edge-case"><span style="font-weight: 400;">edge-кейсов</span></a><span style="font-weight: 400;">. </span></p>
<p><span style="font-weight: 400;">А еще&nbsp;наша команда серьезно изучила правила гольфа, чтобы понять, как&nbsp;данные о&nbsp;турнире должны будут отображаться на&nbsp;платформе.</span></p>
<h2>Забавная терминология</h2>
<p><span style="font-weight: 400;">Правила гольфа наша команда обсуждала с&nbsp;командой заказчика. Мы&nbsp;погружались в&nbsp;правила игры, сопоставляя их&nbsp;со&nbsp;сценариями работы платформы. </span></p>
<p><span style="font-weight: 400;">Тут в&nbsp;какой&#8209;то&nbsp;момент обсуждения один из&nbsp;коллег из&nbsp;The&nbsp;Open спрашивает: «А что&nbsp;если происходит sudden death (внезапная смерть)?». Обсуждение продолжается, кто&#8209;то&nbsp;из&nbsp;наших ребят спрашивает, частое ли&nbsp;это&nbsp;явление – внезапная смерть? Ему&nbsp;отвечают, мол, бывает – нормальная практика. В&nbsp;голове – ужас – неужели гольф в&nbsp;списке настолько опасных видов спорта?</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2962/slide-16_9-13.png" alt="" itemprop="">


</figure>

<p><span style="font-weight: 400;">Оказалось, что&nbsp;sudden death – это&nbsp;форма плей&#8209;офф&nbsp;в&nbsp;соревнованиях по&nbsp;игре на&nbsp;счет ударов, когда один или&nbsp;несколько игроков имеют одинаковое количество очков. “Внезапно умирают” те, кто&nbsp;закатывает шар&nbsp;в&nbsp;одну лунку за&nbsp;большее количество ударов. </span></p>
<h2>Как портал выдерживает большие нагрузки</h2>
<p><span style="font-weight: 400;">За 4 дня&nbsp;турнира платформу посещают миллионы пользователей. Кроме того, их&nbsp;наплывы также появляются в&nbsp;дни&nbsp;старта продаж билетов. Чтобы выдержать нагрузки, мы&nbsp;создавали API&nbsp;на&nbsp;базе бессерверных вычислений для&nbsp;отдельных операций – регистрации, например. Serverless позволяет порталу выдерживать гибкую нагрузку без&nbsp;необходимости держать большое количество ресурсов. Подробнее об&nbsp;этой технологии и&nbsp;ее&nbsp;применении мы&nbsp;рассказываем в&nbsp;<a href="/articles/it-infrastructure-scaling/" title="Как масштабировать IT-инфраструктуру, работая изнутри">одной из&nbsp;наших статей</a>.</span></p>
<p><span style="font-weight: 400;">Другой инструмент – </span><a href="https://newrelic.com/blog/best-practices/what-is-apm"><span style="font-weight: 400;">Application Performance Monitoring</span></a><span style="font-weight: 400;">. Это&nbsp;система, которую мы&nbsp;использовали, чтобы в&nbsp;реальном времени выявить страницы или&nbsp;запросы, части кода, которые работают недостаточно быстро, чтобы устранить проблемы. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2965/opera-&#x441;&#x43D;&#x438;&#x43C;&#x43E;&#x43A;_2023-07-06_162548_new-relic-apm-dashboardwebp.png" alt="" itemprop="">


</figure>

<p><span style="font-weight: 400;">APM позволяет отследить время выполнения запросов на&nbsp;портале и&nbsp;отображает данные в&nbsp;виде графиков, ориентируясь на&nbsp;временные показатели для&nbsp;отдельных сервисов и&nbsp;страниц. Также здесь можно мониторить ошибке, возникающие при&nbsp;загрузках.</span></p>
<p><span style="font-weight: 400;">Увеличивать скорость загрузки страниц также помогало обширное кэширование данных на&nbsp;нескольких уровнях: базы данных, приложения и&nbsp;CDN. О&nbsp;нем&nbsp;мы&nbsp;также рассказываем <a href="/articles/it-infrastructure-scaling/" title="Как масштабировать IT-инфраструктуру, работая изнутри">в нашей статье про&nbsp;масштабирование IT-продуктов</a>. Для&nbsp;The&nbsp;Open кэширование делали очень гибким, с&nbsp;большим количеством правил, например, для&nbsp;часто обновляющихся разделов, новостей и&nbsp;видео. </span></p>
<p><span style="font-weight: 400;">После настройки интеграций и&nbsp;инструментов, упрощающих столкновение с&nbsp;высокими нагрузками, провели несколько симуляций работы платформы и&nbsp;сессии нагрузочного тестирования. Для&nbsp;этого поехали в&nbsp;Румынию, чтобы поработать вместе с&nbsp;командой, которая отвечала за&nbsp;API&nbsp;и&nbsp;поддержку платформы. В&nbsp;ходе симуляций оперативно фиксили недочеты и&nbsp;отправляли фичи в&nbsp;тестирование. Получилось хорошо сработаться со&nbsp;сторонней командой и&nbsp;заодно немного попутешествовать – все&nbsp;на&nbsp;пользу продукту.</span></p>
<h2>Итоги</h2>
<p><span style="font-weight: 400;">Полноценная переработка платформы The&nbsp;Open была проведена примерно за&nbsp;год. Все&nbsp;это&nbsp;время мы&nbsp;постепенно вводили в&nbsp;эксплуатацию новые функциональные блоки так, что&nbsp;со&nbsp;временем портал полностью обновился. </span></p>

<div class="umb-macro-highlights">
    <strong>В момент Х&nbsp;(первый турнир после обновления) удалось обеспечить должную производительность и&nbsp;скорость работы портала при&nbsp;десяти миллионах активных пользователей.</strong>
    
</div>

<p><span style="font-weight: 400;">С точки зрения архитектуры платформа The&nbsp;Open построена на&nbsp;нескольких интеграциях и&nbsp;элементах:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">сайт на&nbsp;CMS;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">сервис аутентификации Amazon Cognito;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">API с&nbsp;данными о&nbsp;ходе турнира;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">билетная платформа Securix;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">видеоплатформа Stream AMG;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">ecommerce платформа;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">мобильное приложение;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">CDN.</span></li>
</ul>
<p><span style="font-weight: 400;">Платформа The&nbsp;Open работает уже&nbsp;не&nbsp;первый год. Турниры до&nbsp;сих&nbsp;пор&nbsp;освещаются с&nbsp;ее&nbsp;помощью. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2964/slide-16_9-20.png" alt="" itemprop="">


</figure>

<p><span style="font-weight: 400;">Успешное завершение проекта мы&nbsp;с&nbsp;командой разработки поехали отмечать в&nbsp;Pine Creek – гольф-курорт, где&nbsp;все&nbsp;изученные в&nbsp;ходе проекта правила гольфа удалось применить на&nbsp;практике и&nbsp;прочувствовать, что&nbsp;такое настоящая игра.  </span></p>
<p><span style="font-weight: 400;"> </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Правильный аутстаффинг ИТ персонала, или Почему мы не работаем с компаниями-интеграторами
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как выходить на игру вдолгую и взаимовыгодные отношения с заказчиком. Бонус: вовлеченные разработчики, которые хорошо знают бизнес.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/successfull-outstaffing/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/successfull-outstaffing/</guid>

                <pubDate>Tue, 05 Nov 2024 08:28:39 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Правильный аутстаффинг ИТ персонала, или Почему мы не работаем с компаниями-интеграторами</h1>
                                <figure>
                                    <img src="/Media/2841/frame-2.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/08e5f3d705fd2798d8e662a0c2c7c97d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f6b5445b31b34e89af3f535b0e9c7779"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Есть два&nbsp;пути. Первый – прямой: аутстафим разработчиков из&nbsp;компании А&nbsp;(подрядчик) в&nbsp;компанию Б&nbsp;(заказчик). Второй – извилистый: аутстафим разработчиков из&nbsp;компании А&nbsp;в&nbsp;команду Б, используя посредника В&nbsp;(компания-интегратор).&nbsp;</span></p>
<p><span style="font-weight: 400;">Зачем нужен посредник при&nbsp;подборе персонала в&nbsp;IT&nbsp;сфере?<strong> </strong>Во-первых, компании-заказчику (Б) при&nbsp;наличии посредника не&nbsp;нужно нанимать партнерских менеджеров и&nbsp;тратить время на&nbsp;взаимодействие с&nbsp;аутстаф-компаниями, выбирая подходящую. Создал интегратору задачу и&nbsp;ждёшь себе поставку рабочих рук. Во-вторых, компания разработчик (которая А), может не&nbsp;уметь (хотеть, успевать) искать целевых клиентов. Интегратор берёт на&nbsp;себя поиск лидов и&nbsp;общение с&nbsp;бизнесом. Компания А&nbsp;тогда просто продаёт специалистов.&nbsp;</span></p>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/ceb2a59eee894bf09042b3dc8dc7b573"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2840/frame-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/fa458c8d81ba4cf499ac21bd6e509051"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<p><span style="font-weight: 400;">Такая модель сотрудничества жизнеспособна, но&nbsp;вопрос в&nbsp;её&nbsp;эффективности.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/08e5dbea04b602521b34493cd0d25949"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/260be46a7d4d4c3c986579c5068d231e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Когда аутстаф ломается</h2>
<p><span style="font-weight: 400;">Требования к&nbsp;разработчикам, которых ищут через посредников, размываются: нужен Инспектор-Гаджет, который будет уметь всё&nbsp;и&nbsp;сразу. Требования при&nbsp;подборе IT&nbsp;персонала через интеграторов завышаются, потому что&nbsp;заказчику проще исключить риски и&nbsp;взять на&nbsp;позицию человека, который точно покроет задачи. Не&nbsp;важно, что&nbsp;большая их&nbsp;часть будет по&nbsp;силам и&nbsp;менее опытному специалисту – лучше взять с&nbsp;«запасом».</span></p>

<div class="umb-macro-highlights">
    <strong>Аутстаф ломается,</strong>
    когда подбор «правильного» айти специалиста под&nbsp;задачу клиента становится пыткой для&nbsp;обеих сторон процесса.
</div>

<p><span style="font-weight: 400;">Заказчик хочет получить сеньора чтобы не&nbsp;рисковать, но&nbsp;заплатить за&nbsp;него как&nbsp;за&nbsp;миддла. Компания-разработчик не&nbsp;хочет отдавать сеньора за&nbsp;дёшево, поэтому пытается миддлов преподнести как&nbsp;сеньоров. Из&#8209;за&nbsp;этого интеграторам приходится отсеивать нерелевантных специалистов, чтобы найти для&nbsp;заказчика то, что&nbsp;он&nbsp;ищет. А&nbsp;это&nbsp;время и&nbsp;деньги.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c81033fb0eec19f8edaff8c6669044c7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e05e68ada7c944069e5e5e6e323d43d8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Компания-разработчик ≠ кадровое агентство</h2>
<p><span style="font-weight: 400;">Вот как&nbsp;устроена работа через посредников. Заказчик общается с&nbsp;2-3 компаниями-интеграторами. Те&nbsp;создают множество запросов в&nbsp;компании с&nbsp;«готовыми» разработчиками, настраивая поиск по&nbsp;грейду и&nbsp;навыкам. При&nbsp;этом задачи и&nbsp;цели, для&nbsp;выполнения которых бизнес решил нанимать исполнителей, если и&nbsp;раскрываются, то&nbsp;на&nbsp;уровне «создаем приложение для&nbsp;банка на&nbsp;микросервисной архитектуре». Этого, конечно, мало для&nbsp;<a href="/articles/task-understanding/" title="Понимание задачи by&nbsp;fuse8: что&nbsp;такое и&nbsp;зачем  нужно">понимания задачи</a>, а&nbsp;без&nbsp;него тяжело подобрать правильного специалиста. </span></p>

<div class="text-highlight">
  На&nbsp;таких проектах разработчики выгорают быстрее. Из&#8209;за&nbsp;этого может страдать качество разработки.  Получается, что&nbsp;устраиваются они&nbsp;в&nbsp;одну компанию, а&nbsp;работают по&nbsp;факту в&nbsp;другой. Компании сменяются. В&nbsp;каждой – свои процессы, уникальные руководители и&nbsp;задачи, под&nbsp;которые нужно подстраиваться. Возможно, до&nbsp;определенной точки это&nbsp;«полезный опыт», но&nbsp;этот самый опыт подсказывает, что&nbsp;такие перекосы быстрее приведут к&nbsp;выгоранию, чем&nbsp;к&nbsp;просветлению. Бизнес потратит на&nbsp;онбординг то&nbsp;время, которое могло бы&nbsp;уходить уже&nbsp;на&nbsp;разработку решений.
</div>

<p><span style="font-weight: 400;">Уровень вовлеченности и&nbsp;погружения в&nbsp;процессы повышается, когда заказчик приходит с&nbsp;запросом напрямую. Так&nbsp;проще обсудить задачу, выявить потребности и&nbsp;дать бизнесу исполнителей, которые будут соответствовать запросу. То&nbsp;есть заказчик получит не&nbsp;просто набор разработческих навыков, а&nbsp;комплексную экспертизу, которая вырабатывается у&nbsp;нас&nbsp;внутри. Подробнее о&nbsp;таком подходе<a href="/articles/outstaff-vs-outsource/" title="Аутстаф VS&nbsp;Аутсорс: что&nbsp;полезнее бизнесу и&nbsp;разработчикам"> в&nbsp;нашей статье про&nbsp;аутстаф и&nbsp;аутсорс</a>. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6470277036ea4f5409fe72d79c47698d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/96201bcfb9534df48243dd1ed91a7eab"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Правильный аутстаф = партнерские отношения</h2>
<p><span style="font-weight: 400;">В идеальном мире каждый подрядчик печётся о&nbsp;боли бизнеса заказчика как&nbsp;о&nbsp;своей собственной. Уровень вовлеченности должен быть сильно выше, чем&nbsp;просто писать код&nbsp;по&nbsp;указке с&nbsp;утра до&nbsp;вечера. Идеал, наверное, недостижим, но&nbsp;стремиться к&nbsp;нему стоит.</span></p>
<p><span style="font-weight: 400;">Заказчик, работающий с&nbsp;нами напрямую, получает помимо разработчиков аккаунт-менеджера, который будет в&nbsp;курсе происходящих работ при&nbsp;ведении ИТ-проектов. Он&nbsp;делится нашей экспертизой с&nbsp;клиентом через выделенных специалистов и&nbsp;через всю&nbsp;нашу компанию. А&nbsp;если что&#8209;то&nbsp;в&nbsp;работе идёт не&nbsp;так, аккаунт-менеджер быстро реагирует и&nbsp;вносит изменения в&nbsp;процессы или&nbsp;команду. Так&nbsp;получается предлагать изящные и&nbsp;эффективные работающие решения. Если не&nbsp;хватает экспертизы в&nbsp;каких&#8209;то&nbsp;локальных вопросах, всегда есть техдир или&nbsp;руководитель направления разработки, который по&nbsp;умолчанию курирует проект.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/acec2ed9db6447f193e827abe147b0bc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2839/frame-5.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ad74e4991a7344ce8599dc3efde5d265"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">На большинстве проектов мы&nbsp;приставляем к&nbsp;тимлиду не&nbsp;нулевых джунов. Они&nbsp;становятся дополнением основной команды и&nbsp;учатся работать над&nbsp;задачами клиента под&nbsp;надзором тимилда, вникают в&nbsp;продукт и&nbsp;процессы клиента. На&nbsp;боевых проектах рост ускоряется. Клиенту это&nbsp;выгодно, потому что&nbsp;при&nbsp;потребности в&nbsp;масштабировании команды можно будет нанять<strong> </strong>фронтенд, бекенд разработчика или&nbsp;другого готового айти специалиста, которого не&nbsp;придётся онбордить – он&nbsp;будет полностью погружен в&nbsp;проект.</span></p>

<div class="umb-macro-highlights">
    <strong>Цель онбординга </strong>
    – быстро, эффективно и&nbsp;последовательно провести вовлечение команды или&nbsp;специалиста в&nbsp;рабочие процессы проекта.
</div>

<p> </p>
<p><span style="font-weight: 400;">Всё это&nbsp;работа на&nbsp;перспективу для&nbsp;обеих сторон. Заказчик получает исполнителей на&nbsp;текущие задачи и&nbsp;уверенность в&nbsp;создании работающего решения. Начинающие разработчики набираются опыта, чтобы быть готовыми быстро подхватить проект при&nbsp;масштабировании. Мы&nbsp;доносим бизнес-ценность и&nbsp;в&nbsp;будущем получаем сильных специалистов с&nbsp;экспертизой. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f027c9ff38ce742212864527989935cc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ae6a2cf572274fc2909ceb5dd809fd7b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Почему правильный ИТ&nbsp;аутстаф работает</h2>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Больше пользы клиенту через понимание задач и&nbsp;целей бизнеса, а&nbsp;значит и&nbsp;точечного подбора экспертизы.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Мы не&nbsp;превращаемся в&nbsp;кадровое агентство. Выращиваем и&nbsp;нарабатываем экспертизу внутри компании и&nbsp;делимся ею&nbsp;с&nbsp;нашими клиентами.&nbsp;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Клиент распоряжается не&nbsp;навыками отдельно взятых разработчиков, а&nbsp;экспертной мощью всей компании.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Работать напрямую с&nbsp;клиентом значит глубже понять бизнес. Так&nbsp;получается через написание кода решать бизнесовые задачи.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Клиент, работая напрямую с&nbsp;аутстафферами, получает разработчиков под&nbsp;свои потребности и&nbsp;не&nbsp;тратит время на&nbsp;нерелевантных кандидатов.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Разработчики не&nbsp;выгорают, потому что&nbsp;практикуют интересные им&nbsp;задачи, а&nbsp;не&nbsp;выполняют работу «потому что&nbsp;надо».</span></li>
</ol>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Southampton FC: меняя правила игры
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    История о том, как мы в связке с британскими коллегами из Delete сделали крутой сайт для футбольного клуба Английской Премьер-лиги
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/southampton-fc/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/southampton-fc/</guid>

                <pubDate>Tue, 08 Oct 2024 10:49:39 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Southampton FC: меняя правила игры</h1>
                                <figure>
                                    <img src="/Media/1868/southhampton-fc-case.jpeg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a3c86baa75659394be23a53e87fa9895"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/638e4c5626694e05812e7947e7b77b4e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p><span style="font-weight: 400;">Southampton FC&nbsp;— футбольный клуб из&nbsp;графства Гемпшир, основанный в&nbsp;1885 году. Играет в&nbsp;высшем дивизионе в&nbsp;системе футбольных лиг&nbsp;Англии — в&nbsp;Премьер-лиге. </span><span style="font-weight: 400;">«Саутгемптон» был&nbsp;основан членами Молодёжной ассоциации церкви Святой Девы Марии, поэтому членов клуба традиционно называют «святыми» (англ. </span><span style="font-weight: 400;">The Saints</span><span style="font-weight: 400;">).</span></p>
<h2>Задача</h2>
<p><span style="font-weight: 400;">Первая встреча с&nbsp;руководством ФК&nbsp;произошла осенью 2015 года. «Святые» хотели запустить новый сайт к&nbsp;началу сезона 2016.  </span></p>
<p><span style="font-weight: 400;">Футбольные клубы Английской Премьер-лиги в&nbsp;тот&nbsp;момент «сидели» на&nbsp;шаблонных сайтах — максимально простых и&nbsp;скучных. На&nbsp;них&nbsp;были краткие исторические справки о&nbsp;ФК&nbsp;и&nbsp;расписание игр. Отличались друг от&nbsp;друга эти&nbsp;сайты разве что&nbsp;цветовым оформлением.</span></p>
<p><span style="font-weight: 400;"> </span><span style="font-weight: 400;">«Саутгемптон» решил изменить правила игры. Им&nbsp;нужен был&nbsp;современный и&nbsp;динамичный сайт, вовлекающий фанатов в&nbsp;жизнь любимого футбольного клуба и&nbsp;дающий новые возможности для&nbsp;коммерческой деятельности: продажа мерча, билетов на&nbsp;матчи, членства в&nbsp;клубе и&nbsp;спецобслуживания во&nbsp;время игр. </span></p>
<p><a rel="noopener" href="https://unrvld.com/" target="_blank" title="Сайт британской веб-студии UNRVLD (бывшая Delete Agency)"><span style="font-weight: 400;">UNRVLD (бывшие Delete Agency)</span></a><span style="font-weight: 400;"> провели необходимые исследования, разработали концепцию, прототипы и&nbsp;дизайны для&nbsp;нового сайта. Вся&nbsp;техническая часть проекта реализована силами fuse8.</span></p>
<h2>Дизайн</h2>
<p><span style="font-weight: 400;">У футбольного клуба </span><span style="font-weight: 400;">«Саутгемптон» есть логотип и&nbsp;фирменные цвета — алый и&nbsp;белый. Они&nbsp;легли в&nbsp;основу стайлгайда нового сайта.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2257/&#x441;&#x442;&#x430;&#x439;&#x43B;&#x433;&#x430;&#x439;&#x434;.jpg"
         alt=""
         itemprop="">


</figure>

<p><span style="font-weight: 400;"></span><span style="font-weight: 400;">Алый — как&nbsp;полосы фанатского шарфа и&nbsp;поле на&nbsp;щите. Золотой — как&nbsp;нимб над&nbsp;футбольным мячом и&nbsp;шрифт названия клуба. Черный — как&nbsp;цвет геральдической ленты. Дополнительные цвета — традиционный белый и&nbsp;несколько оттенков серого.</span></p>
<p><span style="font-weight: 400;"></span><span style="font-weight: 400;">Определившись с&nbsp;основными цветами и&nbsp;шрифтами, дизайнеры Delete создали несколько макетов главной страницы сайта. Расстановка и&nbsp;назначение блоков на&nbsp;них&nbsp;менялась в&nbsp;зависимости от&nbsp;того, в&nbsp;какой момент времени фанат зашел на&nbsp;  </span><a rel="noopener" href="https://southamptonfc.com/" target="_blank" title="Сайт футбольного клуба «Саутгемптон»"><span style="font-weight: 400;">Southamptonfc.com</span></a><span style="font-weight: 400;"> — перед матчем, во&nbsp;время или&nbsp;после. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2262/&#x43F;&#x440;&#x43E;&#x442;&#x438;&#x442;&#x43E;&#x43F;&#x44B;1.jpg"
         alt=""
         itemprop="">


</figure>

<p><span style="font-weight: 400;"></span><span style="font-weight: 400;">После утверждения дизайна главной страницы, мы&nbsp;приступили к&nbsp;созданию макетов всех остальных разделов.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2251/&#x444;&#x438;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439;-&#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;.png"
         alt=""
         itemprop="">


        <figcaption>
            Финальный дизайн
        </figcaption>
</figure>

<h2>Разработка</h2>
<p><span style="font-weight: 400;">Мы выбрали Sitecore CMS, потому что&nbsp;она&nbsp;идеально подходит для&nbsp;воплощения в&nbsp;жизнь всех амбиций «святых». Sitecore CMS&nbsp;позволила создать новый сайт Southampton FC, организовать его&nbsp;работу и&nbsp;связать со&nbsp;сторонними сервисами и&nbsp;сайтами. Еще&nbsp;одна причина, по&nbsp;которой выбор пал&nbsp;именно на&nbsp;Sitecore — возможность системы предоставлять пользователю персонифицированный контент на&nbsp;основе его&nbsp;предпочтений. </span></p>
<h3>Интеграция</h3>
<p><span style="font-weight: 400;">Новый сайт «Саутгемптона»</span><span style="font-weight: 400;"> стал центральной вещательной площадкой футбольного клуба. Здесь фанаты получают всю&nbsp;информацию о&nbsp;жизни «святых» — семь дней в&nbsp;неделю, 24 часа в&nbsp;сутки. Это&nbsp;разноплановый и&nbsp;качественный контент. Причем он&nbsp;меняется по&nbsp;форме и&nbsp;содержанию в&nbsp;зависимости от&nbsp;периода публикации: до&nbsp;матча, во&nbsp;время или&nbsp;после. Главный принцип такой: если на&nbsp;новом сайте Southampton FC&nbsp;есть всё, </span><strong>зачем фанату идти куда&#8209;то&nbsp;ещё?</strong></p>
<p><span style="font-weight: 400;">Чтобы это&nbsp;стало возможными, мы&nbsp;интегрировали Sitecore с&nbsp;несколькими сторонними сервисами и&nbsp;площадками: </span></p>
<ul>
<li><span style="font-weight: 400;">SQL Data Warehouse;</span></li>
<li><span style="font-weight: 400;">платформа для&nbsp;управления внешними медиа-файлами </span><a rel="noopener" href="https://www.thirdlight.com/news/2017/article/saints-march-forward-with-game-changing-digital-media-technology" target="_blank"><span style="font-weight: 400;">Third Light</span></a><span style="font-weight: 400;">; </span></li>
<li><span style="font-weight: 400;">видео-провайдер Ooyala;</span></li>
<li><a href="https://www.statsperform.com/opta/"><span style="font-weight: 400;">Opta</span></a><span style="font-weight: 400;"> — спортивная статистика;</span></li>
<li><span style="font-weight: 400;">BBC Radio Solent — аудио-трансляции; </span></li>
<li><span style="font-weight: 400;">официальные страницы ФК&nbsp;в&nbsp;социальных сетях.</span><span style="font-weight: 400;"></span></li>
</ul>


<figure class="umb-macro-image">
    


    <img src="/Media/2259/&#x441;&#x442;&#x435;&#x43A;-&#x442;&#x435;&#x445;&#x43D;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x439;.jpg"
         alt=""
         itemprop="">


</figure>

<h2>Сложности</h2>
<p><span style="font-weight: 400;">С первой сложностью мы&nbsp;столкнулись перед запуском сайта — это&nbsp;ограничение публикации видео Премьер-лиги в&nbsp;разных странах мира из&#8209;за&nbsp;разницы во&nbsp;времени. </span></p>



<blockquote>
    <div class="blockquote-body">
        Мы&nbsp;получили огромный список требований —  где&nbsp;и&nbsp;когда можно показывать игру по&nbsp;странам. Суть в&nbsp;том, что&nbsp;на&nbsp;сайте «Саутгемптона» информация о&nbsp;матче должна появляться не&nbsp;раньше, чем&nbsp;ее&nbsp;покажут по&nbsp;местному телевидению. Все&nbsp;эти&nbsp;условия прописывались отдельно для&nbsp;разных стран.
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Андрей Степанов, технический директор
                </cite>
            </div>
        </div>
    </footer>
</blockquote>


<p><span style="font-weight: 400;">Еще одна проблема возникла с&nbsp;аудио-стримами — они&nbsp;не&nbsp;работали на&nbsp;устройствах с&nbsp;iOS. Мы&nbsp;связались с&nbsp;людьми, которые писали эти&nbsp;стримы и&nbsp;договорились, чтобы они&nbsp;передавали нам&nbsp;информацию в&nbsp;том&nbsp;формате, который мы&nbsp;можем перекодировать и&nbsp;встроить для&nbsp;iOS&nbsp;другим способом.     </span></p>
<p><span style="font-weight: 400;">Во время текстовой трансляции первого матча Southampton FC&nbsp;на&nbsp;новый сайт пришло столько посетителей, что&nbsp;серверы не&nbsp;выдержали нагрузки. Общее количество фанатов в&nbsp;пять раз&nbsp;превысило наши самые смелые ожидания. В&nbsp;итоге часть пользователей просто не&nbsp;увидели сайт — страница загружалась бесконечно долго. Мы&nbsp;начали выяснять, в&nbsp;чем&nbsp;же&nbsp;проблема.</span></p>
<p><span style="font-weight: 400;">На тот&nbsp;момент сайт располагался на&nbsp;шести виртуальных машинах в&nbsp;приватном облаке. Когда одна из&nbsp;них&nbsp;оказывалась под&nbsp;большой нагрузкой, балансировщик не&nbsp;прекращал направлять на&nbsp;неё&nbsp;новые запросы. В&nbsp;итоге пользователи, волей судеб распределенные именно на&nbsp;этот сервер, оставались ни&nbsp;с&nbsp;чем.  </span></p>

<div class="text-highlight">
  Тестировщик Александр Пермяков подробно рассказал, как&nbsp;мы&nbsp;ловили эту&nbsp;проблему, в&nbsp;статье <a href='https://fuse8.ru/articles/atypical-ways-to-use-jmeter' title='Статья Александра Пермякова о&nbsp;нестандартных способах использования JMeter'>«JMeter — швейцарский нож&nbsp;тестировщика»</a>.
</div>

<p><span style="font-weight: 400;">Проблема была решена быстро и&nbsp;просто: мы&nbsp;добавили еще&nbsp;две&nbsp;виртуальные машины и&nbsp;перенастроили балансировщик нагрузки. Теперь, когда он&nbsp;видел, что&nbsp;на&nbsp;одном из&nbsp;серверов время отклика превышает лимит, он&nbsp;отправлял новые запросы на&nbsp;свободные машины.</span></p>
<h2>Результат</h2>
<p><span style="font-weight: 400;">Сайт «святых» был&nbsp;запущен в&nbsp;начале сезона 2016, как&nbsp;и&nbsp;хотело руководство клуба. Перед тем, как&nbsp;отдать проект в&nbsp;разработку, наши коллеги из&nbsp;Англии провели исследование и&nbsp;выяснили, чего ждут люди от&nbsp;сайта футбольного клуба. Поэтому фанаты получили именно то, что&nbsp;им&nbsp;было нужно.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2261/final.jpg"
         alt=""
         itemprop="">


</figure>

<h3>Возможности нового сайта Southampton FC</h3>
<p><a rel="noopener" href="https://southamptonfc.com/" target="_blank"><span style="font-weight: 400;">Southamptonfc.com</span></a><span style="font-weight: 400;"> стал информационным хабом для&nbsp;всех фанатов «святых». На&nbsp;сайте регулярно обновляется раздел с&nbsp;новостями клуба, анонсируются ближайшие матчи и&nbsp;выводится актуальная турнирная таблица Английской Премьер-лиги. </span></p>
<p><span style="font-weight: 400;">Уникальный раздел сайта — </span><strong>MatchDay Live</strong><span style="font-weight: 400;">. Здесь ведется текстовая онлайн-трансляция матчей. Благодаря интеграции с&nbsp;BBC&nbsp;Radio Solent, в&nbsp;ленте появляются аудио-комментарии. Сюда же&nbsp;из&nbsp;OptaSports подтягивается статистика матча и&nbsp;игроков, посты из&nbsp;соцсетей и&nbsp;фотографии с&nbsp;поля — из&nbsp;Third Light. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2263/&#x432;&#x430;&#x440;&#x430;&#x442;&#x43C;.jpg"
         alt=""
         itemprop="">


</figure>

<p><span style="font-weight: 400;">Зарегистрированные на&nbsp;сайте пользователи получают доступ к&nbsp;дополнительным материалам — эксклюзивным видеороликам, аудио-стримам, интервью с&nbsp;игроками и&nbsp;пресс-конференциям. Одновременно с&nbsp;этим создается база фанатов, с&nbsp;помощью которой для&nbsp;каждого из&nbsp;них&nbsp;генерируются специальные предложения, скидки и&nbsp;акции. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2264/&#x440;&#x430;&#x43E;&#x44C;&#x43B;&#x440;&#x43D;.jpg"
         alt=""
         itemprop="">


</figure>

<p><span style="font-weight: 400;">В разделе Teams представлены списки всех игроков «Саутгемптона» с&nbsp;подробной игровой статистикой за&nbsp;сезон. </span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2256/pasted-image-0.png"
         alt=""
         itemprop="">


</figure>

<p><span style="font-weight: 400;">Разделы Store и&nbsp;Tickets&amp;Hospitality редиректят на&nbsp;сайты, где&nbsp;фанаты могут купить билеты на&nbsp;матч, сезонные абонементы, мерч от&nbsp;«святых» или&nbsp;заказать спецобслуживание во&nbsp;время игры. </span></p>
<h2>Награды</h2>
<p><span style="font-weight: 400;">В марте 2017 года </span><a href="https://southamptonfc.com/"><span style="font-weight: 400;">Southamptonfc.com</span></a><span style="font-weight: 400;"> получил «золото» на&nbsp;конкурсе </span><a rel="noopener" href="https://www.deleteagency.com/news/delete-wins-two-sitecore-experience-awards" target="_blank"><span style="font-weight: 400;">Sitecore Experience Awards</span></a><span style="font-weight: 400;"> в&nbsp;рубриках UK&nbsp;Digital Innovation и&nbsp;Global People's Choice. </span></p>
<hr>
<p><span style="font-weight: 400;">Читайте </span><a rel="noopener" href="https://unrvld.com/work/southampton-fc" target="_blank" title="Английская версия кейса Southampton FC&nbsp;на&nbsp;сайте Delete Agency"><span style="font-weight: 400;">оригинальный кейс Southampton FC&nbsp;на&nbsp;английском языке</span></a><span style="font-weight: 400;"> на&nbsp;сайте UNRVLD (бывшие Delete Agency). </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Автоматический импорт: зло или благо?
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Фронтенд-разработчик Владимир Лысов — о лени, оптимизации рабочего процесса и телесных наказаниях от коллег-бекендеров
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/automatic-import/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/automatic-import/</guid>

                <pubDate>Tue, 01 Oct 2024 11:35:49 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Автоматический импорт: зло или благо?</h1>
                                <figure>
                                    <img src="/Media/1898/reason-rack-back.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9dea1a10a26059b69e7def26f132bced"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3bf9be603e07428385cad56cd87146dd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Прошлым летом, пока я&nbsp;прокачивал знание JavaScript и&nbsp;читал документацию <span>Vue.js</span>, наткнулся &nbsp;на видео Криса Фрица:</p>



    <div class="iframe">
        <div class="iframe__sizer" style="padding-bottom:56.25%"></div>
        <iframe
            class="iframe__el"
            width="560"
            height="315"
            src="https://www.youtube.com/embed/7lpemgMhi0k?start=0"
            frameborder="0"
            allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
            allowfullscreen>
        </iframe>
    </div>

<p>Один из&nbsp;приёмов, который описывает Фриц — автоматический импорт базовых компонентов: делаешь простенький индексный файл, он&nbsp;пробегает по&nbsp;остальным файлам в&nbsp;директории и&nbsp;регистрирует их&nbsp;как&nbsp;компоненты Vue.</p>
<p>Я обрадовался и&nbsp;рассказал о&nbsp;своей находке коллеге-бекендеру: просто складываешь компоненты в&nbsp;директорию и&nbsp;используешь по&nbsp;всему проекту. Он&nbsp;меня обругал и&nbsp;сказал, что&nbsp;за&nbsp;неявный импорт бьют по&nbsp;рукам. Мы&nbsp;немного поспорили и&nbsp;остались каждый при&nbsp;своём.</p>
<h2>Личный опыт</h2>
<p>Прошло полгода, и&nbsp;я&nbsp;добрался, наконец, до&nbsp;самостоятельной конфигурации вебпака. Мне&nbsp;нужен был&nbsp;простой сборщик: руками делать лень, а&nbsp;тащить vue&#8209;cli&nbsp;или&nbsp;create-react-app для&nbsp;простой страницы — &nbsp;избыточно. Я&nbsp;же&nbsp;хотел максимально облегчить себе жизнь и&nbsp;сделать проект поддерживаемым.</p>
<p>Итак, мне&nbsp;нужно разделять код&nbsp;на&nbsp;модули, но&nbsp;при&nbsp;этом не&nbsp;импортировать каждый создаваемый модуль ручками. Ещё&nbsp;я&nbsp;хочу использовать глобальные переменные в&nbsp;SCSS, клеить и&nbsp;оптимизировать векторные спрайты, использовать современный JavaScript и&nbsp;другие удобства. Как&nbsp;всё&nbsp;это&nbsp;устроить? И&nbsp;тут&nbsp;я&nbsp;вспомнил про&nbsp;автоматический импорт.</p>
<p>Полчаса ушло на&nbsp;то, чтобы освежить информацию и&nbsp;настроиться. Итог — готовый конфиг для&nbsp;вебпака. Попутно попробовал PostCSS, но&nbsp;решил все-таки не&nbsp;пересаживаться на&nbsp;новую технологию: во-первых, мне&nbsp;не&nbsp;нравится синтаксис PostCSS; во-вторых, это&nbsp;бессмысленно, ведь знакомый и&nbsp;удобный SCSS отлично справляется со&nbsp;своими задачами.</p>
<p>Я использовал node-sass-glob-importer для&nbsp;импорта директорий в&nbsp;SCSS:</p>
<pre class=" language-scss"><span class="token keyword">@import</span> <span class="token string">'./components/**/*'</span><span class="token punctuation">;</span>
<span class="token keyword">@import</span> <span class="token string">'./shared/**/*'</span><span class="token punctuation">;</span></pre>
<p>Попробовал использовать — показалось удобным, но&nbsp;решил все-таки посоветоваться с&nbsp;коллегами.</p>
<h2>Неявные проблемы</h2>
<p>Иду на&nbsp;кухню на&nbsp;работе, рассказываю коллегам и&nbsp;упоминаю, что&nbsp;бекендеры бы&nbsp;за&nbsp;неявный импорт наругали. Завязывается разговор, и&nbsp;опытный коллега-бекендер объясняет мне, чем&nbsp;плох неявный импорт: &nbsp;</p>
<p>— Проблемы возникнут, — сказал он, — когда другой человек посмотрит на&nbsp;код. Он&nbsp;попросту не&nbsp;поймёт, откуда тянется, например, переменная в&nbsp;SCSS. Изучив структуру, можно найти, что&nbsp;это&nbsp;переменная из&nbsp;директории shared. Но&nbsp;у&nbsp;разных людей на&nbsp;это&nbsp;уйдет разное количество времени и&nbsp;нервов.</p>
<p>И тут&nbsp;я&nbsp;вспоминаю свои эмоции, когда распутывал подобные клубки слишком абстрактного кода. И&nbsp;понимаю, что&nbsp;не&nbsp;хочу для&nbsp;коллег таких мучений.</p>
<pre class=" language-javascript"><span class="token keyword">return</span> <span class="token constant">R</span><span class="token punctuation">.</span><span class="token function">defaultTo</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>isActive<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>visibility<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Убираю функциональную библиотеку Ramda из&nbsp;проекта</span>
<span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>isActive <span class="token operator">||</span> <span class="token keyword">this</span><span class="token punctuation">.</span>visibility<span class="token punctuation">;</span></pre>
<p>К разговору подключился ещё&nbsp;один наш&nbsp;разработчик — фронтендер, и&nbsp;рассказал, как&nbsp;они&nbsp;работают с&nbsp;глобальными переменными в&nbsp;SCSS. Ребята разбивают на&nbsp;файлы группы переменных: цвета, брейкпойнты, размеры шрифтов, анимации и&nbsp;прочее, а&nbsp;затем импортируют их&nbsp;в&nbsp;общий файл _settings.scss. И&nbsp;уже&nbsp;этот единственный файл отправляют в&nbsp;компоненты. Удобно.</p>
<p>Убираю автоматическую сборку глобальных переменных и&nbsp;делаю по&nbsp;совету ребят. Оставляю только автоматическую сборку компонентов — лень импортировать в&nbsp;main.scss каждый создаваемый модуль.</p>
<p>На реальном проекте возникают проблемы: при&nbsp;включенном дев-сервере вебпак не&nbsp;подхватывает свежесозданный файл в&nbsp;директории с&nbsp;автоимпортом. Дело в&nbsp;том, что&nbsp;в&nbsp;режиме слежения вебпак наблюдает над&nbsp;&nbsp;изменениями в&nbsp;дереве зависимостей, и&nbsp;строка @import './components/**/*'; в&nbsp;файле main.scss преобразовывается плагином node-sass-glob-importer в&nbsp;пачку строк импортов:</p>
<pre class=" language-scss"><span class="token keyword">@import</span> <span class="token string">'./components/all.scss'</span><span class="token punctuation">;</span>
<span class="token keyword">@import</span> <span class="token string">'./components/button.scss'</span><span class="token punctuation">;</span>
<span class="token keyword">@import</span> <span class="token string">'./components/checkbox.scss'</span><span class="token punctuation">;</span>
<span class="token keyword">@import</span> <span class="token string">'./components/form.scss'</span><span class="token punctuation">;</span>
…</pre>
<p>Но в&nbsp;этой пачке нет&nbsp;нового файла, ведь main.scss не&nbsp;менялся. Нужно перезапускать дев-сервер или&nbsp;пересохранять main.scss.</p>
<h2>Что всё&nbsp;это&nbsp;значит?</h2>
<p>На первый взгляд, автоматический импорт крутая штука, но&nbsp;на&nbsp;деле всё&nbsp;не&nbsp;так&nbsp;радужно. Кратковременное удобство для&nbsp;одного разработчика не&nbsp;стоит времени и&nbsp;нервов остальной команды.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Мобильное приложение «Нескучные путешествия по&nbsp;Южному&nbsp;Уралу»
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/journey/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/journey/</guid>

                <pubDate>Mon, 30 Sep 2024 15:03:24 GMT</pubDate>

                            <category>&#x41C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Мобильное приложение «Нескучные путешествия по&nbsp;Южному&nbsp;Уралу»</h1>
                                <figure>
                                    <img src="/Media/1873/library-case-dark.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f379eef62e968faaeb6bc131dd9a045b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6a6e4666b10046388e27415a0c41838a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Заказчик — ГКУК «Челябинская областная универсальная научная библиотека».</p>
<p>Отдел краеведения библиотеки решил запустить проект по&nbsp;популяризации туризма на&nbsp;Южном Урале — приложение «Нескучные путешествия по&nbsp;Южному Уралу».</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="fourEight"
            data-content-element-type-key="ca282c47-86be-3881-a738-38a85635f98f"
            data-element-udi="umb://element/15a609b7b106699df5eb066f37e1b4b5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--42885723 umb-grid--ai-c" style="background-color:#f7f7f7;">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--42885723 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/c5772159c6924487aaca14fd56225e40"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--4650096">
    


    <img src="/Media/1547/start-screen.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--4650096 {
                    /* manual inline */
                    margin-top:60px;margin-left:-420px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography-new--accessories-quaternary spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3b09a69f1e9548d194bb95967b529e00"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Задача</h2>
<p>Разработать приложение об&nbsp;интересных местах Южного Урала. У&nbsp;заказчика не&nbsp;было четкой постановки задачи. Было желание сделать мобильное приложение с&nbsp;использованием информации из&nbsp;<a rel="noopener" href="http://dl.chelreglib.ru/2016/puteshestvia/18/mobile/index.html#p=1" target="_blank" title="Энциклопедия «Нескучные путешествия по&nbsp;Южному Уралу»" data-anchor="#p=1">электронной книги «Нескучное путешествие по&nbsp;Южному Уралу»</a>. Но&nbsp;для&nbsp;начала клиент должен был&nbsp;определиться:</p>
<ul>
<li>для каких платформ будет разрабатываться приложение — iOS, Android, Windows Phone;</li>
<li>наметить сроки;</li>
<li>определить бюджет;</li>
<li>решить, где&nbsp;брать и&nbsp;как&nbsp;готовить контент.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9fa079df699c4a574e53ebcf77bb0204"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b0e92cc619654c1a9daab66ada919830"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Разработка ТЗ&nbsp;и&nbsp;прототипов</h2>
<p>Мы подготовили две&nbsp;концепции приложения и&nbsp;прототипы к&nbsp;ним.</p>
<h3>Первая концепция</h3>
<ul>
<li>перенести контент из&nbsp;книги «Нескучное путешествие по&nbsp;Южному Уралу» в&nbsp;формат отдельных экскурсий;</li>
<li>сделать так, чтобы пользователь заранее загружал понравившуюся экскурсию с&nbsp;картой на&nbsp;смартфон и&nbsp;пользовался приложением в&nbsp;оффлайн-режиме;</li>
<li>предоставить пользователю карту достопримечательностей для&nbsp;каждой экскурсии;</li>
<li>реализовать поиск по&nbsp;экскурсиям и&nbsp;местам;</li>
<li>добавить раздел «Информация о&nbsp;проекте»;</li>
<li>добавить аудиогид и&nbsp;заготовленные маршруты для&nbsp;некоторых экскурсий.</li>
</ul>
<h3>Вторая концепция</h3>
<p>Вторая концепция частично повторяет первую, но&nbsp;в&nbsp;упрощенном варианте — без&nbsp;аудиогида и&nbsp;заготовленных маршрутов.</p>
<p>Подготовка аудиогида и&nbsp;маршрутов требовала времени и&nbsp;дополнительных затрат, а&nbsp;бюджет и&nbsp;сроки были ограничены. Поэтому мы&nbsp;начали с&nbsp;упрощенной версии.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/30f40bbc4878462bbe61474ced74b858"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--10211791 " style="background-color:#f7f7f7;">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--10211791 {
                    /* manual inline */
                    padding: 40px 0 40px 30px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="slider"
            data-content-element-type-key="fe4b1c5b-697c-4ddf-b617-5f55c38c8017"
            data-element-udi="umb://element/a6b8fe42aeee4110b811b37137e590a8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">




    <div data-cp="carousel"
         style="background-color:;"
         class="swiper-container carousel typography__ignore-offset"
         data-settings='{&quot;slidesPerView&quot;:6,&quot;spaceBetween&quot;:30,&quot;mousewheel&quot;:true,&quot;freeMode&quot;:true,&quot;breakpoints&quot;:{&quot;576&quot;:{&quot;slidesPerView&quot;:2,&quot;spaceBetween&quot;:24},&quot;768&quot;:{&quot;slidesPerView&quot;:3,&quot;spaceBetween&quot;:24},&quot;1024&quot;:{&quot;slidesPerView&quot;:4,&quot;spaceBetween&quot;:24}}}'>
        <div class="swiper-wrapper">
                <div class="swiper-slide">
	                    


    <img src="/Media/1618/screen01.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1619/screen02.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1620/screen03.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1621/screen04.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1622/screen05.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1623/screen06.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1624/screen07.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1625/screen08.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1626/screen09.png"
         alt=""
         itemprop="">

                </div>
                <div class="swiper-slide">
	                    


    <img src="/Media/1617/screen10.png"
         alt=""
         itemprop="">

                </div>
        </div>
    </div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f7f02ce42573054819d9a394761ffbc4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--45161860 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--45161860 {
                    /* manual inline */
                    padding: 50px 15px 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d90a147dbdf34676a9d04a9d646d3d3b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Основные положения ТЗ</h3>
<ul>
<li>приложение должно работать в&nbsp;оффлайн-режиме, пользователь сможет скачать карту с&nbsp;экскурсиями на&nbsp;телефон;</li>
<li>на карте должны быть отмечены экскурсии и&nbsp;места;</li>
<li>есть поиск по&nbsp;экскурсиям и&nbsp;местам;</li>
<li>пользователь сможет оценивать экскурсии;</li>
<li>контент (фотографии и&nbsp;тексты) нам&nbsp;предоставляют специалисты краеведческого отдела библиотеки.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a175f5c1d5712130eb903423335ae724"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  typography-new--accessories-tertiary" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a6f907dd4c84448f97bd4bef89223935"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Визуальное решение</h2>
<p>У клиента уже&nbsp;был&nbsp;логотип и&nbsp;брендинг, которые ранее использовались в&nbsp;печатной продукции. Дизайн выглядел устаревшим, и&nbsp;мы&nbsp;предложили клиенту провести ребрендинг: переделать логотип, основные элементы фирменного стиля, цветовую палитру.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1539/2018-10-10-14-52-46.png"
         alt=""
         itemprop="">


        <figcaption>
            Так&nbsp;раньше оформлялась печатная продукция библиотеки
        </figcaption>
</figure>

<h3>Разработка концептуальных вариантов логотипа и&nbsp;фирменного стиля</h3>
<p>Мы разработали четыре варианта логотипа, фирменного стиля и&nbsp;иллюстраций и&nbsp;попросили заказчика выбрать понравившийся.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1d5365a1d30a41258b90aa98df2efad7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--32032987 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--32032987 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="slider"
            data-content-element-type-key="fe4b1c5b-697c-4ddf-b617-5f55c38c8017"
            data-element-udi="umb://element/da6f42efd26f4c1588d5f519508e4706"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">




    <div data-cp="carousel"
         style="background-color:#ddefef;"
         class="swiper-container carousel typography__ignore-offset"
         data-settings='{&quot;navigation&quot;:{&quot;nextEl&quot;:&quot;.swiper-button-next&quot;,&quot;prevEl&quot;:&quot;.swiper-button-prev&quot;}}'>
        <div class="swiper-wrapper">
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/1633/logo02.jpg"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/1627/logo01.jpg"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/1628/logo03.jpg"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/1629/logo04.jpg"
         alt=""
         itemprop="">

                        </div>
                </div>
        </div>
            <button
                type="button"
                class="carousel__navigation carousel__navigation--prev swiper-button-prev"
                data-carousel-ref="prev"
                style="color:#478e8e;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--l">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&lt;</span>
                </span>
            </button>
            <button type="button"
                    class="carousel__navigation carousel__navigation--next swiper-button-next"
                    data-carousel-ref="next"
                    style="color:#478e8e;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--r">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&gt;</span>
                </span>
            </button>
    </div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f9f9bd70c1c08a04e2a1567518b0cae8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--8185726 typography-new--accessories-tertiary" style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--8185726 {
                    /* manual inline */
                    padding: 50px 15px 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6bc6a07807b84ead88f69dce5f492444"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Новый логотип узнаваем и&nbsp;без&nbsp;названия приложения, он&nbsp;используется в&nbsp;качестве иконки. Главный цвет выбран из&nbsp;гайдлайна библиотеки, чтобы сохранить преемственность.</p>
<h3>Стайлгайд и&nbsp;библиотека компонентов</h3>
<p>Для каждого проекта мы&nbsp;готовим стайлгайд и&nbsp;библиотеку основных компонентов. Это&nbsp;помогает сохранять дизайн консистентным и&nbsp;облегчает жизнь разработчикам. Поддерживать проект со&nbsp;стайлгайдом гораздо проще.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/1638/bitmap-2x.png"
         alt=""
         itemprop="">


        <figcaption>
            Обновлённый стайлгайд
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="twoColumn"
            data-content-element-type-key="4873b7da-ae69-3604-986d-470f83f94a81"
            data-element-udi="umb://element/185146f15ed92347c367e5d8d4ff4313"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  umb-grid--ai-c" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography-new--quaternary spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4c942402819d4ab28c96ac4ad7e95120"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Разработка и&nbsp;тестирование</h2>
<p>Приложение «Нескучные путешествия по&nbsp;Южному Уралу» написано на&nbsp;языках Java и&nbsp;Kotlin. Мы&nbsp;использовали Retrofit, Room и&nbsp;Clean Architecture.</p>
<p>На завершающих этапах мы&nbsp;вручную тестировали приложение на&nbsp;современных Samsung Galaxy S8, LG&nbsp;Nexus 5X со&nbsp;«свежей» версией Android и&nbsp;на&nbsp;устаревших моделях — Samsung Galaxy Note II&nbsp;и&nbsp;других.</p>
<p>Работа с&nbsp;ошибками велась в&nbsp;системе трекинга багов Jira.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--6">
							
<div class="umb-block-grid__area"
     data-area-col-span="6"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 6;--umb-block-grid--area-column-span: 6; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/df6890d50e1b4fbb9625e6c9401521e0"
            data-col-span="6"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 6; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--3175363">
    


    <img src="/Media/1545/phone-and-notebook.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--3175363 {
                    /* manual inline */
                    margin-right:-580px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/0cd2e94f95f63b2d8988e2ee0676a46a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--7274371 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--7274371 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f06f691adc08415d810ed462d6cbfdce"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Карты</h3>
<p>При работе с&nbsp;картами мы&nbsp;использовали mapbox. Оптимизировали размер карты выделением отдельных регионов и&nbsp;их&nbsp;предварительной загрузкой. Из&#8209;за&nbsp;небольшого бюджета заказчика пошли на&nbsp;ухищрения: в&nbsp;mapbox нельзя скачать более шести тысяч тайлов за&nbsp;раз, поэтому мы&nbsp;разбивали и&nbsp;закачивали карту в&nbsp;несколько потоков.</p>
<h3>Оптимизация размера</h3>
<p>Поскольку приложение работает в&nbsp;оффлайне, много информации хранится в&nbsp;памяти смартфона. Чтобы уменьшить размер приложения нам&nbsp;пришлось сжать изображения, максимально сохранив их&nbsp;качество. Мы&nbsp;использовали новые возможности Android Studio — разделили ресурсы приложения так, чтобы пользователь в&nbsp;момент установки получал только те&nbsp;изображения и&nbsp;файлы, которые соответствуют параметрам его&nbsp;смартфона.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/10a6fc18e2d6fa3a8c41e21c078098dd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  typography-new--accessories-quaternary" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/beab67d74d44409daefcdae9735a1828"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Презентация приложения после запуска</h2>
<p>После выпуска приложения клиент пригласил нас&nbsp;на&nbsp;презентацию, которая проходила в&nbsp;рамках праздника «Общероссийский день библиотек».</p>
<p>Участие в&nbsp;ней&nbsp;принимали сотрудники и&nbsp;директора библиотек со&nbsp;всего Урала. Мы&nbsp;рассказали о&nbsp;приложении и&nbsp;показали, как&nbsp;им&nbsp;пользоваться.</p>
<p>Проект «Нескучные путешествия по&nbsp;Южному Уралу» получил положительные отзывы. Многие гости установили приложение на&nbsp;свои смартфоны. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1fdf2c2e300f3009c7a6ca82bca25e4f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="background-color:#f7f7f7;">
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/233a182a79784b8d8158f3f0685b0951"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>&nbsp;</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1540/bitmap.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Фото с&nbsp;презентации (взято с&nbsp;сайта ЧОУНБ - <a rel="noopener" href="http://chelreglib.ru/ru/news/4064/" target="_blank">http://chelreglib.ru/ru/news/4064/)</a>
        </figcaption>
</figure>

<p>&nbsp;</p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/144186b5a3570c224758c8cc898c21b5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  typography--light typography--accessories-light" style="background-image:linear-gradient(to bottom, #bd000d, #8b0014);">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium typography-new--bigger spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b9da4b9db366405780c7113837f6519c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Результат</h2>
<p>Создано мобильное приложение для&nbsp;Android «Нескучные путешествия по&nbsp;Южному Уралу». В&nbsp;нём&nbsp;17 экскурсий, 80 туристических объектов и&nbsp;сотня фотографий достопримечательностей. С&nbsp;момента запуска приложение скачали более 500 раз. Оно&nbsp;весит 18 Мб&nbsp;— не&nbsp;больше приложения для&nbsp;вызова такси. Средняя оценка пользователей — 4,9 балла.</p>
<p>Приложение работает в&nbsp;режимах онлайн и&nbsp;оффлайн. Ориентация на&nbsp;местности происходит с&nbsp;помощью карт с&nbsp;отмеченными достопримечательностями. Насколько увлекательны экскурсии, решают сами путешественники, оценивая их&nbsp;по&nbsp;пятибалльной шкале.</p>
<p> </p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="awards"
            data-content-element-type-key="82cdbbd8-0baa-4271-a5b0-0f1aae3d3bed"
            data-element-udi="umb://element/8eb6c899309f46a68b458217e186777f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/959005ca0011fda52baf7f8ace453408"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/44237d3dbf124655a9f7d63d829b9e8e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    
<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Отрадно, что&nbsp;мы&nbsp;стали лауреатами премии по&nbsp;итогам 2018 года в&nbsp;номинации «Лучшие практики в&nbsp;сфере туризма» — настолько высоко оценили наше мобильное приложение «Нескучные путешествия по&nbsp;Южному Уралу»
Это&nbsp;стало возможным благодаря слаженной работе библиотекарей краеведческого отдела и&nbsp;наших партнёров из&nbsp;fuse8. Высокий профессионализм, творческий подход и&nbsp;энтузиазм (с&nbsp;ребятами мы&nbsp;тесно общались на&nbsp;всех этапах разработки) позволили создать современный, удобный и&nbsp;нужный продукт.
Большое спасибо коллективу компании fuse8 и&nbsp;особенно руководителю проекта Вениамину Мустафину и&nbsp;дизайнеру Екатерине Данилиной. Надеемся, у&nbsp;нас&nbsp;ещё&nbsp;будут совместные проекты!
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Наталья Соловьёва
                </cite>
                <p class="blockquote-new__author-position">
                    замдиректора по&nbsp;творческой деятельности ЧОУНБ
                </p>
            </div>
        </footer>
    </blockquote>
</div>

<p> </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Авторизация и аутентификация в ASP.NET Core с использованием ASP.NET Core Identity и JWT
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Разбираемся, как быстро и просто реализовать безопасную аутентификацию пользователя с помощью технологий ASP.NET Core Identity и JWT.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/secure-authorization-with-jwt/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/secure-authorization-with-jwt/</guid>

                <pubDate>Fri, 27 Sep 2024 16:08:17 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Авторизация и аутентификация в ASP.NET Core с использованием ASP.NET Core Identity и JWT</h1>
                                <figure>
                                    <img src="/Media/2311/main.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/aab4f26d5f2a75cbe90a0817de4077b4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3f3009ee145f4d36b724a2d0a54f8c5f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">В одном из&nbsp;рабочих проектов мне&nbsp;нужно было внедрить авторизацию на&nbsp;основе ASP.NET Core Identity и&nbsp;JWT. Подробного гайда о&nbsp;том, как&nbsp;это&nbsp;сделать, я&nbsp;не&nbsp;нашла. И&nbsp;потому написала свой.</span></p>
<p><span style="font-weight: 400;">В этой статье я&nbsp;расскажу о&nbsp;структуре JWT&nbsp;и&nbsp;схеме работы ASP.NET Core Identity и&nbsp;JWT&nbsp;вместе. Во&nbsp;второй части — на&nbsp;живом примере покажу, как&nbsp;реализовать авторизацию в&nbsp;ASP.NET Core 3.1 с&nbsp;использованием этих технологий.</span></p>
<p><span style="font-weight: 400;">Аутентификация и&nbsp;авторизация — одни из&nbsp;обязательных частей RESTful API. В&nbsp;</span><a rel="noopener" href="http://asp.net" target="_blank"><span style="font-weight: 400;">ASP.NET</span></a><span style="font-weight: 400;"> есть встроенная система аутентификациии и&nbsp;авторизации — </span><span style="font-weight: 400;">ASP.NET</span><span style="font-weight: 400;"> Identity. Она&nbsp;дает возможность создавать учетные записи и&nbsp;управлять ими,  аутентифицироваться или&nbsp;входить на&nbsp;сайт через профили Google, Facebook, Microsoft и&nbsp;других внешних провайдеров.</span></p>
<p><span style="font-weight: 400;">ASP.NET</span><span style="font-weight: 400;"> Core поддерживает еще&nbsp;и&nbsp;Json Web&nbsp;Token (JWT). Эта&nbsp;технология предоставляет авторизовавшемуся пользователю уникальный идентификатор – токен. С&nbsp;его&nbsp;помощью пользователь взаимодействует с&nbsp;веб-приложением.</span></p>
<p><span style="font-weight: 400;">Подключить авторизацию на&nbsp;основе JWT&nbsp;в&nbsp;ASP.NET Core достаточно просто. Давайте разберемся, как&nbsp;это&nbsp;сделать. </span></p>
<p><span style="font-weight: 400;">Сперва рассмотрим </span>структуру JWT&nbsp;и&nbsp;алгоритм создания токенов<span style="font-weight: 400;">. </span></p>
<p><span style="font-weight: 400;">Затем разберемся в&nbsp;</span>схеме работы ASP.NET Core Identity и&nbsp;JWT<span style="font-weight: 400;">.  </span></p>
<h2>Структура и&nbsp;алгоритм создания JWT</h2>
<p><span style="font-weight: 400;">JSON Web&nbsp;Token (JWT) — это&nbsp;открытый стандарт </span><a rel="noopener" href="https://tools.ietf.org/html/rfc7519" target="_blank"><span style="font-weight: 400;">RFC 7519</span></a><span style="font-weight: 400;">, который используют для&nbsp;компактной, автономной и&nbsp;безопасной передачи данных в&nbsp;виде объекта JSON. </span></p>
<p><span style="font-weight: 400;">JWT состоит из&nbsp;трех блоков, разделенных точками: заголовок(header), поля (payload) и&nbsp;подпись (signature). Header и&nbsp;payload формируются отдельно, затем на&nbsp;их&nbsp;основе вычисляется signature.</span></p>
<h3>Алгоритм создания JWT</h3>
<ol>
<li style="font-weight: 400;"><span style="font-weight: 400;">Блоки заголовок (</span><strong>header</strong><span style="font-weight: 400;">) и&nbsp;поля (</span><strong>payload</strong><span style="font-weight: 400;">) представляются в&nbsp;виде UTF-8 строк.</span></li>
<li style="font-weight: 400;"><span style="font-weight: 400;">Переводим оба&nbsp;блока в&nbsp;массивы байтов, затем кодируем, используя алгоритм base64. Результатом будет строка </span><strong>header.payload</strong><span style="font-weight: 400;">.</span></li>
<li style="font-weight: 400;"><span style="font-weight: 400;"><span>Для строки <strong>header.payload</strong> генерируем подпись <strong>signature</strong>, используя алгоритм из&nbsp;параметра header «alg» и&nbsp;secret key&nbsp;(который известен только серверу)</span>. <span>Кодируем полученную подпись <strong>signature</strong>, используя алгоритм base64.</span></span></li>
<li style="font-weight: 400;"><span style="font-weight: 400;">Формируем </span>JWT<span style="font-weight: 400;"> из&nbsp;полученных блоков через точку: </span><strong>header.payload.signature</strong><span style="font-weight: 400;">.</span><span style="font-weight: 400;"></span>


<figure class="umb-macro-image">
    


    <img src="/Media/2312/1.png"
         alt=""
         itemprop="">


        <figcaption>
            Структура JWT&nbsp;
        </figcaption>
</figure>

</li>
</ol>
<h2>Схема работы ASP.NET Core Identity и&nbsp;JWT</h2>
<ol>
<li><span style="font-weight: 400;"> Клиент идет с&nbsp;запросом на&nbsp;сервер, передавая свои данные (например, username и&nbsp;password), чтобы получить JWT.</span></li>
<li><span style="font-weight: 400;"> Сервер проверяет username и&nbsp;password, используя SignInManager: если проверка прошла успешно, генерирует JWT&nbsp;и&nbsp;передаёт его&nbsp;клиенту, если нет&nbsp;  — возвращает 401 ошибку.<br> <br></span><span style="font-weight: 400;">В дальнейшем сервер будет проверять этот токен  перед выполнением каждого клиентского запроса. <br></span><span style="font-weight: 400;"><span style="font-weight: 400;"><br>Из соображений безопасности токен имеет ограниченный срок жизни. Как&nbsp;только это&nbsp;время истечет, <span>клиенту нужно будет запросить его&nbsp;заново, используя refresh token</span>.</span></span><br>


<figure class="umb-macro-image">
    


    <img src="/Media/2313/2.png"
         alt=""
         itemprop="">


</figure>

</li>
<li><span style="font-weight: 400;">Далее клиент обращается к&nbsp;серверу, используя JWT, передавая его, например, через HTTP-заголовок.</span></li>
<li><span style="font-weight: 400;"><span>Сервер декодирует header и&nbsp;payload, проверяет зарезервированные поля, и&nbsp;по&nbsp;указанному в&nbsp;header алгоритму с&nbsp;помощью secret key&nbsp;составляется подпись</span>. Затем полученная подпись проверяется на&nbsp;совпадение с&nbsp;переданной. В&nbsp;случае успеха пользователь авторизуется и&nbsp;получает запрошенные данные. Если подписи не&nbsp;совпали, на&nbsp;запрос вернётся ошибка 401. <br></span><span style="font-weight: 400;"></span>


<figure class="umb-macro-image">
    


    <img src="/Media/2314/3.png"
         alt=""
         itemprop="">


</figure>

</li>
</ol>
<p><span style="font-weight: 400;">На этом с&nbsp;теорией закончим. Во&nbsp;второй части статьи будет практика — покажу пошагово, <a href="/articles/using-asp-net-core-identity-and-jwt">как прикрутить авторизацию в&nbsp;ASP.NET Core 3.1</a> через ASP.NET Core Identity и&nbsp;JWT.</span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Применение ASP.NET Core Identity и JWT в ASP.NET Core 3.1
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Как прикрутить авторизацию в ASP.NET Core 3.1 через ASP.NET Core Identity и JWT — пошаговая инструкция.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/using-asp-net-core-identity-and-jwt/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/using-asp-net-core-identity-and-jwt/</guid>

                <pubDate>Fri, 27 Sep 2024 15:31:23 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Применение ASP.NET Core Identity и JWT в ASP.NET Core 3.1</h1>
                                <figure>
                                    <img src="/Media/2320/main-2atr.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/0cccd87a630dd2d3f2fda0d6ff06856f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--64906131 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--64906131 {
                    /* manual inline */
                    padding: 50px 15px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/305e13fe8ff942ea8e4c7328c43e95a6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">В предыдущей статье мы&nbsp;рассмотрели <a href="/articles/secure-authorization-with-jwt">структуру JWT</a> и&nbsp;схему работы ASP.NET Core Identity и&nbsp;JWT&nbsp;вместе. В&nbsp;этой — на&nbsp;живом примере реализуем авторизацию в&nbsp;ASP.NET Core 3.1 с&nbsp;использованием этих технологий.</span></p>
<h3>Архитектура приложения и&nbsp;необходимые nugget пакеты</h3>
<p><span style="font-weight: 400;">Чтобы продемонстрировать на&nbsp;практике использование ASP.NET Core Identity и&nbsp;JWT, я&nbsp;создала пять отдельных проектов, настроила связи между ними и&nbsp;установила необходимые nugget-пакеты. Дополнительно добавила Entity Framework для&nbsp;взаимодействия MS&nbsp;SQL&nbsp;Server. <br><br><a rel="noopener" href="https://github.com/abushmeleva/AspNetCoreIdentity" target="_blank">Исходный код&nbsp;проекта доступен на&nbsp;GitHub</a></span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2321/4.png"
         alt=""
         itemprop="">


        <figcaption>
            Архитектура приложения: основные модули и&nbsp;их&nbsp;nuget-пакеты
        </figcaption>
</figure>

<p><span style="font-weight: 400;">Моё приложение — максимально упрощенное. Но&nbsp;я&nbsp;все&nbsp;равно придерживалась </span><a rel="noopener" href="https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/" target="_blank"><span style="font-weight: 400;">Onion Architecture</span></a><span style="font-weight: 400;">. Так&nbsp;пример получается максимально приближенным к&nbsp;реальному проекту: его&nbsp;можно брать и&nbsp;расширять до&nbsp; своего рабочего простенького веб-приложения. </span></p>
<h3>Настраиваем конфигурацию</h3>
<p><span style="font-weight: 400;">Добавим конфигурацию для&nbsp;использования DataContext EntityFramework.<br></span></p>
<pre><code class="language-dotnet">services.AddDbContext&lt;DataContext&gt;(opt =&gt;
  opt.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); <br><br></code></pre>
<p> </p>
<p>И строку подключения к&nbsp;MS&nbsp;SQL&nbsp;Server в&nbsp;appsettings.json.е.</p>
<pre><code class="language-dotnet">"ConnectionStrings": {
  "DefaultConnection": "Server=.\\SQL_2016;Database=AspNetCoreIdentity;user id=testUser;   
    password='testUser'"}</code></pre>
<p> </p>
<p>Добавим MediatR, чтобы реализовать в&nbsp;нашем приложении <a rel="noopener" href="https://medium.com/@dbottiau/a-naive-introduction-to-cqrs-in-c-9d0d99cd2d54" target="_blank">подход CQRS</a>. Он&nbsp;позволяет отделить код, изменяющий состояние, от&nbsp;кода, читающего это&nbsp;состояние. С&nbsp;подходом CQRS мы&nbsp;уменьшаем количество зависимостей в&nbsp;каждом классе и&nbsp;соблюдаем SRP&nbsp;— один из&nbsp;принципов SOLID. Проект, построенный по&nbsp;принципам CQRS, легче расширять и&nbsp; тестировать.</p>
<pre><code class="language-dotnet">services.AddMediatR(typeof(LoginHandler).Assembly);</code></pre>
<p> </p>
<h3>Добавляем ASP.NET Core Identity в&nbsp;проект</h3>
<p>Первым делом добавим в&nbsp;Domain пользовательский класс AppUser.cs с&nbsp; необходимыми под&nbsp;наши задачи полями. Унаследуем его&nbsp;от&nbsp;IdentityUser.</p>
<pre><code class="language-dotnet">public class AppUser : IdentityUser
  {
      public string DisplayName { get; set; }
  }</code></pre>
<p> </p>
<p>Теперь зарегистрируем созданный нами класс пользователя в&nbsp;Startup.cs.</p>
<pre><code class="language-dotnet">var builder = services.AddIdentityCore&lt;AppUser&gt;();
var&nbsp;identityBuilder = new&nbsp;IdentityBuilder(builder.UserType, builder.Services);</code></pre>
<p> </p>
<p>Добавим в&nbsp;проект EFData DataContext, унаследованный от&nbsp; IdentityDbContext.</p>
<pre><code class="language-dotnet">public class DataContext: IdentityDbContext&lt;AppUser&gt; 
  {
      public DataContext(DbContextOptions options) : base(options) { }
  }</code></pre>
<p> </p>
<p>Установим тип&nbsp;хранилища (класс контекста данных) в&nbsp;Startup.cs, которое Identity будет использовать для&nbsp;хранения данных.</p>
<pre><code class="language-dotnet">identityBuilder.AddEntityFrameworkStores&lt;DataContext&gt; ();
identityBuilder.AddSignInManager&lt;SignInManager&lt;AppUser&gt;&gt;();</code></pre>
<p> </p>
<p>Подключим аутентификацию в&nbsp;методе Configure() класса Startup.cs.</p>
<pre><code class="language-dotnet">app.UseAuthentication();</code></pre>
<p> </p>
<p>Теперь мы&nbsp;можем создать начальную миграцию. Для&nbsp;этого стартовым проектом выбираем API, открываем Package Manager Console и&nbsp;в&nbsp;Default project выбираем проект EFData. Запускаем создание начальной миграции командой: </p>
<pre><code class="language-dotnet">&gt; Add-migration initial </code></pre>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/eee10856b5516894370e4d96cfc36521"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--3229624 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--3229624 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7c86633d1df94055b253e35a15be4944"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2379/1.png"
         alt=""
         itemprop="">


</figure>

</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/598a569e6acae4e562219f631b462f84"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--26550251 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--26550251 {
                    /* manual inline */
                    padding: 25px 15px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/879b91827bec459b9034278988e3030d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Результатом будет автоматически созданная миграция в&nbsp;папке Migrations проекта EFData. Прежде чем&nbsp;накатить её&nbsp;на&nbsp;нашу базу, в&nbsp;том&nbsp;же&nbsp;проекте создадим DataSeed для&nbsp;автозаполнения начальными данными.</p>
<pre><code class="language-dotnet">public class DataSeed
 {
      public static async Task SeedDataAsync(DataContext context, UserManager userManager)
      {
          if&nbsp;(!userManager.Users.Any())
          {
              var&nbsp;users = new&nbsp;List&lt;AppUser&gt;
                            {
                                new&nbsp;AppUser
                                    {
                                        DisplayName = "TestUserFirst",
                                        UserName = "TestUserFirst",
                                        Email = "testuserfirst@test.com"
                                    },

                                new&nbsp;AppUser
                                    {
                                        DisplayName = "TestUserSecond",
                                        UserName = "TestUserSecond",
                                        Email = "testusersecond@test.com"
                                    }
                              };

              foreach (var&nbsp;user in&nbsp;users)
              {
                  await userManager.CreateAsync(user, "qazwsX123@");
              }
          }
      }
  }</code></pre>
<p> </p>
<p>Теперь можно создавать базу. Она&nbsp;заполнится данными при&nbsp;первом запуске веб-приложения. </p>
<pre><code class="language-dotnet">update-database</code></pre>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/92467d1ba2e91c43447fea0b0d41dc63"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--31759802 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--31759802 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e458b799f78c4af7b1dd711cd77e58e6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2387/2.png"
         alt=""
         itemprop="">


        <figcaption>
            Вот&nbsp;что&nbsp;у&nbsp;нас&nbsp;получилось в&nbsp;результате
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/fcea8145d5f85f2ee3f8489007edbafa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--48619045 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--48619045 {
                    /* manual inline */
                    padding: 25px 15px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/96267cb4ca704a498496d20f0cb66c87"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Всё необходимое для&nbsp;работы с&nbsp;Identity добавлено. Теперь реализуем метод для&nbsp;авторизации пользователя в&nbsp;приложении.</p>
<p>В UserController проекта API&nbsp;добавим метод LoginAsync.</p>
<pre><code class="language-dotnet">[HttpPost("login")]
  public async Task&lt;ActionResult&lt;UserModel&gt;&gt; LoginAsync(LoginQuery query)
  {
       return await Mediator.Send(query);
  }
 </code></pre>
<p><br>В проект Application добавим три&nbsp;класса:</p>
<p><strong>LoginHandler.cs</strong></p>
<pre><code class="language-dotnet">public class LoginHandler : IRequestHandler&lt;LoginQuery, UserModel&gt;
 {
	private readonly UserManager&lt;AppUser&gt; _userManager;

	private readonly SignInManager&lt;AppUser&gt; _signInManager;

	public LoginHandler(UserManager userManager&lt;AppUser&gt;,  
                                   SignInManager&lt;AppUser&gt; signInManager)
	{
		_userManager = userManager;
		_signInManager = signInManager;
	}

	public async Task&lt;UserModel&gt; Handle(LoginQuery request, CancellationToken cancellationToken)
	{
		var&nbsp;user = await _userManager.FindByEmailAsync(request.Email);
		if&nbsp;(user == null)
		{
			throw new&nbsp;RestException(HttpStatusCode.Unauthorized);
		}

		var&nbsp;result = await _signInManager.CheckPasswordSignInAsync(user, request.Password, false);

		if&nbsp;(result.Succeeded)
		{
			return new&nbsp;UserModel
						{
							DisplayName = user.DisplayName,
							Token = "test", (Далее здесь будет вызов метода сервиса, генерирующий Token)                         
							UserName = user.UserName,
							Image = null
						};
		}

		throw new&nbsp;RestException(HttpStatusCode.Unauthorized);
	}
 }</code></pre>
<p> </p>
<p><strong>LoginQuery.cs</strong></p>
<pre><code class="language-dotnet">public class LoginQuery : IRequest&lt;UserModel&gt;
{
	public string Email { get; set; }
	public string Password { get; set; }
}</code></pre>
<p> </p>
<p><strong>LoginQueryValidation.cs</strong></p>
<pre><code class="language-dotnet">public class LoginQueryValidation : AbstractValidator&lt;LoginQuery&gt;
{
	public LoginQueryValidation()
	{
		RuleFor(x =&gt; x.Email).<span style="font-weight: 400;">EmailAddress().</span>NotEmpty();
		RuleFor(x =&gt; x.Password).NotEmpty();
	}
}</code></pre>
<p> </p>
<p>Протестируем метод с&nbsp;помощью любого API&nbsp;клиента. В&nbsp;нашем случае это&nbsp; будет Postman. Делаем запрос к&nbsp;веб-приложению и&nbsp;получаем результат:</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/68c29c2e6ba509797d90f44e49a1f5c1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--666162 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--666162 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9d7c11fb868d42de9b0427f1bb7575b5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2388/3.png"
         alt=""
         itemprop="">


        <figcaption>
            В&nbsp;запросе некорректные пользовательские данные (ошибка в&nbsp;логине или&nbsp;пароле) — получаем ответ 401 Unauthorized
        </figcaption>
</figure>

<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2389/4.png"
         alt=""
         itemprop="">


        <figcaption>
            На&nbsp;корректный запрос получаем ответ 200 OK&nbsp;и&nbsp;данные пользователя
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e19c336276b6a5d7fb4201ca93369a14"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--19318708 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--19318708 {
                    /* manual inline */
                    padding: 15px 15px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c167279dd9714a52a4a24c2c5d0203fa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Добавим набор ограничений в&nbsp;Startup.cs. Теперь каждый запрос к&nbsp;нашему API&nbsp;должен быть авторизован. Единственный метод, который будет являться исключением (в&nbsp;дальнейшем их&nbsp;может быть больше) — это&nbsp; Login. Для&nbsp;этого на&nbsp;UserController навесим атрибут [AllowAnonymous].</p>
<pre><code class="language-dotnet">services.AddMvc(option =&gt; 
{
// Отключаем маршрутизацию конечных точек на&nbsp;основе endpoint-based logic из&nbsp;EndpointMiddleware
// и&nbsp;продолжаем использование маршрутизации на&nbsp;основе IRouter. 
        option.EnableEndpointRouting = false;
        var&nbsp;policy = new&nbsp;AuthorizationPolicyBuilder()
                            .RequireAuthenticatedUser().RequireAuthenticatedUser().Build();
		option.Filters.Add(new AuthorizeFilter(policy));
	}).SetCompatibilityVersion(CompatibilityVersion.Latest);
</code></pre>
<h3>Добавляем JWT&nbsp;в&nbsp;проект</h3>
<p>Конфигурация взаимодействия нашего приложения с&nbsp;JWT&nbsp;производится достаточно просто. В&nbsp;проекте Application определим отдельный интерфейс IJwtGenerator с&nbsp;единственным методом CreateToken.</p>
<pre><code class="language-dotnet"> public interface IJwtGenerator
 {
     string CreateToken(AppUser user);
 }</code></pre>
<p> </p>
<p>В проект Infrastructure добавим класс JwtGenerator и&nbsp;унаследуем его&nbsp;от&nbsp; IJwtGenerator со&nbsp;следующей реализацией CreateToken:</p>
<pre><code class="language-dotnet">        
	public class JwtGenerator : IJwtGenerator
	{
		private readonly SymmetricSecurityKey _key;

		public JwtGenerator(IConfiguration config)
		{
			_key = new&nbsp;SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["TokenKey"]));
		}

		public string CreateToken(AppUser user)
		{
			var&nbsp;claims = new&nbsp;List { new&nbsp;Claim(JwtRegisteredClaimNames.NameId, user.UserName) };

			var&nbsp;credentials = new&nbsp;SigningCredentials(_key, SecurityAlgorithms.HmacSha512Signature);

			var&nbsp;tokenDescriptor = new&nbsp;SecurityTokenDescriptor
			{
				Subject = new&nbsp;ClaimsIdentity(claims),
				Expires = DateTime.Now.AddDays(7),
				SigningCredentials = credentials
			};
			var&nbsp;tokenHandler = new&nbsp;JwtSecurityTokenHandler();

			var&nbsp;token = tokenHandler.CreateToken(tokenDescriptor);

			return tokenHandler.WriteToken(token);
		}
	}
</code></pre>
<p><br>Зарегистрируем реализацию в&nbsp;контейнере приложения в&nbsp;Startup.cs.</p>
<pre><code class="language-dotnet">services.AddScoped&lt;IJwtGenerator, JwtGenerator&gt;();</code></pre>
<p><br>Настроим проверку JWT&nbsp;в&nbsp;Startup.cs.</p>
<pre><code class="language-dotnet">var key&nbsp;= new&nbsp;SymmetricSecurityKey(Encoding.UTF8.GetBytes("super secret key"));
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(
        opt&nbsp;=&gt;
             {
                 opt.TokenValidationParameters = new&nbsp;TokenValidationParameters
                                                     {
                                                         ValidateIssuerSigningKey = true,
                                                         IssuerSigningKey = key,
                                                         ValidateAudience = false,
                                                         ValidateIssuer = false,
                                                     };
             });	
</code></pre>
<p><strong><br>Защита секретных ключей JWT</strong>. Сейчас значение строки указано в&nbsp; открытом виде и&nbsp;берется даже не&nbsp;из&nbsp;конфигов. Чтобы безопасно хранить секретные данные, предлагаю воспользоваться .NET user secret. Добавлю лишь, что&nbsp;итоговый файл хранит незашифрованные данные. Поэтому мы&nbsp;будем использовать его&nbsp;только во&nbsp;время разработки. Чтобы включить секретное хранилище воспользуемся командой в&nbsp;Package Manager Console.</p>
<pre><code class="language-dotnet">&gt; dotnet user-secrets init </code></pre>
<p><br>В API.csproj добавим UserSecretsId.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2332/image.png"
         alt=""
         itemprop="">


</figure>

<p><br>Теперь в&nbsp;наше секретное хранилище можем поместить значение следующей командой:</p>
<pre><code class="language-dotnet">&gt; dotnet user-secrets set&nbsp;"TokenKey" "super secret key" –p API/</code></pre>


<figure class="umb-macro-image">
    


    <img src="/Media/2327/10.png"
         alt=""
         itemprop="">


</figure>

<p><br>Чтобы просмотреть все, что&nbsp;сейчас находится в&nbsp;хранилище, воспользуемся командой:</p>
<pre><code class="language-dotnet">&gt; dotnet user-secrets list –p API/</code></pre>


<figure class="umb-macro-image">
    


    <img src="/Media/2328/11.png"
         alt=""
         itemprop="">


</figure>

<p><br>После этого мы&nbsp;можем использовать наши секретные данные следующим образом:</p>
<pre><code class="language-dotnet">var key&nbsp;= new&nbsp;SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["TokenKey"]));</code></pre>
<p><br>Теперь мы&nbsp;можем использовать JwtGenerator в&nbsp;LoginHandler:</p>
<pre><code class="language-dotnet"> return new&nbsp;User
 {
        DisplayName = user.DisplayName,
        Token = _jwtGenerator.CreateToken(user),
	      UserName = user.UserName,
	      Image = null
 };
</code></pre>
<p><br>Так мы&nbsp;связали авторизацию с&nbsp;использованием ASP.NET Core Identity и&nbsp; генерацию токена из&nbsp;JwtGenerator. Наш&nbsp;ответ при&nbsp;регистрации изменится и&nbsp;будет возвращать токен, с&nbsp;которым мы&nbsp;можем идти на&nbsp;сервер за&nbsp; данными.</p>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9102229cddd0eedd8d736088e46f823c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--23371645 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--23371645 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bae2b3fde37f4ab19dc4c1223aff857a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2390/5.png"
         alt=""
         itemprop="">


</figure>

<p> </p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6bc2b732fa9cb584e4b13477149bd6c9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--6689089 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--6689089 {
                    /* manual inline */
                    padding: 25px 15px 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/343415466b97417cb34324f884ad5686"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Проверим работу веб-приложения. Чтобы запрос выполнился успешно, в&nbsp; параметрах Headers необходимо добавить заголовок Authorization со&nbsp; значением "Bearer {токен}":</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/499d71241a6bae80bd6671733020f0bd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--59765867 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--59765867 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2afb094cea224de69517cf0bf184466c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2391/6.png"
         alt=""
         itemprop="">


</figure>

<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/2392/7.png"
         alt=""
         itemprop="">


        <figcaption>
            В&nbsp;случае, если токена не&nbsp;будет, вернется ошибка 401 Unauthorized
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/97ca5e8e520e48a99da01617b7a4ef02"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--55488544 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--55488544 {
                    /* manual inline */
                    padding: 25px 15px 50px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/37365791a86946b9b9cc1b6f27f063a5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Вот и&nbsp;всё! Мы&nbsp;создали проект и&nbsp;добавили в&nbsp;него ASP.NET Core Identity и&nbsp; JWT.</p>
<p>Преимущество JWT&nbsp;в&nbsp;его&nbsp;самодостаточности. Все&nbsp;необходимые для&nbsp;аутентификации данные хранятся в&nbsp;самом токене. JWT&nbsp;не&nbsp;обеспечивает защиту данных, но&nbsp;гарантирует их&nbsp;подлинность при&nbsp;помощи цифровой подписи.</p>
<hr>
<h3>Полезные ссылки:</h3>
<p><a rel="noopener" href="https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/" target="_blank" title="The Onion Architecture, by&nbsp;Jeffrey Palermo"><span style="font-weight: 400;">Джеффри Палермо о&nbsp;«Луковой архитектуре» (на&nbsp;англ.)</span></a></p>
<p><a rel="noopener" href="https://medium.com/@dbottiau/a-naive-introduction-to-cqrs-in-c-9d0d99cd2d54" target="_blank" title="A naive introduction to&nbsp;CQRS in&nbsp;C#, by&nbsp;David Bottiau"><span style="font-weight: 400;">A naive introduction to&nbsp;CQRS in&nbsp;C#</span></a><span style="font-weight: 400;"> </span></p>
<p><a rel="noopener" href="https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-3.1&amp;tabs=windows" target="_blank" title="Safe storage of&nbsp;app&nbsp;secrets in&nbsp;development in&nbsp;ASP.NET Core, by&nbsp;Rick Anderson, Kirk Larkin, Daniel Roth, and&nbsp;Scott Addie" data-anchor="?view=aspnetcore-3.1&amp;tabs=windows"><span style="font-weight: 400;">Safe storage of&nbsp;app&nbsp;secrets in&nbsp;development in&nbsp;ASP.NET Core</span></a></p>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Интеграция Sitecore  c Azure Active Directory B2C
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    В этой статье расскажем, как создать личный кабинет на базе Sitecore и интегрировать в него систему управления пользователями Azure AD B2C.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-integrate-sitecore-with-azure-ad-b2c/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-integrate-sitecore-with-azure-ad-b2c/</guid>

                <pubDate>Fri, 27 Sep 2024 15:30:31 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Интеграция Sitecore  c Azure Active Directory B2C</h1>
                                <figure>
                                    <img src="/Media/2749/fotis-fotopoulos-lj9ky8pih3e-unsplash-1.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/72dc2514cd998dbc8aec817b6b26ab44"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/803e384264c64048a42b412d10fed53b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В этой статье мы&nbsp;хотим поделиться нашим опытом интеграции Sitecore 9.3 с&nbsp;системой управления пользователями Azure AD&nbsp;B2C. Расскажем о&nbsp;том, как&nbsp;нам&nbsp;удалось построить на&nbsp;базе этих технологий личный кабинет, с&nbsp;какими трудностями мы&nbsp;при&nbsp;этом столкнулись и&nbsp;как&nbsp;их&nbsp;в&nbsp;итоге решили. Но&nbsp;сначала — немного вводных данных.</p>
<h2>Вводные</h2>
<p><strong>Sitecore CMS</strong> — одна из&nbsp;лидирующих систем управления контентом на&nbsp;.NET Framework. По&nbsp;данным <a rel="noopener" href="https://trends.builtwith.com/cms/Sitecore-CMS#:~:text=We%20know%20of%2017%2C494%20live,websites%20in%20the%20United%20States." target="_blank" title="Built With" data-anchor="#:~:text=We%20know%20of%2017%2C494%20live,websites%20in%20the%20United%20States.">Built With</a>, на&nbsp;Sitecore построено больше 17000 сайтов, среди которых сайты компаний Microsoft, United Airlines, PUMA, L’Oreal и&nbsp;т.д.</p>
<p>В России Sitecore не&nbsp;особо популярна из&#8209;за&nbsp;своей дороговизны. Согласно информации все&nbsp;тех&nbsp;же&nbsp;Built With, в&nbsp;русскоязычном интернете на&nbsp;этой CMS&nbsp;разработано около 60 сайтов.</p>
<p>Мы во&nbsp;fuse8 много работаем с&nbsp;зарубежными клиентами и&nbsp;диджитал-агентствами. Поэтому Sitecore — одна из&nbsp;основных CMS&nbsp;в&nbsp;нашем стеке технологий. Вместе с&nbsp;нашими партнёрами <a rel="noopener" href="https://www.unrvld.com/" target="_blank" title="Сайт UNRVLD">UNRVLD</a> (бывшие Delete Agency), мы&nbsp;разработали на&nbsp;Sitecore сайты для&nbsp;таких компаний и&nbsp;брендов, как&nbsp;<a rel="noopener" href="https://www.biffa.co.uk/" target="_blank" title="Biffa">Biffa</a>, <a rel="noopener" href="https://www.leedsbeckett.ac.uk/" target="_blank" title="Leeds Beckett University">Leeds Beckett University</a>, <a rel="noopener" href="https://www.theopen.com/" target="_blank" title="The Open">The Open</a>, <a rel="noopener" href="https://www.southamptonfc.com/" target="_blank" title="Southampton FC">Southampton FC</a>, <a rel="noopener" href="https://www.royalcanin.com/ru" target="_blank" title="Royal Canin">Royal Canin</a> и&nbsp;других.</p>
<p><strong>Azure Active Directory B2C</strong> — это&nbsp;облачная служба управления корпоративными удостоверениями пользователей. С&nbsp;её&nbsp;помощью пользователи могут войти в&nbsp;приложения, используя аккаунты социальных сетей, предприятий и&nbsp;локальных учётных записей.</p>
<h3>Задача</h3>
<p>На одном из&nbsp;проектов перед нами стояла задача создать личный кабинет для&nbsp;клиентов крупной организации. В&nbsp;этом личном кабинете пользователи должны были иметь возможность просматривать текущие операции, выставлять счета на&nbsp;оплату, общаться с&nbsp;технической поддержкой, управлять личной информацией и&nbsp;т.д. При&nbsp;этом все&nbsp;данные в&nbsp;ЛК&nbsp;должны были подтягиваться из&nbsp;корпоративной системы нашего заказчика через защищенный API. Точкой входа пользователей заказчик выбрал Azure Active Directory B2C.</p>
<p>Итак, немного декомпозируем задачу. Нам&nbsp;нужно было:</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">интегрироваться с&nbsp;защищенным API, предоставленным заказчиком;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">реализовать регистрацию пользователя; </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">реализовать вход/выход пользователя в&nbsp;ЛК&nbsp;и&nbsp;сброс пароля;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">реализовать имперсонализацию — сделать так, чтобы администраторы и&nbsp;специалисты технической службы заказчика могли попасть в&nbsp;ЛК&nbsp;пользователя, не&nbsp;зная его&nbsp;логина и&nbsp;пароля. </span></li>
</ul>
<p> </p>
<p>И в&nbsp;процессе выполнения всего этого мы&nbsp;столкнулись с&nbsp;некоторыми сложностями и&nbsp;проблемами:</p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">как реализовать поддержку нескольких пользовательских политик (входа, имперсонализации, регистрации, сброса пароля) в&nbsp;пределах одного сайта;</span></li>
<li><span style="font-weight: 400;">как организовать одновременный выход из&nbsp;Azure AD&nbsp;B2C и&nbsp;личного кабинета Sitecore;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">как при&nbsp;входе в&nbsp;ЛК&nbsp;переадресовать пользователя на&nbsp;  страницу входа Azure AD&nbsp;B2C;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">как избежать роста количества аутентификационных кук, приводящего к&nbsp;превышению допустимой длины запроса. </span></li>
</ul>
<p>В интернете полно документации, статей и&nbsp;гайдов по&nbsp;Sitecore CMS&nbsp;и&nbsp;Azure Active Directory B2C. Но&nbsp;решений именно наших проблем и&nbsp;трудностей, собранных в&nbsp;одной статье, мы&nbsp;среди них&nbsp;не&nbsp;нашли. Пришлось справляться местами самим, местами с&nbsp;помощью официальной техподдержки Sitecore. Полученной информацией мы&nbsp;и&nbsp;поделимся с&nbsp;вами ниже. Как&nbsp;говорится, мы&nbsp;через эти&nbsp;сложности уже&nbsp;прошли, так&nbsp;что&nbsp;вам&nbsp;не&nbsp;придется :)</p>

<div class="umb-macro-highlights">
    <strong></strong>
    Вот&nbsp;<a href='https://bitbucket.org/delete-ondemand/sitecore.azureb2c.demo_public/src/master/' target='_blank' title='sitecore.azureb2c.demo_public'>тут лежит исходный код&nbsp;проекта»</a>. Можете смело его&nbsp;использовать.
</div>

<h2>Создаём клиент Azure AD&nbsp;B2C</h2>
<p>Чтобы воссоздать нашу работу над&nbsp;интеграцией Sitecore с&nbsp;Azure AD&nbsp;B2C, понадобится базовый клиент Azure AD&nbsp;B2C — со&nbsp;стандартными пользовательскими потоками <em><strong>Sign up&nbsp;and&nbsp;sign in</strong></em> и&nbsp;<em><strong>Password reset</strong></em>. Чтобы создать его, воспользуйтесь <a href="https://docs.microsoft.com/ru-ru/azure/active-directory-b2c/tutorial-create-tenant" title="Руководство по&nbsp;созданию клиента Azure Active Directory B2C">официальным гайдом</a> — нужно просто повторить шаги с&nbsp;1 по&nbsp;3 и&nbsp;у&nbsp;вас&nbsp;уже&nbsp;будет рабочий клиент с&nbsp;нужными настройками пользовательских потоков.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/38f561a231414562376412558046922f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--22629118 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--22629118 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/1986e8c453e24d27b156c41a7fa4e54d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2752/1-user-flows-1-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7963b9b55f0941ddbc1be7637c0e9adb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="text-align: center;"><em>Рисунок 1 — потоки пользователей</em></p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/0c245b8094c3e0ac359e7190c8ab0350"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7234e1f2e17e4133a248c9bb4d118997"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Также нам&nbsp;необходимо выбрать утверждения <em><strong>Claims</strong></em>, которые будут возвращаться с&nbsp;ID-токеном. Помимо стандартных утверждений, вроде имени, email и&nbsp;т.д., мы&nbsp;добавим ещё&nbsp;и&nbsp;утверждение <em><strong>Roles</strong></em>. Для&nbsp;этого нажимаем на&nbsp;<em><strong>Manage user attributes → Add</strong></em>. Теперь при&nbsp;создании пользователя вы&nbsp;сможете добавить ему&nbsp;роль с&nbsp;определенным уровнем прав доступа — например, администратор, клиент или&nbsp;гость. Отметим, что&nbsp;в&nbsp;реальном приложении для&nbsp;этого пришлось бы&nbsp;настраивать индивидуальные пользовательские политики. Но&nbsp;для&nbsp;демонстрации и&nbsp;нашего метода будет достаточно.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9ec9286b0ca43cefe9bfb0926ffdc26f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--12097672 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--12097672 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/2ef4ca8815f2472290474166f42a666b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2753/2-claims.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3864719f71d14704b4b2c39dfe68b146"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="text-align: center;"><em>Рисунок 2 — утверждения Claims</em></p>
<p> </p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6bba0696407c6fa27e138019274e3787"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6e14e280589f4cf7834edb15777963ae"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Теперь при&nbsp;входе/регистрации мы&nbsp;получим ID-токен, в&nbsp;котором будут прописаны данные о&nbsp;пользователе и&nbsp;предоставленных ему&nbsp;ролях.</p>
<p> </p>
<pre><code class="language-dotnet">{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "exp": 1646850084,
  "nbf": 1646846484,
  "ver": "1.0",
  "iss": "https://azureb2cmydemo.b2clogin.com/d227dc46-1f9c-4a46-97a2-d3b83ed89a3a/v2.0/",
  "sub": "b5bb6799-77f9-43a6-b6bf-15eaff761600",
  "aud": "d1400d7d-a389-4c38-a36f-327e8e949017",
  "nonce": "defaultNonce",
  "iat": 1646846484,
  "auth_time": 1646846484,
  "oid": "b5bb6799-77f9-43a6-b6bf-15eaff761600",
  "name": "Test user",
  "country": "Russia",
  "given_name": "Dmitry",
  "family_name": "Ivanov",
  "extension_Roles": "Administrator, Developer",
  "emails": [
    "kataconov@mail.ru"
  ],
  "tfp": "B2C_1_SignUpAndSignIn1"
}.[Signature]</code></pre>
<p> </p>
<p>Последний шаг&nbsp;для&nbsp;настройки клиента Azure B2C — интеграция с&nbsp;защищенным API. Процесс настройки подробно описан <a rel="noopener" href="https://docs.microsoft.com/ru-ru/azure/active-directory-b2c/configure-authentication-sample-web-app-with-api?tabs=visual-studio#step-2-register-web-applications" target="_blank" title="Шаг 2. Регистрация веб-приложения">в шаге 2 руководства</a>.</p>
<p>В итоге наше веб-приложение должно получить доступ к&nbsp;защищённому API, который затем будет использоваться при&nbsp;получении Access- и&nbsp;Refresh-токенов.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9d9800a58c56337fed9d4c2f6af42801"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--10760384 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--10760384 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/5591c4f461494eddb3d3cb0eb7773c0f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2757/3-api-permissions.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2729461348814ee491a57171d592aee1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="text-align: center;"><em>Рисунок 3 — API&nbsp;permissions</em></p>
<p> </p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d36a09823f8809d0ec79a19a470ef0cd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bd850b4b0bd64baa9edfed7de20bd91d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Интегрируемся с&nbsp;Sitecore</h2>
<p>Согласно <a rel="noopener" href="https://doc.sitecore.com/xp/en/developers/93/sitecore-experience-manager/configure-federated-authentication.html" target="_blank" title="Configure federated authentication">официальной документации</a>, федеративная аутентификация требует настройки Sitecore определенным образом. Дополнительно к&nbsp;этому, с&nbsp;учётом специфики нашей задачи, мы&nbsp;еще&nbsp;разберёмся, как&nbsp;нам&nbsp;организовать конвейер для&nbsp;сброса пароля и&nbsp;реализовать получение Access- и&nbsp;Refresh-токенов.</p>
<p>Итак, вот, что&nbsp;нам&nbsp;предстоит реализовать:</p>
<ul>
<li><span style="font-weight: 400;">конфигурацию поставщика удостоверений (Identity Provider); </span></li>
<li><span style="font-weight: 400;">получение Access- и&nbsp;Refresh-токенов;</span></li>
<li><span style="font-weight: 400;">преобразование утверждений (Claims) и&nbsp;свойств профиля пользователя (Properties);</span></li>
<li><span style="font-weight: 400;">создание виртуального пользователя;</span></li>
<li><span style="font-weight: 400;">генерацию URL&nbsp;для&nbsp;доступа в&nbsp;Azure B2C;</span></li>
<li><span style="font-weight: 400;">дополнительный конвейер для&nbsp;сброса пароля.</span></li>
</ul>
<p>Помимо этого, стоит уделить внимание кукам, процессу выхода из&nbsp;системы и&nbsp;окончанию сессии.</p>

<div class="umb-macro-highlights">
    <strong>Парочка важных выводов, которые мы&nbsp;сделали в&nbsp;процессе настройки Sitecore и&nbsp;его&nbsp;интеграции с&nbsp;Azure AD&nbsp;B2C:</strong>
    <p></p>
<p>Все взаимодействие с&nbsp;Azure AD&nbsp;B2C должно происходить через Identity Provider и&nbsp;генерацию ссылки через конвейер (pipeline) Sitecore. Даже если кажется, что&nbsp;у&nbsp;нас&nbsp;есть всё&nbsp;необходимое для&nbsp;прямого запроса. Таким образом мы&nbsp;задействуем Sitecore Identity Server, где&nbsp;генерируется объект State, и&nbsp;все&nbsp;внутренние процессы работают так, как&nbsp;должны. </p>
<p>Чтобы поддерживать сразу несколько пользовательских потоков, нужно создать отдельный провайдер под&nbsp;каждый пользовательский поток или&nbsp;пользовательскую политику. К&nbsp;этому мы&nbsp;пришли после обсуждения этого вопроса с&nbsp;официальной поддержкой Sitecore. </p>
</div>

<p>А теперь — к&nbsp;настройке!</p>
<h3>Конфигурация Identity provider</h3>
<p>Чтобы сконфигурировать поставщика удостоверений (Identity Provider), нам&nbsp;нужно:</p>
<ul>
<li><span style="font-weight: 400;">создать конвейер, наследуемый от&nbsp;</span><strong><em>IdentityProvidersProcessor</em></strong><span style="font-weight: 400;">;</span></li>
<li><span style="font-weight: 400;">переопределить метод <em><strong>ProcessCore</strong></em>;</span></li>
<li><span style="font-weight: 400;">переопределить <strong><em>IdentityProviderName</em></strong>;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">зарегистрировать конвейер в&nbsp;конфигурации Sitecore.</span></li>
</ul>
<p>Ниже приведен код&nbsp;класса, реализующего конвейер, предназначенный для&nbsp;регистрации и&nbsp;входа (аутентификации) пользователей:</p>
<p> </p>
<pre><code class="language-dotnet">namespace SitecoreAzureB2CDemo.Pipelines
{
   public class SignUpAndSignInPipeline : IdentityProvidersProcessor
   {
       private readonly string _tenant = "azureb2cmydemo.onmicrosoft.com";
       private readonly string _aadInstance;
       private readonly string _metaAddress;
       private readonly string _redirectUri = "https://sitecoreazureb2cdemosc.dev.local/azureb2c";
       private readonly string _postLogoutRedirectUri = "https://sitecoreazureb2cdemosc.dev.local/azureb2c";
       private readonly string _clientId = "d1400d7d-a389-4c38-a36f-327e8e949017";
       private readonly string _clientSecret = "aF67Q~rO4IoyoisargoDvtSkq2K4RF-u5Jyut";
       private readonly string _scope = "https://azureb2cmydemo.onmicrosoft.com/tasks-api/tasks.read";
       protected override string IdentityProviderName =&gt; IdentityProviderNames.SignUpAndSignIn;
       protected virtual string Policy =&gt; "B2C_1_SignUpAndSignIn1";
       private readonly HttpClient _client = new&nbsp;HttpClient();
      
       private IdentityProvider IdentityProvider =&gt; GetIdentityProvider();

       public SignUpAndSignInPipeline(FederatedAuthenticationConfiguration federatedAuthenticationConfiguration,
           ICookieManager cookieManager, BaseSettings settings) : base(federatedAuthenticationConfiguration,
           cookieManager, settings)
       {
           var&nbsp;aadInstanceTemplate = "https://azureb2cmydemo.b2clogin.com/{0}/{1}";
           _aadInstance = string.Format(aadInstanceTemplate, _tenant, Policy);
           _metaAddress = $"{_aadInstance}/v2.0/.well-known/openid-configuration";
       }

       protected override void ProcessCore(IdentityProvidersArgs args)
       {
           Assert.ArgumentNotNull(args, nameof(args));

           var&nbsp;authenticationType = GetAuthenticationType();
           var&nbsp;options = new&nbsp;OpenIdConnectAuthenticationOptions(authenticationType)
           {
               Caption = IdentityProvider.Caption,
               AuthenticationMode = AuthenticationMode.Passive,
               RedirectUri = _redirectUri,
               PostLogoutRedirectUri = _postLogoutRedirectUri,
               ClientId = _clientId,
               Authority = _aadInstance,
               MetadataAddress = _metaAddress,
               UseTokenLifetime = true,
               TokenValidationParameters = new&nbsp;TokenValidationParameters { NameClaimType = Claims.Name },
               CookieManager = CookieManager,
               Notifications = new&nbsp;OpenIdConnectAuthenticationNotifications
               {
                   RedirectToIdentityProvider = OnRedirectToIdentityProvider,
                   SecurityTokenValidated = OnSecurityTokenValidated,
               }
           };

           args.App.UseOpenIdConnectAuthentication(options);
       }

       private async Task OnSecurityTokenValidated(
           SecurityTokenValidatedNotification&lt;OpenIdConnectMessage, OpenIdConnectAuthenticationOptions&gt; arg)
       {
           var&nbsp;identity = arg.AuthenticationTicket.Identity;

           identity.AddClaim(new Claim(Claims.IdToken, arg.ProtocolMessage.IdToken));

           //apply Sitecore claims tranformations
           arg.AuthenticationTicket.Identity.ApplyClaimsTransformations(
               new&nbsp;TransformationContext(FederatedAuthenticationConfiguration, IdentityProvider));
           arg.AuthenticationTicket = new&nbsp;AuthenticationTicket(identity, arg.AuthenticationTicket.Properties);
       }

       private Task OnRedirectToIdentityProvider(
           RedirectToIdentityProviderNotification&lt;OpenIdConnectMessage, OpenIdConnectAuthenticationOptions&gt; arg)
       {
           var&nbsp;owinContext = arg.OwinContext;
           var&nbsp;protocolMessage = arg.ProtocolMessage;

           if&nbsp;(protocolMessage.RequestType == OpenIdConnectRequestType.Authentication)
           {
               protocolMessage.Prompt = "login";
           }
           else if&nbsp;(protocolMessage.RequestType == OpenIdConnectRequestType.Logout)
           {
               protocolMessage.PostLogoutRedirectUri = BuildPostLogoutRedirectUri(owinContext);
           }
          
           return Task.CompletedTask;
       }
  }
}</code></pre>
<p> </p>
<p> </p>
<p>Теперь, чтобы зарегистрировать наш&nbsp;конвейер в&nbsp;конфигурации Sitecore, мы&nbsp;должны сделать следующее:</p>
<ul>
<li><span style="font-weight: 400;">создать новую секцию identityProvider под&nbsp;/sitecore/federatedAuthentication/identityProviders;</span></li>
<li><span style="font-weight: 400;">создать новую секцию mapEntry под&nbsp;configuration/sitecore/federatedAuthentication/identityProvidersPerSites.</span></li>
</ul>
<p>Итоговый patch-file Sitecore конфигурации выглядит следующим образом:</p>
<p> </p>
<pre><code class="language-xml">
&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/"
              xmlns:role="http://www.sitecore.net/xmlconfig/role/"&gt;
   &lt;sitecore&gt;

       &lt;pipelines&gt;
           &lt;owin.identityProviders&gt;
               &lt;processor type="SitecoreAzureB2CDemo.Pipelines.SignUpAndSignInPipeline, SitecoreAzureB2CDemo" resolve="true" /&gt;
           &lt;/owin.identityProviders&gt;
       &lt;/pipelines&gt;

       &lt;federatedAuthentication type="Sitecore.Owin.Authentication.Configuration.FederatedAuthenticationConfiguration, Sitecore.Owin.Authentication"&gt;

           &lt;identityProvidersPerSites hint="list:AddIdentityProvidersPerSites"&gt;
               &lt;mapEntry name="Azure AD&nbsp;B2C for&nbsp;website" type="Sitecore.Owin.Authentication.Collections.IdentityProvidersPerSitesMapEntry, Sitecore.Owin.Authentication" resolve="true"&gt;
                   &lt;sites hint="list"&gt;
                       &lt;site&gt;website&lt;/site&gt;
                   &lt;/sites&gt;
                   &lt;identityProviders hint="list:AddIdentityProvider"&gt;
                       &lt;identityProvider ref="federatedAuthentication/identityProviders/identityProvider[@id='SignUpAndSignIn']" /&gt;
                   &lt;/identityProviders&gt;
                   &lt;externalUserBuilder type="SitecoreAzureB2CDemo.Helpers.ExternalDomainUserBuilder, SitecoreAzureB2CDemo" resolve="true"&gt;
                       &lt;IsPersistentUser&gt;false&lt;/IsPersistentUser&gt;
                   &lt;/externalUserBuilder&gt;
               &lt;/mapEntry&gt;
           &lt;/identityProvidersPerSites&gt;

           &lt;identityProviders hint="list:AddIdentityProvider"&gt;
               &lt;identityProvider id="SignUpAndSignIn" type="Sitecore.Owin.Authentication.Configuration.DefaultIdentityProvider, Sitecore.Owin.Authentication"&gt;
                   &lt;param desc="name"&gt;SignUpAndSignIn&lt;/param&gt;
                   &lt;param desc="domainManager" type="Sitecore.Abstractions.BaseDomainManager" resolve="true" /&gt;
                   &lt;caption&gt;SignUpAndSignIn&lt;/caption&gt;
                   &lt;domain&gt;extranet&lt;/domain&gt;
                   &lt;enabled&gt;true&lt;/enabled&gt;
                   &lt;triggerExternalSignOut&gt;true&lt;/triggerExternalSignOut&gt;
                   &lt;transformations hint="list:AddTransformation"&gt;
                   &lt;/transformations&gt;
               &lt;/identityProvider&gt;
           &lt;/identityProviders&gt;

       &lt;/federatedAuthentication&gt;

   &lt;/sitecore&gt;

&lt;/configuration&gt;

</code></pre>
<p> </p>
<p>Параметры конфигурации Azure B2C поместим в&nbsp;секцию appSettings в&nbsp;файле Web.config:</p>
<p> </p>
<pre><code class="language-dotnet">
  &lt;appSettings configBuilders="SitecoreAppSettingsBuilder"&gt;
   &lt;add key="AzureB2C.Tenant" value="azureb2cmydemo.onmicrosoft.com"/&gt;
   &lt;add key="AzureB2C.SignUpAndSignInPolicy" value="B2C_1_SignUpAndSignIn1"/&gt;
   &lt;add key="AzureB2C.PasswordResetPolicy" value="B2C_1_PasswordReset1"/&gt;
   &lt;add key="AzureB2C.ProfileEditingPolicy" value="B2C_1_ProfileEditing1"/&gt;
   &lt;add key="AzureB2C.ClientId" value="xxx"/&gt;
   &lt;add key="AzureB2C.ClientSecret" value="xxx"/&gt;
   &lt;add key="AzureB2C.RedirectUri" value="https://sitecoreazureb2cdemosc.dev.local/azureb2c"/&gt;
   &lt;add key="AzureB2C.PostLogoutRedirectUri" value="https://sitecoreazureb2cdemosc.dev.local/azureb2c"/&gt;
   &lt;add key="AzureB2C.AzureADInstance" value="https://azureb2cmydemo.b2clogin.com/{0}/{1}"/&gt;
   &lt;add key="AzureB2C.AccessTokenUri" value="https://azureb2cmydemo.b2clogin.com/azureb2cmydemo.onmicrosoft.com/{0}/oauth2/v2.0/token"/&gt;
   &lt;add key="AzureB2C.Scope" value="https://azureb2cmydemo.onmicrosoft.com/tasks-api/tasks.read" /&gt;
 &lt;/appSettings&gt;</code></pre>
<p> </p>
<p>На что&nbsp;ещё&nbsp;стоит обратить внимание: <em><strong>OnRedirectToIdentityProvider</strong></em></p>
<ul>
<li><em><strong>OnRedirectToIdentityProvider<span style="font-weight: 400;"> — </span></strong></em><strong><span style="font-weight: 400;">необходимо сгенерировать ссылку PostLogoutRedirectUri во&nbsp;избежание бесконечного редиректа при&nbsp;завершении сеанса.</span></strong></li>
<li><strong><span style="font-weight: 400;"><em><strong>OnSecurityTokenValidated</strong></em> — здесь мы&nbsp;можем добавить дополнительную информацию в&nbsp;утверждения (Claims), например, ID-токен. Позднее мы&nbsp;получим и&nbsp;добавим в&nbsp;утверждения Access- и&nbsp;Refresh-токены.</span></strong></li>
<li><strong><span style="font-weight: 400;">Вызов метода <em><strong>ApplyClaimsTransformations</strong></em> необходим, даже если не&nbsp;определено ни&nbsp;одной трансформации утверждений в&nbsp;конфигурации — без&nbsp;него мы&nbsp;получали бы&nbsp;exception “Ids claim is&nbsp;missing”.</span></strong></li>
<li><strong><span style="font-weight: 400;">Важно получать CookieManager через DI&nbsp;и&nbsp;явно передавать его&nbsp;в&nbsp;<em><strong>OpenIdConnectAuthenticationOptions</strong></em>. Это&nbsp;один из&nbsp;шагов для&nbsp;решения проблем с&nbsp;куками — когда рост количества кук&nbsp;приводит к&nbsp;превышению максимально допустимого размера запроса и&nbsp;приводит к&nbsp;ошибке и&nbsp;некорректной работе с&nbsp;SameSite cookies. Вот&nbsp;тут&nbsp;  — <a rel="noopener" href="https://support.sitecore.com/kb?id=kb_article_view&amp;sysparm_article=KB0901497" target="_blank" title="SameSite support" data-anchor="?id=kb_article_view&amp;sysparm_article=KB0901497">хотфикс с&nbsp;пошаговым решением этой проблемы</a>.</span></strong></li>
</ul>
<h3>Получение Access- и&nbsp;Refresh-токенов</h3>
<p>Итак, вся&nbsp;информация, предоставляемая пользователю в&nbsp;личном кабинете, подтягивается из&nbsp;защищенного API&nbsp;на&nbsp;стороне клиента. Чтобы связаться с&nbsp;этим API, нам&nbsp;нужны Access- и&nbsp;Refresh-токены.</p>
<p>Получение токенов для&nbsp;доступа к&nbsp;защищенному API&nbsp;мы&nbsp;реализуем в&nbsp;обработчике события об&nbsp;успешной валидации токена безопасности, полученного от&nbsp;Azure B2C (<em><strong>OnSecurityTokenValidated</strong></em>). Далее нам&nbsp;нужно сохранить полученные токены в&nbsp;утверждения (Claims) и, таким образом, сделать их&nbsp;доступными в&nbsp;любом месте проекта.</p>
<p>Сейчас для&nbsp;большей наглядности мы&nbsp;использовали обычный API&nbsp;запрос без&nbsp;применения сторонних библиотек. В&nbsp;реальном проекте нужно будет создать сервис для&nbsp;отслеживания времени жизни токена и&nbsp;его&nbsp;обновления по&nbsp;мере необходимости. Или&nbsp;же&nbsp;воспользоваться сторонней библиотекой, в&nbsp;которой реализована валидация и&nbsp;обновление токена.</p>

<div class="umb-macro-highlights">
    <strong></strong>
    Подробно процесс получения токенов расписан в&nbsp;<a href='https://docs.microsoft.com/ru-ru/azure/active-directory-b2c/access-tokens' target='_blank' title='Запрос маркера доступа в&nbsp;Azure Active Directory B2C'>в разделе «Запрос маркера доступа в&nbsp;Azure Active Directory B2C»</a>
 официальной документации Microsoft.
</div>

<p> </p>
<pre><code class="language-dotnet">private async Task OnSecurityTokenValidated(
   SecurityTokenValidatedNotification&lt;OpenIdConnectMessage, OpenIdConnectAuthenticationOptions&gt; arg)
{
   var&nbsp;identity = arg.AuthenticationTicket.Identity;

   var&nbsp;result = await GetToken(arg.ProtocolMessage.Code);

   identity.AddClaim(new Claim(Claims.IdToken, arg.ProtocolMessage.IdToken));
   identity.AddClaim(new Claim(Claims.AccessToken, result.AccessToken));
   identity.AddClaim(new Claim(Claims.RefreshToken, result.RefreshToken));

   //apply Sitecore claims tranformations
   arg.AuthenticationTicket.Identity.ApplyClaimsTransformations(
       new&nbsp;TransformationContext(FederatedAuthenticationConfiguration, IdentityProvider));
   arg.AuthenticationTicket = new&nbsp;AuthenticationTicket(identity, arg.AuthenticationTicket.Properties);
}

private async Task GetToken(string code)
{
   var&nbsp;getTokenUrl = string.Format(AzureB2CConfiguration.AccessTokenUri, Policy);
  
   var&nbsp;dict = new&nbsp;Dictionary&lt;string, string&gt;
   {
       { "grant_type", "authorization_code" },
       { "client_id", _clientId },
       { "client_secret", _clientSecret },
       { "scope",  $"{_scope}  offline_access" },
       { "code",  code },
       { "redirect_uri",  AzureB2CConfiguration.RedirectUri},
   };
   var&nbsp;requestBody = new&nbsp;FormUrlEncodedContent(dict);
   var&nbsp;response = await _client.PostAsync(getTokenUrl, requestBody);
   response.EnsureSuccessStatusCode();           
  
   var&nbsp; responseBody = await response.Content.ReadAsStringAsync();
   var&nbsp;responseDto = JsonConvert.DeserializeObject(responseBody);
   return responseDto;
}</code></pre>
<p> </p>
<h3>Преобразование утверждений (Claims) и&nbsp;свойств профиля пользователя (Properties)</h3>
<p>Для различных сценариев работы нам&nbsp;может понадобиться преобразование (маппинг) одних утверждений в&nbsp;другие или&nbsp;в&nbsp;свойства пользователя Sitecore. У&nbsp;Sitecore для&nbsp;этого есть готовый механизм. Подробнее о&nbsp;нём&nbsp;— в&nbsp;разделе <a rel="noopener" href="https://doc.sitecore.com/xp/en/developers/92/sitecore-experience-manager/configure-federated-authentication.html#map-claims-and-roles" target="_blank" title="Configure federated authentication" data-anchor="#map-claims-and-roles">Configure federated authentication</a> официальной документации.</p>
<p>Преобразования можно настроить двумя способами:</p>
<p> </p>
<ul>
<li><span style="font-weight: 400;">на уровне конкретного провайдера: секция </span><em><strong>identityProvider → transformations</strong></em><span style="font-weight: 400;"> —  будет применяться только к&nbsp;одному identity-провайдеру;</span></li>
<li><span style="font-weight: 400;">на уровне секции <em><strong>identityProviders → sharedTransformations</strong></em> — будет применяться ко&nbsp;всем identity-провайдерам, зарегистрированным в&nbsp;конфигурации приложения.</span></li>
</ul>
<p>Таким образом можно единожды определить общие для&nbsp;всех провайдеров трансформации в&nbsp;одной секции <em><strong>sharedTransformations</strong></em>, а&nbsp;специфические — определить для&nbsp;конкретных провайдеров, если это&nbsp;понадобится.</p>
<p>Рассмотрим несколько примеров:</p>
<p><strong>Преобразование утверждения <em>“Emails” в&nbsp;“Email”</em>. “Emails”</strong> — это&nbsp;стандартное утверждение, которое Sitecore понимает и&nbsp;автоматически сопоставляет с&nbsp;соответствующим свойством пользователя. Чтобы преобразовать его&nbsp;в&nbsp;“Email”, добавим трансформацию в&nbsp;<em><strong>identityProviders → sharedTransformations</strong></em>:</p>
<p> </p>
<pre><code class="language-dotnet">&lt;sharedTransformations&gt;
   &lt;transformation type="Sitecore.Owin.Authentication.Services.DefaultTransformation, Sitecore.Owin.Authentication"&gt;
       &lt;sources hint="raw:AddSource"&gt;
           &lt;claim name="emails" /&gt;
       &lt;/sources&gt;
       &lt;targets hint="raw:AddTarget"&gt;
           &lt;claim name="email" /&gt;
       &lt;/targets&gt;
       &lt;keepSource&gt;false&lt;/keepSource&gt;
   &lt;/transformation&gt;
&lt;/sharedTransformations&gt;</code></pre>
<p> </p>
<p><strong>Преобразования утверждения <em>“Roles”</em> в&nbsp;отдельные роли пользователя.</strong> Тут&nbsp;потребуется более сложный маппинг. Сопоставление утверждений с&nbsp;ролями позволяет системе авторизовать пользователя на&nbsp;основе ролей и&nbsp;управлять правами доступа. Мы&nbsp;также добавили его&nbsp;в&nbsp;<em><strong>sharedTransformations</strong></em>:</p>
<p> </p>
<pre><code class="language-dotnet">&lt;sharedTransformations&gt;
   &lt;transformation name="map roles from Sitecore"
                   type="SitecoreAzureB2CDemo.Transformations.ClaimsToRolesTransformation, SitecoreAzureB2CDemo"
                   patch:after="transformation[@type='Sitecore.Owin.Authentication.IdentityServer.Transformations.ApplyAdditionalClaims, Sitecore.Owin.Authentication.IdentityServer']"
                   resolve="true" /&gt;
&lt;/sharedTransformations&gt;</code></pre>
<p> </p>
<p>Для этого мы&nbsp;создали класс, наследуемый от&nbsp;класса Transformation, и&nbsp;реализовали в&nbsp;нём&nbsp;требуемую логику:</p>
<p> </p>
<pre><code class="language-dotnet">public class ClaimsToRolesTransformation : Transformation
{
   public override void Transform(ClaimsIdentity identity, TransformationContext context)
   {
       var&nbsp;claimValue = identity.Claims.GetClaimValue(Claims.Permissions);
      
       if&nbsp;(string.IsNullOrEmpty(claimValue))
       {
           return;
       }

       var&nbsp;userPermissions = claimValue.Split(',');
       foreach (var&nbsp;userPermission in&nbsp;userPermissions)
       {
           identity.AddClaim(new Claim(Claims.Role, userPermission));
       }
   }
}</code></pre>
<p> </p>
<p>А вот, как&nbsp;реализовать маппинг утверждений в&nbsp;свойства профиля, которые сохраняются в&nbsp;профиле пользователя:</p>
<p> </p>
<pre><code class="language-dotnet">&lt;propertyInitializer
   type="Sitecore.Owin.Authentication.Services.PropertyInitializer, Sitecore.Owin.Authentication"&gt;
   &lt;maps hint="list"&gt;
       &lt;map name="emailClaim"
            type="Sitecore.Owin.Authentication.Services.DefaultClaimToPropertyMapper, Sitecore.Owin.Authentication"
            resolve="true"&gt;
           &lt;data hint="raw:AddData"&gt;
               &lt;source name="email" /&gt;
               &lt;target name="Email" /&gt;
           &lt;/data&gt;
       &lt;/map&gt;
&lt;/propertyInitializer&gt;</code></pre>
<h3>Создание виртуального пользователя</h3>
<p>При работе федеративной аутентификацией нам&nbsp;нужно решить, будем ли&nbsp;мы&nbsp;использовать виртуального пользователя на&nbsp;время жизни сессии или&nbsp;же&nbsp;создадим постоянного (persisted). Поскольку в&nbsp;нашей системе управление пользователями полностью вынесено в&nbsp;систему клиента, мы&nbsp;решили остановиться на&nbsp;варианте с&nbsp;виртуальным пользователем.</p>
<p>Для начала давайте создадим класс, наследуемый от&nbsp;<em><strong>DefaultExternalUserBuilder</strong></em>. Одной из&nbsp;основных его&nbsp;задач будет генерация имени пользователя.</p>
<p> </p>
<pre><code class="language-dotnet">public class ExternalDomainUserBuilder : DefaultExternalUserBuilder
   {
       public ExternalDomainUserBuilder(ApplicationUserFactory applicationUserFactory, IHashEncryption hashEncryption)
           : base(applicationUserFactory, hashEncryption)
       {
       }

       public override ApplicationUser BuildUser(UserManager userManager,
           ExternalLoginInfo externalLoginInfo)
       {
           var&nbsp;appUser = base.BuildUser(userManager, externalLoginInfo);

           appUser.InnerUser.Profile.Save();

           return appUser;
       }

       private static void MapClaimToCustomProperty(ExternalLoginInfo source, ApplicationUser target, string claim, string propertyName)
       {
           var&nbsp;property = source.GetClaimValue(claim);

           if&nbsp;(!string.IsNullOrEmpty(property))
           {
               target.InnerUser.Profile.SetCustomProperty(propertyName, property);
           }
       }

       protected override string CreateUniqueUserName(UserManager userManager,
           ExternalLoginInfo externalLoginInfo)
       {
           if&nbsp;(userManager == null)
           {
               throw new&nbsp;ArgumentNullException(nameof(userManager));
           }

           if&nbsp;(externalLoginInfo == null)
           {
               throw new&nbsp;ArgumentNullException(nameof(externalLoginInfo));
           }

           var&nbsp;identityProvider =
               this.FederatedAuthenticationConfiguration.GetIdentityProvider(externalLoginInfo.ExternalIdentity);

           if&nbsp;(identityProvider == null)
           {
               throw new&nbsp;InvalidOperationException("Unable to&nbsp;retrieve identity provider for&nbsp;given identity");
           }

           var&nbsp;domain = identityProvider.Domain;

           var&nbsp;name = externalLoginInfo.GetClaimValue(Claims.Email);

           if&nbsp;(string.IsNullOrEmpty(name))
           {
               return GetDomainUserName(domain, externalLoginInfo.DefaultUserName);
           }

           return GetDomainUserName(domain, name.Replace(",", ""));
       }

       private string GetDomainUserName(string domain, string userName)
       {
           Sitecore.Diagnostics.Log.Info("Azure login user " + userName, this);
           return $"{domain}\\{userName}";
       }
   }</code></pre>
<p> </p>
<p>Затем нам&nbsp;нужно зарегистрировать этот класс в&nbsp;конфигурации Sitecore. Для&nbsp;этого добавим секцию <em><strong>externalUserBuilder</strong></em> в&nbsp;<em><strong>federatedAuthentication → identityProvidersPerSites → mapEntry</strong></em>. При&nbsp;этом свойство IsPersistentUser для&nbsp;виртуальных пользователей должно быть выставлено в&nbsp;false.</p>
<p> </p>
<pre><code class="language-dotnet">&lt;externalUserBuilder
   type="SitecoreAzureB2CDemo.Helpers.ExternalDomainUserBuilder, SitecoreAzureB2CDemo" resolve="true"&gt;
   &lt;IsPersistentUser&gt;false&lt;/IsPersistentUser&gt;
&lt;/externalUserBuilder&gt;</code></pre>
<h3>Генерация URL&nbsp;для&nbsp;доступа в&nbsp;Azure B2C</h3>
<p>Настроив один или&nbsp;более внешних identity provider-ов, мы&nbsp;сможем генерировать ссылки для&nbsp;доступа к&nbsp;ним&nbsp;путем вызова конвейера Sitecore GetSignInUrlInfo. Конвейер вернет коллекцию ссылок для&nbsp;входа — по&nbsp;одной на&nbsp;каждый identity provider. Нам&nbsp;нужно будет выбрать нужную ссылку по&nbsp;имени провайдера.</p>
<p> </p>
<pre><code class="language-dotnet">private string GetSignInUrl(string identityProviderName, string returnUrl)
{
   if&nbsp;(string.IsNullOrEmpty(identityProviderName))
   {
       throw new&nbsp;ArgumentNullException(nameof(identityProviderName));
   }

   var&nbsp;pipelineManager = (BaseCorePipelineManager)ServiceLocator.ServiceProvider.GetService(typeof(BaseCorePipelineManager));
   var&nbsp;args = new&nbsp;Sitecore.Pipelines.GetSignInUrlInfo.GetSignInUrlInfoArgs(Sitecore.Context.Site.Name, returnUrl);
   Sitecore.Pipelines.GetSignInUrlInfo.GetSignInUrlInfoPipeline.Run(pipelineManager, args);

   var&nbsp;url&nbsp;= args.Result.FirstOrDefault(x =&gt; x.IdentityProvider == identityProviderName);

   return url?.Href;
}</code></pre>
<p> </p>
<p>Тут важно понимать, что&nbsp;ссылка будет вести не&nbsp;на&nbsp;Azure AD&nbsp;B2C, а&nbsp;на&nbsp;Sitecore Identity Server:</p>

<div class="umb-macro-highlights">
    <strong></strong>
    <i>/identity/externallogin?authenticationType=SignUpAndSignIn&ReturnUrl=%2fidentity%2fexternallogincallback%3fReturnUrl%3d%252fazureb2c%26sc_site%3dwebsite%26authenticationSource%3dDefault&sc_site=website</i>
</div>

<p>Чтобы вызвать identity-сервер, нужно отправить POST-запрос. XHR-запрос в&nbsp;этом случае не&nbsp;подойдет, поскольку в&nbsp;ответ мы&nbsp;ожидаем получить редирект с&nbsp;кодом 302, ведущий на&nbsp;Azure AD&nbsp;B2C.</p>
<p>Тут нам&nbsp;поможет форма с&nbsp;автоматической отправкой:</p>
<p> </p>
<pre><code class="language-dotnet">&lt;html&gt;
&lt;body onload='sessionStorage.clear(); document.forms[""form""].submit()'&gt;
&lt;form name='form' action='@Model.SignInUrl' method='post'&gt;
   &lt;input type="submit" value="Login"&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p> </p>
<p>Из кода выше видно, что&nbsp;форма содержит кусочек JavaScript, который будет выполнен браузером автоматически по&nbsp;завершении загрузки HTML.</p>
<p>Теперь identity-сервер перенаправит нас&nbsp;на&nbsp;Azure AD&nbsp;B2C, добавив параметры, необходимые для&nbsp;внутренней работы:</p>

<div class="umb-macro-highlights">
    <strong></strong>
    <i>https://azureb2cmydemo.b2clogin.com/azureb2cmydemo.onmicrosoft.com/b2c_1_signupandsignin1/oauth2/v2.0/authorize?client_id=d1400d7d-a389-4c38-a36f-327e8e949017&redirect_uri=https%3A%2F%2Fsitecoreazureb2cdemosc.dev.local%2Fazureb2c&response_type=code%20id_token&scope=openid%20profile&state=OpenIdConnect.AuthenticationProperties%3Dhwe7m0qKgXQKiMza5ViYcrjAehjrhE-vO2CklGHCDJ4_N2iEbt5leLP0oRG2Y1LujmtZsgHeZ1zzoIHebutJdAUxXr0ZZ9BuQaSLycs-2Eb_nsN2BkVV_qDDJHtJJZsBqbc6v6R1cAeC-WLBJr84nRGrqhTt1BGbAwNPPPv4JfHkUl8d9PjQZf_oXMZHPnGfSLt0J0h1bYYkvpM2k6hk725wnByHDQmWYzlnaCzdzaV_iPisnPuennulGPllC5Vd2OQ4JogZ6M_A_I2uWj5y351rOxv0tmqiRbQpOnUkfAX1JUtnAFxoYAqlS2ij84TeMstnD3MFGpTmAppwFgatiw&response_mode=form_post&nonce=637825709211329023.ZDA2Y2E4MTgtNjdkMi00YTFmLWEyNDYtMzU1OWUyMzMzYzkzODNjODcyZWQtMWFiOS00MmE3LTk3N2EtNGU0NzhhMmE1OGI0&prompt=login&x-client-SKU=ID_NET461&x-client-ver=5.3.0.0</i>
</div>

<h3>Дополнительный конвейер для&nbsp;сброса пароля</h3>
<p>Напомним, ранее представители техподдержки Sitecore рекомендовали нам&nbsp;использовать отдельные классы Identity Provider для&nbsp;каждого потока/политики Azure B2C. Поэтому для&nbsp;сброса пароля нам&nbsp;понадобится дополнительный Identity Provider.</p>
<p>Создадим новый конвейер, наследуемый от&nbsp;<em><strong>SignUpAndSignInPipeline</strong></em>:</p>
<p> </p>
<pre><code class="language-dotnet">public class PasswordResetPipeline : SignUpAndSignInPipeline
{
   public PasswordResetPipeline(FederatedAuthenticationConfiguration federatedAuthenticationConfiguration,
       ICookieManager cookieManager, BaseSettings settings) : base(federatedAuthenticationConfiguration,
       cookieManager, settings)
   {
   }
  
   protected override string IdentityProviderName =&gt; IdentityProviderNames.PasswordReset;
   protected override string Policy =&gt; "B2C_1_PasswordReset1";
}</code></pre>
<p> </p>
<p>И зарегистрируем его&nbsp;в&nbsp;конфигурации, как&nbsp;было показано ранее в&nbsp;разделе «Конфигурация Identity provider» для&nbsp;<em><strong>SignUpAndSignInPipeline</strong></em>.</p>
<p> </p>
<pre><code class="language-dotnet">&lt;pipelines&gt;
   &lt;owin.identityProviders&gt;
       &lt;processor type="SitecoreAzureB2CDemo.Pipelines.SignUpAndSignInPipeline, SitecoreAzureB2CDemo" resolve="true" /&gt;
       &lt;processor type="SitecoreAzureB2CDemo.Pipelines.PasswordResetPipeline, SitecoreAzureB2CDemo" resolve="true" /&gt;
   &lt;/owin.identityProviders&gt;
&lt;/pipelines&gt;

&lt;federatedAuthentication
   type="Sitecore.Owin.Authentication.Configuration.FederatedAuthenticationConfiguration, Sitecore.Owin.Authentication"&gt;

   &lt;identityProvidersPerSites hint="list:AddIdentityProvidersPerSites"&gt;
       &lt;mapEntry name="Azure AD&nbsp;B2C for&nbsp;website"
                 type="Sitecore.Owin.Authentication.Collections.IdentityProvidersPerSitesMapEntry, Sitecore.Owin.Authentication" resolve="true"&gt;
           &lt;sites hint="list"&gt;
               &lt;site&gt;website&lt;/site&gt;
           &lt;/sites&gt;
           &lt;identityProviders hint="list:AddIdentityProvider"&gt;
               &lt;identityProvider ref="federatedAuthentication/identityProviders/identityProvider[@id='SignUpAndSignIn']" /&gt;
               &lt;identityProvider ref="federatedAuthentication/identityProviders/identityProvider[@id='PasswordReset']" /&gt;
           &lt;/identityProviders&gt;
           &lt;externalUserBuilder
               type="SitecoreAzureB2CDemo.Helpers.ExternalDomainUserBuilder, SitecoreAzureB2CDemo" resolve="true"&gt;
               &lt;IsPersistentUser&gt;false&lt;/IsPersistentUser&gt;
           &lt;/externalUserBuilder&gt;
       &lt;/mapEntry&gt;
   &lt;/identityProvidersPerSites&gt;

   &lt;identityProviders hint="list:AddIdentityProvider"&gt;
       &lt;identityProvider id="SignUpAndSignIn" type="Sitecore.Owin.Authentication.Configuration.DefaultIdentityProvider, Sitecore.Owin.Authentication"&gt;
           &lt;param desc="name"&gt;SignUpAndSignIn&lt;/param&gt;
           &lt;param desc="domainManager" type="Sitecore.Abstractions.BaseDomainManager" resolve="true" /&gt;
           &lt;caption&gt;SignUpAndSignIn&lt;/caption&gt;
           &lt;domain&gt;extranet&lt;/domain&gt;
           &lt;enabled&gt;true&lt;/enabled&gt;
           &lt;triggerExternalSignOut&gt;true&lt;/triggerExternalSignOut&gt;
           &lt;transformations hint="list:AddTransformation"&gt;
           &lt;/transformations&gt;
       &lt;/identityProvider&gt;
       &lt;identityProvider id="PasswordReset" type="Sitecore.Owin.Authentication.Configuration.DefaultIdentityProvider, Sitecore.Owin.Authentication"&gt;
           &lt;param desc="name"&gt;PasswordReset&lt;/param&gt;
           &lt;param desc="domainManager" type="Sitecore.Abstractions.BaseDomainManager" resolve="true" /&gt;
           &lt;caption&gt;PasswordReset&lt;/caption&gt;
           &lt;domain&gt;extranet&lt;/domain&gt;
           &lt;enabled&gt;true&lt;/enabled&gt;
           &lt;triggerExternalSignOut&gt;true&lt;/triggerExternalSignOut&gt;
           &lt;transformations hint="list:AddTransformation"&gt;
           &lt;/transformations&gt;
       &lt;/identityProvider&gt;
   &lt;/identityProviders&gt;
</code></pre>
<p> </p>
<p>Теперь мы&nbsp;можем работать с&nbsp;несколькими пользовательскими политиками, а&nbsp;при&nbsp;вызове <em><strong>GetSignInUrlInfoPipeline</strong></em> получим коллекцию ссылок и&nbsp;по&nbsp;имени Identity-провайдера сможем выбрать нужную.</p>
<p> </p>
<pre><code class="language-dotnet"> private string GetSignInUrl(string identityProviderName, string returnUrl)
        {
            if&nbsp;(string.IsNullOrEmpty(identityProviderName))
            {
                throw new&nbsp;ArgumentNullException(nameof(identityProviderName));
            }

            var&nbsp;pipelineManager = (BaseCorePipelineManager)ServiceLocator.ServiceProvider.GetService(typeof(BaseCorePipelineManager));
            var&nbsp;args = new&nbsp;Sitecore.Pipelines.GetSignInUrlInfo.GetSignInUrlInfoArgs(Sitecore.Context.Site.Name, returnUrl);
            Sitecore.Pipelines.GetSignInUrlInfo.GetSignInUrlInfoPipeline.Run(pipelineManager, args);

            var&nbsp;url&nbsp;= args.Result.FirstOrDefault(x =&gt; x.IdentityProvider == identityProviderName);

            return url?.Href;
        }</code></pre>
<h2>Что у&nbsp;нас&nbsp;получилось</h2>
<p>Настало время демонстрации работы! Итак, попробуем войти в&nbsp;систему. Для&nbsp;начала заходим на&nbsp;тестовую страницу. Как&nbsp;мы&nbsp;видим, Is&nbsp;Authenticated — false, то&nbsp;есть, у&nbsp;нас&nbsp;пока нет&nbsp;аутентифицированного пользователя, утверждения отсутствуют, свойства профиля пользователя не&nbsp;заполнены.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4639bb0f774dc72a3f8ff786e6c577c8"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--50852779 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--50852779 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/d6e6215e267342249ebff6b0639a4906"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2758/4-test-page-stage-1-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0b33a405ef8f4e36a0b7cf6f85df6fa6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="text-align: center;"><em>Рисунок 4 — Azure B2C тестовая страница (неавторизованный)</em></p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b161cf118123bb4671e30a1d5cc36b8c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/79b5a3d7a5a345408d0e190e0c20ec29"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Нажмем кнопку Login, и&nbsp;браузер перенаправляет нас&nbsp;на&nbsp;страницу входа Azure AD&nbsp;B2C:</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/6149c0a0f128de85336d66147d2c7ac6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--10144160 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--10144160 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/698e70608e6845ad9e8fb71dd34a482b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2760/5-login-1-2.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/27c8a92e36ce4cc1abebd3f4e1933718"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="text-align: center;"><em>Рисунок 5 — Azure Login page</em></p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b59cb28d3afca6e78ab6e33d0cfc3a09"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/25d6bf21d2e5442dab3eb31835422cff"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Вводим логин и&nbsp;пароль, нажимаем кнопку Sign in&nbsp;и&nbsp;снова возвращаемся на&nbsp;тестовую страницу нашего приложения. Теперь, как&nbsp;видно на&nbsp;рисунке ниже, аутентификация прошла успешно — пользователь авторизован, и&nbsp;мы&nbsp;видим заполненные свойства профиля, утверждения и&nbsp;присвоенные роли.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/0c2b423c5ddae63c8ae79095f45daf18"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--60259523 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--60259523 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/cf141a8f83854b1882b84269da86b5cb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2761/group-3-7-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cc7c1e32677142099a1b56bac2f6cd6a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="text-align: center;"><em>Рисунок 6 — Azure AD&nbsp;B2C тестовая страница (авторизованный)</em></p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9237bfac178c9f5c09293ce6ff7f5485"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6c4910c5fc23410a9dd58a2433ff625d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Проверяем реализацию сброса пароля. Нажимаем на&nbsp;кнопку Password reset и&nbsp;попадем на&nbsp;страницу сброса пароля:</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/7237b65f522a6184ca1cb3cec64d0e7a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--6481548 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--6481548 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/07e0630ec0a14cfbac49798a2347e72c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2762/7-password-reset-1-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4cca37dc2a7249eda8a13a1c9334d1ee"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="text-align: center;"><em>Рисунок 7 — Cброс пароля</em></p>
<p> </p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/2830b464da164bf39787eaf86b409b1d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2763/8-password-reset-1.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6559063f2e1848eb9058a3cf79b9bc06"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="text-align: center;"><em>Рисунок 8 — Cброс пароля</em></p>
</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/04e2b1a07532899defbd471fa7cf9e60"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/26b77bc422c24a4bb2d97f64e4dd33cf"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Готово! Всё, что&nbsp;от&nbsp;нас&nbsp;требовалось, сделано и&nbsp;работает корректно! Мы&nbsp;реализовали процесс входа/выхода в&nbsp;личный кабинет на&nbsp;Sitecore через Azure AD&nbsp;B2C. Научились работать с&nbsp;несколькими пользовательскими политиками. Дали пользователям возможность сбросить и&nbsp;изменить пароль, а&nbsp;также обеспечили корректную обработку кук.</p>
<h2>Материалы, которые мы&nbsp;использовали в&nbsp;работе:</h2>
<p><a rel="noopener" href="https://docs.microsoft.com/ru-ru/azure/active-directory-b2c/" target="_blank" title="Документация по&nbsp;Azure Active Directory B2C"><span style="font-weight: 400;">Документация Azure B2C</span></a></p>
<p><a rel="noopener" href="https://doc.sitecore.com/xp/en/developers/92/sitecore-experience-manager/configure-federated-authentication.html" target="_blank" title="Configure federated authentication"><span style="font-weight: 400;">Документация Sitecore 9.3 Federated authentication</span></a></p>
<p><a rel="noopener" href="https://docs.microsoft.com/ru-ru/azure/active-directory-b2c/tutorial-create-tenant" target="_blank" title="Руководство по&nbsp;созданию клиента Azure Active Directory B2C"><span style="font-weight: 400;">Руководство по&nbsp;созданию клиента Azure Active Directory B2C</span></a></p>
<p><a rel="noopener" href="https://docs.microsoft.com/ru-ru/azure/active-directory-b2c/configure-authentication-sample-web-app-with-api?tabs=visual-studio#step-2-register-web-applications" target="_blank" title="Настройка проверки подлинности в&nbsp;примере веб-приложения, вызывающего веб-API" data-anchor="?tabs=visual-studio#step-2-register-web-applications"><span style="font-weight: 400;">Настройка проверки подлинности в&nbsp;примере веб-приложения, которое вызывает веб&#8209;API&nbsp;при&nbsp;помощи Azure AD&nbsp;B2C</span></a></p>
<p><a rel="noopener" href="https://doc.sitecore.com/xp/en/developers/93/sitecore-experience-manager/configure-federated-authentication.html" target="_blank" title="Configure federated authentication"><span style="font-weight: 400;">Configure federated authentication</span></a></p>
<p><a rel="noopener" href="https://support.sitecore.com/kb?id=kb_article_view&amp;sysparm_article=KB0901497" target="_blank" title="SameSite support" data-anchor="?id=kb_article_view&amp;sysparm_article=KB0901497"><span style="font-weight: 400;">SameSite support</span></a></p>
<p><a rel="noopener" href="https://docs.microsoft.com/ru-ru/azure/active-directory-b2c/access-tokens" target="_blank" title="Запрос маркера доступа в&nbsp;Azure Active Directory B2C"><span style="font-weight: 400;">Запрос маркера доступа в&nbsp;Azure Active Directory B2C</span></a></p>
<p><a rel="noopener" href="https://doc.sitecore.com/xp/en/developers/92/sitecore-experience-manager/configure-federated-authentication.html#map-claims-and-roles_body" target="_blank" title="Map claims and&nbsp;roles" data-anchor="#map-claims-and-roles_body">Map claims and&nbsp;roles</a></p>
<p>Отдельно хочется отметить готовность официальной техподдержки Sitecore помогать разработчиком — часть решений по&nbsp;текущей задаче (проблема с&nbsp;бесконечным редиректом при&nbsp;Logout, использование отдельных identity-провайдеров для&nbsp;каждой пользовательской политики) мы&nbsp;нашли именно благодаря им!</p>
<hr>
<p><em><strong>Фото в&nbsp;заголовке:</strong><span style="font-weight: 400;"> by</span><a rel="noopener" href="https://unsplash.com/@ffstop?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" title="Fotis Fotopoulos" data-anchor="?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><span style="font-weight: 400;"> Fotis Fotopoulos</span></a><span style="font-weight: 400;"> on</span><span style="font-weight: 400;"> Unsplash</span></em></p>
<p><em><strong>Автор статьи:</strong> <span style="font-weight: 400;">Дмитрий Катасонов</span></em></p>
<p><em><strong>Тимлид и&nbsp;эксперт:</strong><span style="font-weight: 400;"> Александр Береговой</span></em></p>
<p><em><strong>Редактура текста:</strong><span style="font-weight: 400;"> Марина Медведева</span></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Чек-лист оценки дизайна проекта
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Делимся нашим авторским чек-листом, который поможет максимально реалистично оценить разработку дизайна проекта и ничего при этом не забыть.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/checklist-for-estimating-of-design-projects/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/checklist-for-estimating-of-design-projects/</guid>

                <pubDate>Fri, 27 Sep 2024 13:57:04 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Чек-лист оценки дизайна проекта</h1>
                                <figure>
                                    <img src="/Media/2690/alvaro-reyes-kxvlkiqqobu-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/b2b977007177180d45e886f7f180c254"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/0551f072b4ad426f833f1524e3c84ced"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Один из&nbsp; наших первых крупных проектов, на&nbsp; котором дизайн-команда работала вместе с&nbsp; разработчиками (можно сказать, это&nbsp;был&nbsp;проект «под ключ» — дизайн + разработка нового сайта), получился весьма противоречивым. С&nbsp; одной стороны, заказчик остался в&nbsp; полном восторге — он&nbsp; получил то, что&nbsp;хотел + максимум внимания и&nbsp; заботы со&nbsp; стороны всех членов нашей команды. С&nbsp; другой — сам&nbsp;проект оказался для&nbsp;нас&nbsp;убыточным.</p>
<p>Причиной тому стала серьёзная ошибка в&nbsp; оценках дизайнерской части. Мы&nbsp; с&nbsp; командой упустили очень важный этап — подбор и&nbsp; обработку медиаматериалов для&nbsp;сайта (фотографий, иллюстраций и&nbsp; т.д.). В&nbsp; итоге к&nbsp; концу проекта у&nbsp; нас&nbsp;накапало много лишних часов работы дизайн-отдела. Это&nbsp;было очень больно...</p>
<p>И вот, чтобы такого больше никогда не&nbsp; происходило, я&nbsp; детально разобрал весь наш&nbsp;процесс работы над&nbsp;дизайном, разбил его&nbsp;на&nbsp; этапы и&nbsp; сформулировал чек-лист. Он&nbsp; поможет оценить дизайнерскую часть проекта максимально реалистично и&nbsp; ничего не&nbsp; забыть.</p>
<p>Делюсь тем, что&nbsp;у&nbsp; меня получилось.</p>
<h2>Оценка объёма работ по&nbsp; дизайну</h2>
<p>Сразу отмечу, что&nbsp;этапу оценивания проекта у&nbsp; нас&nbsp;предшествует этап понимания задачи. Это&nbsp;отдельная большая работа, в&nbsp; которой задействованы все&nbsp;участники будущей команды проекта. Мы&nbsp; разбираемся в&nbsp; задаче клиента, задаём ему&nbsp;много вопросов, стараемся максимально погрузиться в&nbsp; его&nbsp;бизнес-процессы. И&nbsp; всё&nbsp;это&nbsp; — чтобы предложить клиенту оптимальное решение.</p>
<p>Понимание задачи — это&nbsp;вообще тема отдельной статьи. И&nbsp; скоро она&nbsp;непременно появится на&nbsp; нашем сайте. А&nbsp; пока давайте представим, что&nbsp;этап понимания задачи у&nbsp; нас&nbsp;позади, и&nbsp; мы&nbsp; согласовали с&nbsp; клиентом решение — нам&nbsp;нужно создать сайт с&nbsp; нуля, с&nbsp; интерфейсом, дизайном и&nbsp; разработкой. Теперь дело за&nbsp; оценками.</p>
<p><strong>Процесс работы над&nbsp;дизайном интерфейса во&nbsp; fuse8 включает в&nbsp; себя несколько основных этапов:</strong></p>
<ol>
<li>Погружение в&nbsp; предметную область и&nbsp; аналитика.</li>
<li>Проектирование и&nbsp; прототипирование.</li>
<li>Проработка дизайн-концепта или&nbsp;общего визуального решения (ОВР).</li>
<li>Создание дизайн-макетов.</li>
<li>Передача дизайн-макетов разработчикам.</li>
</ol>
<p>Чтобы оценить проект в&nbsp; часах, нужно сформировать список работ для&nbsp;каждого из&nbsp; этих этапов.</p>

<div class="umb-macro-highlights">
    <strong>Внимание!</strong>
    Каждый из&nbsp;этапов я&nbsp;постарался расписать по-максимуму. Понятно, что&nbsp;от&nbsp;проекта к&nbsp;проекту список работ может меняться. Поэтому, чтобы сделать чек-лист релевантным именно для&nbsp;вас, просто удалите ненужные пункты из&nbsp;каждого этапа перед оценкой. Или&nbsp;добавьте, если ваши дизайнерские процессы включают себя что&#8209;то&nbsp;сверх того, что&nbsp;есть у&nbsp;нас&nbsp;во&nbsp;fuse8.
</div>

<h3>Погружение в&nbsp; предметную область</h3>
<p>Первое, что&nbsp;мы&nbsp; делаем, когда заходим на&nbsp; новый проект, — это&nbsp;досконально изучаем предметную область. На&nbsp; этом этапе фиксируем и&nbsp;оцениваем следующие работы:</p>
<p><span style="color: #ca132a;">✓</span> погружение в&nbsp; бизнес-процессы заказчика;</p>
<p><span style="color: #ca132a;">✓</span> анализ решений конкурентов;</p>
<p><span style="color: #ca132a;">✓</span> изучение данных аналитики (если они&nbsp;есть);</p>
<p><span style="color: #ca132a;">✓</span> создание персон и&nbsp; пользовательских сценариев;</p>
<p><span style="color: #ca132a;">✓</span> экспертный UX-аудит текущего решения (если оно&nbsp;есть).</p>
<h3>Проектирование и&nbsp; прототипирование</h3>
<p>На этом этапе можно выделить следующие работы:</p>
<p><span style="color: #ca132a;">✓</span> разработка интерактивных прототипов для&nbsp;десктопа;</p>
<p><span style="color: #ca132a;">✓</span> разработка интерактивных прототипов для&nbsp;мобайла и&nbsp; планшета.</p>
<p>Прототипы для&nbsp;разных устройств мы&nbsp; оцениваем отдельно друг от&nbsp; друга — так&nbsp;оценки получаются значительно точнее.</p>
<h3>Проработка дизайн-концепта или&nbsp;общего визуального решения</h3>
<p>Общее визуальное решение (ОВР) — это&nbsp;наш&nbsp;способ представить клиенту будущий стиль проекта. По-сути, ОВР&nbsp;представляет из&nbsp; себя минимально-детализированные дизайн-макеты — с&nbsp; сеткой, цветовым решением, элементами управления, типографикой и&nbsp; с&nbsp; некоторыми контентными компонентами. С&nbsp; их&nbsp; помощью мы&nbsp; уже&nbsp;на&nbsp; ранних этапах проекта можем согласовать с&nbsp; клиентом большую часть стилистических решений.</p>
<p>При проработке ОВР&nbsp;мы&nbsp; выделяем следующие работы:</p>
<p><span style="color: #ca132a;">✓</span> подбор визуальных референсов;</p>
<p><span style="color: #ca132a;">✓</span> отрисовка макетов ОВР.</p>
<p>Здесь важно отметить, что&nbsp;в&nbsp; зависимости от&nbsp; задачи и&nbsp; договорённости с&nbsp; заказчиком, ОВР&nbsp;может быть представлено только одной главной страницей сайта или&nbsp; же&nbsp;2-3 вариантами нескольких страниц. Учитывайте это&nbsp;при&nbsp;оценке этапа.</p>
<h3>Дизайн-макеты</h3>
<p>Вот тут&#8209;то&nbsp;у&nbsp; нас&nbsp;и&nbsp; спрятался пункт, про&nbsp;который мы&nbsp; совершенно забыли на&nbsp; проекте, о&nbsp; котором я&nbsp; рассказал в&nbsp; самом начале. Не&nbsp; повторяйте наши ошибки! Заранее договоритесь с&nbsp; клиентом, кто&nbsp;будет подбирать все&nbsp;медиаматериалы. И, если это&nbsp;будете делать вы, прикиньте их&nbsp; объём и&nbsp; обязательно заложите время на&nbsp; это&nbsp;в&nbsp; оценки проекта.</p>
<p><span style="color: #ca132a;">✓</span> подбор медиаматериалов для&nbsp;сайта (картинки, фотографии, иконки и&nbsp; т.д.);</p>
<p><span style="color: #ca132a;">✓</span> отрисовка макетов для&nbsp;десктопа;</p>
<p><span style="color: #ca132a;">✓</span> отрисовка макетов для&nbsp;мобайла и&nbsp; планшета.</p>
<h3>Передача макетов разработчикам</h3>
<p>После того, как&nbsp;мы&nbsp;создали и&nbsp; согласовали с&nbsp; заказчиком дизайн макеты, наша работа не&nbsp; заканчивается. Мы&nbsp; ещё&nbsp;должны помочь включиться в&nbsp; проект разработчикам. Для&nbsp;этого у&nbsp; нас&nbsp;есть следующие подэтапы:</p>
<p><span style="color: #ca132a;">✓</span> разработка дизайн-системы проекта (UI-kit);</p>
<p><span style="color: #ca132a;">✓</span> разработка дизайн-документа — описания поведения всех интерактивных компонентов сайта.</p>
<p>Строго говоря, UI&#8209;kit&nbsp;мы&nbsp; формируем на&nbsp; протяжении всего проекта, а&nbsp; не&nbsp; постфактум. Но&nbsp; поскольку относится он&nbsp; именно к&nbsp; этапу передачи макетов разработчиков, прописываем мы&nbsp; его&nbsp;именно тут.</p>
<h2>Ещё немного об&nbsp; оценках</h2>
<p>Есть ещё&nbsp;пара моментов, которые стоит учесть при&nbsp;оценке дизайна проекта.</p>
<p><strong>Первое — это&nbsp;необходимость декомпозировать некоторые задачи.</strong> Самый простой выход тут&nbsp; — это&nbsp;выделить на&nbsp; проекте простые и&nbsp; сложные страницы и&nbsp; оценивать их&nbsp; отдельно.</p>
<p>Простые статичные страницы с&nbsp; базовым набором компонентов (новость, статья, страница «О компании», контакты и&nbsp; т.д. ) можно не&nbsp; декомпозировать. Достаточно просто оценить время их&nbsp; отрисовки в&nbsp; прототипе или&nbsp;на&nbsp; макете.</p>
<p>Страницы со&nbsp; сложной структурой и/или логикой (каталог, страница оформления заказа, корзина, калькуляторы и&nbsp; т.д.) можно «расщепить» на&nbsp; компоненты,а затем каждый из&nbsp; них&nbsp;оценить отдельно.</p>
<p><strong>Второй момент, который важно учесть при&nbsp;оценке проекта, — коммуникации.</strong> Мы&nbsp; закладываем на&nbsp; это&nbsp;до&nbsp; 30% от&nbsp; общего времени, в&nbsp; которое оценили проект. Как&nbsp;правило, этого с&nbsp; запасом хватает и&nbsp; на&nbsp; совместные мозгоштурмы, и&nbsp; на&nbsp; внутренние демо, и&nbsp; на&nbsp; презентации и&nbsp; согласования с&nbsp; заказчиком.</p>
<p>На этом всё! Надеюсь, наш&nbsp;чек-лист будем вам&nbsp;полезен. Лично я, как&nbsp;ведущий дизайнер, доволен, что&nbsp;у&nbsp; нас&nbsp;появился инструмент, который облегчает оценку проекта и&nbsp; помогает ничего не&nbsp; потерять в&nbsp; процессе.</p>

<div class="umb-macro-highlights">
    <strong></strong>
    Подготовил для&nbsp;вас&nbsp;отдельный <a href='https://docs.google.com/document/d/1c_jGdK42bJ2J0XWy54pVILXyZrm9aIaquXl3_kTWBV0/edit?usp=sharing' target='_blank' title='Чек-лист для&nbsp;оценки дизайна проекта fuse8'>документ с&nbsp;чек-листом для&nbsp;оценки дизайна проекта</a>. Берите из&nbsp;него всё, что&nbsp;покажется полезным, добавляйте недостающее и&nbsp;смело отбрасывайте ненужное!
</div>

<hr>
<p><em><strong>Фото в&nbsp; заголовке:</strong><span style="font-weight: 400;"> Photo by&nbsp; </span><a rel="noopener" href="https://unsplash.com/@alvarordesign?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" data-anchor="?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><span style="font-weight: 400;">Alvaro Reyes</span></a><span style="font-weight: 400;"> on&nbsp; </span><a rel="noopener" href="https://unsplash.com/@alvarordesign?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" data-anchor="?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><span style="font-weight: 400;">Unsplash</span></a></em></p>
<p><em><strong>Автор статьи:</strong><span style="font-weight: 400;"> Алексей Пилишков</span></em></p>
<p><em><strong>Редактура:</strong><span style="font-weight: 400;"> Марина Медведева</span></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Fixed Price, Time & Materials и Retainer: что выбрать для разработки ИТ-решения
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Разбираемся, чем отличаются друг от друга Фикс, Т&М и Ретейнер, и выясняем, для каких проектов каждый из них подходит.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/fixed-price-time-materials-retainer/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/fixed-price-time-materials-retainer/</guid>

                <pubDate>Fri, 27 Sep 2024 13:57:00 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Fixed Price, Time & Materials и Retainer: что выбрать для разработки ИТ-решения</h1>
                                <figure>
                                    <img src="/Media/2446/photo-by-morgan-housel-on-unsplash-3.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/15b0d13328aeb21cf43c04378f69bb0f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4cd1ed54b81043a0adc5ce25b9451595"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>Клиенты приходят к&nbsp; </span>нам<span> с&nbsp;разными проектами: аудит IT&nbsp;архитектуры, разработка сложного веб-сервиса, личного кабинета, создание B2B порталов. У&nbsp;всех разные цели, задачи и&nbsp;условия, а&nbsp;значит и&nbsp;сотрудничаем мы&nbsp;по&nbsp;разным схемам.</span></p>
<p><span>Чаще всего мы&nbsp;работаем по&nbsp;договорам Fixed Price, Time &amp; Materials или&nbsp;Retainer. Не&nbsp;все&nbsp;клиенты сразу понимают разницу между ними, поэтому и&nbsp;появилась эта&nbsp;статья. В&nbsp;ней&nbsp;расскажем, чем&nbsp;модели отличаются друг от&nbsp;друга и&nbsp;для&nbsp;каких проектов подходят, приведем примеры.</span></p>
<p><span><img src="/Media/2932/slide-16_9-4.png" alt=""></span></p>
<h2>Fixed Price</h2>
<p><strong>Fixed Price</strong><span> — договор, в&nbsp;котором зафиксированы: объем и&nbsp;содержание работ по&nbsp;проекту (техническое задание), сроки реализации и&nbsp;стоимость.</span></p>
<p><span style="font-weight: 400;"><img src="/Media/2933/slide-16_9-1.png" alt=""></span></p>
<p><span>Частный случай работы по&nbsp;Fixed Price — пошив пальто на&nbsp;заказ. Здесь ТЗ&nbsp;— это&nbsp;фасон изделия, мерки, ткань и&nbsp;фурнитура. Собрав эти&nbsp;требования, портной рассчитывает общую стоимость работ и&nbsp;называет срок, в&nbsp;течение которого пальто будет готово. Всё. Ни&nbsp;один из&nbsp;этих параметров в&nbsp;процессе работы не&nbsp;должен изменяться.</span></p>
<h3>Особенности Fixed Price </h3>
<div class="l-island-a">
<p><strong>Подробное техническое задание на&nbsp;разработку. </strong>Работа с&nbsp;требованиями для&nbsp;создания ТЗ&nbsp;должна быть исчерпывающей . Внести в&nbsp;ТЗ&nbsp;правки (добавить новую функциональность или&nbsp;выбрать другую технологию) и&nbsp;уложиться в&nbsp;те&nbsp;же&nbsp;сроки и&nbsp;сумму не&nbsp;получится. И&nbsp;это&nbsp;плавно подводит нас&nbsp;к&nbsp;следующей особенности</p>
</div>
<div class="l-island-a">
<p><strong>Всё сверх ТЗ</strong> — за&nbsp;дополнительную плату.<span> </span>Если в&nbsp;процессе работы над&nbsp;проектом по&nbsp;Fixed Price заказчик понял, что&nbsp;ему&nbsp;нужно что&#8209;то&nbsp;еще, заключается дополнительное соглашение с&nbsp;отдельной оплатой к&nbsp;уже&nbsp;заключенному договору.</p>
</div>
<div class="l-island-a">
<p><strong>Увеличенная стоимость часа работы.</strong> Исполнитель берет на&nbsp;себя обязательство, что&nbsp;проект будет выполнен в&nbsp;срок и&nbsp;без&nbsp;доплат. Поэтому в&nbsp;рейты на&nbsp;Fixed Price закладываются все&nbsp;возможные риски (как&nbsp;со&nbsp;стороны заказчика, так&nbsp;и&nbsp;со&nbsp;стороны исполнителя), привлечение руководителей проектов и&nbsp;других специалистов.</p>
</div>

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            Самая большая ошибка — предполагать, что&nbsp;проект пойдёт, как&nbsp;задумано.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    <a href='https://bureau.ru/about/fff/' target='_blank' title='Принцип управления проектами»'>«Принцип управления проектами»</a>  <p>Бюро Горбунова</p>
                </cite>
                <p class="blockquote-new__author-position">
                    
                </p>
            </div>
        </footer>
    </blockquote>
</div>

<h3>Для каких проектов подойдет Fixed Price</h3>
<div class="l-island-a">
<p>Fixed Price — идеальная модель для&nbsp;работы над&nbsp;проектами с&nbsp;четкими требованиями, ограниченным бюджетом и&nbsp;определенными сроками:</p>
</div>
<div class="l-island-a">
<ul>
<li>для небольших сайтов — корпоративных, лендингов, одностраничников;</li>
<li>для отдельного блока работ над&nbsp;сайтом — разработки конкретных инструментов (например, калькуляторов), точечной автоматизации бизнес-процессов;</li>
<li>для MVP&nbsp;(от&nbsp;анг. minimum viable product — минимально жизнеспособный продукт) — первой версии ИТ-продукта, обладающей минимальным набором функций, достаточных для&nbsp;удовлетворения потребностей пользователей.</li>
</ul>
</div>
<div class="l-island-a">
<p>Мы работаем по&nbsp;Fixed Price над&nbsp;добавлением дополнительных функциональных блоков в&nbsp;продукт для&nbsp;постоянного клиента, техническим аудитом систем, предпроектной аналитикой.</p>
</div>
<div class="l-island-a">
<p>Мы понимаем, что&nbsp;изменения в&nbsp;процессе разработки бывают критическими для&nbsp;для&nbsp;успеха проекта, а&nbsp;Fixed Price их&nbsp;запрещает. Поэтому индивидуальную разработку по&nbsp;этой модели мы&nbsp;организовываем, используя<span> </span><a href="/articles/wagile/" title="Wagile: как&nbsp;смешать разные модели ведения проектов">Wagile-подход</a>, благодаря которому оставляем границы проекта по&nbsp;Fixed Price, но&nbsp;добавляем гибкости для&nbsp;получения более эффективного результата.</p>
</div>
<h2>Time &amp; Materials</h2>
<p><strong>Time &amp; Materials</strong><span> — договор, в&nbsp;котором зафиксирована ставка разработчика в&nbsp;час. Заказчик платит за&nbsp;время, потраченное на&nbsp;решение его&nbsp;задачи, и&nbsp;за&nbsp;материалы, которые были использованы в&nbsp;ходе работы.</span></p>
<p><span style="font-weight: 400;"><img src="/Media/2934/slide-16_9-2.png" alt=""></span></p>
<p><span>Частный случай работы по&nbsp;Т&amp;М — вызов няни для&nbsp;ребенка с&nbsp;почасовой оплатой. Сколько времени вы&nbsp;отсутствуете, за&nbsp;столько и&nbsp;заплатите. Плюс за&nbsp;мороженое ребенку.</span></p>
<h3>Особенности Time &amp; Materials</h3>
<div class="l-island-a">
<p><strong>Гибкость</strong>. Работая с&nbsp;подрядчиком по&nbsp;T&amp;M, заказчик волен добавлять или&nbsp;удалять функции и&nbsp;возможности в&nbsp;проекте в&nbsp;любой момент без&nbsp;заключения дополнительных договоров и&nbsp;соглашений. Важно только помнить, что&nbsp;любая новая задача — это&nbsp;время команды разработчиков, за&nbsp;которое потом нужно будет заплатить.</p>
</div>
<div class="l-island-a">
<p><strong>Прозрачный процесс.</strong><span> </span>Работая по&nbsp;T&amp;M, разработчики всегда держат клиента в&nbsp;курсе текущих дел&nbsp;на&nbsp;проекте: регулярные встречи с&nbsp;заказчиком, презентации и&nbsp;постоянное логирование времени в&nbsp;тайм-трекерах. Мы&nbsp;на&nbsp;проектах по&nbsp;T&amp;M раз&nbsp;в&nbsp;пару недель проводим демо для&nbsp;клиентов и&nbsp;каждый месяц присылаем отчет о&nbsp;том, что&nbsp;было сделано, и&nbsp;сколько часов это&nbsp;заняло.</p>
</div>
<h3>Для каких проектов подходит Time &amp; Materials  </h3>
<div class="l-island-a">
<p>Лучше всего T&amp;M подходит для&nbsp;больших проектов, требующих гибкости и&nbsp;не&nbsp;имеющих определенного ТЗ&nbsp;и&nbsp;списка функциональных требований.</p>
</div>
<div class="l-island-a">
<ul>
<li>для стартапов — инновационных сервисов и&nbsp;инструментов;</li>
<li>для высоконагруженных сайтов с&nbsp;большим и&nbsp;постоянно расширяющимся списком функциональных требований;</li>
<li>для инструментов по&nbsp;автоматизации и&nbsp;оптимизации бизнеса, разработки бизнес-логики — личных кабинетов, интранет-порталов.</li>
</ul>
</div>
<p><span style="font-weight: 400;"><span>Мы работали по&nbsp;T&amp;M над&nbsp;B2B кабинетом поставщика для&nbsp;Emex. Подробнее об&nbsp;этом сервисе читайте в&nbsp;нашем <a href="/projects/emex-seller-drive-system-development/" title="Emex Seller Drive Development">кейсе</a>.</span> Еще&nbsp;один наш&nbsp;проект на&nbsp;T&amp;M — </span><a href="/projects/assignot-new/" title="Индивидуальная ERP&nbsp;вместо Excel для&nbsp;бизнеса по&nbsp;взысканию долгов"><span style="font-weight: 400;">«Цессионарий» — система для&nbsp;работы с&nbsp;просроченными задолженностями по&nbsp;кредитам</span><span style="font-weight: 400;">. </span></a></p>
<h2>Retainer</h2>
<p><strong>Retainer</strong><span><strong> </strong>— договор, в&nbsp;котором зафиксированы команда проекта, время, которое она&nbsp;будет тратить на&nbsp;работу ежемесячно, и&nbsp;сколько это&nbsp;будет стоить.</span></p>
<p><span style="font-weight: 400;"><span><img src="/Media/2935/slide-16_9-3.png" alt=""></span></span></p>
<p><span>Частный случай работы по&nbsp;Retainer — договор на&nbsp;регулярную уборку в&nbsp;офисе или&nbsp;квартире. В&nbsp;определенные дни&nbsp;недели на&nbsp;час&nbsp;к&nbsp;вам&nbsp;приходит одна и&nbsp;та&nbsp;же&nbsp;уборщица. И&nbsp;вы&nbsp;платите за&nbsp;это&nbsp;фиксированную сумму в&nbsp;месяц.</span></p>
<h3>Особенности Retainer</h3>
<div class="l-island-a">
<p><strong>Стабильность.</strong> На&nbsp;клиента работают одни и&nbsp;те&nbsp;же&nbsp;люди, неизменное количество часов в&nbsp;месяц за&nbsp;«железную» сумму. Ни&nbsp;один из&nbsp;этих параметров не&nbsp;изменится на&nbsp;протяжении всего действия Retainer-договора.</p>
</div>
<div class="l-island-a">
<p><strong>Гибкость.</strong> Как&nbsp;и&nbsp;в&nbsp;случае с&nbsp;T&amp;M, заказчик волен менять требования, ставить задачи и&nbsp;добавлять функциональность. Важно только помнить, что&nbsp;время команды на&nbsp;реализацию ограничено договором.</p>
</div>
<div class="l-island-a">
<p><strong>Неизрасходованные часы сгорают.</strong> Если клиент оплачивает 30 часов в&nbsp;месяц, а&nbsp;команда справляется с&nbsp;поставленными задачами за&nbsp;20, разница сгорает, а&nbsp;не&nbsp;переносится на&nbsp;следующий месяц.</p>
</div>
<h3>Для каких проектов подходит Retainer </h3>
<div class="l-island-a">
<p>Retainer подходит, когда у&nbsp;заказчика есть масштабный проект, который нужно разрабатывать или&nbsp;развивать, а&nbsp;своего IT-отдела нет, или&nbsp;его&nbsp;нужно усилить кадрами извне, нанять готовую команду разработки:</p>
</div>
<div class="l-island-a">
<ul>
<li>для стартапов и&nbsp;компаний с&nbsp;идеей, но&nbsp;без&nbsp;компетенции в&nbsp;IT;</li>
<li>для крупных постоянно развивающихся сервисов, работа над&nbsp;которым не&nbsp;останавливается и&nbsp;после релиза;</li>
<li>для проектов на&nbsp;поддержке.</li>
</ul>
</div>
<p><span style="font-weight: 400;">Мы работаем по&nbsp;Retainer на&nbsp;поддержке </span><a href="/projects/newtonclub" title="Кейс «“Ньютон Клуб”: сайт для&nbsp;жителей микрорайона «Ньютон»»"><span style="font-weight: 400;">«Ньютон Клуба» — сайта для&nbsp;жителей микрорайона «Ньютон»</span></a><span style="font-weight: 400;">. <span>Каждый месяц следим за&nbsp;тем, чтобы все&nbsp;работало хорошо, помогаем диспетчерам и&nbsp;сотрудникам УК&nbsp;вносить данные о&nbsp;новых и&nbsp;домах и&nbsp;квартирах в&nbsp;ЖК, а&nbsp;если возникают проблемы — оперативно их&nbsp;решаем.</span></span></p>
<h3>Гибридный формат</h3>
<div class="l-island-a">
<p>Продуктовая и&nbsp;заказная разработка требует гибкости, поэтому порой полезно переходить от&nbsp;одной модели сотрудничества к&nbsp;другой.</p>
</div>
<div class="l-island-a">

<div class="umb-macro-highlights">
    <strong></strong>
    Обычно комплексные проекты по&nbsp;проектированию, дизайну и&nbsp;разработке ИТ-продукта мы&nbsp;начинаем с&nbsp;аналитики, которую делаем по&nbsp;Fixed Price.
</div>

</div>
<div class="l-island-a">
<p>Этому есть две&nbsp;причины.</p>
</div>
<div class="l-island-a">
<p><strong>Во-первых</strong>,<span> </span>в проектировании часто возникает соблазн опуститься еще&nbsp;на&nbsp;один уровень детализации глубже и&nbsp;описать требования чуть подробнее. Из&#8209;за&nbsp;этого проект может страдать: мы&nbsp;занимаемся писательством, а&nbsp;не&nbsp;разработкой. Фиксируя сроки, каждая сторона берет на&nbsp;себя ответственность за&nbsp;то, чтобы к&nbsp;дедлайну получить результат. Так&nbsp;мы&nbsp;договариваемся, что&nbsp;после наступления фиксированного дедлайна мы&nbsp;начнем разработку, а&nbsp;не&nbsp;продолжим множить текст в&nbsp;ТЗ.</p>
</div>
<div class="l-island-a">
<p><strong>Во-вторых</strong>,<span> </span>новому клиенту проще согласиться на&nbsp;Fixed Price на&nbsp;этапе знакомства. Всегда есть опасения на&nbsp;счет успешности сотрудничества. Поэтому фиксированная модель здесь – некий гарант, позволяющий оценить исполнителей и&nbsp;понять, умеют ли&nbsp;они&nbsp;в&nbsp;управление сроками, бюджетами и&nbsp;качеством. Исполнитель тоже оценивает клиента — выполняет ли&nbsp;он&nbsp;свои обязательства в&nbsp;рамках фиксированных границ, как&nbsp;реагирует на&nbsp;возникающие проблемы.</p>

<div class="umb-macro-highlights">
    <strong></strong>
    После аналитики мы&nbsp;оцениваем объем работ по&nbsp;дизайну и&nbsp;разработке и&nbsp;предлагаем клиенту переходить на&nbsp;Т&М.
</div>

<div class="l-island-a">
<p>Т&amp;М здесь хорош, потому что&nbsp;при&nbsp;разработке сложных ИТ-продуктов невозможно точно оценить трудозатраты. Обязательно будут появляться изменения в&nbsp;требованиях, как&nbsp;хорошо их&nbsp;не&nbsp;продумывай. Скоуп работ будет расширяться. Т&amp;М позволяет в&nbsp;рамках проекта гибко подходить к&nbsp;изменениям в&nbsp;отличие от&nbsp;Fixed Price.</p>
</div>
<div class="l-island-a">
<p>Исполнитель, работая по&nbsp;Fixed Price, очень бережно относится к&nbsp;объему работ, на&nbsp;который подписался, а&nbsp;любые изменения должны пройти кучу согласований и&nbsp;обсуждений. Это&nbsp;все&nbsp;тратит время и&nbsp;смещает фокус с&nbsp;самого главного — бизнес результата.</p>
<p><span>Описанный гибридный подход мы&nbsp;применяли при&nbsp;разработке Seller Drive для&nbsp;Emex. </span><a href="/projects/emex-seller-drive-system-design/" title="Emex Seller Drive Analytics">Предпроектную аналитику</a><span> мы&nbsp;делали по&nbsp;Fixed Price, а&nbsp;в&nbsp;дизайн и&nbsp; </span><a href="/projects/emex-seller-drive-system-development/" title="Emex Seller Drive Development">разработку</a><span> ушли по&nbsp;Т&amp;М.</span></p>

<div class="umb-macro-highlights">
    <strong>Ремарка:</strong>
    работа по&nbsp;Т&М не&nbsp;значит, что&nbsp;мы&nbsp;просто говорим клиенту: «Плати нам&nbsp;и&nbsp;когда-нибудь получишь результат». В&nbsp;Т&М тоже есть фазы планирования, назначения дедлайнов и&nbsp;релизов. Просто гибкости больше.
</div>

</div>
</div>
<h2>Вывод    </h2>
<p><span>От выбора правильной модели сотрудничества зависит многое — сроки и&nbsp;стоимость проекта, его&nbsp;актуальность по&nbsp;завершении работ. Поэтому, прежде чем&nbsp;предложить заказчику работать по&nbsp;одному из&nbsp;контрактов, мы&nbsp;погружаемся в&nbsp;его&nbsp;бизнес-процессы, изучаем и&nbsp; </span><a href="/articles/task-understanding/" title="Понимание задачи by&nbsp;fuse8: что&nbsp;такое и&nbsp;зачем  нужно">понимаем задачу</a><span>, собираем все&nbsp;требования. Только после этого можно понять, что&nbsp;подойдет лучше — Fixed Price, T&amp;M или&nbsp;Retainer. Но&nbsp;отметим — у&nbsp;нас&nbsp;во&nbsp;fuse8 окончательное решение о&nbsp;форме сотрудничества остается все&nbsp;же&nbsp;за&nbsp;заказчиком.</span></p>
<hr>
<p><em><strong>Фото в&nbsp;заголовке:</strong> Morgan Housel<span> on&nbsp; </span>Unsplash</em></p>
<p> </p>
<h3>Что почитать еще:</h3>
<p><a href="/articles/traffic-and-conversion" title="Статья «Трафик и&nbsp;конверсия: что&nbsp;это&nbsp;за&nbsp;показатели и&nbsp;как&nbsp;с&nbsp;их&nbsp;помощью повысить выручку с&nbsp;сайта»"><span style="font-weight: 400;">Трафик и&nbsp;конверсия: что&nbsp;это&nbsp;за&nbsp;показатели и&nbsp;как&nbsp;с&nbsp;их&nbsp;помощью повысить выручку с&nbsp;сайта</span></a></p>
<p><a href="/articles/microsoft-gold-partner-what-for" title="Статья «Статус Microsoft Gold Partner: кому и&nbsp;зачем он&nbsp;нужен»"><span style="font-weight: 400;">Статус Microsoft Gold Partner: кому и&nbsp;зачем он&nbsp;нужен</span></a></p>
<p><a href="/articles/how-we-conduct-ux-audit" title="Статья «Что такое UX-аудит сайта и&nbsp;как&nbsp;мы&nbsp;его&nbsp;проводим»"><span style="font-weight: 400;">Что такое UX-аудит сайта и&nbsp;как&nbsp;мы&nbsp;его&nbsp;проводим</span></a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Что такое UX-аудит сайта и как мы его проводим
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Ведущий дизайнер fuse8 Алексей Пилишков рассказал, что такое UX-аудит сайта, как и для чего он проводится.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-we-conduct-ux-audit/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-we-conduct-ux-audit/</guid>

                <pubDate>Fri, 27 Sep 2024 13:57:00 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Что такое UX-аудит сайта и как мы его проводим</h1>
                                <figure>
                                    <img src="/Media/2408/jexo-owrcijta-80-unsplash-2.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/4e977e7fc0a11332acba5d429e2e7f6d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f3ac767b8dcc4e80bd0e07e7c663fa68"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p style="font-weight: 400;">Мы убеждены, что&nbsp;хороший дизайн — это&nbsp;не&nbsp;только про&nbsp;красоту и&nbsp;фирменный стиль. В&nbsp;первую очередь это&nbsp;про&nbsp;удобство пользователя. Интерфейс сайта должен быть простым и&nbsp;понятным. Если форма записи к&nbsp;врачу на&nbsp;сайте медцентра длинная и&nbsp;запутанная, пациент не&nbsp;заполнит её&nbsp;и&nbsp;не&nbsp;придёт на&nbsp;приём. Если покупатель не&nbsp;понимает, когда и&nbsp;как&nbsp;он&nbsp;получит товар из&nbsp;интернет-магазина, он&nbsp;купит его&nbsp;в&nbsp;другом месте.</p>
<p><span style="font-weight: 400;">Чтобы выявить такие проблемные места в&nbsp;интерфейсе, мы&nbsp;проводим </span><strong>UX-аудит сайта</strong><span style="font-weight: 400;">. </span></p>
<h2><span style="font-weight: 400;">Что такое UX-аудит</span></h2>
<p><strong>UX-аудит сайта</strong> — это&nbsp;исследование с&nbsp;упором на&nbsp;пользовательский опыт. Мы&nbsp;смотрим, как&nbsp;посетители взаимодействуют с&nbsp;интерфейсом, что&nbsp;делают, куда кликают и&nbsp;с&nbsp;какими препятствиями сталкиваются на&nbsp;пути к&nbsp;целевому действию. Целевым действием может быть покупка товара, запись на&nbsp;консультацию, заказ обратного звонка от&nbsp;менеджера — что&nbsp;угодно, в&nbsp;зависимости от&nbsp;бизнес-задачи сайта.</p>

<div class="umb-macro-highlights">
    <strong>Основная цель UX-аудита</strong>
    — найти ключевые интерфейсные проблемы сайта и&nbsp;предложить способы их&nbsp;решения.
</div>

<p><span style="font-weight: 400;">Найти узкие места в&nbsp;интерфейсе нам&nbsp;помогают данные аналитики (Яндекс.Метрика и&nbsp;Google Analytics), инструменты для&nbsp;отслеживания активности посетителей на&nbsp;сайте (вебвизор, карта кликов и&nbsp;др.) и&nbsp;собственная экспертиза нашей команды дизайнеров.</span></p>
<p><span style="font-weight: 400;">Например, на&nbsp;одном из&nbsp;проектов вебвизор помог нам&nbsp;отловить проблему с&nbsp;потерей корзины на&nbsp;мобильных устройствах:</span></p>
<p><span style="font-weight: 400;"> </span></p>
<p><img src="/Media/2411/123.gif" alt="" width="330" height="586"></p>
<p> </p>
<p><span style="font-weight: 400;">При при&nbsp;прокрутке страницы вниз верхний блок с&nbsp;кнопкой «Корзина», уходил за&nbsp;пределы экрана. Пользователи добавляли товар в&nbsp;корзину, но&nbsp;не&nbsp;знали, как&nbsp;им&nbsp;перейти к&nbsp;ней. </span></p>
<h2><span style="font-weight: 400;">Когда нужен UX-аудит</span></h2>
<p><span style="font-weight: 400;">В том&nbsp;или&nbsp;ином объеме мы&nbsp;проводим UX-аудит на&nbsp;всех дизайн-проектах. На&nbsp;небольшом сайте с&nbsp;неподключенными метриками можно ограничиться визуальным аудитом. Масштабные порталы (крупные интернет-магазины, онлайн-сервисы, личные кабинеты и&nbsp;т.д.) требуют масштабных исследований — с&nbsp;созданием персонажей и&nbsp;сценариев, подробным анализом всех страниц сайта и&nbsp;проверкой гипотез на&nbsp;прототипах.</span></p>
<p><span style="font-weight: 400;">Объем и&nbsp;длительность UX-исследований зависят от&nbsp;того, с&nbsp;каким проектом и&nbsp;задачей пришел клиент. Но, абстрагируясь от&nbsp;конкретных сайтов и&nbsp;проблем, я&nbsp;бы&nbsp;выделил пять показаний к&nbsp;проведению аудита на&nbsp;сайте: </span></p>
<p><strong>У сайта хороший трафик, но&nbsp;низкая конверсия.</strong><span style="font-weight: 400;"> Метрики говорят, что&nbsp;сайт посещают довольно много людей, но&nbsp;единицы совершают целевое действие. </span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Читайте статью нашего директора по&nbsp;развитию Вениамина Мустафина о&nbsp;том, <a href='https://fuse8.ru/articles/traffic-and-conversion/' target='_blank' title='Сайт fuse8'>что такое трафик и&nbsp;конверсия, а&nbsp;также как&nbsp;с&nbsp;их&nbsp;помощью можно повысить выручку с&nbsp;сайта</a>.
</div>

<p><strong>Интерфейсные лабиринты.</strong> <span style="font-weight: 400;">На сайте сложно ориентироваться — и&nbsp;менеджерам, и&nbsp;посетителям. </span></p>
<p><strong>Дорогие лиды.</strong><span style="font-weight: 400;"> В&nbsp;рекламу вкладываются деньги, и&nbsp;пользователи переходят по&nbsp;объявлениям, но&nbsp;целевое действие не&nbsp;совершают. </span></p>
<p><strong>Высокий показатель отказов.</strong><span style="font-weight: 400;"> Пользователи не&nbsp;задерживаются на&nbsp;сайте, закрывают его&nbsp;после беглого просмотра. </span></p>
<p><span style="font-weight: 400;"><strong>Есть желание развивать сайт, но&nbsp;нет&nbsp;понимания, с&nbsp;чего начать.</strong> Клиенту не&nbsp;понятно, какие именно улучшения будут полезны пользователям.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Столкнулись с&nbsp;одной из&nbsp;этих проблем? <a href='https://fuse8.ru/contact#contact-form' target='_blank' title='Форма обратной связи fuse8'>Закажите UX-аудит</a>, и&nbsp;мы&nbsp;поможем её&nbsp;решить.
</div>

<h2>Как мы&nbsp;проводим UX-аудит</h2>
<p><span style="font-weight: 400;">У нашей дизайн-команды на&nbsp;UX-аудит сайта уходит от&nbsp;двух недель. За&nbsp;это&nbsp;время мы&nbsp;изучаем бизнес-процессы клиента и&nbsp;его&nbsp;целевую аудиторию, анализируем решения конкурентов и&nbsp;препарируем сайт. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3d28d9e9426494173295209b9dabfc16"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--45945579 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--45945579 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6ca5e24f7e9047d78bcfe510feba8597"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2413/&#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;.png"
         alt=""
         itemprop="">


        <figcaption>
            Немного рабочего процесса
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f5a0f7715039d8961a74e9341a62b916"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d32f4471cac9471e8aa52ae6939acbc7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Условно процесс UX-аудита можно разделить на&nbsp;несколько этапов: </span></p>
<p><strong>Погружение.</strong> <span style="font-weight: 400;">Проводим интервью с&nbsp;клиентом, стараемся максимально изучить его&nbsp;бизнес, внутренние процессы, цели и&nbsp;проблемы. </span></p>
<p><strong>Аналитика.</strong><span style="font-weight: 400;"> Изучаем целевую аудиторию сайта, бизнес-нишу. Смотрим, как&nbsp;представлены в&nbsp;сети конкуренты. Изучаем метрики и&nbsp;фиксируем исходные данные сайта — посещаемость, конверсию и&nbsp;т.д.</span></p>
<p><strong>Аудит.</strong> <span style="font-weight: 400;">Влезаем в&nbsp;шкуру посетителя и&nbsp;проходимся по&nbsp;сайту до&nbsp;целевого действия. Отмечаем все&nbsp;сложности, которые возникают у&nbsp;нас&nbsp;на&nbsp;пути. Изучаем данные вебвизора, карты кликов и&nbsp;других инструментов для&nbsp;отслеживания активности на&nbsp;сайте, чтобы подтвердить наши гипотезы о&nbsp;препятствиях и&nbsp;отследить другие интерфейсные проблемы. </span></p>
<p><strong>Отчёт.</strong> <span style="font-weight: 400;">Фиксируем все&nbsp;найденные нами проблемы интерфейса и&nbsp;прописываем рекомендации по&nbsp;их&nbsp;устранению.</span></p>

<div class="umb-macro-highlights">
    <strong></strong>
    Для&nbsp;каждого конкретного проекта процесс UX-аудита может отличаться.
</div>

<h2>Что клиент получает в&nbsp;итоге</h2>
<p><span style="font-weight: 400;">После того, как&nbsp;мы&nbsp;закончим UX-аудит, клиент получит руководство к&nbsp;действиям по&nbsp;улучшению сайта в&nbsp;виде отчёта. Это&nbsp;документ в&nbsp;PDF&nbsp;или&nbsp;в&nbsp;Google Sheets. В&nbsp;нём&nbsp;мы:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">подробно описываем, как&nbsp;проводили конкретно этот аудит, чтобы клиент понимал, какая работа была проделана и&nbsp;на&nbsp;чём&nbsp;базируются представленные в&nbsp;отчете результаты; </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">перечисляем все&nbsp;обнаруженные интерфейсные проблемы на&nbsp;ключевых страницах;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">визуализируем их: прикрепляем скриншоты, видео или&nbsp;анимированные изображения, на&nbsp;которых видно, в&nbsp;чем&nbsp;проблема;</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">предлагаем способы решения этих проблем, опираясь на&nbsp;собственную экспертизу, лучшие практики и&nbsp;позитивный опыт конкурентов.</span><span style="font-weight: 400;"></span></li>
</ul>
<p><span style="font-weight: 400;">Чтобы клиент понимал, на&nbsp;какие интерфейсные проблемы стоит обратить внимание в&nbsp;первую очередь, мы&nbsp;ранжируем их&nbsp;по&nbsp;степени критичности. </span></p>
<p><strong><span style="color: #ff0000;">Красный маркер </span></strong><span style="font-weight: 400;"> — максимальный приоритет. Это&nbsp;серьезные препятствия на&nbsp;пути к&nbsp;целевому действию, которые нужно устранить как&nbsp;можно скорее.   </span></p>
<p><strong><span style="color: #f1c232;">Желтый маркер </span></strong> <span style="font-weight: 400;">— проблемы среднего приоритета. Их&nbsp;можно устранять во&nbsp;вторую очередь. </span></p>
<p><strong><span style="color: #0000ff;">Синий маркер </span></strong> — низкий приоритет. «Синие» проблемы не&nbsp;оказывают серьезного негативного воздействия на&nbsp;пользовательский опыт. Если их&nbsp;устранить, сайт станет еще&nbsp;лучше, чем&nbsp;был.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/714297cbed71f528180fce552291d22f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--12309723 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--12309723 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2deb0056474b49838f8d331f9068fced"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2415/frame-1-8-1.png"
         alt=""
         itemprop="">


        <figcaption>
            Пример отчёта по&nbsp;аудиту интернет-магазина
        </figcaption>
</figure>

</div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ee570ee0344804b2fb20a8cf543466af"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/45ac394ea26242f09cbebcb2ab52738b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Что дальше</h2>
<p><span style="font-weight: 400;">Обычно, после завершения UX-аудита сайта наши отношения с&nbsp;клиентом развиваются по&nbsp;одному из&nbsp;следующих сценариев:</span></p>
<p><strong>Мы поэтапно улучшаем интерфейс</strong><span style="font-weight: 400;"><strong>.</strong> Дизайн сайта при&nbsp;этом кардинально не&nbsp;меняется. Наша команда точечно работает с&nbsp;отдельными страницами — устраняет недостатки, упрощает интерфейс, делает его&nbsp;удобным и&nbsp;понятным. </span></p>
<p><strong>Мы проводим полный редизайн сайта.</strong><span style="font-weight: 400;"> Если точечно проблемы решить не&nbsp;получится, мы&nbsp;разрабатываем новый дизайн. Цель — создать интерфейс, который помогает целевой аудитории удовлетворить свои потребности быстро и&nbsp;удобно.  </span></p>
<p><strong>Клиент сам&nbsp;устраняет недостатки</strong><span style="font-weight: 400;"><strong>.</strong> Мы&nbsp;предоставляем клиенту  готовый план действий по&nbsp;улучшению UX&nbsp;сайта. А&nbsp;что&nbsp;с&nbsp;ним&nbsp;делать дальше — решать клиенту. Он&nbsp;может постепенно устранять недостатки силами собственного дизайн-отдела, обратиться к&nbsp;другому подрядчику.  Или&nbsp;выбрать первые два&nbsp;пути и&nbsp;продолжить работать с&nbsp;нами :)</span></p>
<hr>
<p><em><strong>Рассказал: </strong>Алексей Пилишков</em></p>
<p><em><strong>Записала и&nbsp;отредактировала: </strong>Марина Медведева</em></p>
<p><em><strong>Фото в&nbsp;заголовке:</strong> <span style="font-weight: 400;">Jexo on&nbsp;Unsplash</span></em></p>
<p> </p>
<h3>Что почитать еще:</h3>
<p><a href="/articles/traffic-and-conversion" title="Статья «Трафик и&nbsp;конверсия: что&nbsp;это&nbsp;за&nbsp;показатели и&nbsp;как&nbsp;с&nbsp;их&nbsp;помощью повысить выручку с&nbsp;сайта»"><span style="font-weight: 400;">Трафик и&nbsp;конверсия: что&nbsp;это&nbsp;за&nbsp;показатели и&nbsp;как&nbsp;с&nbsp;их&nbsp;помощью повысить выручку с&nbsp;сайта</span></a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Статус Microsoft Gold Partner: кому и зачем он нужен
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Разбираемся, какую пользу несёт золотой статус партнёрства с Майкрософт нашим клиентам и нам самим.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/microsoft-gold-partner-what-for/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/microsoft-gold-partner-what-for/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:58 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Статус Microsoft Gold Partner: кому и зачем он нужен</h1>
                                <figure>
                                    <img src="/Media/2274/paolo-bendandi-nrzgjowhnpu-unsplash-2.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/8da761891635fe3e8175b4378486e0f1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d4f39c6592654109b8785e5556e46f50"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Мы отлично знаем технологии Майкрософт. Свой первый проект на&nbsp;C# сделали ещё&nbsp;в&nbsp;2004 году. В&nbsp;2009 году стали сертифицированными партнёрами компании Майкрософт в&nbsp;компетенции Web&nbsp;Development. Спустя год&nbsp;получили серебряный статус партнёрства. А&nbsp;<a rel="noopener" href="/media/1881/ms-gold-letter-2019.pdf" target="_blank">в 2016 году добились золота</a>. Давайте разберёмся, зачем нужны эти&nbsp;статусы и&nbsp;сертификаты.</p>
<h2>Зачем нашим клиентам студия с&nbsp;голд-статусом?</h2>
<p>Золотой статус партнёра Майкрософт у&nbsp;веб-студии — это&nbsp;гарант того, что&nbsp;в&nbsp;её&nbsp;штате есть как&nbsp;минимум четыре разработчика со&nbsp;статусом MCSD. На&nbsp;момент публикации этой статьи у&nbsp;нас&nbsp;их&nbsp;шесть.</p>

<div class="text-highlight">
  Microsoft Certified Solutions Developer (MCSD) — высокий статус разработчика Майкрософт. Чтобы получить его, нужно сдать как&nbsp;минимум три&nbsp;экзамена.
</div>

<h3>Чем хорош разработчик со&nbsp;статусом MCSD</h3>
<p>Представьте, что&nbsp;у&nbsp;вас&nbsp;болит шея. Стандартные массажи уже&nbsp;не&nbsp;помогают, и&nbsp;вы&nbsp;решили обратиться к&nbsp;восточной медицине и&nbsp;записаться на&nbsp;иглоукалывание.</p>
<p>Перед вами два&nbsp;специалиста: у&nbsp;обоих — по&nbsp;две&nbsp;руки и&nbsp;по&nbsp;набору акупунктурных игл. Но&nbsp;только у&nbsp;одного из&nbsp;них&nbsp;есть именной сертификат. Чтобы получить его, акупунктурщик долго изучал теорию, тренировался и&nbsp;подтвердил свои знания на&nbsp;нескольких экзаменах. Он&nbsp;вложился в&nbsp;свою экспертность временем и&nbsp;деньгами. И&nbsp;сертификат в&nbsp;этом случае — гарант того, что&nbsp;воткнув в&nbsp;вас&nbsp;иглу, он&nbsp;достигнет целевого действия — снимет боль.</p>
<p>Несертифицированный акупунктурщик тоже может попасть в&nbsp;нужную точку. А&nbsp;может и&nbsp;не&nbsp;попасть. И&nbsp;у&nbsp;вас&nbsp;полностью онемеет шея. Целевое действие в&nbsp;этом случае тоже вроде бы&nbsp;достигнуто (боли же&nbsp;нет), но&nbsp;результат — так&nbsp;себе.</p>
<p>Разработчику, как&nbsp;и&nbsp;акупунктурщику, тоже приходится сдавать экзамены, чтобы получить сертификат. И&nbsp;тут&nbsp;не&nbsp;обойтись без:</p>
<ul>
<li>знаний и&nbsp;опыта работы с&nbsp;технологиями Майкрософт;</li>
<li>мотивации — чтобы начать всю&nbsp;эту&nbsp;историю;</li>
<li>дисциплины — чтобы найти время на&nbsp;регулярную подготовку к&nbsp;экзамену;</li>
<li>упорства — чтобы не&nbsp;бросить всё, если не&nbsp;получилось сдать с&nbsp;первого раза, и&nbsp;не&nbsp;остановиться на&nbsp;одном экзамене.</li>
</ul>
<p>Сдав экзамены, разработчик подтверждает свои компетенции и&nbsp;высокий уровень экспертизы. Можно быть уверенным — он&nbsp;знает, как&nbsp;оптимально решить вашу бизнес-задачу с&nbsp;использованием технологий Майкрософт.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2275/&#x441;&#x435;&#x440;&#x442;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x44F;-&#x432;-&#x43D;&#x43E;&#x432;&#x43E;&#x441;&#x442;&#x44C;-2.jpg"
         alt=""
         itemprop="">


        <figcaption>
            В&nbsp;феврале 2020 года ещё&nbsp;трое наших ребят стали сертифицированными профессионалами Майкрософт
        </figcaption>
</figure>

<h2>Зачем нам&nbsp;самим голд-статус?</h2>
<p>Каждый год&nbsp;мы&nbsp;продляем золотой статус партнёра: подтверждаем, что&nbsp;в&nbsp;штате до&nbsp;сих&nbsp;пор&nbsp;есть минимум четыре MCSD и&nbsp;оплачиваем партнёрский взнос. За&nbsp;это&nbsp;мы&nbsp;получаем:</p>
<h3>Лицензии Майкрософт на&nbsp;ПО</h3>
<p>В партнёрском пакете — огромное количество лицензий на&nbsp;ПО: операционные системы, программы MS&nbsp;Office, софт для&nbsp;работы с&nbsp;базами данных, подписки на&nbsp;Visual Studio и&nbsp;т.д. Это&nbsp;серьезно экономит нам&nbsp;деньги. Если бы&nbsp;мы&nbsp;не&nbsp;были партнёрами Майкрософт, только годовая подписка для&nbsp;35 разработчиков на&nbsp;Visual Studio стоила бы&nbsp;нам&nbsp;больше 5 миллионов рублей. Ежегодный партнёрский взнос за&nbsp;голд-статус в&nbsp;десятки раз&nbsp;меньше.</p>
<h3>Официальную техподдержку Майкрософт</h3>
<p>Если с&nbsp;каким&#8209;то&nbsp;ПО&nbsp;из&nbsp;пакета Майкрософт возникнет проблема (из&#8209;за&nbsp;которой, например, пользователи не&nbsp;могут зайти на&nbsp;сайты, которые мы&nbsp;хостим на&nbsp;Azure), подключится специалист техподдержки и&nbsp;поможет решить её.</p>
<p>Нам ещё&nbsp;ни&nbsp;разу не&nbsp;приходилось обращаться в&nbsp;Майкрософт по&nbsp;таким вопросам. Всё&nbsp;работает прекрасно. Но&nbsp;доступ к&nbsp;официальной техподдержке — это&nbsp;дополнительная гарантия того, что&nbsp;возможные проблемы будут решаться быстро.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2276/llk6vuughxq-2.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Мы&nbsp;ежегодно продляем статус Microsoft Gold Partner
        </figcaption>
</figure>

<h3>Доступ к&nbsp;крупным проектам и&nbsp;госзаказам</h3>
<p>Крупные компании, размещая заказ на&nbsp;разработку на&nbsp;тендерных площадках, порой ставят обязательное условие — у&nbsp;исполнителя должно быть определённое количество сертифицированных разработчиков Майкрософт. Особенно любят выставлять такие требования госзаказчики. В&nbsp;нашей команде есть сертифицированные разработчики, поэтому мы&nbsp;можем принимать участие в&nbsp;таких тендерах наравне с&nbsp;другими крупными веб-студиями.</p>
<h2>Вывод</h2>
<p>Партнёрство с&nbsp;Майкрософт — это&nbsp;не&nbsp;просто лого корпорации с&nbsp;мировым именем на&nbsp;нашем сайте. Это&nbsp;доказательство высокого уровня экспертизы наших разработчиков, их&nbsp;готовности развиваться и&nbsp;подтверждать свой профессионализм на&nbsp;практике. Это&nbsp;— гарантия оптимального решения бизнес-задачи нашего клиента.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2278/ms-gold-logo.png"
         alt=""
         itemprop="">


</figure>

<hr>
<p><em><strong>Фото в&nbsp;заголовке:</strong> Paolo Bendandi on&nbsp;Unsplash</em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как стать фронтенд-разработчиком
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Если вы хотите стать фронтенд-разработчиком и попасть в IT-компанию, но не знаете с чего начать и в каком направлении двигаться — эта статья для вас.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/how-to-become-a-front-end-developer/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/how-to-become-a-front-end-developer/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:55 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как стать фронтенд-разработчиком</h1>
                                <figure>
                                    <img src="/Media/2104/julien-moreau-688fna1pwoq-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/71257a7b56f88d4ceeffcda418fb8f1c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/404b454094f64ea49563176039c690cd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Как я&nbsp;решил перейти в&nbsp;IT</h2>
<p>По образованию я&nbsp;инженер-строитель. Пять лет&nbsp;работал проектировщиком в&nbsp;конструкторском бюро, рассчитывал надёжность зданий и&nbsp;сооружений. В&nbsp;какой&#8209;то&nbsp;момент я&nbsp;понял, что&nbsp;мне&nbsp;не&nbsp;хватает развития. Я&nbsp;сидел как&nbsp;леший в&nbsp;болотце и&nbsp;потихоньку обрастал «ментальным» жирком. Пришла мысль сменить профессию.<br><br>В моём окружении всегда было много айтишников. Они&nbsp;постоянно рассказывали об&nbsp;интересных рабочих задачах и&nbsp;новых технологиях. А&nbsp;для&nbsp;меня самой «горячей» новостью было изменение СНиПа 85-го года — убрали опечатку в&nbsp;слове. Хаха, вы&nbsp;серьёзно? Потому я&nbsp;и&nbsp;решил попробовать себя в&nbsp;IT.</p>
<p>Практики изучения, которые я&nbsp;описываю ниже — не&nbsp;единственный верный путь. Но&nbsp;это&nbsp;то, что&nbsp;сработало для&nbsp;меня.</p>
<p>Я пробовал разбить обучение на&nbsp;последовательные шаги, но&nbsp;это&nbsp;оказалось нереальным: нельзя сначала изучить HTML и&nbsp;CSS, а&nbsp;через месяц взяться за&nbsp;JS. Это&nbsp;всё&nbsp;работает вместе. Поэтому придётся на&nbsp;каких&#8209;то&nbsp;этапах совмещать несколько источников. Главная идея — итеративное обучение: почитал теорию — закрепил на&nbsp;практике. И&nbsp;так&nbsp;повторять до&nbsp;бесконечности.</p>
<h2>Закладываем фундамент</h2>


<figure class="umb-macro-image">
    


    <img src="/Media/2106/ricardo-gomez-angel-7bzbyafvtyg-unsplash.jpg"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Я начал с&nbsp;курсов от&nbsp;<a rel="noopener" href="https://htmlacademy.ru/" target="_blank" title="Сайт HtmlAcademy">HtmlAcademy</a>. Ребята дают основы и&nbsp;закладывают правильный фундамент, на&nbsp;который потом проще будет надстраивать свои навыки.</p>
<p>Очень круто, что&nbsp;на&nbsp;курсах нет&nbsp;«голой» теории — вы&nbsp;сразу учитесь на&nbsp;практике.</p>
<p>Сам я&nbsp;прошёл только начальный и&nbsp;средний уровень, но&nbsp;если у&nbsp;вас&nbsp;будет желание и&nbsp;энергия заглянуть в&nbsp;продвинутый — не&nbsp;пожалеете.</p>
<p><strong>Что даст:</strong> понимание, что&nbsp;такое вёрстка, HTML, тэги и&nbsp;атрибуты — вы&nbsp;научитесь верстать сетки, оформлять текст и&nbsp;немного поиграете с&nbsp;анимацией.</p>
<h2>Прививаем хороший стиль с&nbsp;самого начала</h2>
<p><span style="font-weight: 400;">Фундамент заложен, можно углубиться в&nbsp;вёрстку. Я&nbsp;взялся за&nbsp;методологию БЭМ&nbsp;от&nbsp;Яндекса. Её&nbsp;используют почти все&nbsp;компании для&nbsp;создания структуры классов. </span></p>
<p><span style="font-weight: 400;">Полностью всю&nbsp;методологию можно не&nbsp;изучать, но&nbsp;раздел «</span><a rel="noopener" href="https://ru.bem.info/methodology/quick-start/" target="_blank" title="Сайт про&nbsp;БЭМ"><span style="font-weight: 400;">Быстрый старт</span></a><span style="font-weight: 400;">» знать и&nbsp;использовать надо.</span></p>
<p><span style="font-weight: 400;">Ещё есть такой парень — Вадим Макеев. Он&nbsp;веб-евангелист (что&nbsp;бы&nbsp;это&nbsp;ни&nbsp;значило). Рассказывает и&nbsp;показывает, как&nbsp;делать валидную и&nbsp;удобную вёрстку. Погуглите его&nbsp;видосы и&nbsp;слушайте </span><a rel="noopener" href="https://soundcloud.com/web-standards" target="_blank" title="Сайт Soundcloud. Подкаст «Веб-стандарты»"><span style="font-weight: 400;">подкаст</span></a><span style="font-weight: 400;">. По&nbsp;моему мнению, Вадим иногда перегибает палку, но&nbsp;рассказывает вещи, которые надо знать.</span></p>
<p><span style="font-weight: 400;">У него есть хороший доклад, который вдохновил меня с&nbsp;самого начала — «</span><a rel="noopener" href="https://www.youtube.com/watch?v=ssJsjGZE2sc" target="_blank" title="Видео доклада на&nbsp;YouTube" data-anchor="?v=ssJsjGZE2sc"><span style="font-weight: 400;">Людоедский интерфейс</span></a><span style="font-weight: 400;">».</span></p>
<p><strong>Что даст:</strong> умение различать хороший подход к&nbsp;вёрстке от&nbsp;плохого и&nbsp;создавать иерархию классов, на&nbsp;которую и&nbsp;через полгода можно смотреть без&nbsp;отвращения.</p>
<h2>Практикуемся</h2>


<figure class="umb-macro-image">
    


    <img src="/Media/2107/federico-izzo-_sbs69gfzbu-unsplash.jpg"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p>Получили базу — нужно пробовать создавать тестовые странички. Гуглите «бесплатные PSD&nbsp;макеты сайтов», скачивайте и&nbsp;верстайте их. Не&nbsp;забывайте про&nbsp;адаптивность.</p>

<div class="text-highlight">
  В&nbsp;браузере Chrome есть панель разработчика. Погуглите и&nbsp;используйте её&nbsp;— она&nbsp;упрощает жизнь.
</div>

<p><span style="font-weight: 400;">Скачайте и&nbsp;установите редактор исходного кода — теперь это&nbsp;ваш&nbsp;главный инструмент в&nbsp;работе. Я&nbsp;использовал </span><a rel="noopener" href="https://atom.io/" target="_blank" title="Сайт Atom"><span style="font-weight: 400;">Atom</span></a><span style="font-weight: 400;"> и&nbsp;</span><a rel="noopener" href="https://code.visualstudio.com/" target="_blank" title="Сайт VS&nbsp;Code"><span style="font-weight: 400;">VS Code</span></a><span style="font-weight: 400;">. </span><span style="font-weight: 400;">Это бесплатные редакторы. Они&nbsp;легко оптимизируются под&nbsp;себя разными расширениями.</span></p>
<p>На этом этапе нужна критика. Ищите в&nbsp;своём окружении или&nbsp;на&nbsp;форумах фронтендеров и&nbsp;показывайте им&nbsp;свои макеты. Фидбек от&nbsp;эксперта поможет найти слабые места и&nbsp;пробелы в&nbsp;знаниях.</p>
<p>Положите любимые свёрстанные макеты в&nbsp;портфолио — будет плюсом при&nbsp;поиске работы.</p>
<p><strong>Что даст:</strong> реальный опыт вёрстки, пусть и&nbsp;в&nbsp;«домашних» условиях.</p>
<h2>Изучаем современные способы работы с&nbsp;сеткой</h2>


<figure class="umb-macro-image">
    


    <img src="/Media/2101/adrian-trinkaus-45gmpkd806w-unsplash.jpg"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p><span style="font-weight: 400;">Нужно знать </span><a rel="noopener" href="https://developer.mozilla.org/ru/docs/Web/CSS/CSS_Flexible_Box_Layout" target="_blank" title="Статья про&nbsp;Flexbox на&nbsp;MDN&nbsp;web&nbsp;docs"><span style="font-weight: 400;">flexbox</span></a><span style="font-weight: 400;"> и&nbsp;</span><a rel="noopener" href="https://developer.mozilla.org/ru/docs/Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout" target="_blank" title="Статья про&nbsp;Grid на&nbsp;MDN&nbsp;web&nbsp;docs"><span style="font-weight: 400;">grid</span></a><span style="font-weight: 400;">. С&nbsp;их&nbsp;помощью можно создавать гибкую сетку и&nbsp;радоваться жизни, а&nbsp;не&nbsp;страдать как&nbsp;наши предшественники с&nbsp;</span><a rel="noopener" href="http://htmlbook.ru/content/tablichnaya-verstka" target="_blank" title="Статья про&nbsp;табличную верстку на&nbsp;Htmlbook"><span style="font-weight: 400;">табличной версткой</span></a><span style="font-weight: 400;"> и&nbsp;</span><a rel="noopener" href="https://developer.mozilla.org/ru/docs/Web/CSS/float" target="_blank" title="Статья про&nbsp;float на&nbsp;MDN&nbsp;web&nbsp;docs"><span style="font-weight: 400;">флоутами</span></a><span style="font-weight: 400;">. </span></p>
<p><span style="font-weight: 400;">Лично для&nbsp;меня flexbox стал откровением. Я&nbsp;пытался сделать хитрую сетку с&nbsp;помощью флоутов, когда подошёл мой&nbsp;друг и&nbsp;сказал «Да тут&nbsp;на&nbsp;флексбоксах делов на&nbsp;5 минут». И&nbsp;да, действительно на&nbsp;5 минут… даже на&nbsp;4! После этого мой&nbsp;мир&nbsp;изучения фронтенда изменился :)</span></p>

<div class="text-highlight">
  Интересный тренажер для&nbsp;изучения flexbox — <a href='https://flexboxfroggy.com/' target='_blank' title='Сайт Flexboxfroggy'>Flexboxfroggy</a>. Сам&nbsp;до&nbsp;сих&nbsp;пор&nbsp;иногда залипаю в&nbsp;свободное время.
</div>

<p><strong>Что даст:</strong> опыт использования современных технологий и&nbsp;подходов к&nbsp;работе.</p>
<h2>JavaScript</h2>
<p><span style="font-weight: 400;">Не стоит забывать про&nbsp;JavaScript — без&nbsp;него сейчас никуда. Есть отличный учебник от&nbsp;Ильи Кантора — </span><a rel="noopener" href="https://learn.javascript.ru/" target="_blank" title="Сайт с&nbsp;современным учебником по&nbsp;JS"><span style="font-weight: 400;">«Современный учебник JavaScript»</span></a><span style="font-weight: 400;">. Первая часть про&nbsp;основы JS, вторая про&nbsp;работу с&nbsp;DOM&nbsp;— как&nbsp;управлять элементами на&nbsp;странице с&nbsp;помощью JS. Учебник можно изучать бесконечно, но&nbsp;для&nbsp;начала хватит первых пяти глав. </span></p>
<p><span style="font-weight: 400;">Здесь главное не&nbsp;переборщить с&nbsp;теорией: освоил тему — закрепи на&nbsp;практике. Придумывайте себе задачи, которые требуют использования JS: скрыть элемент на&nbsp;странице при&nbsp;нажатии на&nbsp;кнопку; показывать или&nbsp;скрывать элементы на&nbsp;странице по&nbsp;таймауту.</span></p>
<p><strong>Что даст:</strong> начальное знание JavaScript.</p>
<h2>Что ещё&nbsp;нужно знать</h2>
<p><span style="font-weight: 400;">Ещё есть такая штука как&nbsp;Webpack — сборщик модулей. Его&nbsp;используют на&nbsp;проектах, в&nbsp;которых много подключаемых файлов и&nbsp;зависимостей между ними. У&nbsp;Ильи Кантора </span><a rel="noopener" href="https://learn.javascript.ru/screencast/webpack" target="_blank" title="Скрин каст про&nbsp;Webpack на&nbsp;сайте learn javascript"><span style="font-weight: 400;">есть скринкаст про&nbsp;него</span></a><span style="font-weight: 400;">. Он, правда, немного устарел — вышло уже&nbsp;несколько новых версий Webpack. Но&nbsp;принципиальных отличий нет, для&nbsp;фундамента самое то.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/2105/kelly-sikkema-z9au36chmqi-unsplash.jpg"
         alt=""
         itemprop="">


</figure>

<p> </p>
<p><span style="font-weight: 400;">Неплохо бы&nbsp;изучить и&nbsp;препроцессоры </span><a rel="noopener" href="https://sass-scss.ru/" target="_blank" title="Сайт про&nbsp;Sass/SCSS"><span style="font-weight: 400;">Sass/SCSS</span></a><span style="font-weight: 400;"> и&nbsp;</span><a rel="noopener" href="https://lesscss.ru/" target="_blank" title="Сайт про&nbsp;Less"><span style="font-weight: 400;">Less</span></a><span style="font-weight: 400;">. Они&nbsp;оптимизируют работу с&nbsp;CSS: с&nbsp;переменными, правилами вложенности, функциями и&nbsp;логическими блоками. </span></p>
<p><span style="font-weight: 400;">Добавлю, что&nbsp;не&nbsp;все&nbsp;браузеры будут одинаково отображать ваши свёрстанные макеты. Например, IE&nbsp;не&nbsp;дружит с&nbsp;флексбоксами, и&nbsp;далеко не&nbsp;все&nbsp;современные браузеры полностью поддерживают грид. Поэтому всегда проверяйте свои макеты в&nbsp;Chrome, Mozilla Firefox, Opera, Safari, IE&nbsp;и&nbsp;Edge.</span></p>

<div class="text-highlight">
  <a href='https://caniuse.com/' target='_blank' title='Сайт CanIUse'>CanIUse</a> — полезный сайт для&nbsp;проверки поддержки технологий разными браузерами.
</div>

<p><span style="font-weight: 400;">Если вы&nbsp;уверенно чувствуете себя в&nbsp;JS, можете начинать выбирать фреймворк для&nbsp;изучения. В&nbsp;России, как&nbsp;я&nbsp;вижу, самый популярный это&nbsp;</span><a rel="noopener" href="https://ru.reactjs.org/" target="_blank" title="Сайт про&nbsp;React"><span style="font-weight: 400;">React</span></a><span style="font-weight: 400;">. Рядом с&nbsp;ним&nbsp;стоят </span><a rel="noopener" href="https://ru.vuejs.org/index.html" target="_blank" title="Сайт про&nbsp;Vue"><span style="font-weight: 400;">Vue</span></a><span style="font-weight: 400;"> и&nbsp;</span><a rel="noopener" href="https://angular.io/" target="_blank" title="Сайт про&nbsp;Angular"><span style="font-weight: 400;">Angular</span></a><span style="font-weight: 400;">. Каждый из&nbsp;них&nbsp;чем&#8209;то&nbsp;лучше и&nbsp;чем&#8209;то&nbsp;хуже других — всё&nbsp;зависит от&nbsp;задачи, которую нужно решить.</span></p>
<h2>Что в&nbsp;итоге</h2>
<p>Я занимался самостоятельно по&nbsp;2-3 часа в&nbsp;день в&nbsp;течение шести месяцев. И&nbsp;за&nbsp;это&nbsp;время я…</p>
<ul>
<li>узнал, что&nbsp;такое HTML, CSS, JS, понял, как&nbsp;это&nbsp;всё&nbsp;применяется и&nbsp;работает вместе;</li>
<li>научился отличать хорошие подходы к&nbsp;разработке от&nbsp;плохих, начал замечать косяки на&nbsp;своих любимых сайтах;</li>
<li>узнал, что&nbsp;такое табличная верстка, флексбоксы и&nbsp;гриды, научился их&nbsp;использовать;</li>
<li>понял, как&nbsp;работает один из&nbsp;препроцессоров и&nbsp;научился применять его&nbsp;в&nbsp;работе;</li>
<li>смог собрать проект с&nbsp;помощью Webpack;</li>
<li>смог самостоятельно сверстать и&nbsp;прикрутить JS&nbsp;на&nbsp;сайт;</li>
<li>научился работать с&nbsp;редактором кода и&nbsp;оптимизировал его&nbsp;под&nbsp;себя.</li>
</ul>
<h2>Ищем работу по&nbsp;новой специальности</h2>
<p>Полученных навыков хватит, чтобы претендовать на&nbsp;позицию фронтенд-разработчика уровня джуниор.</p>
<p>Чтобы попасть во&nbsp;fuse8, я&nbsp;взял отпуск на&nbsp;текущей работе и&nbsp;напросился на&nbsp;бесплатную стажировку. За&nbsp;эти&nbsp;две&nbsp;недели я&nbsp;старался показать всё, на&nbsp;что&nbsp;способен. В&nbsp;итоге меня взяли джуниором. Тут&#8209;то&nbsp;и&nbsp;началось основное обучение.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/2103/david-siglin-uuw4psob388-unsplash.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Выражение моего лица, когда узнал, что&nbsp;меня взяли на&nbsp;работу во&nbsp;fuse8
        </figcaption>
</figure>


<div class="text-highlight">
  Если вы&nbsp;хотите устроиться в&nbsp;конкретную компанию — мониторьте вакансии, смотрите на&nbsp;указанные там&nbsp;требования и&nbsp;подстраивайтесь под&nbsp;них.
</div>

<p> </p>
<p>И не&nbsp;забывайте, что&nbsp;на&nbsp;ваш&nbsp;успех в&nbsp;работе влияют не&nbsp;только хард-скилы. Прокачивайте себя, <a href="/articles/soft-skills-in-it" title="Статья «Софт скиллы в&nbsp;IT-сфере: что&nbsp;прокачивать»">приобретайте гибкие навыки</a> (софт-скиллы): коммуникативность, умение работать в&nbsp;команде, креативность, тайм-менеджмент и&nbsp;другие.</p>
<hr>
<p><em><span style="font-weight: 400;"><strong>Авторы и&nbsp;источники фото:</strong> Julian Moreau, Ricardo Gomez Angel, Adrian Trinkaus, Kelly Sikkema, David Siglin, Frederico Izzo on&nbsp;</span><a rel="noopener" href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" data-anchor="?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><span style="font-weight: 400;">Unsplash.</span></a></em></p>
<h3>Что почитать еще:</h3>
<p><a href="/articles/soft-skills-in-it#top" title="Статья «Софт скиллы в&nbsp;IT-сфере: что&nbsp;прокачивать»" data-anchor="#top"><span style="font-weight: 400;">Софт скиллы в&nbsp;IT-сфере: что&nbsp;прокачивать</span></a></p>
<p><a rel="noopener" href="/articles/tips-for-teamleads" target="_blank" title="Статья «Советы тимлиду: что&nbsp;важно в&nbsp;командной работе»"><span style="font-weight: 400;">Советы тимлиду: что&nbsp;важно в&nbsp;командной работе</span></a></p>
<p> </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    JMeter — швейцарский нож тестировщика (Часть 2)
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Сегодня расскажу, как мы с помощью JMeter’а наладили процесс кэширования продуктовых страниц, проверили работу мобильного приложения без самого приложения и создали 2000 юзеров в системе без доступа к базе данных.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/another-atypical-ways-to-use-jmeter/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/another-atypical-ways-to-use-jmeter/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:55 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>JMeter — швейцарский нож тестировщика (Часть 2)</h1>
                                <figure>
                                    <img src="/Media/1963/goran-ivos-ly-rwar0gxi-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/e872e0a47a3419a35aaa616f227b7a48"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f9a667270ebc4156a66c77827dff9e81"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Сегодня расскажу, как&nbsp;мы&nbsp;с&nbsp;помощью JMeter’а наладили процесс кэширования продуктовых страниц, проверили работу мобильного приложения без&nbsp;самого приложения и&nbsp;создали 2000 юзеров в&nbsp;системе без&nbsp;доступа к&nbsp;базе данных. </p>
<p>Кто не&nbsp;в&nbsp;курсе, что&nbsp;здесь происходит, читайте <a href="/articles/atypical-ways-to-use-jmeter/" title="JMeter — швейцарский нож&nbsp;тестировщика (Часть 1)">первую часть статьи</a> — в&nbsp;ней&nbsp;я&nbsp;рассказал, как&nbsp;JMeter помог нам&nbsp;«поймать» проблему с&nbsp;падением сайта у&nbsp;части пользователей. </p>
<h2>Как быстро закэшировать пару тысяч продуктовых страниц</h2>
<p>Ещё один наш&nbsp;клиент — итальянская компания, производящая оборудование для&nbsp;внутреннего, наружного и&nbsp;декоративного освещения.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/1964/ig-ipad-1.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Оборудование наших клиентов освещает шедевры мировой живописи, памятники архитектуры, монументы, здания бизнес-центров и&nbsp;аэропортов
        </figcaption>
</figure>

<p> </p>
<p>Сайт для&nbsp;этой компании мы&nbsp;разрабатывали на&nbsp;Kentico. На&nbsp;нём&nbsp;представлены все&nbsp;материалы и&nbsp;модели осветительного оборудования — 20 000 экземпляров. И&nbsp;у&nbsp;каждого есть отдельная страница. </p>
<p>После релиза сайта мы&nbsp;обнаружили одну неприятную особенность Kentico: в&nbsp;ней&nbsp;нет&nbsp;инструмента для&nbsp;автоматической загрузки медиафайлов в&nbsp;кэш. После обновления и&nbsp;перезапуска сайта (что&nbsp;происходит регулярно) кэш&nbsp;сбрасывается, и&nbsp;большинство страниц открываются по&nbsp;10 секунд. Не&nbsp;каждый пользователь готов столько ждать.</p>
<p>Мы видели два&nbsp;варианта загрузки медиафайлов в&nbsp;кэш. Первый: последовательно вручную через браузер обходить сайт — это&nbsp;долго. Второй: написать скрипт, который будет делать это&nbsp;за&nbsp;нас&nbsp;— подходит! </p>
<p>Мы решили использовать JMeter: просто скормили ему&nbsp;полный сайтмап, он&nbsp;по&nbsp;нему прогулялся и&nbsp;отправил медиафайлы в&nbsp;кэш. </p>
<p>Это было простое решение, но&nbsp;не&nbsp;очень оптимальное. Проход скрипта занимал шесть (!!!) часов. Требовался какой&#8209;то&nbsp;более быстрый способ. </p>
<p>Немного изучив тему, мы&nbsp;решили использовать регэкспы. JMeter умеет запрашивать у&nbsp;сервера встроенные в&nbsp;страницу ресурсы по&nbsp;определённым маскам. Этим мы&nbsp;и&nbsp;воспользовались. Отсеяв то, что&nbsp;расположено не&nbsp;на&nbsp;нашем сервере и&nbsp;не&nbsp;требует загрузки в&nbsp;кэш&nbsp;(сторонние изображения, шрифты, стили и&nbsp;прочее), мы&nbsp;сократили время прохождения скрипта по&nbsp;страницам до&nbsp;двух часов. </p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/1965/2.png"
         alt=""
         itemprop="">


        <figcaption>
            Так&nbsp;должен выглядеть HTTP-Request в&nbsp;JMeter для&nbsp;загрузки только определённого типа ассетов
        </figcaption>
</figure>

<p> </p>
<p>Но и&nbsp;это&nbsp;слишком долго: заливка начинается в&nbsp;9:00 по&nbsp;Челябинску и&nbsp;занимает час, затем ещё&nbsp;два&nbsp;часа уходит на&nbsp;скрипт, в&nbsp;итоге закончим мы&nbsp;в&nbsp;12:00. В&nbsp;Италии — это&nbsp;08:00, а&nbsp;некоторые местные жители начинают работать уже&nbsp;в&nbsp;6-7 часов утра. Сайт работает медленно, сыплются жалобы… Надо оптимизировать дальше!</p>
<p>Решение пришло, когда мы&nbsp;осознали, что&nbsp;на&nbsp;всех 20 000 продуктовых страниц используются почти одинаковые картинки. Мы&nbsp;провели анализ и&nbsp;поняли, что&nbsp;достаточно загружать полностью (со&nbsp;всеми встроенными ресурсами) только 30% случайных страниц, а&nbsp;остальные можно пробегать без&nbsp;подгрузки медиафайлов. Таким образом в&nbsp;кэш&nbsp;попадает подавляющая часть материалов — картинки, шрифты, скрипты и&nbsp;стили для&nbsp;продуктовых страниц. При&nbsp;обращении пользователя к&nbsp;одной из&nbsp;них&nbsp;загрузить с&nbsp;сервера понадобится лишь небольшую часть контента, и&nbsp;займет это&nbsp;не&nbsp;больше 1-2 секунд.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1966/3.png"
         alt=""
         itemprop="">


        <figcaption>
            Запрашивая рандомный номер страницы из&nbsp;таблицы User Defined Variables, мы&nbsp;каждый раз&nbsp;получаем случайную страницу из&nbsp;списка
        </figcaption>
</figure>

<p>Используя описанный метод, мы&nbsp;получали сайт, который в&nbsp;90% случаев работает быстро. Да, в&nbsp;одном случае из&nbsp;десяти ждать загрузки страницы приходилось до&nbsp;30 секунд, но&nbsp;в&nbsp;остальных девяти всё&nbsp;просто летало. И&nbsp;это&nbsp;— всего за&nbsp;15-30 минут.  </p>
<p>Сейчас такие ухищрения уже&nbsp;не&nbsp;нужны — разработчики оптимизировали саму систему кэширования. Но&nbsp;на&nbsp;тот&nbsp;момент это&nbsp;решение было реальным спасением, а&nbsp;JMeter оказался весьма полезным инструментом, даже после релиза и&nbsp;заливки.</p>
<h2>Как создать 2000 пользователей приложения, если у&nbsp;вас&nbsp;есть только их&nbsp;e-mail и&nbsp;два&nbsp;часа на&nbsp;работу</h2>
<p>Третий клиент, про&nbsp;которого я&nbsp;расскажу, — это&nbsp;компания, которая занимается разработкой, производством и&nbsp;продажей медицинского оборудования: от&nbsp;простых скальпелей до&nbsp;лазерных резаков и&nbsp;комплексных буров со&nbsp;встроенными камерами. Их&nbsp;менеджеры ездят по&nbsp;клиникам, общаются с&nbsp;хирургами и&nbsp;рассказывают им&nbsp;о&nbsp;своей продукции. Для&nbsp;этого у&nbsp;них&nbsp;есть специальное приложение для&nbsp;iPad: в&nbsp;него вносятся данные врача и&nbsp;список инструментов, которые его&nbsp;заинтересовали. Позже на&nbsp;email врача приходит ссылка на&nbsp;персональную страницу со&nbsp;списком всех этих инструментов, подробными описаниями и&nbsp;характеристиками. Именно эти&nbsp;страницы для&nbsp;хирургов мы&nbsp;и&nbsp;разрабатывали. Приложение и&nbsp;email-рассылку делала другая компания. </p>
<p>Одна из&nbsp;задач для&nbsp;JMeter’а на&nbsp;этом проекте — протестировать систему создания разных вариантов таких страниц, при&nbsp;том, что&nbsp;у&nbsp;нас&nbsp;был&nbsp;только бэкенд. Мы&nbsp;написали скрипт так, чтобы он&nbsp;с&nbsp;помощью генератора случайных чисел создавал страницы разного вида, а&nbsp;затем отправлял их&nbsp;на&nbsp;наши рабочие email’ы для&nbsp;проверки. Всё&nbsp;просто. И&nbsp;я&nbsp;бы&nbsp;даже не&nbsp;упомянул этого клиента в&nbsp;статье, если бы&nbsp;не&nbsp;один случай.</p>
<p>За несколько дней до&nbsp;запуска мне&nbsp;позвонил наш&nbsp;менеджер и&nbsp;попросил создать 2000 пользователей для&nbsp;приложения. Сложность состояла в&nbsp;том, что&nbsp;у&nbsp;нас&nbsp;не&nbsp;было доступа ни&nbsp;к&nbsp;живому серверу, ни&nbsp;к&nbsp;базе данных. Мы&nbsp;должны были создать 2000 пользователей только через CMS&nbsp;(в&nbsp;данном случае — через Umbraco). При&nbsp;этом каждому пользователю после регистрации должно было прийти письмо примерно такого вида: </p>


<figure class="umb-macro-image">
    


    <img src="/Media/1967/4.png"
         alt=""
         itemprop="">


        <figcaption>
            Получив такое письмо, пользователь устанавливает приложение и&nbsp;меняет стандартный пароль на&nbsp;собственный
        </figcaption>
</figure>

<p>Для регистрации пользователя требуется заполнить пять полей: </p>
<ul>
<li>email;</li>
<li>имя;</li>
<li>фамилия;</li>
<li>логин;</li>
<li>пароль. </li>
</ul>
<p>На выполнение задачи у&nbsp;меня было всего два&nbsp;часа. Ещё&nbsp;раз: 2000 пользователей, пять полей у&nbsp;каждого из&nbsp;них, два&nbsp;часа… Данные от&nbsp;менеджера пришли в&nbsp;таком виде:</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1968/5.png"
         alt=""
         itemprop="">


</figure>

<p>Будь я&nbsp;разработчиком, а&nbsp;не&nbsp;QA-специалистом, я&nbsp;бы&nbsp;написал скрипт, например, на&nbsp;perl: он&nbsp;бы&nbsp;распарсил эти&nbsp;данные и&nbsp;по-быстрому всё&nbsp;раскидал. Но&nbsp;я&nbsp;избрал другой путь и&nbsp;использовал самый, пожалуй, идеальный инструмент для&nbsp;быстрой организации данных — MS&nbsp;Excel. Электронные таблицы спасут мир!</p>
<p>С помощью нехитрых манипуляций с&nbsp;заменой данных, отрезанием лишнего и&nbsp;прочими ухищрениями, я&nbsp;создал файлик из&nbsp;~10k строк, вида: </p>
<p>login1 | john.smith</p>
<p>login2 | doctor.who</p>
<p>…</p>
<p>name1 | John</p>
<p>…</p>
<p>С паролями сильно заморачиваться не&nbsp;стал — написал просто PasswordNumber1 и&nbsp;«протянул» этот столбец в&nbsp;Excel’е на&nbsp;все&nbsp;2000 юзеров. Это&nbsp;не&nbsp;беда, ведь он&nbsp;использовался только для&nbsp;первого входа. Да&nbsp;и&nbsp;общий список email’ов по&nbsp;алфавиту я&nbsp;не&nbsp;сортировал, а&nbsp;значит вероятность случайного подбора пароля была сведена к&nbsp;минимуму. </p>
<p>Скормив этот файл (через буфер обмена) JMeter’у, я&nbsp;откинулся на&nbsp;спинку кресла и&nbsp;с&nbsp;наслаждением наблюдал, как&nbsp;создаются юзеры. Весь процесс обработки данных и&nbsp;создания новых пользователей занял 1 ч&nbsp;45 мин&nbsp;— осталось даже время на&nbsp;кофе!</p>
<p>Вывод: JMeter оказался удобным инструментом для&nbsp;автоматизированного тестирования бэкенда мобильных приложений, а&nbsp;ещё, внезапно, для&nbsp;автоматизации нестандартных задач — вроде вот&nbsp;этой, с&nbsp;кучей пользователей и&nbsp;минимумом информации о&nbsp;них. </p>
<p>А вообще, JMeter может использоваться (и&nbsp;использовался лично мной) для&nbsp;самых разных задач. Например, для:</p>
<ul>
<li>анализа оптимизации: проводим нагрузочное тестирование, накатываем оптимизационные фиксы, проводим тестирование ещё&nbsp;раз, сравниваем результаты;</li>
<li>теста секьюрности запросов: записываем скрипт с&nbsp;помощью прокси, отправляем запрос напрямую на&nbsp;сервер без&nbsp;фронтендовых проверок, убираем различные ключи из&nbsp;запроса, проверяем, что&nbsp;сервер реагирует адекватно;</li>
<li>проверки реакции на&nbsp;заголовки: пишем скрипт, который отправляет в&nbsp;цикле запросы на&nbsp;одну и&nbsp;ту&nbsp;же&nbsp;страницу с&nbsp;разными заголовками, проверяем реакцию сервера и&nbsp;смотрим, что&nbsp;следует убрать;</li>
<li>перебора комбинаций авторизации: вкладываем цикл с&nbsp;паролями в&nbsp;цикл с&nbsp;логинами, тестируем форму авторизации;</li>
<li>проверки на&nbsp;защиту от&nbsp;атак: отправляем в&nbsp;несколько потоков запросы на&nbsp;отправку форм и&nbsp;смотрим, работает ли&nbsp;ваша защита;</li>
<li>автоматизации API-систем: любые результаты запросов на&nbsp;API&nbsp;могут быть обработаны скриптом и&nbsp;использоваться в&nbsp;следующем шаге тест-цикла — так&nbsp;можно автоматизировать тестирование любой подобной системы.</li>
</ul>
<p>Из всего вышесказанного можно сделать общий вывод: JMeter — универсальный инструмент, настоящий швейцарский нож&nbsp;для&nbsp;тестировщика (да&nbsp;и&nbsp;для&nbsp;разработчика, если честно).</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    JMeter — швейцарский нож тестировщика (Часть 1)
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Поговорим о JMeter’е? Скорее всего, если вы в теме, то давно уже прочли всё об этом инструменте для нагрузочного тестирования. Но мне есть чем вас удивить. За три года работы в QA я понял, что JMeter очень универсален и может использоваться в самых разных целях.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/atypical-ways-to-use-jmeter/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/atypical-ways-to-use-jmeter/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:54 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>JMeter — швейцарский нож тестировщика (Часть 1)</h1>
                                <figure>
                                    <img src="/Media/1957/paul-felberbauer-tm16sjcyy84-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/037ba50d5da028b883ac2aad6adb2d87"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a6ea527cfc5a4cda844deacc1ebdf8d6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Поговорим о&nbsp;JMeter’е? Скорее всего, если вы&nbsp;в&nbsp;теме, то&nbsp;давно уже&nbsp;прочли всё&nbsp;об&nbsp;этом инструменте для&nbsp;нагрузочного тестирования. Но&nbsp;мне&nbsp;есть чем&nbsp;вас&nbsp;удивить. За&nbsp;три&nbsp;года работы в&nbsp;QA&nbsp;я&nbsp;понял, что&nbsp;JMeter очень универсален и&nbsp;может использоваться в&nbsp;самых разных целях. Например, для:</p>
<ul>
<li>поиска неуловимого бага с&nbsp;падением сайта у&nbsp;части юзеров;</li>
<li>быстрого прогрева кэша на&nbsp;тысячах страниц продуктов;</li>
<li>тестирования бэкенда мобильного приложения;</li>
<li>создания 2000 записей с&nbsp;данными пользователей в&nbsp;базе приложения в&nbsp;сжатые сроки. </li>
</ul>
<p>Получилось объемно, поэтому разобью статью на&nbsp;две&nbsp;части. </p>
<p><strong>Disclaimer:</strong> По&nbsp;понятным причинам я&nbsp;не&nbsp;вставляю в&nbsp;статью скриншоты из&nbsp;реальных проектов (или&nbsp;вымарываю из&nbsp;них&nbsp;всю&nbsp;важную информацию). Иллюстрации представлены исключительно в&nbsp;исследовательских и&nbsp;ознакомительных целях.</p>
<h2>Классическое применение JMeter</h2>
<p>JMeter — Java-апплет с&nbsp;GUI. Для&nbsp;тестирования он&nbsp;запускается без&nbsp;графического интерфейса. А&nbsp;для&nbsp;написания тестовых скриптов у&nbsp;него панель, в&nbsp;которой можно сделать всё&nbsp;что&nbsp;угодно. </p>


<figure class="umb-macro-image">
    


    <img src="/Media/1952/1.png"
         alt=""
         itemprop="">


        <figcaption>
            Так&nbsp;выглядит процесс создания скрипта (тут&nbsp;даже слово «написания» не&nbsp;подойдет)
        </figcaption>
</figure>

<p> </p>
<p>Создается общий Test Plan, в&nbsp;который закидывается Thread Group с&nbsp;основными элементами теста: контроллеры, управляющие процессом, и&nbsp;запросы (HTTP, FTP&nbsp;и&nbsp;т.д.). </p>
<p>Помимо этого есть дополнительные элементы для&nbsp;задания параметров. Например, HTTP Request Defaults позволяет указать основной сервер, заголовки и&nbsp;включить/выключить загрузку дополнительных ассетов (картинок, стилей, шрифтов и&nbsp;прочего). Разобраться несложно. А&nbsp;ещё&nbsp;можно сразу из&nbsp;этого интерфейса запустить тест и&nbsp;посмотреть на&nbsp;результаты. </p>
<p>JMeter умеет записывать такие тестовые сценарии. Он&nbsp;запускается в&nbsp;виде прокси на&nbsp;локальной машине и, если вы&nbsp;настроите браузер (или&nbsp;приложение), вести трафик через эту&nbsp;проксю, JMeter запишет все&nbsp;запросы и&nbsp;ответы. А&nbsp;из&nbsp;этого набора можно состряпать тестовый сценарий, который будет повторять действия пользователя, и&nbsp;запустить его&nbsp;где&nbsp;и&nbsp;когда угодно:</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1953/2.png"
         alt=""
         itemprop="">


</figure>

<p>Основная проблема — heap памяти самой Java. Он&nbsp;упирается в&nbsp;потолок и&nbsp;может упасть при&nbsp;50 потоках одновременного тестирования даже на&nbsp;топовых машинах. </p>
<p>Если для&nbsp;проведения полного нагрузочного тестирования мощности машины не&nbsp;хватает — обратитесь к&nbsp;сторонним организациям. Они&nbsp;развернули у&nbsp;себя инфраструктуру, являющуюся набором серверов. На&nbsp;них&nbsp;поднят тот&nbsp;же&nbsp;самый JMeter. За&nbsp;вознаграждение эти&nbsp;ребята запустят ваш&nbsp;скрипт у&nbsp;себя на&nbsp;любой нагрузке. Мы&nbsp;обращались за&nbsp;такими услугами в&nbsp;Octoperf и&nbsp;Blazemeter.</p>
<h2>Это футбол, детка: как&nbsp;мы&nbsp;ловили баг&nbsp;с&nbsp;частичным падением сервера</h2>
<p>Мы занимаемся веб-разработкой 18 лет&nbsp;(ура&nbsp;— теперь можно курить, жениться и&nbsp;смотреть «Джона Уика»). Клиентов на&nbsp;своём веку повидали немало, но&nbsp;самые крупные появились недавно. Например, мы&nbsp;сделали сайт на&nbsp;Sitecore для&nbsp;одного из&nbsp;футбольных клубов английской Премьер-лиги с&nbsp;парадигмой SPW&nbsp;(single page website: все&nbsp;страницы открываются без&nbsp;перезагрузки самой страницы браузера). Под&nbsp;капотом — админка для&nbsp;управления страницей живого матча. Это&nbsp;текстовая онлайн-трансляция игры: основные события (голы, удаления, штрафные удары) подгружаются автоматически из&nbsp;системы Opta, а&nbsp;фото, комментарии и&nbsp;репосты болельщиков из&nbsp;Twitter и&nbsp;Instagram публикуют живые люди — контент-менеджеры футбольного клуба.    </p>
<p>Не без&nbsp;гордости отмечу: после релиза британские СМИ&nbsp;выпустили статьи под&nbsp;заголовками вроде «Наконец-то гегемония старых сайтов футбольных клубов закончена». На&nbsp;тот&nbsp;момент у&nbsp;большинства клубов уже&nbsp;были сайты. Но&nbsp;выглядели они&nbsp;так, словно разрабатывались в&nbsp;начале нулевых и&nbsp;с&nbsp;тех&nbsp;пор&nbsp;не&nbsp;менялись — с&nbsp;соответствующим дизайном и&nbsp;UX.</p>
<p>Перед запуском мы&nbsp;провели полное нагрузочное тестирование и&nbsp;убедились, что&nbsp;всё&nbsp;работает как&nbsp;надо. Структура серверов выглядела так: </p>
<ol>
<li style="font-weight: 400;">запрос от&nbsp;клиента идёт на&nbsp;сервер распределения нагрузки → </li>
<li style="font-weight: 400;">сервер распределения нагрузки проверяет состояние восьми CD-серверов →  </li>
<li style="font-weight: 400;">сервер распределения нагрузки направляет запрос на&nbsp;наименее нагруженный CD-сервер →</li>
<li style="font-weight: 400;">CD-сервер отвечает клиенту. </li>
</ol>
<p>Через год&nbsp;после запуска во&nbsp;время большого наплыва юзеров на&nbsp;сайт клиент позвонил и&nbsp;сообщил, что&nbsp;сайт не&nbsp;работает: </p>
<p>— У&nbsp;нас&nbsp;сайт не&nbsp;работает! Вообще не&nbsp;работает! Просто белый экран и&nbsp;надпись от&nbsp;браузера, что&nbsp;сайт не&nbsp;работает! — говорит клиент. </p>
<p>Мы в&nbsp;панике открываем сайт, а&nbsp;с&nbsp;ним&nbsp;все&nbsp;ОК:</p>
<p>— Всё&nbsp;же&nbsp;работает, — отвечаем. </p>
<p>Клиент открывает сайт с&nbsp;телефона и&nbsp;компьютера и...у него тоже все&nbsp;ОК!</p>
<p>— Действительно, извините.  Видимо, у&nbsp;юзеров проблемы. </p>
<p>Такие сообщения на&nbsp;пустом месте не&nbsp;появляются, поэтому мы&nbsp;провели исследование: запустили утилиту для&nbsp;отслеживания состояние серверов Server Density и&nbsp;посмотрели, что&nbsp;происходит с&nbsp;ними во&nbsp;время наплыва пользователей на&nbsp;сайте:</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1954/3.png"
         alt=""
         itemprop="">


        <figcaption>
            Нагрузка есть, но&nbsp;все&nbsp;CD-сервера выглядят примерно одинаково и&nbsp;ровно
        </figcaption>
</figure>

<p>Скоро история повторилась — часть пользователей сообщили о&nbsp;полностью неработающем сайте. Это&nbsp;была не&nbsp;какая&#8209;то&nbsp;ошибка или&nbsp;ненайденная страница — сервер просто не&nbsp;отвечал на&nbsp;запрос. Отловить ситуацию получилось с&nbsp;помощью <strong>JMeter’а</strong>.</p>
<p>Цель была простой —  нагрузить все&nbsp;восемь серверов и&nbsp;посмотреть, что&nbsp;произойдёт. Стресс-тест проводили, когда в&nbsp;Челябинске занималась заря, а&nbsp;в&nbsp;Лондоне была глубокая ночь. Мы&nbsp;использовали несколько машин в&nbsp;безинтерфейсном режиме (он&nbsp;позволяет запускать гораздо больше потоков одновременно). Скрипт бесконечно открывал домашнюю страницу, и&nbsp;в&nbsp;этом и&nbsp;была наша основная ошибка.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1955/4.png"
         alt=""
         itemprop="">


</figure>

<p>Мы загружали одни и&nbsp;те&nbsp;же&nbsp;ассеты, которые уже&nbsp;сто&nbsp;раз&nbsp;закэшировались. Поэтому и&nbsp;нагрузка выходила незначительной. Тогда пришла идея: на&nbsp;сайте — вагон и&nbsp;маленькая тележка страниц с&nbsp;новостями за&nbsp;определённые даты. Если зарандомить пару переменных и&nbsp;подставить их&nbsp;в&nbsp;URL, мы&nbsp;всё&nbsp;время будем получать случайную страницу (например — <strong>...url/news/2016/08/23/?page=4</strong>). </p>
<p>Внезапно мы&nbsp;осознали, что&nbsp;Server Density имеет некое встроенное «сглаживание» в&nbsp;графике нагрузки на&nbsp;сервер за&nbsp;прошлые периоды. Если за&nbsp;пять минут нагрузка на&nbsp;сервер достигла 100%, потом упала до&nbsp;0%, а&nbsp;через 20-30 секунд выросла до&nbsp;90%, он&nbsp;покажет среднее значение за&nbsp;этот период — около 80-90%. Поэтому мы&nbsp;и&nbsp;не&nbsp;видели реального падения серверов. </p>
<p>Детально разобрав логи во&nbsp;время стресс-тестов, мы&nbsp;выяснили, что&nbsp;один из&nbsp;CD-серверов при&nbsp;стопроцентной загрузке уходил в&nbsp;ребут и&nbsp;никому об&nbsp;этом не&nbsp;сообщал (вот&nbsp;такой он&nbsp;интроверт).</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1956/5.png"
         alt=""
         itemprop="">


</figure>

<p>Сервер распределения нагрузки смотрел только на&nbsp;загрузку CPU&nbsp;всех серверов. Он&nbsp;видел, что&nbsp;один из&nbsp;них&nbsp;загружен на&nbsp;20%, а&nbsp;остальные — под&nbsp;90%, и&nbsp;отправлял юзера на&nbsp;первый. А&nbsp;он&nbsp;находился в&nbsp;ребуте и&nbsp;выдавал белый экран. Кроме того, сервер распределения выставлял юзеру куку и&nbsp;намертво привязывал его&nbsp;к&nbsp;неработающему серверу. Поэтому даже после обновления сайт был&nbsp;недоступен. Остальные 7 из&nbsp;8 юзеров при&nbsp;этом радовались жизни и&nbsp;говорили, что&nbsp;все&nbsp;работает. </p>
<p><strong>Вывод:</strong> мы&nbsp;выяснили, что&nbsp;JMeter можно использовать для&nbsp;стресс-тестов и&nbsp;одновременного анализа состояния серверов во&nbsp;время тестирования другими инструментами. Нам&nbsp;удалось «поймать» проблему с&nbsp;падением сайта у&nbsp;части пользователей и&nbsp;решить её, поправив логику распределения нагрузки и&nbsp;добавив контроль состояния. </p>
<p>В следующей части расскажу, как&nbsp;мы&nbsp;с&nbsp;помощью JMeter’а наладили процесс кэширования продуктовых страниц, проверили работу мобильного приложения без&nbsp;самого приложения и&nbsp;создали 2000 юзеров в&nbsp;системе без&nbsp;доступа к&nbsp;базе данных. </p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Master of Tickets: как урвать билет на концерт, если ты программист
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Фронтенд-разработчик Данил Шилов — о любви к хэви-метал, необычном подходе к охоте на билеты и упорстве настоящего программиста.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/master-of-tickets/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/master-of-tickets/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:53 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Master of Tickets: как урвать билет на концерт, если ты программист</h1>
                                <figure>
                                    <img src="/Media/1894/sebastian-ervi-1274720-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/06e4e1e90dde84c45cf0dd4384557719"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a5cc57deb7b941748c6875fa128c0a61"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>В феврале 2019 года я&nbsp;узнал, что&nbsp;Metallica, группа, которую я&nbsp;слушаю уже&nbsp;без&nbsp;малого 18 лет, собирается посетить Россию с&nbsp;концертом. Он&nbsp;пройдёт в&nbsp;Москве в&nbsp;спорткомплексе «Лужники» 21 июля. Естественно, я&nbsp;сразу вознамерился посетить его, но, как&nbsp;оказалось, билетов нет&nbsp;и&nbsp;не&nbsp;было уже&nbsp;с&nbsp;сентября прошлого года.</p>
<p>Фанаты утверждали, что&nbsp;билеты периодически появляются небольшими партиями на&nbsp;<a rel="noopener" href="https://msk.kassir.ru/" target="_blank" title="Сайт городских зрелищных касс">сайте официального продавца</a>. Отлично, подумал я, осталось только поймать момент! Но&nbsp;эти&nbsp;же&nbsp;люди выяснили, что&nbsp;билеты раскупают в&nbsp;течение 10 минут. <span style="font-weight: 400;">Упустить своё не&nbsp;хотелось, поэтому я&nbsp;решил быстро написать приложение на&nbsp;хорошо знакомом мне&nbsp;JavaScript, а&nbsp;заодно и&nbsp;изучить столько популярный сейчас Node.js.</span> Оно&nbsp;должно было периодически ходить на&nbsp;сайт продавца, парсить страницу и&nbsp;оповещать меня о&nbsp;появлении билетов.</p>
<p>Приложение я&nbsp;написал, но&nbsp;оно&nbsp;не&nbsp;работало как&nbsp;надо — просто переставало функционировать спустя некоторое время. Что&nbsp;интересно, ошибок никаких не&nbsp;было, и&nbsp;вообще — с&nbsp;виду всё&nbsp;было нормально. Периодически я&nbsp;делился своими наблюдениями с&nbsp;коллегами, и&nbsp;все&nbsp;настойчиво рекомендовали переписывать приложение под&nbsp;.NET (благо было кому подсказать, как&nbsp;работать с&nbsp;этой технологией). К&nbsp;тому времени я&nbsp;узнал, что&nbsp;кто&#8209;то&nbsp;написал бота «<a rel="noopener" href="https://vk.com/metallicabot" target="_blank" title="Бот для&nbsp;отслеживания билетов во&nbsp;«Вконтакте»">ВКонтакте</a>»  и&nbsp;решил задачу, но&nbsp;во&nbsp;мне&nbsp;уже&nbsp;играли спортивный азарт и&nbsp;любопытство. Так&nbsp;что&nbsp;я&nbsp;взялся за&nbsp;перенос проекта на&nbsp;новую платформу. Тем&nbsp;более, что&nbsp;основная логика занимала меньше <a rel="noopener" href="https://github.com/hostile-d/PageWatcher.js/blob/master/services/pageWatcher.js" target="_blank" title="Код на&nbsp;GitHub">100 строк на&nbsp;JavaSctipt</a>.</p>
<p>Долго ли, коротко ли, в&nbsp;апреле <a rel="noopener" href="http://page-watcher.danils.ru/" target="_blank" title="Готовый проект">проект</a> пошел на&nbsp;живой. А&nbsp;через пару дней после релиза прошло боевое крещение, настойчиво разбудив меня среди ночи и&nbsp;предложив купить заветный билет.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1893/screenshot-1.png"
         alt=""
         itemprop="">


        <figcaption>
            О&nbsp;том, что&nbsp;билеты появились в&nbsp;продаже, оповещает бот&nbsp;в&nbsp;Telegram
        </figcaption>
</figure>

<p>Как это&nbsp;работает? Всё&nbsp;просто: на&nbsp;<a rel="noopener" href="http://page-watcher.danils.ru/" target="_blank" title="Готовый проект">сайте</a> есть ссылка на&nbsp;группу в&nbsp;Telegram, в&nbsp;которой есть я&nbsp;и&nbsp;бот. Бот&nbsp;отправляет сообщение, как&nbsp;только на&nbsp;странице с&nbsp;билетами появляется таблица цен. Приложение ещё&nbsp;сырое, но&nbsp;оно&nbsp;работает. Отследить и&nbsp;купить билет — реально.</p>
<p>Я разместил <a rel="noopener" href="https://github.com/hostile-d/PageWatcher.Net" target="_blank" title="Код на&nbsp;GitHub">исходный код</a> нового приложения на&nbsp;C# на&nbsp;GitHub. Так&nbsp;что&nbsp;при&nbsp;желании вы&nbsp;можете переделать проект под&nbsp;себя и&nbsp;отследить, например, билеты на&nbsp;концерт Rammstein, Стаса Михайлова или&nbsp;любой другой интересующий вас&nbsp;ивент.</p>
<p>Хочу поблагодарить всех, кто&nbsp;помогал советом — это&nbsp;половина бэкендеров нашей компании. Возможно, я&nbsp;сам&nbsp;и&nbsp;не&nbsp;воспользуюсь приложением, но&nbsp;я&nbsp;уже&nbsp;получил огромное удовлетворение от&nbsp;своего первого pet&nbsp;project с&nbsp;реальным практическим применением.</p>
<p>P.S. Наблюдение по&nbsp;«Металлике» — билеты не&nbsp;раскупают за&nbsp;10 минут: в&nbsp;прошлый раз&nbsp;два&nbsp;выложенных места в&nbsp;фан-зоне забрали меньше, чем&nbsp;за&nbsp;две&nbsp;минуты. А&nbsp;билет в&nbsp;ложу продержался по&nbsp;меньшей мере полчаса.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Преимущества использования source map на проектах
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Source maps позволяют просматривать исходные файлы LESS (js, sass, stylus и тп.) в браузере.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/less-source-maps/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/less-source-maps/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:52 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Преимущества использования source map на проектах</h1>
                                <figure>
                                    <img src="/Media/1866/chris-lawton-346402-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/894ce800ca59e1abc1542fd3c6fc8841"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/acd3910d6fa14ef8a18a526f2b008824"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>При добавлении CSS&nbsp;в&nbsp;проект, обычной практикой является разделение таблицы стилей на&nbsp;несколько модулей или&nbsp;частей. Затем мы&nbsp;импортируем эти&nbsp;части вместе с&nbsp;другими в&nbsp;один индексный файл, используя директиву @import, после чего они&nbsp;будут собраны с&nbsp;помощью LESS препроцессора в&nbsp;один файл CSS. Вот&nbsp;здесь начинается проблема. Браузеры анализируют собранный CSS, а&nbsp;не&nbsp;ваши рабочие файлы, что&nbsp;в&nbsp;конечном итоге делает отладку стилей более сложной. Выяснить, из&nbsp;каких именно файлов получился собранный CSS, практически невозможно. </span></p>
<p><span>Проблему с&nbsp;отладкой можно решить, используя source maps. Source maps позволяют ассоциировать собранный код&nbsp;с&nbsp;исходным кодом вашего проекта и&nbsp;значительно облегчить его&nbsp;отладку. Давайте разберёмся, как&nbsp;добавить поддержку source maps в&nbsp;проект с&nbsp;LESS препроцессором.</span></p>


<figure class="umb-macro-image">
    


    <img src="/Media/1842/unnamed.jpg"
         alt=""
         itemprop="">


        <figcaption>
            CSS&nbsp;код&nbsp;без&nbsp;source map&nbsp;
        </figcaption>
</figure>

<p> </p>
<p>Не видно, из&nbsp;какого LESS-файла берутся стили, есть только reference на&nbsp;собранный core.css файл. Нужно активировать source maps. Подключим source maps — для&nbsp;этого добавим в&nbsp;Gruntfile.js поддержку Source maps:</p>
<pre><code class="language-js">less: {
   dev: {
  options: {
     paths: [<span class="hljs-string">"assets/css/config"</span>, <span class="hljs-string">"assets/css/modules"</span>, <span class="hljs-string">"assets/css/modules/icheck/minimal"</span>]
<span class="hljs-built_in">     source</span>Map: <span class="hljs-literal">true</span>,
<span class="hljs-built_in">     source</span>MapFilename: <span class="hljs-string">'/assets/css/core.css.map'</span>,
<span class="hljs-built_in">     source</span>MapRootpath: <span class="hljs-string">''</span>
     //compress: <span class="hljs-literal">true</span>
    },
    files: {
<span class="hljs-string">     "assets/css/core.css"</span>: <span class="hljs-string">"assets/css/core.less"</span>
    }
  }
}</code></pre>
<p>При запуске будет создан grunt, начнёт обновляться файл core.css.map, а&nbsp;в&nbsp;core.css в&nbsp;самый конец файла добавится строка:/*# sourceMappingURL=/assets/css/core.css.map*. Теперь в&nbsp;Chrome DevTools мы&nbsp;сможем просматривать исходники LESS вот&nbsp;так&nbsp;(в&nbsp;Firebug не&nbsp;работает, но&nbsp;может есть какие&#8209;то&nbsp;дополнения, если поискать):</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1841/unnamed-1.jpg"
         alt=""
         itemprop="">


        <figcaption>
            CSS&nbsp;код&nbsp;с&nbsp;source map&nbsp;
        </figcaption>
</figure>

<p>т.е. видно прямой reference на&nbsp;blocks.less вместо ссылки на&nbsp;скомпилированный core.css.</p>
<p>Можно, конечно, обходиться и&nbsp;без&nbsp;source map, но&nbsp;на&nbsp;большом проекте с&nbsp;множеством LESS-файлов удобство работы с&nbsp;LESS будет ощутимо.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Работа с Canvas и Paper.js на проекте Qatar Airways
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Хочу рассказать немного про мой опыт работы с Canvas на проекте Qatar Airways.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/qatar-airways-paperjs/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/qatar-airways-paperjs/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:52 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Работа с Canvas и Paper.js на проекте Qatar Airways</h1>
                                <figure>
                                    <img src="/Media/1865/luka-slapnicar-1197738-unsplash.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/25621c959a1eae4dde2065fa1ce338e1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3c943bcbee3143529cc321e6b0195d51"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Хочу рассказать немного про&nbsp;мой&nbsp;опыт работы с&nbsp;Canvas. Нюансов много, но&nbsp;я&nbsp;бы&nbsp;хотел остановиться на&nbsp;подготовительных моментах. В&nbsp;проекте, над&nbsp;которым я&nbsp;в&nbsp;настоящий момент работаю, потребовалось создать картинку, которая является результатом выбора пользователем нескольких опций. Для&nbsp;этого я&nbsp;использовал<span> </span><a rel="noopener" href="http://paperjs.org/" target="_blank" title="Сайт библиотеки Paper.js">Paper.js</a><span> —</span> библиотеку для&nbsp;работы с&nbsp;Canvas-графикой.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/1887/image1.png"
         alt=""
         itemprop="">


        <figcaption>
            Так&nbsp;выглядит готовая картинка
        </figcaption>
</figure>

<p>В таких проектах удобно разрабатывать Canvas-функциональность отдельно от&nbsp;основного проекта, для&nbsp;которого эта&nbsp;часть предназначена. Это&nbsp;позволит не&nbsp;дожидаться готовности серверной части, а&nbsp;на&nbsp;какой&#8209;то&nbsp;стадии готовности просто встроить ваш&nbsp;компонент. У&nbsp;меня это&nbsp;был&nbsp;просто HTML-проект. Его&nbsp;можно было даже в&nbsp;репозиторий добавить. С&nbsp;какого&#8209;то&nbsp;момента все&nbsp;исправления я&nbsp;стал вносить уже&nbsp;в&nbsp;общий проект.</p>
<p>Требуйте четких инструкций и&nbsp;разъяснений по&nbsp;дизайну. В&nbsp;моём случае после долгой переписки появился конкретный styleguide для&nbsp;моего компонента, который во&nbsp;многом облегчил реализацию.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1888/image2.png"
         alt=""
         itemprop="">


        <figcaption>
            Уточнённый styleguide для&nbsp;компонента
        </figcaption>
</figure>

<p>Нужно сразу согласовать с&nbsp;дизайнерами точные размеры всех готовых картинок. Я, к&nbsp;примеру, до&nbsp;последнего не&nbsp;знал, что&nbsp;облака на&nbsp;заднем плане будут включаться в&nbsp;готовую картинку или&nbsp;что&nbsp;для&nbsp;facebook-шаринга нужны картинки больше, чем&nbsp;810 px. В&nbsp;общем, всё, в&nbsp;чём&nbsp;вы&nbsp;сомневаетесь, нужно уточнять и&nbsp;переуточнять, даже если уже&nbsp;сделали это&nbsp;в&nbsp;начале проекта.</p>
<p>Ассеты: для&nbsp;правильного отображения шрифтов и&nbsp;картинок, используемых в&nbsp;Canvas, все&nbsp;они&nbsp;должны быть загружены к&nbsp;моменту инициализации Canvas.</p>
<p>Шрифты: если сайт будет портирован на&nbsp;несколько языков, заранее проверьте, что&nbsp;шрифт содержит специфические языковые глифы (например немецкие умляуты), иначе получится так:</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1889/image3.png"
         alt=""
         itemprop="">


        <figcaption>
            Символы с&nbsp;умляутами «выпали» из&nbsp;шрифта — получилось очень некрасиво
        </figcaption>
</figure>

<p> </p>
<p>Для отслеживания момента загрузки шрифтов я&nbsp;использовал<span> </span><a rel="noopener" href="https://developers.google.com/fonts/docs/webfont_loader" target="_blank" title="Библиотека для&nbsp;шрифтов Web&nbsp;Font Loader">Web Font Loader</a>. Здесь все&nbsp;достаточно просто:</p>
<ul>
<li>создаем fonts.css, куда добавляем все&nbsp;шрифты, которые нужно загрузить;</li>
<li>подключаем font loade;</li>
<li>вызываем собственно загрузчик;</li>
</ul>
<p>Картинки тоже должны быть загружены, иначе на&nbsp; Canvas они&nbsp;не&nbsp;появятся. Делаем это&nbsp;достаточно просто: создаем скрытый Div&nbsp;и&nbsp;кладем туда все&nbsp;картинки. Затем с&nbsp;помощью ImagesLoaded проверяем, все&nbsp;ли&nbsp;картинки загрузились и&nbsp;если да, то&nbsp;стартуем<span> </span><a rel="noopener" href="http://desandro.github.io/imagesloaded/" target="_blank" title="Библиотека для&nbsp;отслеживания картинок">ImagesLoaded.</a></p>
<p>В следующий раз&nbsp;постараюсь рассказать непосредственно про&nbsp;сам&nbsp;проект и&nbsp;в&nbsp;большей степени про&nbsp;Paper.js.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Баги рендеринга в браузере Chrome
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    К несчастью, я очень часто ловлю баги, связанные с рендерингом элементов в хроме, а найти и зафиксить их - целая проблема.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/chrome-rendering-bugs/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/chrome-rendering-bugs/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:51 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Баги рендеринга в браузере Chrome</h1>
                                <figure>
                                    <img src="/Media/1825/chrome-mobile.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3a271e1e3cabcc39238f7b30ee17dbac"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/53f57a14d1ee4339852bbf06c36c1b06"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>К несчастью, я&nbsp;очень часто ловлю баги, связанные с&nbsp;рендерингом элементов в&nbsp;«Хроме». А&nbsp;найти и&nbsp;зафиксить их&nbsp;— целая проблема. Как&nbsp;правило, на&nbsp;это&nbsp;уходит не&nbsp;один день утомительных поисков. Поэтому расскажу о&nbsp;них&nbsp;здесь — вдруг кому пригодится.</p>
<p>Итак, если у&nbsp;вас&nbsp;возникла проблема с&nbsp;рендерингом (и&nbsp;нужный вам&nbsp;элемент по&nbsp;какой&#8209;то&nbsp;причине не&nbsp;отрисовывается вообще или&nbsp;не&nbsp;перерисовывается нужным образом), проверяйте следующее:</p>
<p><strong>Translate3d</strong></p>
<ul>
<li>На LeedsUni у&nbsp;меня была карусель, и&nbsp;на&nbsp;ней&nbsp;возник следующий баг: когда слайдер сдвигался влево, вместо левого слайда отображался самый левый слайд, а&nbsp;не&nbsp;предыдущий. В&nbsp;коде при&nbsp;этом всё&nbsp;было правильно, т.е. нужный мне&nbsp;элемент просто не&nbsp;прорисовывался. После нескольких дней усердных поисков выяснилось, что&nbsp;карусель использует для&nbsp;сдвига элементов в&nbsp;«Хроме» translate3d. Простая замена translate3d на&nbsp;translate решила проблему.</li>
<li>Сейчас работаю с&nbsp;Mapbox. Нужно было опять реализовать карусель, но&nbsp;с&nbsp;fade-эффектом. На&nbsp;блоке с&nbsp;Mapbox fade-эффект не&nbsp;работал, т.к. свойство opacity не&nbsp;применялось. Опять же, после усердных поисков выяснилось, что&nbsp;для&nbsp;некоторых элементов карты применяется translate3d (маркеры, слои). Замена в&nbsp;коде translate3d на&nbsp;translate снова решило проблему.</li>
</ul>
<p>В связи с&nbsp;этим хочу сказать, что&nbsp;translate3d может не&nbsp;только избавить вас&nbsp;от&nbsp;проблем с&nbsp;мерцанием и&nbsp;плохой отрисовкой, но&nbsp;и&nbsp;добавить вам&nbsp;таковых. Применяйте его&nbsp;осторожно.</p>
<p><strong>Opacity и&nbsp;z-index</strong></p>
<p>С той&nbsp;же&nbsp;самой каруселью с&nbsp;fade-эффектом, о&nbsp;которой говорила ранее, обнаружился ещё&nbsp;один баг&nbsp;в&nbsp;«Хроме». Для&nbsp;реализации fade-эффекта использовалось изменения z-index и&nbsp;opacity. Но&nbsp;на&nbsp;некоторые блоки opacity почему&#8209;то&nbsp;не&nbsp;накладывалось, и&nbsp;элементы при&nbsp;сдвиге карусели оставались непрозрачными, fade эффекта не&nbsp;наблюдалось вообще, и&nbsp;всё&nbsp;было очень некрасиво. Opacity:1 вообще приводило к&nbsp;тому, что&nbsp;элементы опять же&nbsp;не&nbsp;отрисовывались.</p>
<p>Оказалось, что&nbsp;в&nbsp;некоторых страницах карусели я&nbsp;для&nbsp;фона использовала видео и&nbsp;слайдеры. Чтобы эти&nbsp;элементы не&nbsp;перекрывали текст, я&nbsp;им&nbsp;добавила отрицательные z-index. Видимо, «Хром» считал, что&nbsp;раз&nbsp;z-index отрицательный, то&nbsp;и&nbsp;перерисовывать элемент не&nbsp;надо. Всё&nbsp;исправилось увеличением z-index &gt; 0.</p>
<p><strong>Вывод:</strong> старайтесь не&nbsp;использовать отрицательный z-index, а&nbsp;если используете — внимательно тестируйте всё&nbsp;в&nbsp;«Хроме» на&nbsp;предмет рендеринга.</p>
<p>Вот и&nbsp;всё. Надеюсь, это&nbsp;однажды поможет кому&#8209;то&nbsp;сэкономить много времени :)</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Баг с шириной в процентах и как его фиксить
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    Рассмотрим баг, который возникает в браузере Chrome при квадратной сетке и ширине элементов, заданной в процентах.
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/chrome-width-bug/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/chrome-width-bug/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:50 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Баг с шириной в процентах и как его фиксить</h1>
                                <figure>
                                    <img src="/Media/1864/code-coding-computer-574073.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1596967d70b99efa0611c88263f8fabe"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/536b9b3fecc74623ae4f18ee8c8f0bad"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Всем привет, сегодня натолкнулась на&nbsp;интересный баг.</p>
<p>Есть квадратная сетка:</p>
<pre><code class="language-html">&lt;div class="grid"&gt;
&lt;div class="item"&gt;&lt;/div&gt;
&lt;div class="item"&gt;&lt;/div&gt;
&lt;div class="item"&gt;&lt;/div&gt;
&lt;div class="item"&gt;&lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>Ширина каждого элемента .item задана в&nbsp;процентах и&nbsp;различается, в&nbsp;зависимости от&nbsp;ширины экрана. У&nbsp;меня она&nbsp;определялась такой вот&nbsp;функцией:</p>
<pre><code class="language-css"><span class="hljs-class">.grid-cell</span>(<span class="hljs-at_rule">@<span class="hljs-keyword">n,</span> @parent: <span class="hljs-number">100%</span>)</span>{
<span class="hljs-at_rule">@<span class="hljs-keyword">width:</span> @parent / @n</span>;
<span class="hljs-tag">height</span>: <span class="hljs-tag">-1px</span>;
<span class="hljs-tag">width</span>: <span class="hljs-at_rule">@<span class="hljs-keyword">width;</span>
padding-bottom: @width</span>;}</code></pre>
<p>Здесь n&nbsp;&#151; число колонок для&nbsp;текущей ширины.</p>
<p>В&nbsp;&laquo;Хроме&raquo; при&nbsp;рендеринге обнаруживалось, что&nbsp;для&nbsp;некоторой ширины экрана между колонками или&nbsp;между рядами появляется лишний, никем не&nbsp;занятый, пиксель. Возникает это&nbsp;из&#8209;за&nbsp;различного округления дробный пикселей в&nbsp;разных браузерах (подробнее<span> </span><a rel="noopener" href="http://stackoverflow.com/questions/16148155/absolute-positioning-element-100-width-inside-relative-positioned-container-bug" target="_blank" title="Сайт Stackoverflow">тут</a><span> </span>и<span>&nbsp;</span><a rel="noopener" href="http://ejohn.org/blog/sub-pixel-problems-in-css/" target="_blank" title="Сайт эксперта Джона Резига">тут</a>).</p>
<p>Фикс заключается в&nbsp;том, что&nbsp;для&nbsp;.item прописываем:</p>
<pre><code class="language-css"><span class="hljs-class">.item</span><span class="hljs-rules">{
<span class="hljs-rule"><span class="hljs-attribute">margin-right</span>:<span class="hljs-value"> -<span class="hljs-number">1px</span></span></span>;
<span class="hljs-rule"><span class="hljs-attribute">margin-bottom</span>:<span class="hljs-value"> -<span class="hljs-number">1px</span></span></span>;<span class="hljs-rule">}</span></span></code></pre>
<p>Всё&nbsp;же надеюсь, что&nbsp;подобных проблем ни&nbsp;у&nbsp;кого больше не&nbsp;возникнет.</p>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Краткий обзор Apache Kafka
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    В этой статье мы рассмотрим брокер сообщений Apache Kafka
                    ]]>
                </description>
                <link>http://fuse8.ru/articles/apache-kafka/</link>
                <guid isPermaLink="true">http://fuse8.ru/articles/apache-kafka/</guid>

                <pubDate>Fri, 27 Sep 2024 13:56:49 GMT</pubDate>


                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Краткий обзор Apache Kafka</h1>
                                <figure>
                                    <img src="/Media/1824/apache-kafka.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/ca45cf8b38541560018ce7ce4fe191e2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/cb7338b69aa74ea1a5c5ada96504a1d6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><a rel="noopener" href="https://kafka.apache.org/" target="_blank" title="Брокер сообщений Apache Kafka">Apache Kafka</a><span> —</span> брокер сообщений, реализующий паттерн Producer-Consumer с&nbsp;хорошими способностями к&nbsp;горизонтальному масштабированию. Это&nbsp;Open Source разработка, созданная компанией LinkedIn на&nbsp;JVM&nbsp;стеке (Scala).</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1378/apache1.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Паттерн Producer-Consumer — типичная очередь
        </figcaption>
</figure>

<p>Горизонтально масштабируя какую-либо систему, вы&nbsp;поневоле делаете её&nbsp;распределённой, а&nbsp;работа с&nbsp;распределённой системой имеет свои особенности.</p>
<p>Формально, для&nbsp;описания свойств распределённых систем существует CAP-теорема.</p>
<p><strong>В распределённой системе невозможно обеспечить одновременное выполнение всех трёх свойств: консистентности, доступности, устойчивости к&nbsp;сбоям узлов.</strong></p>
<p>Что это&nbsp;за&nbsp;свойства:</p>
<dl>
<dt><em>Консистентность (Consistency)</em></dt>
<dd>Говорит о&nbsp;том, что&nbsp;система всегда выдаёт только логически непротиворечивые ответы. Не&nbsp;бывает такого, что&nbsp;вы&nbsp;добавили в&nbsp;корзину товар, а&nbsp;после рефреша страницы его&nbsp;там&nbsp;не&nbsp;видите.</dd>
</dl>
<dl>
<dt><em>Доступность (Availability)</em></dt>
<dd>Означает, что&nbsp;сервис отвечает на&nbsp;запросы, а&nbsp;не&nbsp;выдаёт ошибки о&nbsp;том, что&nbsp;он&nbsp;недоступен.</dd>
</dl>
<dl>
<dt><em>Устойчивость к&nbsp;сбоям сети (Partition tolerance)</em></dt>
<dd>Означает, что&nbsp;распределённая по&nbsp;кластеру система работает в&nbsp;расчёте на&nbsp;случаи произвольной потери пакетов внутри сети.</dd>
</dl>
<p>С точки зрения CAP-теоремы, Kafka имеет CA*, т.е. выполняются условия консистентности и&nbsp;доступности, но&nbsp;не&nbsp;гарантируется устойчивость к&nbsp;сбоям в&nbsp;сети — по<span> </span><a rel="noopener" href="https://www.youtube.com/watch?v=skD7pRDGqF4&amp;t=1253s" target="_blank" title="Видео: Андрей Панасюк — Kafka in&nbsp;production" data-anchor="?v=skD7pRDGqF4&amp;t=1253s">отзывам</a><span> </span>пользователей, Kafka не&nbsp;очень устойчива к&nbsp;netsplit (моменту, когда ваш&nbsp;кластер, например, разваливается пополам), хотя официальной документации на&nbsp;этот счёт мы&nbsp;не&nbsp;нашли.</p>
<p>На самом низком уровне Kafka — это&nbsp;просто распределённый лог-файл. То&nbsp;есть, по&nbsp;сути, файл, разбитый на&nbsp;несколько частей (партиций) и&nbsp;«раскатанный» на&nbsp;несколько узлов кластера. Запись в&nbsp;этот файл всегда происходит в&nbsp;конец. Разделение файла на&nbsp;части необходимо для&nbsp;ускорения чтения из&nbsp;очереди и&nbsp;горизонтального масштабирования. Ваш&nbsp;Topic (тема) может быть «порезан» на&nbsp;сколько угодно частей. Соответственно, вы&nbsp;можете разделить Topic на&nbsp;сколько угодно серверов. Из&nbsp;каждой партиции может читать не&nbsp;более одного Consumer (читатель). Это&nbsp;значит, что&nbsp;максимальное число параллельных читателей равно количеству частей, на&nbsp;которые разбит ваш&nbsp;Topic.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1380/apache2.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Внутренне устройство Topic
        </figcaption>
</figure>

<p>Соответственно, для&nbsp;одной партиции топика гарантируется очерёдность сообщений, так&nbsp;как&nbsp;из&nbsp;каждой партиции может читать не&nbsp;более одного читателя.</p>
<p>У каждого сообщения есть свой сквозной номер внутри патриции. В&nbsp;терминах Kafka это&nbsp;называется offset. При&nbsp;чтении из&nbsp;партиции читатель делает коммит оффсета. Это&nbsp;необходимо для&nbsp;того, чтобы, если, например, текущий читатель упадёт, то&nbsp;следующий (новый читатель) начнёт с&nbsp;последнего коммита.</p>


<figure class="umb-macro-image">
    


    <img src="/Media/1381/apache3.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Группа читателей
        </figcaption>
</figure>

<p>Читатели объединяются в&nbsp;группы, что&nbsp;так&nbsp;и&nbsp;называется — consumer group. При&nbsp;добавлении нового читателя или&nbsp;падении текущего, группа перебалансирутся. Это&nbsp;занимает какое&#8209;то&nbsp;время, поэтому лучший способ чтения — подключить читателя и&nbsp;не&nbsp;переподключать его&nbsp;без&nbsp;необходимости.</p>
<p>Что касается<span> </span><em>доступности</em>, Kafka обеспечивает репликацию сообщений и<span> </span><em>disk persistence</em>, сохраняя сообщения на&nbsp;диск.</p>
<p> </p>


<figure class="umb-macro-image">
    


    <img src="/Media/1379/apache4.jpg"
         alt=""
         itemprop="">


        <figcaption>
            Репликация
        </figcaption>
</figure>

<p>Формат репликации называется InSync. Это&nbsp;значит, что&nbsp;слейвы (в&nbsp;терминах Kafka это&nbsp;фолловеры) сами постоянно спрашивают мастера о&nbsp;новых сообщениях. Это&nbsp;pull-модель. Синхронностью/асинхронностью репликации вы&nbsp;можете управлять сами, указывая какие гарантии (acknowledgement) вы&nbsp;хотите получить при&nbsp;записи в&nbsp;очередь. Kafka поддерживает три&nbsp;режима:</p>
<ul>
<li>отправить и&nbsp;не&nbsp;дожидаться подтверждения записи;</li>
<li>отправить и&nbsp;дождаться подтверждения на&nbsp;мастер-ноде;</li>
<li>отправить и&nbsp;дождаться подтверждения на&nbsp;всех репликах.</li>
</ul>
<p>Вы должны найти компромисс между возможностью потери сообщений и&nbsp;минимальным откликом приложения. Чем&nbsp;выше гарантии доставки, тем, соответственно, дольше запись в&nbsp;очередь.</p>
<p>Поскольку Kafka гарантирует консистентность, для&nbsp;читателей сообщение будет видно только после записи по&nbsp;всем репликам. Репликация происходит отдельно для&nbsp;каждой партиции в&nbsp;топике.</p>
<p>Если вспомнить про&nbsp;disk persistence, то&nbsp;он&nbsp;вытекает из&nbsp;устройства Kafka. Так&nbsp;как&nbsp;вся&nbsp;система — это&nbsp;просто лог, то&nbsp;все&nbsp;сообщения в&nbsp;любом случае попадают на&nbsp;диск и&nbsp;это&nbsp;невозможно выключить, но&nbsp;в&nbsp;конфигурации можно подкрутить ручку, какими периодами сообщения падают на&nbsp;диск. Что, соответственно, уменьшит ваши гарантии на&nbsp;потерю сообщений, но&nbsp;увеличит производительность.</p>
<p>Клиенты для&nbsp;Kafka достаточно интеллектуальные и&nbsp;работают на&nbsp;уровне TCP. В&nbsp;коробке с&nbsp;Kafka лежит клиент на&nbsp;Java (так&nbsp;как&nbsp;сама Kafka написана на&nbsp;Scala) и&nbsp;библиотека на&nbsp;C.</p>
<p> </p>
<p>Для тех, кто&nbsp;пишет на&nbsp;.NET или, например, Python, существуют<span> </span><a rel="noopener" href="https://github.com/confluentinc/confluent-kafka-python" target="_blank" title="GitHub">open source биндинги</a><span> </span>к этой библиотеке на&nbsp;С. Так&nbsp;как&nbsp;это&nbsp;open source разработки, исходный код&nbsp;у&nbsp;вас&nbsp;на&nbsp;руках. Другое дело, что&nbsp;и&nbsp;патчить иногда придётся вам.</p>
<p>Мы работаем на&nbsp;платформе .NET, поэтому примеры кода выкладываю под&nbsp;.NET:<span> </span><a rel="noopener" href="https://bitbucket.org/fuse8ru/kafka-demo_git/src/master/" target="_blank">примеры простой записи-чтения из&nbsp;шины.</a></p>
<p><strong>Выводы:</strong> Apache Kafka менее удобна, чем&nbsp;тот&nbsp;же&nbsp;RabbitMQ, но&nbsp;если вы&nbsp;не&nbsp;можете терять сообщения, то&nbsp;вариант с&nbsp;Kafka подходит больше. К&nbsp;тому же&nbsp;у&nbsp;Kafka гораздо больше scalability (расширяемость).</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Редизайн страницы товара в интернет-магазине forsarm.ru
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/fors/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/fors/</guid>

                <pubDate>Fri, 27 Sep 2024 11:35:14 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x412;&#x435;&#x431;-&#x434;&#x438;&#x437;&#x430;&#x439;&#x43D;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Редизайн страницы товара в интернет-магазине forsarm.ru</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/4511d1950dbdefc36eb2d36d62a7cf8e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-top" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/9739cdce73174f52ad5876a6e0b86073"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><img class="fors-top__logo" src="/Media/2299/fors-logo.png" alt=""></p>
<h1>Редизайн страницы товара в&nbsp; интернет-магазине forsarm.ru</h1>
<p>Компания FORS продаёт сантехнику и&nbsp;комплектующие для&nbsp; монтажа инженерных систем, связанных с&nbsp;водоснабжением и&nbsp; водоотведением. В&nbsp; ассортименте — собственная продукция и&nbsp; товары партнёров.</p>
<p>Нас FORS попросили проанализировать интерфейс страницы товара и&nbsp; сделать её&nbsp; редизайн.</p>
<p><strong>Глобальная цель</strong> — увеличить количество заказов в&nbsp; интернет-магазине.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/d8cc5166d6be444c92caaaf54cc2566f"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--57774573">
    


    <img src="/Media/2294/image-60.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--57774573 {
                    /* manual inline */
                    margin-right:-201px;
                }
            }
            </style>
</div>

        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/056f07c8fca742159ecbdf4d828420ae"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><a rel="noopener" href="https://47.ru/products/5286-Kran-sharovoj-latunnyj-gallop-standart-231-dn15-12-vr-nr-babochka-0103165?e=search&amp;query=%D0%BA%D1%80%D0%B0%D0%BD%20%D1%88%D0%B0%D1%80%D0%BE%D0%B2%D0%BE%D0%B9?search=%D0%9A%D1%80%D0%B0%D0%BD%20%D0%BB%D0%B0%D1%82%D1%83%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%88%D0%B0%D1%80%D0%BE%D0%B2%D0%BE%D0%B9%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BC%D0%B0%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B0&amp;tag=%D0%9A%D1%80%D0%B0%D0%BD%20%D0%BB%D0%B0%D1%82%D1%83%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%88%D0%B0%D1%80%D0%BE%D0%B2%D0%BE%D0%B9%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BC%D0%B0%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B0" target="_blank" class="fors-top__button button button--contured button--primary" data-anchor="?search=%D0%9A%D1%80%D0%B0%D0%BD%20%D0%BB%D0%B0%D1%82%D1%83%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%88%D0%B0%D1%80%D0%BE%D0%B2%D0%BE%D0%B9%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BC%D0%B0%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B0&amp;tag=%D0%9A%D1%80%D0%B0%D0%BD%20%D0%BB%D0%B0%D1%82%D1%83%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%88%D0%B0%D1%80%D0%BE%D0%B2%D0%BE%D0%B9%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BC%D0%B0%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B0">Посмотреть результат</a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/aaf7c786c6e83cca47e0c17d1c347361"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-about" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b3ec56696d044cd3958fa889bb04cc40"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>О проекте</h2>
<div class="fors-about__specs">
<p>Старт: декабрь 2019</p>
<p>Запуск: март 2020</p>
<p>Бюджет: ≈ <strong>50 000</strong> ₽</p>
</div>
<div class="fors-about__stages">
<div class="fors-about__stage stage">
<div class="stage__point stage__point--design"></div>
<p class="stage__name">Дизайн</p>
<p class="stage__time">3 недели</p>
</div>
<div class="fors-about__stage stage" style="width: 50%;">
<div class="stage__point stage__point--development"></div>
<p class="stage__name">Разработка</p>
<p class="stage__time">1,5 месяца</p>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="threeColumns"
            data-content-element-type-key="c9b72d31-8ab3-38f4-b5fb-a9a9814ae17a"
            data-element-udi="umb://element/42ebb758239a96f6432a4b9a57c6be87"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-team" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3e67d75fd4c348c4b90082cc46ef088b"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p class="fors-team__subtitle fors-team__subtitle--fuse8">Команда fuse8</p>
<p class="fors-team__position">Руководитель проектов</p>
<p class="fors-team__name">Вениамин Мустафин</p>
<p class="fors-team__position">Дизайнер</p>
<p class="fors-team__name">Алексей Пилишков</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c4ec49fb081941959d30120a646f8f23"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p class="fors-team__subtitle fors-team__subtitle--fors">Команда FORS</p>
<p class="fors-team__position">Директор по&nbsp;маркетингу</p>
<p class="fors-team__name">Тимур Кушакаев</p>
<p class="fors-team__position">Разработчик</p>
<p class="fors-team__name">Артём Ванат</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/81b210daa7c4306c15068d199de7d193"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-result" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7857f79aceee4064aa4268818b4bd586"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Результатом стала новая страница товара, на&nbsp;которой есть всё&nbsp;важное для&nbsp;покупателя — характеристики товара, цена, наличие, условия и&nbsp; способы доставки. Здесь же&nbsp;можно заказать установку приобретённого оборудования.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/37750bcba8cc3df6a8489b25193dbeff"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-result-image" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/5e2857202885495c81d2e3fa0387f1cc"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2293/8.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/f36ed77253b78ce75baa11ca3db734f1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-how-it-started" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a75563a8b96e4a5d8dd32e06798138eb"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>С чего всё&nbsp;начиналось</h2>
<p>FORS пришли к&nbsp;нам&nbsp;с&nbsp;проблемой — их&nbsp;интернет-магазин не&nbsp; приносил желаемой конверсии, казался перегруженным, неудобным и&nbsp;непонятным для&nbsp; пользователя. Ребята хотели перемен, но&nbsp; поскольку раньше с&nbsp;нами не&nbsp; работали, решили начать с&nbsp; малого — с&nbsp; переделки только страницы товара.</p>
<p>План был&nbsp;такой: на&nbsp; небольшом проекте познакомиться друг с&nbsp; другом, понять, сработаемся ли&nbsp;мы&nbsp;в&nbsp; будущем, и, в&nbsp;случае успеха, продолжить сотрудничество.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/ae491dfbf352a924202aef33b398bc77"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-process" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1a6aec8e2ea84d5ca27ff777956dbf16"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Процесс</h2>
<p>Редизайн страницы товара мы&nbsp;провели в&nbsp;три&nbsp;этапа:</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="threeColumns"
            data-content-element-type-key="c9b72d31-8ab3-38f4-b5fb-a9a9814ae17a"
            data-element-udi="umb://element/802566bf09d1f20c2cee65d8da44680c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-process-stages" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium fors-process__stage spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bb45c38b4cf94bc4b623cd572407132f"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="fors-process__stage-inner">
<p class="fors-process__number">1</p>
<p class="fors-process__label">Собрали требования и&nbsp; провели аудит</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium fors-process__stage spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/08dc630bb8454b12b5fe86a7d80e0769"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="fors-process__stage-inner">
<p class="fors-process__number">2</p>
<p class="fors-process__label">Создали прототипы для&nbsp; десктопа и&nbsp; мобильных устройств</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium fors-process__stage spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e05f69a2d8c5480699250e4d5a5d78db"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="fors-process__stage-inner">
<p class="fors-process__number">3</p>
<p class="fors-process__label">Разработали дизайн-макеты</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/d45be68222048f3af7c15d43e574464f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-process-info" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c3367dbbf780417792b2661e77702861"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>На каждом этапе мы&nbsp;много и&nbsp; часто общались с&nbsp; командой заказчика — задавали вопросы, показывали промежуточные результаты, после получения обратной связи корректировали курс.</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/55b290dec95ac9774bd3aaee877fbc12"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-audit" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/7957680b1d6b45e48a6d684da9b1d469"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p class="fors-case__title-label">1 этап</p>
<h3>Сбор данных и&nbsp;аудит интерфейса страницы товара</h3>
<p>Первое, что&nbsp;мы&nbsp;сделали — изучили целевую аудиторию интернет-магазина FORS.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="threeColumns"
            data-content-element-type-key="c9b72d31-8ab3-38f4-b5fb-a9a9814ae17a"
            data-element-udi="umb://element/bbcab2d1eb3ca9902deb5d226445f91b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-audit-audience" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c8189cf6beb844b89ce2da4b757d9e0e"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="fors-audit-audience-type">

<figure class="umb-macro-image">
    


    <img src="/Media/2300/ca-icon-1.png"
         alt=""
         itemprop="">


</figure>

<div class="fors-audit-audience-type__text">
<h3>Физическое лицо</h3>
<p>Не специалист, ему&nbsp;просто нужно сделать ремонт в&nbsp; ванной.</p>
<div></div>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c7042d2bc81a4a5a8f900c172e4633ec"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="fors-audit-audience-type">

<figure class="umb-macro-image">
    


    <img src="/Media/2301/ca-icon-2.png"
         alt=""
         itemprop="">


</figure>

<div class="fors-audit-audience-type__text">
<h3>Монтажник</h3>
<p>Специалист, делает ремонт тем, кто&nbsp;не&nbsp; умеет или&nbsp;не&nbsp; хочет сам.</p>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8a8d994de3884c7bbb6c6190cadaeb3b"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="fors-audit-audience-type">

<figure class="umb-macro-image">
    


    <img src="/Media/2302/ca-icon-3.png"
         alt=""
         itemprop="">


</figure>

<div class="fors-audit-audience-type__text">
<h3>Снабженец</h3>
<p>Юридическое лицо, закупает крупные партии товара для&nbsp; строительных компаний.</p>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/939f91df31ee79424579ed193efd6911"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-audit-info" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/972de5ae7b6646d3b97a012f13500a68"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Заказчик предоставил нам&nbsp;данные Яндекс.Метрики и&nbsp; карту кликов. С&nbsp;их&nbsp;помощью мы&nbsp;выявили основные потребности ЦА, поведенческие паттерны на&nbsp; сайте и&nbsp; увидели, где&nbsp;интерфейс ведет себя не&nbsp; так, как&nbsp;того ожидает пользователь.</p>
<p>Мы также изучили сайты конкурентов FORS и&nbsp; популярные интернет-магазины — «Леруа-Мерлен», «Ситилинк», OZON, DNS, AliExpress и&nbsp; другие. Последние формируют пользовательский опыт — то, как&nbsp;люди привыкли взаимодействовать с&nbsp; коммерческими площадками в&nbsp; сети. Поэтому изучать их&nbsp;интерфейсные решения — всегда хорошая идея.</p>
<p>Исследования помогли определиться с&nbsp; <strong>основной идеей проекта</strong>:</p>
<p class="fors-case__highlighted">Мы должны показать пользователю всё&nbsp;о&nbsp; товаре на&nbsp; одном экране, чтобы ему&nbsp;не&nbsp; пришлось скроллить, листать или&nbsp;тапать в&nbsp; поисках нужной информации.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium fors-audit__report spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d43389f2dea74eba85d3bf93094fbc79"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2303/docs.png" alt="" itemprop="">


</figure>

<p> </p>
<p><a rel="noopener" href="/media/2305/отчет-по-результатам-ui_ux-аудита-карточки-товара-интернет-магазина-forsarmru.pdf" target="_blank" title="отчет-по-результатам-ui_ux-аудита-карточки-товара-интернет-магазина-forsarmru.pdf" class="fors-case__link">Отчёт по&nbsp;результатам UX/UI аудита страницы товара интернет-магазина forsarm.ru</a></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/d9d8a2b64ffe20412ec69831fb087d4b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-audit-subtitle" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/6731372965614d158e8ade89bd6dccbd"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Аудит страницы товара</h3>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/f7bdcd153e3f490ba04985ba103a7eb1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--49164791 fors-audit-slider" style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--49164791 {
                    /* manual inline */
                    padding: 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__row">
					<div class="umb-grid__col umb-grid__col--12">
						
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="slider"
            data-content-element-type-key="fe4b1c5b-697c-4ddf-b617-5f55c38c8017"
            data-element-udi="umb://element/5089e6148fc4448292bf3e95ec0f40c7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">




    <div data-cp="carousel"
         style="background-color:#ffffff;"
         class="swiper-container carousel typography__ignore-offset"
         data-settings='{&quot;pagination&quot;: {&quot;el&quot;: &quot;.swiper-pagination&quot;, &quot;clickable&quot;: true}}'>
        <div class="swiper-wrapper">
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2295/image-68.jpg"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2296/image-69.jpg"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2297/image-70.jpg"
         alt=""
         itemprop="">

                        </div>
                </div>
                <div class="swiper-slide">
                        <div class="carousel__limiter">
                            


    <img src="/Media/2298/image-71.jpg"
         alt=""
         itemprop="">

                        </div>
                </div>
        </div>
            <div class="swiper-pagination" data-carousel-ref="pagination"></div>
            <button
                type="button"
                class="carousel__navigation carousel__navigation--prev swiper-button-prev"
                data-carousel-ref="prev"
                style="color:#C4C4C4;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--l">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&lt;</span>
                </span>
            </button>
            <button type="button"
                    class="carousel__navigation carousel__navigation--next swiper-button-next"
                    data-carousel-ref="next"
                    style="color:#C4C4C4;">
                <span class="carousel__navigation-icon">
                    <svg focusable="false" class="icon">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink"
                             xlink:href="#icon-triangle--r">
                        </use>
                    </svg>
                    <span class="carousel__navigation-text">&gt;</span>
                </span>
            </button>
    </div>
        </div>
</div>


</div>

					</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/a8c6b6bf218f9df0cc9b6952f19dd8c4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-prototype" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5086085752604f7e8b8b9f44d0c98c1e"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p class="fors-case__title-label">2 этап</p>
<h3>Прототипирование</h3>
<p>Прототипы разрабатывали в&nbsp; три&nbsp;этапа. Сначала создали наше видение страницы товара — в&nbsp; десктопной и&nbsp; мобильной версии. Затем презентовали его&nbsp;заказчику и&nbsp; получили обратную связь. И&nbsp; только после этого разработали боевую версию прототипов с&nbsp; учётом всех замечаний и&nbsp; дополнений.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/33944cde751dd50eea198bef1c8bc018"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-prototype-tabs" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/68dcb849ccb94ea498732fb374f99893"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="tabs" data-tabs="" data-cp="tabs">
<div class="tabs__controls">
<div class="tabs__control tabs__control--active" data-tabs-control="">Десктопная версия</div>
<div class="tabs__control" data-tabs-control="">Мобильная версия</div>
</div>
<div class="tabs__content tabs__content--active" data-tabs-content="">

<figure class="umb-macro-image">
    


    <img src="/Media/2288/3.png"
         alt=""
         itemprop="">


</figure>
</div>
<div class="tabs__content" data-tabs-content="">

<figure class="umb-macro-image">
    


    <img src="/Media/2290/5.png"
         alt=""
         itemprop="">


</figure>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/b606c341e891621ae00711307c27e9eb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-design" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/eb79a2e3f7bc42c683b23b77a25a5e54"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p class="fors-case__title-label">3 этап</p>
<h3>Разработка дизайн-макетов</h3>
<p>У компании FORS уже&nbsp;был&nbsp;свой фирменный стиль. Опираясь на&nbsp; него, мы&nbsp;разработали UI-кит, а&nbsp; затем превратили согласованные прототипы в&nbsp; дизайн-макеты и&nbsp; передали их&nbsp;разработчикам FORS.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/822a8c1564f2178fdf8924f3b6171b35"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-design-tabs" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/939387e36b79440dac7d9daa0a0eaa68"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Результат</h2>
<div class="tabs" data-tabs="" data-cp="tabs">
<div class="tabs__controls">
<div class="tabs__control tabs__control--active" data-tabs-control="">Десктопная версия</div>
<div class="tabs__control" data-tabs-control="">Мобильная версия</div>
</div>
<div class="tabs__content tabs__content--active" data-tabs-content="">
<div class="comparison-slider" data-cp="comparison-slider" data-comparison-slider="slider">
<div class="comparison-slider__handle" data-comparison-slider="handle">
<div class="comparison-slider__handle-legend comparison-slider__handle-legend--before">Прототип</div>
<div class="comparison-slider__handle-legend comparison-slider__handle-legend--after">Дизайн</div>
</div>
<div class="comparison-slider__content" data-comparison-slider="content">
<div class="comparison-slider__slide comparison-slider__slide--after" data-comparison-slider="after"><img src="/Media/2289/4.png" alt=""></div>
<div class="comparison-slider__slide comparison-slider__slide--before" data-comparison-slider="before"><img src="/Media/2288/3.png" alt=""></div>
</div>
</div>
</div>
<div class="tabs__content" data-tabs-content="">

<figure class="umb-macro-image">
    


    <img src="/Media/2304/mobile.png" alt="" itemprop="">


</figure>
<ins></ins></div>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/181e756242476e85d82951edbe054a18"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  fors-review" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/980a99ab04474e6f8ca38e3f09656b51"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 class="fors-review__title">Отзыв клиента</h2>

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            — От&nbsp;работы с&nbsp;fuse8 у&nbsp;нас сложились положительные впечатления. Понравилось, как&nbsp;ребята проводят переговоры и&nbsp;фактически конспектируют их, а&nbsp;затем отправляют результаты встречи на&nbsp;согласование. Руководитель проектов Вениамин спокойно и&nbsp;с&nbsp;пониманием относится к&nbsp;замечаниям и&nbsp;правкам, а&nbsp;дизайнер Алексей очень хорошо подает себя на&nbsp;переговорах. Единственное, что&nbsp;хотелось бы&nbsp;рекомендовать fuse8, так&nbsp;это&nbsp;иметь резерв сил&nbsp;для&nbsp;дополнительных проектов.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Тимур Кушакаев 
                </cite>
                <p class="blockquote-new__author-position">
                    директор по&nbsp;маркетингу FORS
                </p>
            </div>
        </footer>
    </blockquote>
</div>
<ins></ins>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Технический аудит системы для одного из крупнейших российских туроператоров 
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/tech-audit-for-travel/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/tech-audit-for-travel/</guid>

                <pubDate>Fri, 27 Sep 2024 11:33:40 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>
                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Технический аудит системы для одного из крупнейших российских туроператоров </h1>
                                <figure>
                                    <img src="/Media/3072/slide-16_9-116.png" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/aee0d07f3e39f9ee2d09907a01511cd3"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  case-header" style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5892b9fc7bf24209a7c02eb5271bbfa1"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h1>Технический аудит системы для&nbsp;одного из&nbsp;крупнейших российских туроператоров</h1>
<p>&nbsp;</p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="tags"
            data-content-element-type-key="63a4c374-4210-45ac-851a-40ff3a9bbb25"
            data-element-udi="umb://element/4fcc5b3de39d4e6da0f584172a33bf59"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">


        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/1243db8e900745f39bbcee6d8425c92c"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Проанализировали сервис для&nbsp;поиска туров, выявили проблемы производительности, приоритезировали их&nbsp;и&nbsp;выдали заказчику план улучшения сервиса с&nbsp;расчетом времени на&nbsp;фиксацию каждой из&nbsp;проблем, чтобы можно было прозрачно и&nbsp;понятно перейти к&nbsp;их&nbsp;устранению. </span></p>

<div class="umb-macro-highlights">
    <strong>Разработка и&nbsp;развитие высоконагруженных систем – наши основные специализации.</strong>
    Мы&nbsp;занимаемся такими задачами давно, предлагая заказчикам из&nbsp;разных сфер бизнеса разные форматы работы над&nbsp;задачами. Это&nbsp;был&nbsp;первый раз, когда мы&nbsp;работали с&nbsp;туристическим бизнесом, но&nbsp;специфика запроса, с&nbsp;которым пришел заказчик, все&nbsp;равно была нам&nbsp;близка и&nbsp;знакома.
</div>

</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium intro-image-desktop spacing-wrapper"
            data-content-element-type-alias="introImage"
            data-content-element-type-key="9bfbaf3d-89e1-4a29-ad0c-78f70d733f19"
            data-element-udi="umb://element/6ccda161f3f148c4b4c6ea6d7d188626"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">


<div class="umb-macro-image-with-offset intro-image-large">
    


    <img src="/Media/3079/&#x438;&#x43D;&#x442;&#x440;&#x43E;.png"
         alt=""
         itemprop="">


</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3b4a57b7393d0e8e411bcd292b3dd96f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/17657c8981b240518331d422c02ca630"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Дано</h2>
<p><span style="font-weight: 400;">Сервис по&nbsp;поиску, бронированию и&nbsp;покупке туров со&nbsp;среднемесячной нагрузкой около 3 млн&nbsp;пользователей. Заказчик – один из&nbsp;лидеров рынка. Продуктовая команда выяснила, что&nbsp;сервис стал работать медленнее, чем&nbsp;у&nbsp;конкурентов: при&nbsp;одинаковом принципе работы отображение результатов поиска туров и&nbsp;следующие пользовательские шаги проходят с&nbsp;отставанием по&nbsp;скорости, что&nbsp;стали замечать в&nbsp;том&nbsp;числе и&nbsp;пользователи ресурса. Конверсия сервиса снизилась, а&nbsp;адаптивная версия сайта для&nbsp;мобильных устройств стала выдавать  показатели ниже ожидаемых.</span></p>
<p><span style="font-weight: 400;">Продуктовая команда заказчика была загружена, глаз специалистов слегка замылен ввиду длительной работы над&nbsp;продуктом. Времени на&nbsp;выявление проблем и&nbsp;поиск их&nbsp;решений не&nbsp;было, поэтому заказчик решил обратиться за&nbsp;сторонней экспертизой к&nbsp;нам. </span></p>
<p><span style="font-weight: 400;">Стек системы: </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Фронтенд — Vue&nbsp;и&nbsp;Laravel (bff)</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Бекенд — C#, админка (гео) — Laravel</span></li>
</ul>
<h2>Основные фокусы, к&nbsp;которым приступили к&nbsp;работе</h2>
<p><span style="font-weight: 400;">Команда заказчика при&nbsp;описании общих проблем с&nbsp;показателями загрузки своего сервиса отметила, что&nbsp;при&nbsp;загрузке выявляли сторонние скрипты, причины появления которых нуждались в&nbsp;уточнении. Мы&nbsp;сработали проактивно и&nbsp;уже&nbsp;к&nbsp;первым установочным встречам выдвинули несколько предположений об&nbsp;этой проблеме. Так, определили несколько ключевых направлений выявления проблем производительности сервиса: </span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Исправить некорректную работу или&nbsp;подключение аналитических сервисов (появление сторонних скриптов), а&nbsp;именно:</span></li>
<ul>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">На странице поиска (результатов) отправляется около 200 обращений в&nbsp;вебвизор, хотя на&nbsp;сайтах конкурентов, по&nbsp;наблюдению команды, меньше.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Google Tag&nbsp;Manager вызывает проблемы при&nbsp;работе сервиса. Возможно он&nbsp;не&nbsp;правильно подключен, а, возможно, в&nbsp;нем&nbsp;подключено много событий, которые отслеживает команда. При&nbsp;отключении GTM&nbsp;наблюдается прирост производительности  в&nbsp;2 раза.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Возможные проблемы с&nbsp;другими аналитическими сервисами.</span></li>
</ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Разобраться с&nbsp;событиями, которые вызываются при&nbsp;работе сайта.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Ошибки в&nbsp;консоли — локализовать и&nbsp;предложить их&nbsp;исправление.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Определение возможности переноса событий, которые JS&nbsp;отправляет в&nbsp;Google Analytics, на&nbsp;сторону GTM.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Локализовать дополнительные проблемы и&nbsp;предложить решения по&nbsp;их&nbsp;устранению/улучшению.</span></li>
</ul>
<h2>Как мы&nbsp;работали</h2>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Первым этапом мы&nbsp;провели встречи с&nbsp;командой заказчика, чтобы зафиксировать понимание задачи. Это&nbsp;обязательный процесс на&nbsp;всех наших проектах, и&nbsp;подробнее о&nbsp;нем&nbsp;мы&nbsp;рассказали </span><a href="/articles/task-understanding"><span style="font-weight: 400;">в отдельной статье</span></a><span style="font-weight: 400;">. </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">После фиксации понимания задачи переходим к&nbsp;описанию задач, которые видим для&nbsp;решения проблем заказчика, описываем границы проекта и&nbsp;план аудита. </span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Когда все&nbsp;ожидания согласованы, переходим к&nbsp;самому аудиту, полноценные работы по&nbsp;которому мы&nbsp;распределили на&nbsp;4 недели.</span></li>
</ol>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/e06b4fedfd614930bb30c3dec87d984f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3074/slide-16_9-97.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/73819982ff804d728f84fcd38c1b364c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">О более верхнеуровневом видении аудита, понимании того, когда его&nbsp;нужно проводить, и&nbsp;наших подходах к&nbsp;этому процессу рассказали </span><a href="/articles/tech-inspection"><span style="font-weight: 400;">в отдельном материале</span></a><span style="font-weight: 400;">.</span></p>
<h2>Что проверяли и&nbsp;делали в&nbsp;ходе аудита для&nbsp;выявления и&nbsp;фиксирования проблем производительности системы</h2>
<p><span style="font-weight: 400;">Сначала нужно было провести общую техническую оценку перфоманса системы в&nbsp;рамках трех разделов: главная, поиск, страница отеля. Это&nbsp;первый этап, без&nbsp;которого нет&nbsp;смысла лезть в&nbsp;код&nbsp;или&nbsp;анализировать работу сторонних сервисов. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/dbeece1754914016b7bc0fc1f574931f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3075/slide-16_9-98.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8d05d6f349fd46f7a87389a202908773"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Следующим шагом мы&nbsp;локализуем проблемы, которые удалось найти и&nbsp;выясняем, какие процессы или&nbsp;интеграции в&nbsp;системе повлекли их&nbsp;возникновение. На&nbsp;этом этапе постепенно погружаемся в&nbsp;кодовую базу системы: просматриваем, как&nbsp;ведут себя процессы с&nbsp;точки зрения исполнения кода, отсматриваем блокеры производительности. </span></p>

<div class="text-highlight">
  Предположили, что&nbsp;ряд&nbsp;проблем производительности системы может быть связан с&nbsp;работой Google Tag&nbsp;Manager – это&nbsp;диспетчер тегов, с&nbsp;помощью которого на&nbsp;сайт можно добавить коды разных служб аналитики или&nbsp;Google Maps для&nbsp;мониторинга сайта в&nbsp;целях анализа пользовательской активности. Это&nbsp;важная штука, но&nbsp;работа такого менеджера может быть блокирующим ресурсом с&nbsp;точки зрения производительности сервиса.
</div>

<p><span style="font-weight: 400;">Также серьезной проблемой была загрузка большого количества данных на&nbsp;странице поиска. Это&nbsp;сильно блокировало загрузку страницы.</span></p>

<div class="text-highlight">
  Кроме Google Tag&nbsp;Manager заказчик на&nbsp;своем сайте использовал и&nbsp;другие сторонние системы, которые скриптами встроены в&nbsp;кодовую базу системы. Их&nbsp;мы&nbsp;также анализировали на&nbsp;предмет правильности работы и&nbsp;ошибок в&nbsp;консоли.  Так, в&nbsp;код&nbsp;были зашиты разные сервисы, которые не&nbsp;были задокументированы, и&nbsp;соответственно, вызывали сторонние скрипты, которые при&nbsp;исполнении вызывали еще&nbsp;очередь скриптов. Проведя анализ, нашли места где&nbsp;эти&nbsp;скрипты подключаются и&nbsp;предоставили клиенту эти&nbsp;точки для&nbsp;документирования.
</div>

<p><span style="font-weight: 400;">Когда все&nbsp;аналитические задачи были выполнены, мы&nbsp;составили таблицу с&nbsp;выявленными проблемами и&nbsp;способами их&nbsp;решения с&nbsp;указанием часов работы для&nbsp;этого. В&nbsp;этом, на&nbsp;наш&nbsp;взгляд, отличие качественного технического аудита: важно не&nbsp;просто обозначить проблемы, но&nbsp;и&nbsp;выяснить их&nbsp;природу, для&nbsp;того, чтобы предложить понятный способ решения. Еще&nbsp;один важный момент: приоритетность фиксации неполадок: низкая, средняя и&nbsp;высокая – в&nbsp;таблице мы&nbsp;указали, какие проблемы решить нужно прежде всего, чтобы получить улучшение производительности ресурса заказчика. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/a0506b5963394132854d9cf61331327a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3076/slide-16_9-99.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8fbdcf1a8b6a4b5b8c66892bd4f19e15"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Последним шагом аудита был&nbsp;обзор архитектуры сайта и&nbsp;связанных с&nbsp;ней&nbsp;систем с&nbsp;целью предложить возможные улучшения. Фишкой нашей работы было то, что&nbsp;таблицу с&nbsp;найденными проблемами мы&nbsp;заполняли постепенно, из&#8209;за&nbsp;чего команда заказчика сразу же&nbsp;могла посильно устранять проблемы, а&nbsp;не&nbsp;ждать финальной встречи с&nbsp;демонстрацией результатов. </span></p>
<h2>Примеры проблем и&nbsp;решений производительности, обнаруженных в&nbsp;ходе аудита</h2>
<p><span style="font-weight: 400;">Чтобы было понятнее, приведем примеры описания проблем производительности и&nbsp;способов их&nbsp;решения на&nbsp;проекте. Для&nbsp;этого возьмем проблемы, связанные с&nbsp;CSS, API, шрифтами и&nbsp;скриптами, которые использовались в&nbsp;системе</span></p>
<h3>Отсутствие извлечения стилей из&nbsp;компонентов Vue&nbsp;(40 часов на&nbsp;исправление)</h3>
<p><span style="font-weight: 400;">На проекте используется фреймворк Vue. Одной из&nbsp;проблем производительности сайта заказчика было то, что&nbsp;стили, расположенные во&nbsp;Vue&nbsp;компонентах, работали неправильно – они&nbsp;грузились с&nbsp;помощью JS&nbsp;и&nbsp;не&nbsp;генерировались самостоятельно, что&nbsp;  откладывало их&nbsp;применение до&nbsp;инициализации и&nbsp;скачивания. </span></p>
<p><span style="font-weight: 400;">Чтобы решить проблему извлечения стилей, было предложение следующее решение:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сделать маппинг роутов и&nbsp;чанков в&nbsp;веб-приложении</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сделать хелпер для&nbsp;Laravel для&nbsp;добавления инлайнового CSS&nbsp;по&nbsp;роуту</span></li>
</ul>
<h3>Блокирующие API&nbsp;запросы (30 часов на&nbsp;исправление)</h3>
<p><span style="font-weight: 400;">Система, над&nbsp;которой мы&nbsp;работали, помогает пользователям находить и&nbsp;бронировать туры, оплачивать поездки и&nbsp;проживание в&nbsp;отелях. Поэтому, для&nbsp;того, чтобы все&nbsp;множество различных данных, необходимых для&nbsp;решения пользовательских задач отображалось корректно, ресурс заказчика использует большое количество API&nbsp;запросов за&nbsp;конфигурацией – это, например, разные валюты и&nbsp;их&nbsp;конвертация, опции настраиваемых пользователем при&nbsp;поиске фильтров. Из&#8209;за&nbsp;того, что&nbsp;запросов очень много и&nbsp;они&nbsp;зависят друг от&nbsp;друга, отрисовка контента на&nbsp;сайте замедляется, и&nbsp;пользователю приходится ждать.</span></p>
<p><span style="font-weight: 400;">API запросы нельзя просто сократить или&nbsp;удалить. Каждый из&nbsp;них&nbsp;несет функцию, которая необходима сервису для&nbsp;корректной работы. Поэтому в&nbsp;таком случае, чтобы ускорить отрисовку контента, объединяем по&nbsp;возможности запросы в&nbsp;один API&nbsp;endpoint, чтобы конфигурации запрашивали не&nbsp;по&nbsp;одной, а&nbsp;сразу по&nbsp;несколько. Другой способ – заинлайнить результат выполнения запросов в&nbsp;html в&nbsp;формате JSON.</span></p>
<h3>Приоритет загрузки шрифтов (6 часов на&nbsp;исправление)</h3>
<p><span style="font-weight: 400;">Чтобы контент на&nbsp;сайте отрисовывался быстро, необходимо, чтобы его&nbsp;загрузка была приоритезирована. Например, появление текста в&nbsp;нужном формате на&nbsp;странице не&nbsp;должно отставать от&nbsp;остальных элементов, чтобы не&nbsp;было ситуации, когда один сегмент сайта уже&nbsp;загрузился и&nbsp;активен, а&nbsp;другие до&nbsp;сих&nbsp;пор&nbsp;отображаются в&nbsp;непонятном виде. </span></p>
<p><span style="font-weight: 400;">Так, в&nbsp;нашем проекте у&nbsp;шрифтов, используемых на&nbsp;страницах сайта не&nbsp;было высокого приоритета загрузки. Из&#8209;за&nbsp;чего тест загружался позже, чем&nbsp;это&nbsp;было необходимо для&nbsp;быстрой отрисовки контента. Кроме того, пока шрифты не&nbsp;загружались, текст вообще не&nbsp;отображался на&nbsp;экране.</span></p>
<p><span style="font-weight: 400;">Чтобы решить эту&nbsp;проблему, нужно было реализовать предзагрузку необходимых страницу шрифтов. Для&nbsp;этого мы&nbsp;использовали метод preload, который позволяет ускорить загрузку страницы, управляя процессом загрузки отдельного элемента – в&nbsp;нашем случае определенного шрифта. </span></p>
<p><span style="font-weight: 400;">Вот как&nbsp;это&nbsp;выглядело в&nbsp;коде:</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/420cfbdb77af4871a793e889ddd32e7b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3073/frame-487.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5e2a23e7cb7b4c79899cf2c7e8dffec7"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p> </p>
<h3>Слишком большие JS&nbsp;бандлы (18 часов на&nbsp;исправление)</h3>
<p><span style="font-weight: 400;">Код проекта обычно разбивается на&nbsp;бандлы, относительно своей функциональности. Это&nbsp;полезно и&nbsp;с&nbsp;точки зрения удобства разработчиков, и&nbsp;с&nbsp;точки зрения использования ресурсов для&nbsp;загрузки страниц веб-сервиса: когда код&nbsp;разделен на&nbsp;группы, с&nbsp;ним&nbsp;проще работать и&nbsp;человеку, и&nbsp;компьютеру. Однако, когда такие кодовые группы перегружаются, работа с&nbsp;ними усложняется, поэтому важно не&nbsp;закидывать в&nbsp;бандл слишком много кода и&nbsp;следить за&nbsp;тем, чтобы весь код&nbsp;бандла был&nbsp;действительно необходим для&nbsp;работы сервиса.</span></p>
<p><span style="font-weight: 400;">На нашем проекте проблема чрезмерной величины JS&nbsp;бандлов была связана среди прочего с&nbsp;применением пакета moment. Это&nbsp;библиотека, позволяющая упрощать работу с&nbsp;датами и&nbsp;временем через определенные методы. Это&nbsp;тяжелая и&nbsp;устаревшая библиотека, которую </span><a href="https://momentjs.com"><span style="font-weight: 400;">рекомендуют </span></a><span style="font-weight: 400;">заменять на&nbsp;более легковесные аналоги, например, dayjs.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/26cf14e426ea4b459000acc3122e3299"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/3077/slide-16_9-100.png"
         alt=""
         itemprop="">


        <figcaption>
            Сокращение загружаемого кода после оптимизации бандлов: было 6.6Мб - стало 205Кб
        </figcaption>
</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/4a30dc5e61aa4be89bc0d817943ac39a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Другой пакет – Lodash – был&nbsp;добавлен в&nbsp;бандл полностью, хотя в&nbsp;проекте применяется только часть его&nbsp;функциональности. Для&nbsp;оптимизации lodash были заменены импорты библиотеки.  import _ from "lodash";заменен на&nbsp;import forEach from "lodash/forEach";. Кроме того, на&nbsp;проекте были использованы несколько версий одной и&nbsp;той&nbsp;же&nbsp;библиотеки Lodash – мы&nbsp;привели все&nbsp;к&nbsp;одной версии, за&nbsp;счет чего сократили в&nbsp;несколько раз&nbsp;объем JS&nbsp;бандлов.</span></p>
<p><span style="font-weight: 400;">Чтобы решить проблему перегрузки бандлов, мы&nbsp;применили tree-shaking компонентов. Простыми словами – это&nbsp;“стряхивание” неиспользуемого кода при&nbsp;сборке приложения. В&nbsp;дальнейшем нужно будет контролировать импорт элементов в&nbsp;бандлы, не&nbsp;пропуская те, что&nbsp;идут, например, по-умолчанию в&nbsp;пакете, но&nbsp;на&nbsp;самом деле не&nbsp;нужны для&nbsp;реализации фич&nbsp;сервиса. </span></p>
<p><span style="font-weight: 400;">Также перегружать бандлы могут лишние языковые пакеты. Их&nbsp;можно  исключить с&nbsp;помощью ContextReplacementPlugin.</span></p>
<h2>Итоги проекта</h2>
<p><span style="font-weight: 400;">4 недели потребовалось на&nbsp;то, чтобы провести установочные встречи с&nbsp;заказчиком , сам&nbsp;аудит и&nbsp;все&nbsp;обсуждения и&nbsp;презентации, связанные с&nbsp;ним. </span></p>
<p><span style="font-weight: 400;">Среди проблем туристической системы мы&nbsp;выявили 28 кейсов, 10 из&nbsp;которых имели высокий приоритет, 13 – средний и&nbsp;5 – низкий. Выявили проблемы, связанные с&nbsp;CSS, JS, загрузкой шрифтов и&nbsp;изображений, API, кэша, работы бэкенда и&nbsp;мониторингов. Фронт работ по&nbsp;устранению всех проблем был&nbsp;оценен примерно в&nbsp;400 часов.</span></p>
<p><span style="font-weight: 400;">Получилось настроить синергетический режим работы, при&nbsp;котором команда заказчика не&nbsp;просто находилась в&nbsp;ожидании до&nbsp;конца наших работ по&nbsp;аудиту. Как&nbsp;только мы&nbsp;выявляли каждую их&nbsp;проблем и&nbsp;предлагали решение, специалисты из&nbsp;команды заказчика могли оперативно приступать к&nbsp;исправлению проблем производительности. </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    «Цессионарий»: система для&nbsp;работы с просроченным задолженностями по кредитам
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/assignot/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/assignot/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:59 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>
                            <category>&#x424;&#x438;&#x43D;&#x430;&#x43D;&#x441;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x44B;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>«Цессионарий»: система для&nbsp;работы с просроченным задолженностями по кредитам</h1>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="nineThree"
            data-content-element-type-key="f7fe9789-b264-3d4f-9aef-ce05a431c4df"
            data-element-udi="umb://element/b39136cd413fef311578d80be43b0c8f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--22587534 forseti-case-header" style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--22587534 {
                    /* manual inline */
                    padding: 50px 15px 0px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--9">
							
<div class="umb-block-grid__area"
     data-area-col-span="9"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 9;--umb-block-grid--area-column-span: 9; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/a93724a0c0284591a1ed992d3d04ba46"
            data-col-span="9"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 9; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div><img class="forseti-case-header__logo" src="/Media/2376/logo.png" alt=""></div>
<h1 class="forseti-case-header__title">«Цессионарий»: система для&nbsp; работы с&nbsp;просроченными задолженностями по&nbsp;кредитам</h1>
<p> </p>
<ins>
<div class="tags">



</div>
</ins>
<p><span>Заказчик — МФО&nbsp;«Лайм Займ». С&nbsp;2014 года вместе с&nbsp;нами запустила <a href="/projects/lime-zaim" title="Сервисы микрофинансовой организации «Лайм-Займ»">четыре сервиса онлайн-кредитования</a> — в&nbsp;России, Польше, ЮАР&nbsp;и&nbsp;Мексике.</span></p>
<p><span>В компании есть отдел, который занимается истребованием долгов через суд. Вместе с&nbsp;аналитиками «Лайм Займ» мы&nbsp;создали для&nbsp;этого отдела рабочий инструмент — систему «Цессионарий».</span></p>
<p><span>За время использования в&nbsp;«Цессионарии» появились новые фичи, о&nbsp;которых мы&nbsp;рассказали <a href="/projects/assignot-new/" title="Индивидуальная ERP&nbsp;вместо Excel для&nbsp;бизнеса по&nbsp;взысканию долгов">в другом материале</a>.  </span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--3">
							
<div class="umb-block-grid__area"
     data-area-col-span="3"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 3;--umb-block-grid--area-column-span: 3; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium forseti-intro-image spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/07177e2247b14e7481cc1506ceb1b4cd"
            data-col-span="3"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 3; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--55814001">
    


    <img src="/Media/2374/forseti-about.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--55814001 {
                    /* manual inline */
                    max-width:735px;left:0;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/28b792c108e4ebc8d0fa9e6e9bc80bf1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c1a61766cc41411ab1c536d715bea671"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="forseti-about">
<h2>О проекте</h2>
<div class="forseti-about__breakpoints">
<div class="forseti-about__start"><strong>Старт работ:</strong> август 2019</div>
<div class="forseti-about__final"><strong>Запуск проекта:</strong> февраль 2020</div>
</div>
<div class="forseti-about__timeline">
<div class="forseti-about__timeline-start">Создание ТЗ</div>
<div class="forseti-about__timeline-final"><span>Оценка</span> <span>Разработка</span> <span>Тестирование</span></div>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="threeFourFive"
            data-content-element-type-key="5fd4bd7b-6c4c-30a1-9036-ee0b24efbe10"
            data-element-udi="umb://element/e5fc5631a273c8475a0a51795a3abe8b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--14282009 forseti-team" style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--14282009 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--3">
							
<div class="umb-block-grid__area"
     data-area-col-span="3"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 3;--umb-block-grid--area-column-span: 3; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f07dd19d6e284d1ca3f7145095f02dd1"
            data-col-span="3"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 3; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3 class="forseti-team__title forseti-team__title--lime">Команда LIME</h3>
<p class="forseti-team__position">Менеджер проекта</p>
<p class="forseti-team__teammate">Евгений Морякин</p>
<h3 class="forseti-team__title forseti-team__title--fuse8">Команда fuse8</h3>
<p class="forseti-team__position">Тимлид</p>
<p class="forset-team__teammate">Фёдор Киселёв</p>
<p class="forseti-team__position">Бэкенд-разработчики</p>
<p class="forseti-team__teammate">Сергей Васнин</p>
<p class="forseti-team__teammate">Андрей Питиримов</p>
<p class="forseti-team__teammate">Елена Фёдорова</p>
<p class="forseti-team__teammate">Анастасия Москаленко</p>
<p class="forseti-team__teammate">Елена Пермякова</p>
<p class="forseti-team__teammate">Ирина Маковецкая</p>
<p class="forseti-team__teammate">Максим Захаров</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/646b21ab39bd47ebb5757ae957ccea0d"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="forseti-team__headless-column">
<p class="forseti-team__position">Бизнес-аналитик проекта</p>
<p class="forseti-team__teammate">Кирилл Ефимов</p>
</div>
<div class="forseti-team__headless-column">
<p class="forseti-team__position">Дизайнер</p>
<p class="forseti-team__teammate">Владимир Лысов</p>
<p class="forseti-team__position">Фронтенд-разработчики</p>
<p class="forseti-team__teammate">Владимир Лысов</p>
<p class="forseti-team__teammate">Юлия Поспелова</p>
<p class="forseti-team__position">Тестировщик</p>
<p class="forseti-team__teammate">Максим Шумаков</p>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--5">
							
<div class="umb-block-grid__area"
     data-area-col-span="5"
     data-area-row-span="1"
     data-area-alias="area_2"
     style="--umb-block-grid--grid-columns: 5;--umb-block-grid--area-column-span: 5; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/0bdf870f816e4c8092336865cda8e413"
            data-col-span="5"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 5; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--39966483">
    


    <img src="/Media/2370/coin.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--39966483 {
                    /* manual inline */
                    max-width:395px;top:59px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/7c81089248dda2e423676b09853d65f5"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--52625272 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--52625272 {
                    /* manual inline */
                    padding: 30px 15px 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b27be87355364399b74f521bef9642e7"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span>Мы работали над&nbsp;«Цессионарием» по&nbsp;системе аутстаффинга: аналитики заказчика подготовили подробное техническое задание. На&nbsp;нас&nbsp;была разработка и&nbsp;UX-дизайн интерфейса «Цессионария».</span></p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/b73a6b94650d47849483581bc494838a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--56537450 forseti-preparation" style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--56537450 {
                    /* manual inline */
                    padding: 50px 15px 30px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bf97a16d99374260859f019353a5dead"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Подготовительный этап</h2>
<h3>Проблемы отдела судебного взыскания</h3>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/547fbf6279fe7226e64f5da23e822b5a"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--35472152 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--35472152 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/d78512053df340ffbd96baa603c57fb0"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Истребования долга по&nbsp;<strong>цессии</strong> — сложный процесс. Любое дело проходит через множество этапов — сбор пакета документов, переписка с&nbsp;ведомствами, судебные разбирательства, передача решений приставам… На&nbsp;некоторых из&nbsp;них&nbsp;требуется подключение новых специалистов, и&nbsp;абсолютно на&nbsp;каждом — много бумажной работы. При&nbsp;этом, сотрудники отдела одновременно ведут тысячи дел.</p>
<p>В «Лайм Займ» нам&nbsp;рассказали, с&nbsp;какими проблемами сталкиваются специалисты по&nbsp;судебному взысканию каждый день:</p>
<ul>
<li><strong>потеря и&nbsp;долгий поиск документов по&nbsp;делам</strong> из&#8209;за&nbsp;больших объёмов работы и&nbsp;отсутствия централизованного хранилища;</li>
<li><strong>усложненная коммуникация</strong> из&#8209;за&nbsp;того, что&nbsp;на&nbsp;разных этапах за&nbsp;одно дело отвечают разные люди;</li>
<li><strong>невозможность быстро сориентироваться, на&nbsp;какой стадии находится дело и&nbsp;каким должен быть следующий шаг</strong> из&#8209;за&nbsp;сложного процесса истребования долга по&nbsp;суду.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c81bf4d889ce417aad2f78f2bbae1a61"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p class="forseti-note"><strong>Цессия</strong> — переуступка права. В&nbsp; данном случае — права требования долга по&nbsp;кредиту.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c48c0b03f662e13ef64d805f6465682d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c6d15c0207864d8bb4cdce230b785133"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="forseti-goal">
<div class="forseti-goal__arrow">

<figure class="umb-macro-image">
    


    <img src="/Media/2369/arrow.png"
         alt=""
         itemprop="">


</figure>
</div>
<div class="forseti-goal__content">
<p><strong>Задача «Цессионария»</strong> — решить эти&nbsp;проблемы, ускорить и&nbsp;упростить одновременное ведение тысяч дел, автоматизировать процессы.</p>
<div></div>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/8c6f4f766196e5d1d0bc186dc758dd80"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--61846438 forseti-specs-title" style="background-color:#FAFAFA;">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--61846438 {
                    /* manual inline */
                    padding: 30px 15px 0
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/3a583dbc56714e6ea565dc79517b8153"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Техническое задание</h3>
<p>В техническом задании аналитики «Лайм Займ» подробно описали все&nbsp;этапы, через которые проходит любое дело, и&nbsp;кто&nbsp;из&nbsp;сотрудников отдела ответственен за&nbsp;каждый из&nbsp;них.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/1141ee57a1b474cf3ded21cefb75c54f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  forseti-specs" style="background-color:#FAFAFA;">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5c6af0187b6b41b09cf6c7999979ab77"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <div class="forseti-spec">
<div class="forseti-spec__column">
<div class="forseti-spec__image">

<figure class="umb-macro-image">
    


    <img src="/Media/2364/spec-1.png"
         alt=""
         itemprop="">


</figure>
</div>
</div>
<div class="forseti-spec__column">
<div class="forseti-spec__image">

<figure class="umb-macro-image">
    


    <img src="/Media/2365/spec-2.png"
         alt=""
         itemprop="">


</figure>
</div>
<div class="forseti-spec__image">

<figure class="umb-macro-image">
    


    <img src="/Media/2366/spec-3.png"
         alt=""
         itemprop="">


</figure>
</div>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/bb17eb1a6e4f42f697040ef04a751920"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p class="forseti-note">На схемах зафиксировано, как&nbsp; идёт работа над&nbsp;любым делом, попавшим в&nbsp;отдел на&nbsp; истребование.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/52f48259b8f3e1aa6e8249ed004282c1"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--5416416 " style="background-color:#FAFAFA;">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--5416416 {
                    /* manual inline */
                    padding: 0 15px 30px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/13969bc00ae04beeac18416c3674969d"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Мы изучили ТЗ, вникли в&nbsp;бизнес-процессы отдела судебного взыскания, оценили объём работ и&nbsp;приступили к&nbsp;созданию системы «Цессионарий».</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/f3e9a9438c7ad41c0ce3b04613866e1b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/10e307a7ee20439194cbf3a02e6b1af9"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Разработка</h2>
<p>Основой «Цессионария» стали статусы судопроизводства. Это&nbsp;— воркфлоу системы. Вокруг них&nbsp;была выстроена вся&nbsp;функциональность.</p>
<p>Мы разбили проект на&nbsp;задачи и&nbsp;распределяли их&nbsp;с&nbsp;помощью канбан-доски. Прогресс отслеживали по&nbsp;диаграмме Ганта.</p>
<p>На разработку ушло 5 850 часов: из&nbsp;них&nbsp;4590 — на&nbsp;бэкенд, 800 — на&nbsp;фронтенд и&nbsp;460 — на&nbsp;тестирование.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/fec8a1a5ebac63a7b8b8add5a852cd60"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--57879316 forseti-technologies" style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--57879316 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/3d962de753b14d41a981a3a512353579"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2372/docker-logo.png"
         alt=""
         itemprop="">


</figure>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/be92faa830cf409881b70027a91f2549"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p class="forseti-note">«Цессионарий» разрабатывался с&nbsp;использованием .Net Core 3.0, MSSQL Server, EF&nbsp;Core и&nbsp;Docker.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/09a0b40ecd6b6a5a5c393e10ee87ad6c"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/711750ec7f4e4dd589ac3f55a7a3c0d7"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Основной нашей задачей на&nbsp;проекте была разработка. Но&nbsp;наши фронтендеры пошли дальше. Они&nbsp;с&nbsp;нуля создали дизайн интерфейса системы и&nbsp;подобрали подходящие цветовые схемы — чтобы многочисленные формы и&nbsp;таблицы «Цессионария» стали легкими в&nbsp;восприятии.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/46ab36292b71e4dfb09e47af5cc4a34b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="background-color:#F5F6F9;">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/aafe4fbefdd34309bd1a4cf75d0507b0"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p>Отдельное внимание мы&nbsp;уделили тёмной теме. «Цессионарий» — это&nbsp;рабочий инструмент. Важно, чтобы сотрудникам отдела было комфортно пользоваться им&nbsp;в&nbsp;течение всего рабочего дня. Тёмная тема снижает нагрузку на&nbsp;глаза в&nbsp;вечернее время, когда естественного освещения не&nbsp;хватает.</p>

<div class="switch-images" data-cp="data-switch" data-switch>
	<div class="switch-images__switch switch">
		<input type="checkbox" id="dark-theme" name="dark-theme" data-switch-input/>
		<span class="switch__toggler"></span>
		<label class="switch__label" for="dark-theme">Тёмная тема</label>
	</div>

	<div class="switch-images__images">
		<div class="switch-images__image switch-images__image--default" data-switch-default-image>
			


    <img src="/Media/2375/light-theme.jpg"
         alt=""
         itemprop="">

		</div>
		<div class="switch-images__image switch-images__image--switched" data-switch-switched-image>
            


    <img src="/Media/2371/dark-theme.jpg"
         alt=""
         itemprop="">

		</div>
	</div>
</div>

<p>А ещё, по&nbsp;личной инициативе одного из&nbsp;наших фронтендеров, у&nbsp;«Цессионария» появился логотип — профиль Фемиды на&nbsp;алом поле в&nbsp;стиле pixel art.</p>
<div class="forseti-logo-progress">
<div class="forseti-logo-progress__stage">
<div>

<figure class="umb-macro-image">
    


    <img src="/Media/2377/logo-progress-1.png"
         alt=""
         itemprop="">


</figure>
</div>
</div>
<div class="forseti-logo-progress__stage">
<div>

<figure class="umb-macro-image">
    


    <img src="/Media/2378/logo-progress-2.png"
         alt=""
         itemprop="">


</figure>
</div>
</div>
<div class="forseti-logo-progress__stage">
<div>

<figure class="umb-macro-image">
    


    <img src="/Media/2361/logo-progress-3.png"
         alt=""
         itemprop="">


</figure>
</div>
</div>
</div>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/55ce2b3466cf96fc0e3a9a877ef5613f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/c56cf83f1f3f403480eed39671b0d444"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Внедрение</h3>
<p>«Цессионарий» — это&nbsp;уникальный продукт. Он&nbsp;разработан под&nbsp;устоявшиеся в&nbsp;компании процессы работы с&nbsp;долгами. Поэтому и&nbsp; внедрить его&nbsp;было не&nbsp;сложно. Да, сама система для&nbsp;сотрудников отдела была в&nbsp;новинку, но&nbsp;знакомый воркфлоу облегчил её&nbsp;понимание.</p>
<p>Внедрением «Цессионария» занималась команда со&nbsp;стороны заказчика. На&nbsp;обучение всех сотрудников отдела ушло около двух часов — интуитивно им&nbsp;всё&nbsp;было сразу понятно. Сейчас отдел взыскания свободно ориентируется в&nbsp;системе.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/5100cc18a1d39e9db87b15098a99648e"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block umb-grid__block--26034072 " style="">
		<style>
            @media screen and (min-width: 768px) {
                .umb-grid__block--26034072 {
                    /* manual inline */
                    padding: 0 15px
                }
            }
        </style>
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e36a9d74ab0b4941a7b271cd598b7d3f"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Результат</h2>
<p>«Цессионарий» облегчает и&nbsp;систематизирует работу с&nbsp;просроченными задолженностями. <br>Хранит всю&nbsp;информацию и&nbsp;документы по&nbsp;делам, поступившим в&nbsp;отдел на&nbsp;истребование.</p>
<p>&nbsp;</p>

<div class="image-map" data-image-map data-cp="image-map">
    <img class="image-map__image" src="/Media/2910/result.png" alt="Цессионарий" usemap="#forseti-result">

    <map name="forseti-result">
            <area shape="rect" coords='267,83,840,230' alt='Фильтры для&nbsp;поиска дел&nbsp;по&nbsp;разным параметрам' data-image-map-area data-image-map-content='Фильтры для&nbsp;поиска дел&nbsp;по&nbsp;разным параметрам' data-image-map-area-coords='267,83,840,230'>
            <area shape="rect" coords='267,248,840,340' alt='Результаты поиска' data-image-map-area data-image-map-content='Результаты поиска' data-image-map-area-coords='267,248,840,340'>
            <area shape="rect" coords='120,110,250,265' alt='Этапы судопроизводства, через которые проходят все&nbsp;дела' data-image-map-area data-image-map-content='Этапы судопроизводства, через которые проходят все&nbsp;дела' data-image-map-area-coords='120,110,250,265'>
            <area shape="rect" coords='120,270,250,350' alt='Операции с&nbsp;документами, реестрами, исками' data-image-map-area data-image-map-content='Операции с&nbsp;документами, реестрами, исками' data-image-map-area-coords='120,270,250,350'>
            <area shape="rect" coords='120,360,250,375' alt='Имя пользователя' data-image-map-area data-image-map-content='Имя пользователя' data-image-map-area-coords='120,360,250,375'>
            <area shape="rect" coords='120,375,250,415' alt='Настройки системы: формат данных и&nbsp;тёмная тема' data-image-map-area data-image-map-content='Настройки системы: формат данных и&nbsp;тёмная тема' data-image-map-area-coords='120,375,250,415'>
    </map>
</div>

</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/db869792139b1a4917b73f7907a87b48"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/80f6f197215742ec809e686f91ac6969"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Что умеет Цессионарий</h3>
<ul>
<li>Позволяет вручную прикрепить к&nbsp;делу корреспонденцию: сотрудник подгружает в&nbsp;дело сканы писем и&nbsp;документов, которые есть исключительно на&nbsp;бумаге.</li>
<li>Генерирует ряд&nbsp;документов: выписки из&nbsp;договоров цессии, заявления на&nbsp;выдачу судебных постановлений.</li>
<li>Назначает нового ответственного сотрудника при&nbsp;переходе с&nbsp;этапа на&nbsp;этап.</li>
<li>Сортирует и&nbsp;ищет дела в&nbsp;общей базе по&nbsp;нескольким параметрам: внутреннему ID, номеру договора, кредитору, статусу иска и&nbsp;другим.</li>
<li>За раз&nbsp;готовит к&nbsp;печати пакеты документов сразу по&nbsp;нескольким делам.</li>
<li>Уведомляет Бюро кредитных историй о&nbsp;заключении договора цессии, поступлении платежей, полном погашении долга или&nbsp;его&nbsp;списании.</li>
</ul>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/83db54ab6712381da8893d06aecfd57b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/13156434d2de43b7b4a909d93c647747"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Достигнутые цели</h2>
<p>Система «Цессионарий» ускорила работу сотрудников отдела судебного взыскания:</p>
<div class="forseti-goals-achieved">
<p>— до&nbsp;запуска «Цессионария» в&nbsp;рамках первичной подачи отдел готовил 8-10 тыс. заявлений в&nbsp;месяц;</p>
<p>— после запуска — на&nbsp;20% больше.</p>
</div>
<p>«Цессионарий» навел порядок в&nbsp;отделе судебного взыскания — весь пул&nbsp;дел&nbsp;и&nbsp;документов по&nbsp;ним&nbsp;теперь хранится в&nbsp;одном месте, поэтому их&nbsp;потеря на&nbsp;каком-либо из&nbsp;этапов исключается.</p>
<p>Система внесла прозрачность в&nbsp;процесс: сотрудники быстро находят нужное дело по&nbsp;фильтрам, понимают, на&nbsp;какой стадии оно&nbsp;сейчас находится, и&nbsp;что&nbsp;нужно делать дальше.</p>
<p>Значительно увеличилась скорость обработки и&nbsp;подготовки печатных материалов. «Цессионарий» делает выборку по&nbsp;делам на&nbsp;одной стадии и&nbsp;«склеивает» весь пакет документов по&nbsp;ним&nbsp;в&nbsp;один файл. Остается лишь отправить его&nbsp;на&nbsp;печать, рассортировать по&nbsp;конвертам и&nbsp;разослать по&nbsp;судам. Раньше пакеты документов по&nbsp;каждому делу приходилось собирать и&nbsp;печатать отдельно.</p>
</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/2076bb5a2303410894fbcb12674bce80"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    

<figure class="umb-macro-image">
    


    <img src="/Media/2363/result2.png"
         alt=""
         itemprop="">


</figure>

<h3>больше дел&nbsp;в&nbsp;месяц готовят сотрудники отдела взыскания с&nbsp;помощью «Цессионария»</h3>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="eightFour"
            data-content-element-type-key="1f5f46c1-77e1-3a24-975c-eccb57720568"
            data-element-udi="umb://element/28003e5605e5cf245e9cb34dac158084"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  forseti-review" style="background-color:#F5F6F9;">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--8">
							
<div class="umb-block-grid__area"
     data-area-col-span="8"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 8;--umb-block-grid--area-column-span: 8; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/09d5611651fc4a72b37131db9a7f9bbe"
            data-col-span="8"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 8; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2 class="forseti-review__title">Отзыв клиента</h2>

<div class="typography">
    <blockquote class="blockquote-new">
        <div class="blockquote-new__body">
            «Цессионарий» автоматизировал часть бизнес-процессов отдела судебного взыскания. Поэтому значительно увеличилась скорость работы наших сотрудников. Нам&nbsp; также удалось решить проблему бумажных завалов – теперь документы распечатываются непосредственно перед отправкой, а&nbsp;не&nbsp;заранее. С&nbsp;помощью «Цессионария» мы&nbsp;добились максимальной актуализации данных к&nbsp; моменту отправки (например, в&nbsp;сумме долга клиента) и&nbsp; исключили часть рудиментарных ручных действий со&nbsp; стороны специалистов. Что&nbsp;касается работы с&nbsp;fuse8, тут&nbsp; у&nbsp; нас&nbsp;впечатления исключительно положительные: команда организована и&nbsp;достаточно автономна — нет&nbsp; необходимости в&nbsp;постоянном контроле.
        </div>
        <footer class="blockquote-new__footer">
            <div class="blockquote-new__author">
                <cite class="blockquote-new__author-name">
                    Евгений Морякин
                </cite>
                <p class="blockquote-new__author-position">
                    руководитель отдела проектного менеджмента «Лайм Займ»
                </p>
            </div>
        </footer>
    </blockquote>
</div>

</div>
        </div>
</div>


</div>

						</div>
						<div class="umb-grid__col umb-grid__col--4">
							
<div class="umb-block-grid__area"
     data-area-col-span="4"
     data-area-row-span="1"
     data-area-alias="area_1"
     style="--umb-block-grid--grid-columns: 4;--umb-block-grid--area-column-span: 4; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="imageWithOffset"
            data-content-element-type-key="53fff1f0-ecb9-4c3c-9af3-73a017c22bdf"
            data-element-udi="umb://element/d1396a7f98ae4824a9a07e4ad5080aa6"
            data-col-span="4"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 4; --umb-block-grid--item-row-span: 1; ">

<div class="umb-macro-image-with-offset umb-macro-image-with-offset--22860622">
    


    <img src="/Media/2373/femida.png"
         alt=""
         itemprop="">


            <style>
            @media screen and (min-width: 768px) {
                .umb-macro-image-with-offset--22860622 {
                    /* manual inline */
                    max-width:362px;right:-64px;
                }
            }
            </style>
</div>

        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Сервисы микрофинансовой организации «Лайм-Займ»
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/lime-zaim/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/lime-zaim/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:57 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x421;&#x442;&#x430;&#x440;&#x442;&#x430;&#x43F;&#x44B;</category>
                            <category>&#x424;&#x438;&#x43D;&#x430;&#x43D;&#x441;&#x43E;&#x432;&#x44B;&#x435; &#x43F;&#x43B;&#x430;&#x442;&#x444;&#x43E;&#x440;&#x43C;&#x44B;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Сервисы микрофинансовой организации «Лайм-Займ»</h1>
                                <figure>
                                    <img src="/Media/1774/lime-case.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/30cb3e2deca4651fb07e4843d54ce154"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/416a06c7df7040dbbf062d85156ebd0d"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Микрофинансовая организация «Лайм-Займ».</p>
<p>Компания основана в&nbsp;2013 году. Работает в&nbsp;России, Польше, Южной Африке и&nbsp;Мексике.</p>
<h2>Задача</h2>
<p>Создать веб-сервис, предоставляющий кредиты физическим лицам в&nbsp;режиме онлайн.</p>
<p>Сервис должен моментально оценивать кредитоспособность заёмщика, назначать тариф пользователю, перечислять деньги на&nbsp;привязанную карту, принимать суммы за&nbsp;погашение кредита.</p>
<p>Также требовалось разработать большой блок управления системой: интерфейс администратора системы, интерфейс операторов, отображение текущих финансовых показателей, выгрузка отчетов для&nbsp;Центрального Банка.</p>
<p>Идеи и&nbsp;принципы работы сервиса описал сам&nbsp;клиент. Нам&nbsp;предстояло переложить эти&nbsp;идеи на&nbsp;язык технического задания и&nbsp;прототипов, а&nbsp;затем разработать и&nbsp;запустить сервис.</p>
<h2>Результат</h2>
<p>В апреле 2014 года мы&nbsp;запустили первый сайт микрофинансовой организации «Лайм-Займ» в&nbsp;России — <a rel="noopener" href="https://www.lime-zaim.ru/" target="_blank" title="Сайт «Лайм-Займ» в&nbsp;России">https://www.lime-zaim.ru/</a>  </p>
<p>Со временем география «Лайм-Займ» расширилась. За&nbsp;четыре года мы&nbsp;разработали и&nbsp;запустили три&nbsp;аналогичных веб-сервиса:</p>
<ul>
<li>в декабре 2015 — <a rel="noopener" href="https://www.lime-kredyt.pl/" target="_blank" title="Сайт «Лайм-Займ» в&nbsp;Польше">Lime Kredyt в&nbsp;Польше</a>;</li>
<li>в июле 2017 —  <a rel="noopener" href="https://www.lime24.co.za/" target="_blank" title="Сайт «Лайм-Займ» в&nbsp;Южной Африке">Lime24 в&nbsp;Южной Африке</a>;</li>
<li>в ноябре 2018 — <a rel="noopener" href="https://www.lime24.mx/" target="_blank" title="Сайт «Лайм-Займ» в&nbsp;Мексике">Lime24 в&nbsp;Мексике</a>.</li>
</ul>
<p>На сайтах «Лайм-Займ» клиенты берут кредиты в&nbsp;режиме онлайн: круглосуточно и&nbsp;без&nbsp;посещения офиса компании. Сервис онлайн-займов автоматически рассчитывает индивидуальный тариф в&nbsp;зависимости от&nbsp;запрошенной суммы, срока кредитования и&nbsp;кредитной истории. После одобрения деньги поступают на&nbsp;счет клиента. Денежные операции совершаются с&nbsp;соблюдением законов стран, где&nbsp;работает «Лайм-Займ».</p>
<hr />
<p>В 2020 году мы&nbsp;запустили еще&nbsp;один проект для&nbsp;«Лайм Займ» — систему для&nbsp;работы с&nbsp;просроченным задолженностям «Цессионарий».</p>
<p>«Цессионарий» позволяет вести сразу несколько дел, облегчает, систематизирует и&nbsp;ускоряет работу с&nbsp;документам, исключает риск их&nbsp; потери.</p>
<p>Подробнее о&nbsp;проекте читайте <a href="/projects/assignot" title="Кейс РМ&nbsp;«Цессионарий»">в кейсе системы «Цессионарий»</a>.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Сайт для британской веб-студии Delete&nbsp;Agency
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/delete/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/delete/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:56 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Сайт для британской веб-студии Delete&nbsp;Agency</h1>
                                <figure>
                                    <img src="/Media/1863/deleteagency-case.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/a3f41f0f97edc5c19374a353a53fa5f4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ed63de882090467dba2766f5e0cac6aa"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Наши партнеры из&nbsp;Англии — веб-студия Delete Agency.</p>
<h2>Задача</h2>
<p>Создать новый сайт Delete Agency*: обновить бренд, повысить его&nbsp;привлекательность и&nbsp;узнаваемость. Дизайном занималась английская команда, а&nbsp;разработка была на&nbsp;нас.  </p>
<h2>Результат</h2>
<p>Стильный и&nbsp;современный адаптивный сайт Delete Agency. На&nbsp;новом сайте существенно расширился раздел «Портфолио». Сайт работает на&nbsp;системе Sitecore CMS.</p>
<p> </p>
<p><em>* Проект разрабатывался совместно с<span> </span>Delete Agency (сейчас работают под&nbsp;брендом <a rel="noopener" href="https://unrvld.com/" target="_blank" title="Сайт UNRVLD">UNRVLD</a>).</em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Never Buy Another: сайт для британской компании Harris Brushes 
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/harris-brushes/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/harris-brushes/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:53 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Never Buy Another: сайт для британской компании Harris Brushes </h1>
                                <figure>
                                    <img src="/Media/1892/never-buy-another.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/9052afaf7ce1fc6f6347dc008e2ddd70"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/5d40c28ecca64914987d717daba841b4"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Производитель малярных кистей из&nbsp;Великобритании компания Harris Brushes, основанная в&nbsp;1928 году.</p>
<h2>Задача</h2>
<p>Создать сайт компании Harris Brushes*, который повысит узнаваемость бренда и&nbsp;увеличит продажи. Основная идея сайта — «купи кисть Harris Brushes с&nbsp;пожизненной гарантией». Если кисть испортится, Harris Brushes вышлет покупателю новую. </p>
<p>Переговоры и&nbsp;дизайн были на&nbsp;стороне Delete Agency, а&nbsp;техническая часть — на&nbsp;нас.  </p>
<h2>Результат</h2>
<p>В октябре 2015 была запущена первая версия сайта Harris Brushes. На&nbsp;нём&nbsp;пользователи могли:</p>
<ul>
<li>зарегистрировать купленную кисть по&nbsp;её&nbsp;уникальному коду;</li>
<li>обменять испорченную кисть на&nbsp;новую (если старая кисть была зарегистрирована);</li>
<li>персонализировать кисть Harris Brushes с&nbsp;помощью гравировки на&nbsp;ручке.</li>
</ul>
<p>Данные из&nbsp;форм регистрации и&nbsp;персонализации собирались и&nbsp;использовались заказчиком в&nbsp;маркетинговых целях.</p>
<p>В ноябре 2015 года была запущена вторая версия сайта — появилась возможность купить кисть нужного размера и&nbsp;с&nbsp;уникальной надписью напрямую через сайт.</p>
<p>Сейчас компания Harris Brushes сменила дизайн сайта, но&nbsp;веб-архив всё&nbsp;помнит: так&nbsp;выглядел сайт <a rel="noopener" href="http://web-arhive.ru/view?url=https%3A%2F%2Fwww.harrisneverbuyanother.co.uk%2F&amp;time=20171208002246&amp;f=1" target="_blank" title="Сайт Harris Brushes в&nbsp;веб-архиве" data-anchor="?url=https%3A%2F%2Fwww.harrisneverbuyanother.co.uk%2F&amp;time=20171208002246&amp;f=1">www.harrisneverbuyanother.co.uk</a> по&nbsp;версии Delete Agency и&nbsp;fuse8.</p>
<p> </p>
<p><em>* Проект разрабатывался совместно с&nbsp;<a rel="noopener" href="https://unrvld.com/" target="_blank" title="Сайт UNRVLD">UNRVLD</a> (бывшие Delete Agency).</em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Система регистрации гостей iGuzzini на выставке Light+Building
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/iguzzini/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/iguzzini/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:53 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x41C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Система регистрации гостей iGuzzini на выставке Light+Building</h1>
                                <figure>
                                    <img src="/Media/1806/iguzzini.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/35a9b4f8639cc09f3b1c0ac54d42e0ff"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/f32a017dfee24fd385804b20bf08ae19"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Итальянская компания iGuzzini основана в&nbsp;1958 году. Производит оборудование для&nbsp;внутреннего, наружного и&nbsp;декоративного освещения.</p>
<p>Светильники iGuzzini используются в&nbsp;аэропортах, музеях и&nbsp;галереях, торговых центрах и&nbsp;выставочных залах. Специальная линейка оборудования итальянской компании предназначена для&nbsp;наружного освещения: для&nbsp;подсветки административных зданий, памятников архитектуры, статуй и&nbsp;монументов.  </p>
<h2>Задача</h2>
<p>В 2018 году компания iGuzzini принимала участие в&nbsp;международной выставке Light+Building во&nbsp;Франкфурте. Перед Delete Agency и&nbsp;fuse8 стояла задача разработать приложение* для&nbsp;регистрации гостей стенда компании, разделить потоки людей и&nbsp;собрать информацию о&nbsp;тех, кто&nbsp;побывал на&nbsp;шоу.</p>
<h2>Результат</h2>
<p>Приложение для&nbsp;регистрации гостей iGuzzini на&nbsp;выставке Light+Building.</p>
<p>Посетители заранее регистрировались на&nbsp;сайте <a rel="noopener" href="https://www.iguzzini.com/" target="_blank" title="Сайт iGuzzini">iGuzzini.com</a> и&nbsp;выбирали удобные день и&nbsp;время посещения стенда компании. После этого на&nbsp;электронную почту приходило приветственное письмо с&nbsp;входным билетом – брендированным QR-кодом. В&nbsp;назначенный день гость прикладывал смартфон с&nbsp;QR-кодом или&nbsp;распечатанный билет к&nbsp;тумбе с&nbsp;iPad, а&nbsp;установленное на&nbsp;него приложение считывало информацию, приветствовало гостя и&nbsp;приглашало войти на&nbsp;световое шоу.</p>
<p>На регистрацию 50 гостей через приложение уходило до&nbsp;4 минут. За&nbsp;шесть дней выставки iGuzzini провели 162 шоу, на&nbsp;которых побывали 6000 человек. Информация о&nbsp;гостях сохранилась в&nbsp;базе данных компании: когда выставка закончилась, iGuzzini автоматически разослала участникам благодарственные письма и&nbsp;каталоги продукции с&nbsp;дополнительной информацией.</p>
<p> </p>
<p>* <em>Проект разрабатывался совместно с<span> <a rel="noopener" href="https://unrvld.com/" target="_blank" title="Сайт UNRVLD">UNRVLD</a> (бывшие Delete Agency)</span>.</em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Онлайн-журнал IKEA Live
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/ikea/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/ikea/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:53 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Онлайн-журнал IKEA Live</h1>
                                <figure>
                                    <img src="/Media/1859/ikea.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/262114dc3769754424e0fae595c39981"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/20bd975fde1c43cfae254551c8f50269"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Издательство August Media, которое занимается выпуском полиграфии для&nbsp;IKEA.  </p>
<h2>Задача</h2>
<p>Создать онлайн-версию бумажного журнала IKEA Live*.</p>
<p>Цель журнала — вдохновить читателей. На&nbsp;его&nbsp;страницах — фото реальных интерьеров домов, созданных с&nbsp;использованием продукции IKEA.</p>
<p>Онлайн-версия журнала должна была сохранить очарование полиграфического издания, а&nbsp;в&nbsp;долгосрочной перспективе — уменьшить тираж печатной продукции компании.</p>
<h2>Результат</h2>
<p>Онлайн-версия журнала IKEA Live, названная «Live Digimag» (электронный Live-журнал). Журнал был&nbsp;запущен на&nbsp;26 языках, в&nbsp;том&nbsp;числе и&nbsp;на&nbsp;русском.</p>
<p><br /><em>* Проект разрабатывался совместно с&nbsp;<a rel="noopener" href="https://unrvld.com/" target="_blank" title="Сайт UNRVLD">UNRVLD</a><span> </span>(бывшие Delete Agency).</em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Сайт итальянского ресторана CasaMia
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/casamia/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/casamia/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:52 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Сайт итальянского ресторана CasaMia</h1>
                                <figure>
                                    <img src="/Media/1818/appetizer-breakfast-cuisine-326278.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/63e81d3d5217f72936890131cfd613cb"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/48d96be959c14b19b7ddb75d650e5864"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Франческо Мазелла — владелец итальянского ресторана CasaMia из&nbsp;Лидса, города графства Йоркшир в&nbsp;Великобритании.</p>
<h2>Задача</h2>
<p>Переделать сайт пятилетней давности: сделать его&nbsp;современным, удобным и&nbsp;адаптивным.</p>
<p>Заказчик хотел, чтобы на&nbsp;новом новом сайте клиент мог:</p>
<ul>
<li>ознакомиться с&nbsp;меню и&nbsp;акциями ресторана;</li>
<li>заказать и&nbsp;оплатить еду&nbsp;навынос или&nbsp;купить товары (вино, подарочные наборы, готовые итальянские десерты);</li>
<li>забронировать столик в&nbsp;зале;</li>
<li>зарегистрировать карту лояльности ресторана;</li>
<li>посмотреть расписание мастер-классов и&nbsp;событий.</li>
</ul>
<h2>Результат</h2>
<p>Удобный и&nbsp;функциональный сайт итальянского ресторана <a rel="noopener" href="https://www.casamiaonline.com/" target="_blank" title="Сайт ресторана CasaMia">CasaMia</a>, который адаптирован для&nbsp;разных устройств.<span style="font-weight: 400;"></span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    «Сократ» — мобильное приложение для логистических компаний
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/sokrat/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/sokrat/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:52 GMT</pubDate>

                            <category>&#x41C;&#x43E;&#x431;&#x438;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>
                            <category>&#x421;&#x442;&#x430;&#x440;&#x442;&#x430;&#x43F;&#x44B;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>«Сократ» — мобильное приложение для логистических компаний</h1>
                                <figure>
                                    <img src="/Media/1861/sokrat-case.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/1491bd1823d91f2116568233330097c9"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/717b369bfda84cfb910ba01237d28548"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Челябинский предприниматель Александр Афанасьев. Долгое время проработал в&nbsp;логистической компании, сейчас занимается финансовым консультированием. Александр знает всё&nbsp;о&nbsp;грузоперевозках. Он&nbsp;выступил автором стартапа «Сократ» — приложения, которое помогает менеджерам по&nbsp;грузоперевозкам вести сделки, а&nbsp;клиентам — отслеживать движение груза.</p>
<h2>Задача</h2>
<p>Создать мобильное приложение, которое:</p>
<ul>
<li>облегчит организацию грузоперевозок;</li>
<li>позволит клиенту отслеживать местоположение водителя, осуществляющего перевозку;</li>
<li>сократит количество телефонных переговоров менеджера с&nbsp;клиентами и&nbsp;водителями;</li>
<li>соберёт всю&nbsp;информацию о&nbsp;сделке в&nbsp;одном месте (детали сделки, участники, их&nbsp;контакты и&nbsp;прочее).</li>
</ul>
<p>Также перед нами стояла задача создать лендинг для&nbsp;приложения «Сократ», где&nbsp;подробно рассказывается о&nbsp;функциях приложения, чем&nbsp;оно&nbsp;полезно и&nbsp;как&nbsp;им&nbsp;пользоваться.</p>
<h2>Результат</h2>
<p><a rel="noopener" href="https://play.google.com/store/apps/details?id=ru.fuse8.socrat" target="_blank" title="«Сократ» в&nbsp;Google Play" data-anchor="?id=ru.fuse8.socrat">Мобильное приложение «Сократ»</a> для&nbsp;смартфонов и&nbsp;лендинг <a rel="noopener" href="http://www.sokrat.biz/" target="_blank" title="Лендинг приложения «Сократ»">http://www.sokrat.biz/</a> с&nbsp;подробным описанием приложения и&nbsp;инструкцией по&nbsp;его&nbsp;использованию.</p>
<p>В приложении можно организовывать и&nbsp;вести сразу несколько сделок. В&nbsp;каждой из&nbsp;них&nbsp;хранится вся&nbsp;необходимая информация — от&nbsp;списка участников до&nbsp;их&nbsp;контактных данных и&nbsp;географического положения (для&nbsp;водителей). Если менеджер подключит к&nbsp;сделке клиента, он&nbsp;сможет в&nbsp;режиме реального времени отслеживать груз.</p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Сайт Университета Эссекса
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/university-of-essex/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/university-of-essex/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:52 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Сайт Университета Эссекса</h1>
                                <figure>
                                    <img src="/Media/1807/essex.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/c968ba964b778642ae961717efc76f58"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium  spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/ed6c16daa23a4f77b72e84cc31aff485"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Эссекский университет — клиент нашего партнёра Delete Agency — британское высшее учебное заведение кампусного типа (учебные корпусы, общежития и&nbsp;досуговые учреждения находятся на&nbsp;одной территории), основанное в&nbsp;1963 году. Специализируется как&nbsp;на&nbsp;преподавательской, так&nbsp;и&nbsp;на&nbsp;исследовательской деятельности.</p>
<p>Университет разделен на&nbsp;три&nbsp;факультета (факультет науки и&nbsp;здоровья, факультет социальных наук, факультет гуманитарных наук), которые включают в&nbsp;себя 20 школ и&nbsp;учебных отделений.</p>
<h2>Задача</h2>
<p>Перед Delete Agency и&nbsp;fuse8 стояла задача создать современный и&nbsp;удобный сайт университета*, на&nbsp;котором абитуриенты и&nbsp;студенты смогут получить всю&nbsp;необходимую информацию для&nbsp;поступления и&nbsp;обучения.</p>
<p>Университет Эссекса входит в&nbsp;топ-25 лучших высших учебных заведений Великобритании. Руководство университета хотело заявить о&nbsp;себе, переосмыслить и&nbsp;оживить свой бренд в&nbsp;онлайне, сделать сайт, который будет не&nbsp;похож на&nbsp;другие, и&nbsp;привлечь внимание потенциальных студентов.</p>
<p>Мы взяли на&nbsp;себя всю&nbsp;техническую сторону проекта (бэкенд- и&nbsp;фронтэнд-разработка, тестирование), Delete Agency — дизайн нового сайта университета.</p>
<h2>Результат</h2>
<p>Новый сайт университета Эссекса — <a rel="noopener" href="https://www.essex.ac.uk/" target="_blank" title="Официальный сайт Университета Эссекса">https://www.essex.ac.uk/</a>.</p>
<p>Основой успеха этого проекта стал смелый дизайн от&nbsp;Delete Agency, кардинально отличающийся от&nbsp;первой версии сайта. Он&nbsp;вдохновляет и&nbsp;привлекает абитуриентов, повышает узнаваемость бренда.</p>
<p>На новом сайте пользователи с&nbsp;легкостью могут найти подходящие курсы, ознакомиться с&nbsp;новостями и&nbsp;историей университета, запросить дополнительную информацию через специальную форму Ask&nbsp;us&nbsp;a&nbsp;question и&nbsp;записаться на&nbsp;участие в&nbsp;Дне&nbsp;открытых дверей.</p>
<p>&nbsp;</p>



<blockquote>
    <div class="blockquote-body">
        Мы&nbsp;хотели создать сайт, не&nbsp;похожий на&nbsp;другие сайты университетов в&nbsp;Великобритании. И&nbsp;команда Delete Agency (совместно с&nbsp;fuse8) помогла нам&nbsp;добиться этого. Новая цифровая площадка выдвигает Университет Эссекса на&nbsp;передний план всего сектора образования — будущие студенты в&nbsp;восторге от&nbsp;возможности учиться у&nbsp;нас, сайт охватывает всё&nbsp;больше аспектов и&nbsp;направлений работы уже&nbsp;существующего коммьюнити университета.
    </div>
    <footer>
        <div class="author">
            <div class="author__title">
                <cite>
                    Брин Моррис, вице-канцлер Университета Эссекса
                </cite>
            </div>
        </div>
    </footer>
</blockquote>


<p>&nbsp;</p>
<p><em><span style="font-weight: 400;">* Проект разрабатывался совместно с&nbsp;</span><a href="https://www.deleteagency.com/"><span style="font-weight: 400;">Delete Agency</span></a><span style="font-weight: 400;">.</span></em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Сервис по продаже и аренде недвижимости Carter Jonas
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/carter-jonas/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/carter-jonas/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:52 GMT</pubDate>

                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>
                            <category>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Сервис по продаже и аренде недвижимости Carter Jonas</h1>
                                <figure>
                                    <img src="/Media/1867/carterjonas.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3c5086d4aa2cf2f079cf2b15db90775b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/e89a856e01bb4164915555327f205b42"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h2>Клиент</h2>
<p>Британская компания Carter Jonas — клиент нашего партнёра Delete Agency. Занимается продажей и&nbsp;сдачей в&nbsp;аренду недвижимости на&nbsp;территории Англии — жилой и&nbsp;коммерческой, под&nbsp;застройку и&nbsp;для&nbsp;сельского хозяйства.</p>
<h2>Задача</h2>
<p>Нашей задачей была техническая реализация (бэкенд- и&nbsp;фронтэнд-разработка, тестирование) сайта по&nbsp;поиску недвижимости*. Сайт должен быть адаптирован под&nbsp;работу на&nbsp;разных устройствах — ПК, планшетах и&nbsp;смартфонах. Дизайн нового сайта был&nbsp;разработан в&nbsp;Delete Agency.</p>
<h2>Результат</h2>
<p>Сайт <a rel="noopener" href="https://www.carterjonas.co.uk/" target="_blank" title="Сайт Carter Jonas">https://www.carterjonas.co.uk/</a> был&nbsp;запущен в&nbsp;июле 2017 года.</p>
<p>Сервис помогает найти недвижимость в&nbsp;аренду или&nbsp;собственность для&nbsp;определенных целей в&nbsp;любом графстве Великобритании. Если зарегистрированный пользователь сохранит параметры поиска, сервис уведомит его&nbsp;о&nbsp;появлении новых подходящих объектов. Недвижимость отображается на&nbsp;карте. Также на&nbsp;CarterJonas.co.uk можно заказать оценку недвижимости или&nbsp;консультацию.  </p>
<p>С  момента запуска сайта Carter Jonas:</p>
<ul>
<li>на 507% увеличилось количество онлайн-запросов на&nbsp;оценку недвижимости;</li>
<li>на 375% увеличилась общая конверсия сайта;</li>
<li>на 925% увеличилось количество предварительных телефонных запросов на&nbsp;покупку и&nbsp;аренду недвижимости.</li>
</ul>
<p><br /><em>* Проект разрабатывался совместно с&nbsp;<span> </span><a rel="noopener" href="https://unrvld.com/" target="_blank" title="Сайт UNRVLD">UNRVLD</a><span> </span>(бывшие Delete Agency).</em></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
            <item turbo="true">
                <title>
                    <![CDATA[
                    Как устроена работа на складе Emex: простой интерфейс на десктопе и портативном устройстве для множества складов компании
                    ]]>
                </title>
                <description>
                    <![CDATA[
                    
                    ]]>
                </description>
                <link>http://fuse8.ru/projects/emex-wms/</link>
                <guid isPermaLink="true">http://fuse8.ru/projects/emex-wms/</guid>

                <pubDate>Sun, 22 Sep 2024 22:45:52 GMT</pubDate>

                            <category>&#x418;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;</category>
                            <category>&#x412;&#x435;&#x431;-&#x440;&#x430;&#x437;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x430;</category>

                <turbo:content>
                    <![CDATA[
                    <header>
                        <h1>Как устроена работа на складе Emex: простой интерфейс на десктопе и портативном устройстве для множества складов компании</h1>
                                <figure>
                                    <img src="/Media/2992/img_0331.jpg" alt=""/>
                                </figure>

                        <menu>
                                <a href="/header/projects/">Портфолио</a>
                                <a href="/header/services/">Услуги</a>
                                <a href="/header/articles/">Статьи</a>
                                <a href="/header/team/">Команда</a>
                                <a href="/header/contacts/">Контакты</a>
                        </menu>
                    </header>

<div class="umb-block-grid"
     data-grid-columns="12;"
     style="--umb-block-grid--grid-columns: 12;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="oneColumn"
            data-content-element-type-key="d2f4b61f-b7ed-347c-853c-81ef1559ef49"
            data-element-udi="umb://element/3858583d7bc0e10d94d7d0b4bd9cd97b"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">



<div class="umb-grid__block  " style="">
	<div class="umb-grid">
			<div class="umb-grid__limiter">
				<div class="umb-grid__row">
						<div class="umb-grid__col umb-grid__col--12">
							
<div class="umb-block-grid__area"
     data-area-col-span="12"
     data-area-row-span="1"
     data-area-alias="area_0"
     style="--umb-block-grid--grid-columns: 12;--umb-block-grid--area-column-span: 12; --umb-block-grid--area-row-span: 1;">
    

<div class="umb-block-grid__layout-container">
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/512d542a6aec4a319e6bd43d8ef35170"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Компания Emex занимается продажей запчастей и&nbsp;оборудования для&nbsp;автомобилей через собственный маркетплейс. В&nbsp;2020 году мы&nbsp;с&nbsp;Emex вместе поработали над&nbsp;проектом для&nbsp;российского сектора бизнеса компании, а&nbsp;после сообща обновили Seller Drive – внутреннюю систему для&nbsp;поставщиков на&nbsp;зарубежном рынке: </span><a href="/projects/emex-seller-drive-system-design/" title="Emex Seller Drive Analytics"><span style="font-weight: 400;">спроектировали</span></a><span style="font-weight: 400;">, а&nbsp;потом </span><a href="/projects/emex-seller-drive-system-development/" title="Emex Seller Drive Development"><span style="font-weight: 400;">запустили</span></a><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">Работа с&nbsp;Emex на&nbsp;этом не&nbsp;закончилась. Мы&nbsp;также помогли компании создать подсистему управления складами в&nbsp;рамках автоматизации работы сортировочных центров. Она&nbsp;служит инструментом труда складских работников, которые занимаются приемкой, размещением и&nbsp;выдачей товаров, заказанных на&nbsp;маркетплейсе Emex, а&nbsp;также товаров, переданных на&nbsp;хранение внешними заказчиками.</span></p>
<h2>Как работает склад (сортировочный центр)</h2>
<ol>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Товар определенной категории и&nbsp;размера поступает на&nbsp;склад.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Сотрудник склада выполняет приемку через систему, при&nbsp;необходимости стикерует (распечатывает и&nbsp;наклеивает стикер со&nbsp;штрих-кодом), взвешивает и&nbsp;размещает товар в&nbsp;подходящую ячейку.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Может возникнуть потребность переместить товар из&nbsp;одной ячейки в&nbsp;другую. Тогда сотрудник склада также обращается к&nbsp;системе управления складом, чтобы изменить в&nbsp;ней&nbsp;расположение определенного товара.</span></li>
<li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Когда товар нужно выдать (или&nbsp;отправить) заказчику, сотрудник склада снова обращается к&nbsp;системе, чтобы найти нужный товар и&nbsp;выдать его&nbsp;(отгрузка со&nbsp;склада).</span></li>
</ol>
<h2>Как система управления складом помогает складскому сотруднику</h2>
<p><span style="font-weight: 400;">Это Виктор. Он&nbsp;работает на&nbsp;складе Emex и&nbsp;отвечает за&nbsp;приемку, размещение, перемещение и&nbsp;сбор товарных единиц, которые поступают на&nbsp;склад ежедневно.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/787313edd8414f508e351c0426e2c448"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2989/slide-16_9-34.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/8bfb121c1e654355b4b7d62720b98323"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <h3>Приемка и&nbsp;размещение</h3>
<p> </p>
<p><span style="font-weight: 400;">Вот на&nbsp;склад приходит партия товара. Его&nbsp;нужно простикеровать, отсканировать и&nbsp;разложить по&nbsp;подходящим свободным ячейкам. Виктор вооружается ТСД&nbsp;(терминал сбора данных) и&nbsp;идет разбирать поставку. На&nbsp;ТСД&nbsp;он&nbsp;открывает нашу систему, в&nbsp;интерфейсе которой высвечивается команда: «Сканируйте стикер приемки».</span></p>
<p><span style="font-weight: 400;">Стикер приемки – это&nbsp;штрих код, расположенный на&nbsp;упаковке товара. Этот штрихкод был&nbsp;сгенерирован внутри системы Emex во&nbsp;время приемки. Сканируя штрих код, Виктор видит в&nbsp;системе задание на&nbsp;размещение. </span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/eca5a2ad447f4f7282ea9ea08eafe9f6"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2990/slide-16_9-36.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/50ebcea5f1c7414dba1a22c20253f208"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Система по&nbsp;штрих коду поймет, что&nbsp;это&nbsp;за&nbsp;товар и&nbsp;сколько он&nbsp;весит. А&nbsp;еще&nbsp;благодаря интеграции с&nbsp;электронными весами, запишет и&nbsp;вес&nbsp;отсканированного товара. На&nbsp;основе этих данных система подскажет Виктору, куда можно положить отсканированный товар. </span></p>
<p><span style="font-weight: 400;">На терминале Виктор увидит набор чисел – координаты размещения товара на&nbsp;складе. Сначала номер ряда, затем номер секции, а&nbsp;после – номер конкретной ячейки.</span></p>
<p><span style="font-weight: 400;">Виктор подойдет к&nbsp;ячейке, положит в&nbsp;нее&nbsp;товар, после чего ячейку отсканирует, чтобы на&nbsp;этапе сбора выдать нужную позицию из&nbsp;нужной ячейки.</span></p>
<p><span style="font-weight: 400;">На этапе раскладывания пришедших товаров по&nbsp;ячейкам система управления складом работает так, чтобы Виктору, размещая товары, не&nbsp;пришлось бегать по&nbsp;всему складу. После размещения и&nbsp;сканирования ячейки, система будет предлагать для&nbsp;следующих размещений ближайшие ячейки. Экономим время и&nbsp;силы Виктора.</span></p>
<h3>Перемещение</h3>
<p> </p>
<p><span style="font-weight: 400;">Если нужно переложить какие&#8209;то&nbsp;товары в&nbsp;другие ячейки, Виктор переходит во&nbsp;вкладку «Перемещение».</span></p>
<p><span style="font-weight: 400;">Здесь процесс обратный. Сперва Виктор сканирует ячейку, из&nbsp;которой вынимает товар, а&nbsp;затем – сам&nbsp;товар. После нужно отсканировать целевую ячейку для&nbsp;перекладывания, переместить в&nbsp;нее&nbsp;товар, и&nbsp;готово.</span></p>
<h3>Сбор</h3>
<p><span style="font-weight: 400;">Когда за&nbsp;партией товара приезжает заказчик или&nbsp;перевозчик, который перемещает товары на&nbsp;другой, например, склад, Виктор начинает заниматься процессом сбора.</span></p>
<p><span style="font-weight: 400;">Приезжает заказчик и&nbsp;хочет забрать товары, или&nbsp;поступил заказ из&nbsp;интернет магазина. Здесь Виктору нужно сперва распечатать стикеры на&nbsp;сбор, отсканировав которые станет понятно, какие товары и&nbsp;из&nbsp;каких ячеек собирать. Для&nbsp;каждого случая задания на&nbsp;сбор будут разными, но&nbsp;  обрабатывать их&nbsp;Виктор будет в&nbsp;уже&nbsp;знакомом интерфейсе.</span></p>
</div>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="imageWithCaption"
            data-content-element-type-key="63d80d2e-38a7-4efb-aaa7-1165ccb258c0"
            data-element-udi="umb://element/a4f4a9bd134b4011b0c2bc0a6ae8a2d2"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">


<figure class="umb-macro-image">
    


    <img src="/Media/2991/slide-16_9-37.png"
         alt=""
         itemprop="">


</figure>
        </div>
        <div class="umb-block-grid__layout-item spacing-top-medium spacing-medium spacing-wrapper"
            data-content-element-type-alias="richtextBlock"
            data-content-element-type-key="fab70c80-30e4-4efc-8e26-f0e773afff9b"
            data-element-udi="umb://element/b8de42ddba364fa78f0e9a79166cfa77"
            data-col-span="12"
            data-row-span="1"
            style=" --umb-block-grid--item-column-span: 12; --umb-block-grid--item-row-span: 1; ">

<div class="typography">
    <p><span style="font-weight: 400;">Лента со&nbsp;стикерами вылезает из&nbsp;принтера, и&nbsp;Виктор начинает их&nbsp;по&nbsp;очереди сканировать. Система не&nbsp;дает сделать ошибку, оповещая о&nbsp;неверных сканированиях, например. Виктор точно знает, куда идти и&nbsp;что&nbsp;вынимать из&nbsp;ячеек. Когда все&nbsp;стикеры отработаны, Виктор складывает все&nbsp;в&nbsp;тележку и&nbsp;увозит ее&nbsp;на&nbsp;выдачу.</span></p>
<p><span style="font-weight: 400;">Рабочий день окончен, можно выдохнуть.</span></p>
<h2>Откуда берутся ячейки</h2>
<p><span style="font-weight: 400;">На десктопной версии сайта появляется кнопка «Ячейки». Перейдя в&nbsp;эту&nbsp;вкладку, можно настроить топологию каждого конкретного склада. Чтобы настроить расположение ячеек, нужно будет зайти в&nbsp;«Ячейки» и&nbsp;разметить их&nbsp;как&nbsp;требуется. Для&nbsp;каждого склада в&nbsp;системе записана своя топология.</span></p>
<h2>И долго такое разрабатывать?</h2>
<p><span style="font-weight: 400;">На активную разработку системы управления складом у&nbsp;нас&nbsp;ушло порядка четырех месяцев. Еще&nbsp;месяца три&nbsp;интегрировали эту&nbsp;систему с&nbsp;остальными системами и&nbsp;компонентами для&nbsp;обеспечения непрерывного логистического процесса.</span></p>
<p><span style="font-weight: 400;">Сейчас система уже&nbsp;вовсю работает, упрощая ежедневные задачи множества складских сотрудников как&nbsp;в&nbsp;РФ, так&nbsp;и&nbsp;за&nbsp;ее&nbsp;пределами (в&nbsp;ОАЭ&nbsp;и&nbsp;Польше). </span></p>
</div>
        </div>
</div>


</div>

						</div>
				</div>
			</div>
	</div>
</div>
        </div>
</div>


</div>
                    ]]>
                </turbo:content>
            </item>
    </channel>
</rss>
