<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Evgeniy Peshkov</title><generator>teletype.in</generator><description><![CDATA[Пишу про DDD, Agile, Kanban Method, развитие команд и разработку в целом.]]></description><image><url>https://teletype.in/files/fa/23/fa232552-37ee-4546-b3c9-8a925840c63b.png</url><title>Evgeniy Peshkov</title><link>https://devtrick.com/</link></image><link>https://devtrick.com/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/devtrick?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/devtrick?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 20 Apr 2026 02:08:42 GMT</pubDate><lastBuildDate>Mon, 20 Apr 2026 02:08:42 GMT</lastBuildDate><item><guid isPermaLink="true">https://devtrick.com/not-only-event-storming</guid><link>https://devtrick.com/not-only-event-storming?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/not-only-event-storming?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>Не ивент штормингом единым</title><pubDate>Wed, 08 Sep 2021 09:33:21 GMT</pubDate><category>Agile</category><description><![CDATA[Как отмечают многие эксперты, агрегаты и иные тактические паттерны вторичны для true-DDD. А первично общение с бизнесом, понимание истинной природы запроса. Именно это позволяет создавать фичи максимально заточенные под потребность. Разработчики, которые практикуют DDD обязаны выходить за пределы техники и примерять себе роль продакта.]]></description><content:encoded><![CDATA[
  <p id="zKN0">Как отмечают многие эксперты, агрегаты и иные тактические паттерны вторичны для true-DDD. А первично общение с бизнесом, понимание истинной природы запроса. Именно это позволяет создавать фичи максимально заточенные под потребность. Разработчики, которые практикуют DDD обязаны выходить за пределы техники и примерять себе роль продакта.</p>
  <p id="MVuQ">Какие инструменты мы можем использовать?</p>
  <p id="1Jxf">1. Самый простой и многим привычный инструмент – <a href="https://scrumtrek.ru/blog/product-management/3364/user-story-instruktsiya-po-primeneniyu/" target="_blank">Юзер стори</a>. Не забывайте, что это не просто формальное предложение на карточке, а как и много в аджайл повод пообщаться.</p>
  <p id="aMNv"><br />2. Event Storming – хорошо знакомый ДДД-практикам воркшоп. Если вы не знакомы, то <a href="https://github.com/mariuszgil/awesome-eventstorming/" target="_blank">здесь</a> много полезных ссылок.</p>
  <p id="eMGs"><br />3. <a href="https://tilda.education/articles-jobs-to-be-done" target="_blank">Jobs To Be Done</a> (aka JTBD).<br />Далее цитата из статьи: <br />Продукт, который вы создаете, решает проблему пользователя — «выполняет работу». Пользователи покупают, то есть «нанимают на работу» ваш продукт, чтобы он сделал свою работу — и сделал жизнь пользователя немного счастливее.</p>
  <p id="4wTm"><br />4. <a href="https://knowledge21.com/blog/decantation-tank-a-canvas-as-a-solution/" target="_blank">Decantation Tank</a>.<br />Этот канвас помогает сконцентрироваться на предназначении продукта, проблемах пользователей, метриках и идеях.</p>
  <p id="yiYf"><br />5. Fit for purpose (aka F4P) <br />Данный фреймворк также сфокусирован на понимании своего заказчика, его истинных потребностей, и на подстройке своего продукта под заказчика.</p>
  <p id="kIVq">Это неисчерпывающий список, в мире продактов есть еще пачка различных фреймворков и канвасов. Делитесь в комментариях как часто вы входите в зону продакт-менеджмента и какими инструментами при этом пользуетесь.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://devtrick.com/transfer</guid><link>https://devtrick.com/transfer?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/transfer?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>Перенос постов</title><pubDate>Mon, 25 Jan 2021 09:24:20 GMT</pubDate><description><![CDATA[Перевез посты с гугла, к сожалению потерялись оригинальные даты ¯\(ツ)/¯]]></description><content:encoded><![CDATA[
  <p>Перевез посты с гугла, к сожалению потерялись оригинальные даты ¯\<em>(ツ)</em>/¯</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://devtrick.com/iis-request-filtering-against-ddos-attack</guid><link>https://devtrick.com/iis-request-filtering-against-ddos-attack?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/iis-request-filtering-against-ddos-attack?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>IIS Request filtering против ddos-атаки</title><pubDate>Mon, 25 Jan 2021 09:22:40 GMT</pubDate><category>Web</category><description><![CDATA[<img src="https://teletype.in/files/b5/77/b577c9fb-0d69-4a3b-a0d4-5102a0bb1943.png"></img>Заказчик, чьи сайты я поддерживал ранее, обратился с тем, что сайт лежит и отдает 500 ошибку. У него стандартный сайт на ASP.NET WebForms, не скажу, что очень нагруженный, но бывали проблемы с производительностью базы данных (MS SQL Server на отдельном сервере). Недавно сервер БД поменяли и перенесли данные.
Этот сайт не основной бизнес заказчика, поэтому практически не обслуживался. У него не настроено никакого мониторинга и сбора метрик и вообще за ним особо не следят.]]></description><content:encoded><![CDATA[
  <h3>Лежим</h3>
  <p>Заказчик, чьи сайты я поддерживал ранее, обратился с тем, что сайт лежит и отдает 500 ошибку. У него стандартный сайт на ASP.NET WebForms, не скажу, что очень нагруженный, но бывали проблемы с производительностью базы данных (MS SQL Server на отдельном сервере). Недавно сервер БД поменяли и перенесли данные.<br />Этот сайт не основной бизнес заказчика, поэтому практически не обслуживался. У него не настроено никакого мониторинга и сбора метрик и вообще за ним особо не следят.</p>
  <h3>Данные телеметрии</h3>
  <p>Какие аномалии бросились в глаза:</p>
  <ol>
    <li>Процесс w3wp использовал более 50% CPU (обычно сильно меньше).</li>
    <li>Количество потоков в этом процесс стабильно прирастало (сайт не успевал обслужить клиентов).</li>
    <li>Диск на сервере БД использовался на 100% (Active Time).</li>
    <li>Длина очереди обращений к диску с базами проекта была большой (обычно в районе нуля-единиц).</li>
    <li>Оперативная память на сервер БД использована полностью.</li>
    <li>Профайлер показал, что есть один горячий метод, который ходит в БД.</li>
  </ol>
  <h3>Тюнинг СУБД</h3>
  <p>Первая моя гипотеза была связана с неполадками на стороне сервера БД из-за его переноса: забыли что-то настроить, не отрабатывает джоб по сбору статистики и перестроению индекса и т.п.</p>
  <p>Память - сразу стало ясно, что при переносе СУБД забыли ограничить использование оперативной памяти на новом сервере - ограничиваем. По прошлому опыту этой конфигурации вполне хватало 24гб (из общих 32).</p>
  <p>Проверям джобы - все норм. Запускаем Tuning Advisor и достраиваем недостающие индексы (среди них был и индекс для горячего запроса из профайлера).</p>
  <p>Выхлоп близок к нулю: сайт лежит.</p>
  <h3>IIS</h3>
  <p>Захожу в логи и сразу все становится понятно - DDoS:</p>
  <figure class="m_retina">
    <img src="https://teletype.in/files/b5/77/b577c9fb-0d69-4a3b-a0d4-5102a0bb1943.png" width="339" />
  </figure>
  <p>Первый раз такая ситуация, неясно кому понадобилось. Запросов стало на порядок больше, что же в логах?</p>
  <p>В логах видим около 200 запросов в секунду (обычные пользователи генерят до десяти в минуту по метрике).</p>
  <p>Все запросы с разных IP, объединяет их только схожий user-agent:</p>
  <pre>GET / 80 101.200.177.82 WordPress/4.2.2;+http://www.renwenqifei.com;+verifying+pingback+from+37.1.211.155 503
GET / 80 54.69.1.242 WordPress/4.2.10;+http://54.69.1.242;+verifying+pingback+from+37.1.211.155 503
GET / 80 123.57.33.117 WordPress/4.0;+http://www.phenomenon.net.cn;+verifying+pingback+from+37.1.211.155 503
GET / 80 54.69.236.133 WordPress/4.3.1;+http://www.the-call-button.com;+verifying+pingback+from+37.1.211.155 503
GET / 80 52.19.227.86 WordPress/4.3.6;+http://52.19.227.86;+verifying+pingback+from+37.1.211.155 503
GET / 80 52.27.233.237 WordPress/4.1.13;+http://52.27.233.237;+verifying+pingback+from+37.1.211.155 503
GET / 80 202.244.241.54 WordPress/3.5.1;+http://www.fm.geidai.ac.jp 503
GET / 80 52.34.12.105 WordPress/4.3.6;+http://52.34.12.105;+verifying+pingback+from+37.1.211.155 503
GET / 80 128.199.195.155 WordPress/4.3.6;+http://www.glamasia.com;+verifying+pingback+from+37.1.211.155 503
GET / 80 61.194.65.94 WordPress/4.2.10;+http://wpwewill.help;+verifying+pingback+from+37.1.211.155 503
GET / 80 23.226.237.2 WordPress/4.3.1;+http://hypergridder.com;+verifying+pingback+from+37.1.211.155 503
GET / 80 104.239.228.203 WordPress/4.2.5;+http://pjtpartners.com;+verifying+pingback+from+37.1.211.155 503
GET / 80 104.239.168.88 WordPress/4.2.10;+http://creatorinitiative.com;+verifying+pingback+from+37.1.211.155 503
GET / 80 166.78.66.195 WordPress/3.6;+http://remote.wisys.com/website 503
GET / 80 212.34.236.214 WordPress/3.5.1;+http://nuevavista.am 503GET / 80 54.69.1.242 WordPress/4.2.10;+http://54.69.1.242;+verifying+pingback+from+37.1.211.155 503</pre>
  <p>Это известный тип атаки: WordPress сайт с включенным Pingback (включен по умолчанию), может использоваться в DDOS-атаке на другие сайты. Более подробная <a href="https://habrahabr.ru/post/215543/" target="_blank">статья</a> на Хабре.</p>
  <h3>Настраиваем фильтр запросов</h3>
  <p>Есть несколько уровней где можно фильтровать запросы. Первый - это файрвол. Грепаем ip - добавляем их в файрволл, по расписанию собираем вновь появившиеся. Плюсы - отличная скорость, нет мусорных запросов в логах. Минусы - надо писать скрипты и следить.</p>
  <p>Второй уровень - сам IIS (из явных минусов - мусорные запросы попадают в логи). Третий уровень - написать модуль и использовать его. Это самый гибкий подход, но трудоемкий и имеет невысокую производительность.</p>
  <p>Я остановился на втором уровне из соображений получить решение совершив минимум действий.</p>
  <p>У IIS много возможностей по фильтрации запросов. В данном случае подходит<strong> Request Filtering</strong>. <a href="https://www.iis.net/configreference/system.webserver/security/requestfiltering" target="_blank">Более подробно об установке и настройке.</a></p>
  <p>Выбираем сайт -&gt; Request Filtering -&gt;Rules -&gt; Add filtering rules</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/f4/d8/f4d8ee25-cc78-466b-8f3c-910c9b74cda7.png" width="1600" />
  </figure>
  <p>И указываем, что мы хотим отфильтровать все запросы где в Header: User-Agent есть слово WordPress.</p>
  <figure class="m_retina">
    <img src="https://teletype.in/files/53/8c/538c8853-2895-4a5e-aece-5e5509d901aa.png" width="538" />
  </figure>
  <p>Или можно указать соответствующие настройки в файле web.config</p>
  <pre>&lt;system.webServer&gt;
    &lt;security&gt;
        &lt;requestFiltering&gt;
            &lt;filteringRules&gt;
                &lt;filteringRule name=&quot;ddos&quot; scanUrl=&quot;false&quot; scanQueryString=&quot;false&quot;&gt;
                    &lt;scanHeaders&gt;
                        &lt;clear /&gt;
                        &lt;add requestHeader=&quot;User-Agent&quot; /&gt;
                    &lt;/scanHeaders&gt;
                    &lt;denyStrings&gt;
                        &lt;clear /&gt;
                        &lt;add string=&quot;WordPress&quot; /&gt;
                    &lt;/denyStrings&gt;
                &lt;/filteringRule&gt;
            &lt;/filteringRules&gt;
        &lt;/requestFiltering&gt;
    &lt;/security&gt;
&lt;/system.webServer&gt;
</pre>
  <p>Сразу после применения этого фильтра сайт заработал. Все показатели вернулись к норме. Если бы я сразу проверил логи - на все ушло бы менее получаса.</p>
  <h3>Что еще умеет IIS?</h3>
  <p>IIS - очень крутой и производительный сервер для веб-приложений. Помимо передачи запроса в управляемую среду он много что умеет делать и по производительности сильно обыгрывает managed-решения.</p>
  <p>В разделе <strong>Request Filtering</strong> вы можете настроить еще много различных фильтров: по методам, сегментам урла, query-параметрам, расширению и т.д. Можно запретить в asp.net проекте специфичные для PHP query-параметры (попытка получить доступ к htaccess или файлу с паролями). Можно запретить злонамеренные запросы, например, содержащие sql-инъекции. Это делается не как защита от этих атак, а в целях экономии ресурса сервера: IIS самостоятельно откинет эти запросы и сделает это быстро с минимальными затратами памяти и процессорного времени.</p>
  <p>Еще один механизм называется <strong>IP Address and Domain Restrictions</strong>. Этот механизм позволяет составлять белые и черные списки IP-адресов для ограничения доступа к сайту. Вы можете заблокировать злобного парсера или наоборот открыть доступ на тестовый сайт или админку только с определенных IP. Более подробно читать в <a href="https://www.iis.net/configreference/system.webserver/security/ipsecurity" target="_blank">официальной документации</a>.</p>
  <p>И третий механизм, который может вам помочь противодействовать ддос-атакам и нежелательным парсерам -<br /><strong>Dynamic IP Address Restrictions. </strong><br />Не всегда мы можем следить за постоянно меняющимися ip-адресами злоумышленника. Но с помощью этого инструмента мы можем ограничить частоту запросов. Таким образом, IIS на аномально большое количество запросов с одного IP-адреса будет быстро отдавать 403 или 404. Будьте аккуратнее с поисковыми ботами. <a href="https://www.iis.net/downloads/microsoft/dynamic-ip-restrictions" target="_blank">Официальная документация</a>.</p>
  <h3>Выводы</h3>
  <p>Не отключайте логи, настраивайте мониторинг, который явно вас предупредит об аномалиях в показателях. Это можно сделать быстро и недорого, и сэкономит вам время при расследованиях инцидентов. Административные и организационные меры оставим за рамками этой статьи.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://devtrick.com/jobs-sqlserver</guid><link>https://devtrick.com/jobs-sqlserver?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/jobs-sqlserver?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>Как получить скрипт для всех джобов на MS SQL Server</title><pubDate>Mon, 25 Jan 2021 09:10:05 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/19/71/19717c7f-be66-4d37-8389-1daf39c23cff.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/1f/e4/1fe4bcee-c719-40c7-8c92-d80f6450906d.png"></img>Иногда случается, что надо перенести джобы с одного сервера на другой. Или сохранить джобы в качестве скрипта и положить в репозиторий. Если у нас всего два-три джоба, то можно использовать &quot;Script Job As&quot; &gt;&gt; &quot;CREATE To&quot; &gt;&gt; &quot;...выберите куда...&quot;. Но что если у нас десятки джобов?]]></description><content:encoded><![CDATA[
  <p>Иногда случается, что надо перенести джобы с одного сервера на другой. Или сохранить джобы в качестве скрипта и положить в репозиторий. Если у нас всего два-три джоба, то можно использовать &quot;Script Job As&quot; &gt;&gt; &quot;CREATE To&quot; &gt;&gt; &quot;...выберите куда...&quot;. Но что если у нас десятки джобов?</p>
  <h2>Решение</h2>
  <ol>
    <li>Открываем Management Studio.</li>
    <li>Выбираем SQL Server Agent - Jobs.</li>
    <li>Запускаем Object Explorer Details (нажмите F7 или в верхнем меню View - Object Explorer Details).</li>
    <li>Выделяем нужные джобы (или все, тогда просто нажимаем CTRL+A).</li>
    <li>Правой кнопкой мыши на выделенной строчке вызываем контекстное меню и далее привычный &quot;Script Job As&quot;.</li>
  </ol>
  <figure class="m_column">
    <img src="https://teletype.in/files/1f/e4/1fe4bcee-c719-40c7-8c92-d80f6450906d.png" width="893" />
  </figure>
  <p>Полученный скрипт вы можете выполнить на другом сервере, положить в репозиторий или отредактировать. Также допустимы другие массовые действия с джобами, например, удаление.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://devtrick.com/cookies-httpresponse-httprequest</guid><link>https://devtrick.com/cookies-httpresponse-httprequest?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/cookies-httpresponse-httprequest?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>Коллекция Cookies в HttpResponse и HttpRequest</title><pubDate>Mon, 25 Jan 2021 09:08:21 GMT</pubDate><description><![CDATA[Как-то, просматривая вопросы на Stackoverflow, наткнулся на вопрос, связанный с коллекцией кук в запросе и ответе. Вкратце вопрос можно сформулировать так:]]></description><content:encoded><![CDATA[
  <p>Как-то, просматривая вопросы на Stackoverflow, наткнулся на <a href="http://stackoverflow.com/questions/33563181/add-value-of-dropdownlist-in-a-cookie-in-c-sharp" target="_blank">вопрос</a>, связанный с коллекцией кук в запросе и ответе. Вкратце вопрос можно сформулировать так:</p>
  <blockquote>Почему после добавления куки &quot;ABC&quot; в Response.Cookies с новым значением в Request.Cookies[&quot;ABC&quot;] остается лежать старое значение?</blockquote>
  <p>Первая же мысль - это же две различные коллекции , вот и не обновляется! Но не все так просто.</p>
  <p>Открываем <a href="https://msdn.microsoft.com/en-us/library/system.web.httpresponse.cookies.aspx" target="_blank">документацию</a></p>
  <blockquote>ASP.NET includes two intrinsic cookie collections... After you add a cookie by using the HttpResponse.Cookies collection, the cookie is immediately available in the HttpRequest.Cookies collection, even if the response has not been sent to the client.</blockquote>
  <p>То есть, платформа следит за тем, чтобы куки были доступны в обеих коллекциях. Почему же мы видим старое значение?</p>
  <p>У нас же есть Github, и нужные сырцы есть там! Нужные классы находятся в пространстве <a href="https://github.com/Microsoft/referencesource/tree/ec178a5e7deb87a9cc7e0982ee32b7d965735b16/System.Web" target="_blank">System.Web</a>. Свойство Cookies имеет тип <a href="https://github.com/Microsoft/referencesource/blob/ec178a5e7deb87a9cc7e0982ee32b7d965735b16/System.Web/HttpCookieCollection.cs" target="_blank">HttpCookieCollection </a></p>
  <p>Нас интересует, как происходит добавление куки в коллекцию:</p>
  <pre>/// &lt;devdoc&gt;
///    &lt;para&gt;
///       Adds a cookie to the collection.
///    &lt;/para&gt;
/// &lt;/devdoc&gt;
public void Add(HttpCookie cookie) 
{
   if (_response != null)
        _response.BeforeCookieCollectionChange();

    AddCookie(cookie, true);

    if (_response != null)
       _response.OnCookieAdd(cookie);
}
</pre>
  <p>Переходим к методу HttpResponse.OnCookieAdd:</p>
  <pre>internal void OnCookieAdd(HttpCookie cookie) {
    // add to request&#x27;s cookies as well
    Request.AddResponseCookie(cookie);
}
</pre>
  <p>где Request - связанный через контекст экземпляр HttpRequest:</p>
  <pre>internal HttpRequest Request {
    get {
        if (_context == null)
            return null;
        return _context.Request;
    }
}
</pre>
  <p>Посмотрим в HttpRequest.cs</p>
  <pre>//
// Request cookies sometimes are populated from Response
// Here are helper methods to do that.
//

/*
 * Add response cookie to request collection (can override existing)
 */
internal void AddResponseCookie(HttpCookie cookie) {
 // cookies collection

 if (_cookies != null)
  _cookies.AddCookie(cookie, true);

 // cookies also go to parameters collection

 if (_params != null) {
  _params.MakeReadWrite();
  _params.Add(cookie.Name, cookie.Value);
  _params.MakeReadOnly();
 }
}
</pre>
  <p>Вот за счет такой цепочки вызовов происходит пополнение коллекции HttpRequest.</p>
  <p>Так почему же у нас нет нового значения куки? На самом деле оно есть и доступно, например, по числовому индексу.</p>
  <p>Вернемся к классу HttpCookieCollection.cs. При добавлении новой куки происходит вызов метода BaseAdd(cookie.Name, cookie) базового класса</p>
  <pre>/// &lt;devdoc&gt;
///    &lt;para&gt;Adds an entry with the specified key and value into the 
///    &lt;see cref=&#x27;System.Collections.Specialized.NameObjectCollectionBase&#x27;/&gt; instance.&lt;/para&gt;
/// &lt;/devdoc&gt;
protected void BaseAdd(String name, Object value) {
 if (_readOnly)
  throw new NotSupportedException(SR.GetString(SR.CollectionReadOnly));

 NameObjectEntry entry = new NameObjectEntry(name, value);

 // insert entry into hashtable
 if (name != null) {
  if (_entriesTable[name] == null)
   _entriesTable.Add(name, entry);
 }
 else { // null key -- special case -- hashtable doesn&#x27;t like null keys
  if (_nullKeyEntry == null)
   _nullKeyEntry = entry;
 }

 // add entry to the list
 _entriesArray.Add(entry);

 _version++;
}
</pre>
  <p>Как мы видим есть два поля: Hashtable _entriesTable и ArrayList _entriesArray. Первое поле используется для поиска по имени, второе для поиска по индексу. Значимое отличие между двумя коллекциями заключается в том, что в первую коллекцию элемент с дублирующим именем не попадает.</p>
  <p>В нашем случае возникает именно такая ситуация - новая кука попадает только во вторую коллекцию и доступна по индексу, но не доступна по имени.</p>
  <p>Если ваш код заполняет HttpResponse.Cookies, а потом что-то проверяет в коллекции HttpRequest.Cookies по имени - убедитесь, что вы понимаете как это работает и при необходимости сперва удаляйте ненужные куки из реквеста.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://devtrick.com/about-models-and-goals</guid><link>https://devtrick.com/about-models-and-goals?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/about-models-and-goals?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>Тезисы по мотивам ‪#‎agilekitchen‬ и ‪#‎leancoffee</title><pubDate>Mon, 25 Jan 2021 09:06:27 GMT</pubDate><description><![CDATA[В декабре 2014 года прошло сразу два мероприятия: ‪#‎agilekitchen‬ и ‪#‎leancoffee‬. Я попробовал сформулировать несколько тезисов по итогам обсуждений:]]></description><content:encoded><![CDATA[
  <p>В декабре 2014 года прошло сразу два мероприятия: ‪#‎agilekitchen‬ и ‪#‎<a href="http://www.unusual-concepts.ru/blog/2014/12/lean-coffee-2-moscow/" target="_blank">leancoffee‬</a>. Я попробовал сформулировать несколько тезисов по итогам обсуждений:</p>
  <p> 1. Объективности не существует. У каждого в голове своя модель реальности. Чтобы понять решения руководства, надо определить, какую модель оно использует.</p>
  <p> 2. У каждого есть персональные цели (внутренние и установленные извне). Бывает, что эти цели противоречат вашим целям и целям организации. Люди действуют согласно собственной модели реальности и персональных целей.</p>
  <p> 3. Прежде чем предлагать изменения, необходимо понять, насколько хорошо ваши предложения вписываются в модель руководителя и прочих лиц принимающих решения.</p>
  <p> 4. Чтобы продать изменения, надо показать, что эти изменения помогут в достижении персональных целей.</p>
  <p> 5. Если изменения не продаются подчиненным с ними можно расставаться. Если изменения не продаются начальству с ним тоже можно расстаться.</p>
  <p> 6. Прежде чем повышать локальную эффективность подразделения, убедитесь, что вы являетесь ограничением в системе. В противном случае не ожидайте, что ваши улучшения оценят.</p>
  <p> 7. Аджайл многими воспринимается как универсальное обезболивающее. У вас мало разработчиков, мудацкое начальство и легаси на коболе? Внедрите Аджайл и все пройдет.</p>
  <p> 8. Аджайл и вот это всё очень часто не нужен вашему руководству, так как не соответствует их модели реальности и их целям.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://devtrick.com/estimations</guid><link>https://devtrick.com/estimations?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/estimations?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>Оценка задач. Planning Poker</title><pubDate>Mon, 25 Jan 2021 09:04:06 GMT</pubDate><description><![CDATA[Наш проект уже почти полгода живет в agile-стиле. Мы пробуем различные подходы и пытаемся применять все, что нам подходит и делает жизнь проще. К сожалению, никто из нашей команды ранее полноценно не работал с использованием гибких методологий. Процесс внедрения SCRUM идет медленно и не всегда эффективно: мы сами доходим до того, что описано в статьях-книгах.]]></description><content:encoded><![CDATA[
  <h3>Два подхода к оценке.</h3>
  <p>Наш проект уже почти полгода живет в agile-стиле. Мы пробуем различные подходы и пытаемся применять все, что нам подходит и делает жизнь проще. К сожалению, никто из нашей команды ранее полноценно не работал с использованием гибких методологий. Процесс внедрения SCRUM идет медленно и не всегда эффективно: мы сами доходим до того, что описано в статьях-книгах.</p>
  <p>Сейчас мы меняем подход к оценки задач из product backlog. Изначально мы интерпретировали story point как некоторый идеальный человеко-день. В дальнейшем мы поняли, что данное представление не совсем корректно. На наш взгляд (и он совпадает с мнением agile-сообщества) story point - это единица измерения объема работ, но не их длительности. Отличная аналогия - выкапывание ямы. Можно оценить в днях, а можно в кубометрах.</p>
  <h3>В чем же разница?</h3>
  <p>Во-первых, многие отмечают сложность абсолютных оценок и простоту относительных. То есть человеку сложно сказать на глаз, что длина этой кровати 2,5 метра, а другой 1,98. Но в то же время, если перед глазами стоит двухметровая кровать, достаточно легко сказать, первая больше эталона, а вторая примерно такая же. Так и с задачами: иногда бывает сложно оценить задачу, но достаточно легко сказать, что задача xxx примерно такая же как и zzz. Или что задача aaa значимо сложнее bbb.</p>
  <p>Второе преимущество относительной оценки заключается в том, что мы можем наблюдать прогресс команды и обосновывать вложения в инфраструктуру. Развертование билд-машины, возврат технического долга не несут, на первый взгляд, бизнес-велью. Но если показать, что эти траты привели к тому, что команда за итерацию стала успевать делать 35 SP вместо 30, так как не надо руками выкладывать по полдня, не надо с бубном танцевать вокруг старого костыля, то продукт-менеджер примет затраты на погашение технического долга и развитие инфраструктуры. То же самое с прогрессом команды. Команда растет и за спринт успевает произвести большее количество работ (выкопать яму большего объема).</p>
  <h3>Список эталонных работ</h3>
  <p>Мы пока не дошли в полной мере до этого метода. Суть его проста: на планировании перед глазами держать список эталонных работ. Мы используем карты с числами Фибоначчи: 0, 0.5, 1, 2, 3, 5, 8... Задачи более 5 под запретом. Нам надо подготовить список для каждой оценки из верно оцененных задач прошлых спринтов. Таким образом, каждый участник при оценке может аргументировать свою оценку тем, что эта задача по сложности похожа на такую-то задачу из списка, поэтому я поставил эту оценку. Или, эта задача сложнее этой задачи. Если оценка падает между двух карт, то оцениваем в большую сторону.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://devtrick.com/scrum-four-iterations</guid><link>https://devtrick.com/scrum-four-iterations?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/scrum-four-iterations?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>SCRUM: четыре итерации спустя</title><pubDate>Mon, 25 Jan 2021 09:02:07 GMT</pubDate><category>Scrum</category><description><![CDATA[В октябре команда проекта Zarplata.ru перешла на скрам, предпосылки и ожидания я описал ранее. За прошедший квартал мы провели четыре спринта, старались следовать рекомендациям и общепринятым установкам. Наши договоренности остались в силе: все спринты были трехнедельными, был инженерный день, ретро и планирование.]]></description><content:encoded><![CDATA[
  <p>В октябре команда проекта Zarplata.ru перешла на скрам, предпосылки и ожидания я описал <a href="https://devtrick.com/scrum-first-iteration" target="_blank">ранее</a>. За прошедший квартал мы провели четыре спринта, старались следовать рекомендациям и общепринятым установкам. Наши договоренности остались в силе: все спринты были трехнедельными, был инженерный день, ретро и планирование.</p>
  <h3>Что было хорошего?</h3>
  <p>После четырех спринтов можно провести ретроспективу. Две основные причины перехода: планирование и постановка. В решении данных проблем у нас огромный прогресс.<br />Планирование. Скрам устанавливает количество работ в спринте. Так как мы выбрали относительно небольшую длительность спринта - у нас не возникало тяжеловесных срочных задач. Были мелкие задачи, которые мы делали в промежутках, но их было немного.</p>
  <p>Постановка задач. Мы тратим полдня на планирование спринта. Постановка задач на первую итерацию была очень некачественной, возникало огромное количество вопросов тестировщика и программистов. На первой ретроспективе основной темой обсуждения были постановка задач и уточнение требований. В итоге требования стали лучше, формат требований изменился и стал более конкретным. Мы на планировании обсуждаем зачем задача нужна, проговариваем сценарии использования, значимые моменты реализации. Все это позволяет нам лучше понимать задачу, точнее оценивать задачи.</p>
  <p>Внедрение методологии привело к тому, что мы стали лучше понимать, что нам мешает быть более продуктивными, что может помочь повысить качество выпускаемого продукта. Был выявлен ряд проблем с тестированием. Тестирование, как и разработка велись без какой-либо внятной методологии. Сейчас мы пришли к тому, что необходимы тест-кейсы, автоматизированное тестирование, тестирование требований. В целом, роль тестировщика в agile-команде меняется. Мы стали чаще общаться с командой тестирования. Дальнейшие шаги будут направлены на внедрение приемочных тестов и их частичную автоматизацию.</p>
  <h3>Что надо улучшить?</h3>
  <p>Приемочные тесты - важная часть завершения задачи. Мы договорились, что к каждой задаче будем писать несколько ключевых сценариев использования в стиле BDD. Данные сценарии должны в дальнейшем лечь в основу автотестов и живой документации проекта.</p>
  <p>Как ни прискорбно, но у нас до сих пор нет юнит-тестирования. Надеюсь, что мы начнем использовать TDD или BDD при написании кода.</p>
  <p>Оценка задач. Мы пришли к пониманию того, что оценка задач должна быть относительной. Мы же оцениваем задачи безотносительно выполненных задач, а просто в идеальных человекоднях.</p>
  <p>Технический долг, незакрытые баги. Необходимо закрыть все баги в TFS. Часть из них уже неактуальна, но тем не менее надо проверить, закрыть устаревшие, решить существующие. Данная мера позволит использовать баг-трекер более продуктивно. С техническим долгом также надо работать. В середине года мы начали работы по анализу 500 ошибок сайта. Также в коде было множество поглощаемых исключений. Каждое такое место мы начали логировать. Анализ логов также позволил закрыть ряд ошибок. В итоге количество 500 ошибок снизилось в несколько раз. Логи также не сильно пухнут от ошибок. Но эту работу необходимо продолжать.</p>
  <p>Планирование на год. Есть идея завести несколько показателей и следить за их достижением в течение года. Количество пользователей, количество откликов, количество объявлений и т.д.</p>
  <p>У нас множество планов на следующий год, наша команда продолжит погружение в аджайл. Этот год был очень интересным в плане задач и достижений. Надеюсь, что следующий год будет также интересным и богатым на события.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://devtrick.com/scrum-first-iteration</guid><link>https://devtrick.com/scrum-first-iteration?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick</link><comments>https://devtrick.com/scrum-first-iteration?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=devtrick#comments</comments><dc:creator>devtrick</dc:creator><title>Внедрение методологии SCRUM - первая итерация</title><pubDate>Mon, 25 Jan 2021 08:59:25 GMT</pubDate><description><![CDATA[С первого октября 2012 года мы начинаем использовать скрам. Команда на первую итерацию: 1 тестировщик и два программиста. Верстка и дизайн за границами (почти не потребуется).]]></description><content:encoded><![CDATA[
  <h4>Команда.</h4>
  <p>С первого октября 2012 года мы начинаем использовать скрам. Команда на первую итерацию: 1 тестировщик и два программиста. Верстка и дизайн за границами (почти не потребуется).</p>
  <h4>Наши договоренности.</h4>
  <p>Как мы договорились: трехнедельные спринты, последний день спринта - инженерный, DoD пока отсутствует, но я надеюсь, что мы придем к хорошему определению и зафиксируем его. Пока что, под &quot;Выполнено&quot; подразумевается все протестировано и выложено на боевой (если требуется),</p>
  <h4>Почему мы переходим на скрам?</h4>
  <p>Мы использовали квартальные планы, но новые задачи постоянно пытались сломать наши планы. Поэтому первое, что я ожидаю - более точное планирование. Также спринт жестко очерчивает список работ над которыми мы работаем, каждый в команде знает над чем работать. Как результат, более гладкий график нагрузки, команда ритмично поставляет выполненные задания, отсутствуют завалы и свободные дни.</p>
  <h4>Другие причины.</h4>
  <p>Второй ожидаемый эффект: нормальная постановка задач и проработка требований на этапе планирования. Сейчас ставятся задачи на квартал, а потом специфицируются требования. Теперь задачи будут сразу с требованиями - не факт, что все будет заморожено на три недели, но все же добавляется уверенности в завтрашнем дне.</p>
  <p><em>Пока все, отпишусь по итогам итерации.</em></p>

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