﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>About .Net development</title>
	<atom:link href="http://softblog.violet-tape.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://softblog.violet-tape.ru</link>
	<description>Violet Tape</description>
	<lastBuildDate>Tue, 21 Jul 2015 07:32:48 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.2.1</generator>
	<item>
		<title>Fixie – тестирование по соглашению</title>
		<link>http://softblog.violet-tape.ru/2015/07/21/fixie/</link>
				<comments>http://softblog.violet-tape.ru/2015/07/21/fixie/#respond</comments>
				<pubDate>Tue, 21 Jul 2015 07:32:03 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[Утилиты]]></category>
		<category><![CDATA[Fixie]]></category>
		<category><![CDATA[NUnit]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Testing Frameworks]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2103</guid>
				<description><![CDATA[Некоторое время назад попался мне твит о том, что знакомый стал использовать новый тестовый опенсорсный фреймворк Fixie и очень этим доволен. Так, что даже решил исправить все тесты в своем проекте на новый движок. После такого, я просто не мог оставаться в стороне и даже не взглянуть, что это за зверь такой и чем он ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/07/21/fixie/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/01.png"><img class="alignleft size-full wp-image-2104" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/01.png" alt="01" width="192" height="192" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/01.png 192w, http://softblog.violet-tape.ru/wp-content/uploads/2015/07/01-150x150.png 150w" sizes="(max-width: 192px) 100vw, 192px" /></a>Некоторое время назад попался мне твит о том, что знакомый стал использовать новый тестовый опенсорсный фреймворк <strong>Fixie</strong> и очень этим доволен. Так, что даже решил исправить все тесты в своем проекте на новый движок. После такого, я просто не мог оставаться в стороне и даже не взглянуть, что это за зверь такой и чем он так радует окружающих.</p>
<p>Далее я хочу представить вам обзор фреймворка, его возможности, и понять, действительно ли это новое слово в тестировании, стоит к этому присмотреться или же можно пройти мимо и забыть.</p>
<p>Как сказано на самом <a href="http://fixie.github.io/">сайте</a>, Fixie – Conventional Testing for .NET. Т.е. тестирование по соглашению. Под соглашениями здесь понимается то, к чему мы в целом привыкли – все операции выполняются на основе «устного» договора, джентельменского соглашения об именовании. Ближайший пример – scaffolding. Это когда мы договорились, например, что тестовые классы содержат слово Test, или что тестовые классы должны быть публичными и ничего не возвращать.  Тогда такие классы будут распознаны как тестовые. И больше никаких атрибутов и всего такого прочего. Просто классы и методы.</p>
<p>На первый взгляд всё это выглядит хорошо и даже радует. Получается, что необходимо только правильно называть методы и классы и будет счастье. Заодно можно натренировать команду называть классы тестовые как надо, а не произвольным сочетанием слов, как-то относящихся к теме тестируемого класса.</p>
<h2>Установка и первый тест</h2>
<p>По умолчанию, Fixie настроен так, что тестовыми классами является всё, что оканчивается на <strong>Tests</strong>. Тестовыми методами – всё что внутри этих классов и не возвращает значения. Т.е. теоретически и, на самом деле практически, вот такой код уже будет распознаваться как тест:</p><pre class="crayon-plain-tag">public class SuperHeroTests {
    public void NameShouldBeFilled() {
        var superHero = new SuperHero();

        superHero.Name
                 .Should()
                 .NotBeEmpty();
    }
}</pre><p><span id="more-2103"></span></p>
<p>Прежде чем двигаться дальше, стоит сказать пару слов об установке, и что необходимо для работы Fixie.</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/02.png"><img class=" size-full wp-image-2105 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/02.png" alt="02" width="730" height="77" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/02.png 730w, http://softblog.violet-tape.ru/wp-content/uploads/2015/07/02-300x32.png 300w" sizes="(max-width: 730px) 100vw, 730px" /></a></p>
<p>Команда nuget для установки самого фреймворка. Но на этом всё не заканчивается. <strong>Фреймворк не предоставляет встроенного способа для написания проверок данных в тесте.</strong> Для их использования вам необходимо воспользоваться одним из сторонних решений:</p>
<ul>
<li>FluentAssertions</li>
<li>Should</li>
<li>Shouldly</li>
<li>Что-то другое по этой же теме</li>
</ul>
<p>Это всё так же устанавливается с помощью NuGet. В примере выше использован пакет FluentAssertion, так как он лично мне больше нравится и большой разницы по сравнению с другими вариантами по сути нет.</p>
<p>На этом собственно всё, и можно счастливо и весело писать код. Если вы только начали свой путь в разработке и тестировании в частности. Если вы опытный человек, то возникает много вопросов, как эта штука настраивается и насколько удобно гонять тесты.</p>
<h2>Интеграция</h2>
<p>Кстати о запуске тестов. Автор честно признается, что ему надо было запускать тесты из консоли и поэтому он сделал интеграцию со студией в последнюю очередь. Есть плагин для ReSharper, но он для версий от 8.1 до 8.3, т.е. с новой версией вы пролетарий. Ради тестов мне не хотелось откатываться на 8ю версию, поэтому не могу сказать насколько это комфортно.</p>
<p>Интеграция со студией выполняется на уровне обнаружения тестов и запуска их. Т.е. никакой подсветки в редакторе не будет. Имеются ввиду спец.значки тестов.</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/03.png"><img class=" size-full wp-image-2106 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/03.png" alt="03" width="429" height="193" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/03.png 429w, http://softblog.violet-tape.ru/wp-content/uploads/2015/07/03-300x135.png 300w" sizes="(max-width: 429px) 100vw, 429px" /></a></p>
<p>Здесь, на мой взгляд, кроется <strong>потенциальное место ошибки</strong>. Очепятки. Не так-то сложно опечататься в слове “Tests”, что приведет к пропуску тестов. Визуально они никак не выделяются.  Справедливости ради надо сказать, что такая ситуация редка и маловероятна, если вы будете использовать правильные средства студии и запускать не скопом все тесты, а, например, только те, что раньше не запускались.</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/04.png"><img class="aligncenter size-full wp-image-2107" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/04.png" alt="04" width="325" height="199" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/04.png 325w, http://softblog.violet-tape.ru/wp-content/uploads/2015/07/04-300x184.png 300w" sizes="(max-width: 325px) 100vw, 325px" /></a></p>
<p>В целом, можно пока что сослаться на молодость фреймворка и относительную неизвестность и, как следствие, отсутствие многих инструментов.</p>
<p>Чтобы два раза не возвращаться к теме обнаружения тестов и генерирования результатов документация нам сообщает, что Fixie может генерировать отчеты в стиле NUnit и xUnit, что значительно облегчит жизнь тем, у кого нормально построен CI.</p>
<h2>Тюнинг</h2>
<p>Основная сила фреймворка в возможности гибкой настройки того, как ваши тесты будут идентифицироваться, как запускаться и как валидироваться и так далее. По умолчанию ничего с фреймворком не идет. Однако в <a href="https://github.com/fixie/fixie">репозитории</a> находится много <a href="https://github.com/fixie/fixie/tree/master/src/Fixie.Samples">разнообразных примеров</a>.</p>
<p>Чтобы все стало интереснее давайте немного покопаемся в том, как настроить фреймворк под свои нужды. Например, как сказать, какие еще классы должны идентифицироваться как тестовые.</p>
<p>Все настройки происходят в конструкторе класса, наследованного от <strong>Convention.</strong></p><pre class="crayon-plain-tag">public class CustomConvention   : Convention {
    public CustomConvention  () {
          
    }
}</pre><p>По умолчанию, настройки выглядят примерно следующим образом:</p><pre class="crayon-plain-tag">public class DefaultConvention   : Convention {
    public DefaultConvention  () {
        Classes
            .NameEndsWith("Tests");

        Methods
            .Where(method =&gt; method.IsVoid());
    }
}</pre><p>Код говорит о том, что тестовые классы должны заканчиваться на Tests и тестовым методом будет все что возвращает null. В целом годно.</p>
<p>Я стараюсь придерживаться принципа, когда тестовый класс начинается со слова <strong>When, </strong>а тесты со слов <strong>Then</strong>. Получается достаточно стройная картина в тестраннере и при написании тестов ты уже знаешь, что ты тестируешь, т.е. надо только подумать об эффектах для теста. Дополнительным бонусом является то, что тестовые классы получаются короткими и ответственность между тестами не смешивается.</p>
<p>Естественно, что любое правило лишь указывает на направление, а не является догмой.  &#171;A Foolish Consistency is the Hobgoblin of Little Minds&#187; – поэтому всегда надо руководствоваться здравым смыслом.</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/05a.png"><img class="aligncenter wp-image-2111 size-full" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/05a.png" alt="" width="866" height="748" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/07/05a.png 866w, http://softblog.violet-tape.ru/wp-content/uploads/2015/07/05a-300x259.png 300w" sizes="(max-width: 866px) 100vw, 866px" /></a></p>
<p>Глядя на свой список тестов, я вижу, что не все классы заканчиваются на слово <strong>Tests</strong> или начинаются с <strong>When</strong>.</p>
<p>Строгой структуры именования нет и в тестах, в том смысле, что тесты должны начинаться со слова Should, например. Но на мой взгляд читая тесты прекрасно понимаешь, что там происходит. Это я говорю на основе опыта. Этот проект телится уже года 3-4 с переменным успехом и каждый раз я быстро и успешно вспоминаю что сделано, а что надо сделать. Это просто некоторая отдушина, когда бумажной работы становится слишком много.</p>
<p>В таком режиме именования, мне страшновато (да и лень) указывать ключевые слова по которым будут определены тестовые классы. Кроме того, подход When… Then… на практике означает, что есть настроечный метод, который запускается в начале каждого теста и в самом тесте либо проверяются результаты, либо как-то влияем на созданный объект. Т.е. надо явно будет пометить, или указать настроечный метод (SetUp).</p>
<p>Для реализации я могу явно вызывать настроечный метод в каждом тесте. Например, вот так:</p><pre class="crayon-plain-tag">public class SuperHeroTests {
    public void NameShouldBeFilled() {
        SetUpEnvironment();
        var superHero = new SuperHero();

        superHero.Name
                 .Should()
                 .NotBeEmpty();
    }
}</pre><p>Конечно, в реальной жизни, надо писать что-то информативнее чем SetUpEnvironment(), но идея понятна. При такой реализации будут переменные класса, которые будут сохранять свои значения между тестами – что легко может привести к зависимым тестам, если я забуду в каком-нибудь тесте прописать строку инициализации.</p>
<p>Fixie предлагает решение для этой ситуции. Вот оно:</p><pre class="crayon-plain-tag">public class DefaultConvention   : Convention {
    public DefaultConvention  () {
        Classes
            .NameEndsWith("Tests");

        Methods
            .Where(method =&gt; method.IsVoid());

        CaseExecution
            .Wrap&lt;HeroUniverseSetup&gt;();
    }
}

public class HeroUniverseSetup : CaseBehavior {
    public void Execute(Case context, Action next) {
        // реализация
    }
}</pre><p>Т.е. необходимо реализовать наследника <strong>CaseBehavior</strong> и там прописать все, что надо. Документация говорит, что реализация</p>
<ul>
<li>CaseBehavior = [SetUp] / [TearDown]</li>
<li>FixtureExecution = [FixtureSetUp] / [FixtureTearDown]</li>
</ul>
<p>&nbsp;</p>
<p>Хорошо, но даже если так, то в таком подходе я вижу, что мне надо создавать многие варианты «DefaultConvention» и прописывать логику инициализации вдали от теста, при этом при запуске вы не будете даже знать, что такой контекст существует.</p>
<p>Нетрудно это продемонстрировать. Пусть DefaultConvention будет как в примере выше, тогда при запуске класса</p><pre class="crayon-plain-tag">public class SuperHeroTests {
    public void NameShouldBeFilled() {
        var superHero = new SuperHero();

        superHero.Name
                 .Should()
                 .NotBeEmpty();
    }
}</pre><p>Ничто не говорит мне, что есть SetUp/TearDown.</p>
<p><img class=" size-full aligncenter" src="https://psv4.vk.me/c610125/u230783496/docs/43f7ba3f9d98/magic.gif" alt="" /></p>
<p>МАГИЯ!!! Вообще это интересно, но в данном случае нет. Я бы не хотел себе такую магию на проекте. Это совершенно противоречит тому, что тесты должны быть прозрачными. Даже если я в том же классе напишу расширение для <strong>CaseBehavior – </strong>это не решение, так как будет не очень очевидно где мне искать класс, в котором это все будет настроено. Заниматься постоянной копи-пастой тоже не выход.</p>
<p>Сравним:</p><pre class="crayon-plain-tag">public class DefaultConvention   : Convention {
    public DefaultConvention  () {
        Classes
	     .InTheSameNamespaceAs(typeof(DefaultConvention))
            .NameEndsWith("Tests");

        Methods
            .Where(method =&gt; method.IsVoid());

        CaseExecution
            .Wrap&lt;HeroUniverseSetup&gt;();
    }
}

public class HeroUniverseSetup : CaseBehavior {
    public void Execute(Case context, Action next) {
        // реализация
    }
}
public class SuperHeroTests {
    public void NameShouldBeFilled() {
        var superHero = new SuperHero();

        superHero.Name
                 .Should()
                 .NotBeEmpty();
    }
}</pre><p>Против:</p><pre class="crayon-plain-tag">[TestFixture]
public class SuperHeroTests {
    [SetUp]
    public void Init() {
        // реализация
    }
    [Test]
    public void NameShouldBeFilled() {
        var superHero = new SuperHero();

        superHero.Name
                 .Should()
                 .NotBeEmpty();
    }
}</pre><p>Строчек кода как-то будет поменьше в случае с NUnit, да и SetUp из класса не потеряется в проекте.</p>
<p>Может быть я предвзят и неправильно пишу тесты, но… что-то я не уверен в этом. Еще не встречал кучи статей о том, что SetUp это зло. Т.е. все можно до абсурда довести и делать инициализацию там половины проекта, но это другой разговор.</p>
<p>&nbsp;</p>
<p>Однако и на этот случай есть решение. Можно использовать самописные атрибуты для определения нужных частей теста, тестов и классов. Т.е. <a href="http://fixie.github.io/docs/custom-conventions/">можно полностью</a> эмулировать NUnit, xUnit в вашем проекте.</p>
<p>С помощью аттрибутов можно сделать</p>
<ul>
<li>поддержку категорий</li>
<li>параметризованные тесты</li>
<li>тесты, выполняющиеся в строгой очередности</li>
<li>все что придет в голову</li>
</ul>
<p>&nbsp;</p>
<p>Приведу здесь небольшой пример создания категорий и запуск их.</p><pre class="crayon-plain-tag">public class CustomConvention : Convention
{
    public CustomConvention()
    {
        var desiredCategories = Options["include"].ToArray();
        var shouldRunAll = !desiredCategories.Any();

        Classes
            .InTheSameNamespaceAs(typeof(CustomConvention))
            .NameEndsWith("Tests");

        Methods
            .Where(method =&gt; method.IsVoid())
            .Where(method =&gt; shouldRunAll || MethodHasAnyDesiredCategory(method, desiredCategories));

        if (!shouldRunAll)
        {
            Console.WriteLine("Categories: " + string.Join(", ", desiredCategories));
            Console.WriteLine();
        }
    }

    static bool MethodHasAnyDesiredCategory(MethodInfo method, string[] desiredCategories)
    {
        return Categories(method).Any(testCategory =&gt; desiredCategories.Contains(testCategory.Name));
    }

    static CategoryAttribute[] Categories(MethodInfo method)
    {
        return method.GetCustomAttributes&lt;CategoryAttribute&gt;(true).ToArray();
    }
}</pre><p>И запуск:</p>
<p><strong>Fixie.Console.exe path/to/your/test/project.dll &#8212;include CategoryA</strong></p>
<h2>Моё решение</h2>
<p>Можно много чего еще сказать про Fixie, приводить примеры решения тех или иных задач, но первое впечатление уже есть. Поэтому стоит закругляться.</p>
<p>Получается, что Fixie это метафреймворк для тестирования. Вы вольны построить какие угодно правила и возможности для тестирования, при этом строятся они достаточно просто, если честно. Вопрос только в целесообразности. А надо ли это всё делать? Немного отпугивает, конечно, отсутствие поддержи R#, и того, что я не вижу что тест – реально тест, и он оказался распознан фреймворком. В продакшене я бы не стал использовать, но для домашнего использования и как перспективное средство – Fixie очень интересен. По крайней мере, я точно вспомню его, если будет какая-то интересная и специфичная задача тестирования, которая будет трудно решаться стандартными средствами NUnit.</p>
<p>&nbsp;</p>
<p>Hard&#8217;n&#8217;Heavy!</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/07/21/fixie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Забудьте САР теорему как более не актуальную</title>
		<link>http://softblog.violet-tape.ru/2015/07/20/cap-is-not-actual/</link>
				<comments>http://softblog.violet-tape.ru/2015/07/20/cap-is-not-actual/#respond</comments>
				<pubDate>Mon, 20 Jul 2015 08:03:56 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[ESB]]></category>
		<category><![CDATA[Legacy App]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2092</guid>
				<description><![CDATA[или &#171;Прекратите характеризовать БД как CP или AP&#187; Джеф Ходжес в своем прекрасном посте «Заметки о распределенных системах для новичков» рекомендует использовать САР теорему для критики найденных решений. Многие похоже восприняли этот совет слишком близко к сердцу, описывая свои системы как «СР» (согласованность данных, но без постоянной доступности при сетевой распределенности), «АР» (доступность без согласованного ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/07/20/cap-is-not-actual/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p>или &#171;Прекратите характеризовать БД как CP или AP&#187;</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/cap.png"><img class="alignleft  wp-image-2096" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/cap.png" alt="cap" width="419" height="344" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/cap.png 751w, http://softblog.violet-tape.ru/wp-content/uploads/2015/05/cap-300x246.png 300w" sizes="(max-width: 419px) 100vw, 419px" /></a>Джеф Ходжес в своем прекрасном посте «<a href="http://www.somethingsimilar.com/2013/01/14/notes-on-distributed-systems-for-young-bloods/">Заметки о распределенных системах для новичков</a>» рекомендует использовать <a href="https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_CAP">САР теорему</a> для критики найденных решений. Многие похоже восприняли этот совет слишком близко к сердцу, описывая свои системы как «СР» (согласованность данных, но без постоянной доступности при сетевой распределенности), «АР» (доступность без согласованного состояния при сетевой распределенности), или иногда «СА» (означает «Я всё ещё не читал статью <a href="http://codahale.com/you-cant-sacrifice-partition-tolerance/">Коды (Coda Hale) почти 5-летней давности</a>»).</p>
<p>Я согласен со всеми пунктами статьи кроме того, что касается САР теоремы. Она слишком всё упрощает и слишком многие понимают её неверно для того, чтобы использовать для определения характеристик системы. Так что я прошу перестать ссылаться на САР теорему, говорить о ней и дать ей уже спокойно уйти на покой. Вместо неё мы должны использовать более точную терминологию для обсуждения различных компромиссов.</p>
<p>(Да, я понимаю всю иронию написания целой статьи по теме того, о чём призываю не писать других вообще. Но как минимум у меня будет ссылка, которую я смогу давать интересующимся, когда меня будут спрашивать, почему я не одобряю обсуждение САР теоремы. Также, я хочу извиниться если статья вам покажется слишком напыщенной, но эта напыщенность опирается на множество ссылок.)</p>
<h1>САР использует слишком узкое определение</h1>
<p>Если вы хотите ссылаться на САР как на <em>теорему</em> (а не на расплывчатый концепт в маркетинговых материалах к вашей базе данных), вы должны быть точны. Математика требует точности. Доказательство сохраняется только если вы вкладывается в слова, то же самое значение, что было использовано при доказательстве. И оно опирается на очень точные определения:</p>
<ul>
<li><em>Согласованность (Consistency</em><em>)</em> в САР на самом деле означает <a href="http://cs.brown.edu/~mph/HerlihyW90/p463-herlihy.pdf">линеаризуемость</a>, что является (и очень сильным) принципом согласованности. В частности, это не имеет ничего общего с «С» из ACID, даже если эта С так же означает «согласованность». Я на пальцах объясню, что такое линеаризуемость чуть позже.</li>
<li><em>Доступность (Availability</em><em>) </em>в САР определено как «каждый запрос, полученный работающим узлом [базой данных] в системе должен приводить к ответу [не содержащему ошибок]». Недостаточно чтобы <em>некоторые</em> узлы могли обработать запрос: <strong><em>любой</em> </strong>работающий узел должен быть способен обработать запрос. Множество так называемых «высокодоступных» (high abailability), т.е. с низким уровнем простоя, систем в реальности не отвечают определению доступности.</li>
<li><em>Устойчивость к разделению (Partition</em><em> tolerance</em><em>)</em> ужасное название – в общих словах означает что вы для связи используете <a href="http://henryr.github.io/cap-faq/">асинхронную сеть</a>, которая может терять или задерживать сообщения. Интернет и все датацентры <a href="https://aphyr.com/posts/288-the-network-is-reliable">обладают этим свойством</a>, так что в реальности у вас нет выбора в этом контексте.</li>
</ul>
<p><span id="more-2092"></span></p>
<p>Еще хочу заметить, что САР теорема описывает не просто любую старую систему, но систему очень определенной модели:</p>
<ul>
<li>Модель системы в пространстве САР это единый узел\счетчик (register) чтения-записи – и всё. Например, ничего не говориться о транзакциях, которые затрагивают несколько объектов. Они просто за пределами условий теоремы, до тех пор, пока вы не ужмете каким-то образом те объекты до единого объекта.</li>
<li>Единственный тип сбоя о котором упоминает САР теорема – сетевое разделение, т.е. узлы остаются активны, но сеть между некоторыми из них не работает. Такой вид ошибки <a href="https://aphyr.com/posts/288-the-network-is-reliable">так или иначе происходит</a>, но это не единственная вещь, которая может пойти не так: узлы могут быть сломаны или в перезагрузке, может закончиться место на диске, можете поймать баг в ПО, и тд и тп. В процессе создания распределенной системы вам надо иметь ввиду гораздо больший спектр возможных ошибок и компромиссов, к которым они ведут. Слишком сильная фокусировка на САР теореме ведет к игнорированию других важных проблем.</li>
<li>Более того, САР теорема ничего не говорит о латентности, которая <a href="http://dbmsmusings.blogspot.co.uk/2010/04/problems-with-cap-and-yahoos-little.html">беспокоит большинство разработчиков гораздо больше</a>, нежели доступность. Фактически, САР-совместимые системы могут быть сколь угодно медленными и всё равно называться «доступными». Если доводить всё до крайности, я уверен, что ваши пользователи не будут склонны называть вашу систему «доступной», если для получения веб-страницы потребуется минуты 2.</li>
</ul>
<p>Если ваше определение совпадает с формальным значением терминов в САР теореме, тогда она подходит вам. Но если вы даёте другое определение терминам согласованности и доступности, то нельзя ожидать того, что САР теорема применима к вам. Конечно, это не значит, что путем переопределения значений вы внезапно сможете сделать невозможные вещи! Просто вы не можете руководствоваться САР теоремой и использовать ее для аргументации в поддержку вашей точки зрения.</p>
<h1>Линеаризуемость</h1>
<p>В случае, если вы не знакомы с линеаризуемостью (в смысле «целостностью» в контексте САР), позвольте мне кратко рассказать об этом. Формальное определение не то чтобы очень понятное, но ключевая идея, если по-простому, такая:</p>
<p><em>Если операция В началась после успешного завершения операции А, тогда операция В должна видеть состояние системы в момент завершении А или же в новом состоянии. </em></p>
<p>Для большей наглядности, можете себе представить следующую ситуацию, в которой система <strong>не </strong>будет линеаризуемой. Смотрите диаграмму ниже (эдакое превью на мою еще невыпущенную книгу):</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/alice_bob.png"><img class="  wp-image-2097 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/alice_bob.png" alt="alice_bob" width="711" height="506" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/alice_bob.png 1432w, http://softblog.violet-tape.ru/wp-content/uploads/2015/05/alice_bob-300x213.png 300w, http://softblog.violet-tape.ru/wp-content/uploads/2015/05/alice_bob-1024x729.png 1024w" sizes="(max-width: 711px) 100vw, 711px" /></a></p>
<p>Диаграмма иллюстрирует следующую ситуацию: Боб и Алиса находятся в одной комнате, оба проверяют свои телефоны, чтобы проверить результаты финальной игры на чемпионате мира по футболу 2014 года. Сразу после того, как счет был объявлен, Алиса обновляет страницу, видит победителя и радостно сообщает об этом Бобу. Он тут же жмет <em>Обновить</em> на своем телефоне, но его запрос попадает на реплицированную базу, которая слегка лагает, поэтому его телефон говорит, что игра всё ещё идет.</p>
<p>Если бы Алиса и Боб обновили страницу в телефоне одновременно, было бы не удивительно, что они получили разные результаты, потому что они не знают в какое именно время были обработаны их запросы. Однако Боб знает, что он обновляет страницу (инициирует запрос) <em>после</em> того, как услышал восклицание Алисы о финальном счете и, таким образом, он ожидает что его данные будут как минимум с той же давностью, что и у Алисы. Тот факт, что он получил протухший результат запроса является нарушением линеаризации.</p>
<p>Знание о том, что запрос Боба произошел строго после запроса Алисы (что они не были одновременными) основывается на том, что Боб услышал результат запроса от Алисы через другой канал связи (в нашем случае вербально). Если бы Боб не услышал результата от Алисы, что игра окончилась, тогда бы он не знал о том, что его результат устарел.</p>
<p>Когда вы проектируете базу данных, вы не можете знать какие типы каналов общения будут у клиента. Получается, что, если вы хотите предоставить линеаризацию (САР-согласованность) в своей базе, вы должны сделать так, чтобы все думали, что есть только единственная копия данных, даже если их может быть много (реплицированные данные, кэш) в самых разных местах.</p>
<p>Весьма дорого и проблематично предоставить гарантии линеаризуемости, потому что это требует большого числа координационных операций. Даже CPU в вашем компьютере <a href="http://www.cl.cam.ac.uk/~pes20/weakmemory/x86tso-paper.tphols.pdf">не предоставляет линеаризованный доступ к оперативной памяти</a>! Для получения линеаризуемости в современных CPU необходимо использовать <a href="http://mechanical-sympathy.blogspot.co.uk/2011/07/memory-barriersfences.html">memory barrier инструкции</a>. И даже протестировать линеаризуемость системы <a href="https://github.com/aphyr/knossos">очень даже не просто</a>.</p>
<h1>САР-доступность</h1>
<p>Поговорим немного о том, нужно ли жертвовать линеаризованностью или доступностью в случае с сетевым разделением.</p>
<p>Допустим у нас есть копии базы данных в двух разных датацентрах. Конкретный метод репликации в данном случае неважен – это может быть  single-leader (master/slave), multi-leader (master/master) или quorum-based репликация (<a href="http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf">Dynamo-style</a>). Общий смысл репликации в том, чтобы при изменении данных в одном датацентре они отображались в другом. Представим, что клиенты связанны только с одним датацентром и должно быть еще одно соединение между датацентрами для реплицирования данных.</p>
<p>Теперь пусть соединение между ДЦ было прервано – это то, что мы подразумеваем под сетевым разделением. Что тогда случится?</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/dc.png"><img class="  wp-image-2098 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/dc.png" alt="dc" width="753" height="344" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/05/dc.png 1609w, http://softblog.violet-tape.ru/wp-content/uploads/2015/05/dc-300x137.png 300w, http://softblog.violet-tape.ru/wp-content/uploads/2015/05/dc-1024x468.png 1024w" sizes="(max-width: 753px) 100vw, 753px" /></a></p>
<p>Очевидно, что вы можете выбрать один из двух вариантов:</p>
<ol>
<li>Приложение продолжает работать и позволяет запись в базу данных, оно полностью доступно для обоих датацентров. Но так как связь между ДЦ прервана, все изменения в одном ДЦ не будут доступны в другом. Это нарушает линеаризуемость (в терминах предыдущего примера, Алиса может быть отнесена к ДЦ1, а Боб к ДЦ2).</li>
<li>Если вы не хотите терять линеаризуемость, вы должны быть уверены, что вы осуществляете всё чтение и запись в одном датацентре, который вы можете называть <em>ведущим.</em> В другом ДЦ, данные которого не могут быть в актуальном сосотоянии из-за потери соединения, база данных должна прекратить обслуживать клиентов на чтение и запись до восстановления синхронизации. Так как зависимая база данных во втором ДЦ не может обрабатывать запросы, то она не САР-доступна.</li>
</ol>
<p>Кстати, это по сути доказательство САР теоремы. В примере используются два ДЦ, но все может быть применено и к одному ДЦ, так как сетевые проблемы могут быть внутри тоже. Просто я подумал, что пример с двумя ДЦ более простой и наглядный.</p>
<p>Заметьте что в нашей условно «недоступной» ситуации во втором варианте, мы вполне успешно можем обрабатывать запросы в одном из ДЦ. Так что если система построена с упором на линеаризуемость (т.е. не САР-доступна), то это не обязательно означает что сетевая разделенность автоматически ведет к простою приложения. Если вы сможете перевести всех клиентов на использование ведущего ДЦ, клиенты не заметят падения вообще.</p>
<p>Доступность (availability) на практике <a href="http://blog.thislongrun.com/2015/04/cap-availability-high-availability-and_16.html">не то чтобы ссылается</a> на САР-доступность. Доступность вашего приложения скорее всего измеряется в SLA (например, 99,9% правильных запросов должны возвращать результат в течении 1 секунды), но такое соглашение может быть реализовано в системах CAP-доступных и САР-недоступных.</p>
<p>На практике, системы расположенные во многих ДЦ часто разрабатываются с учетом асинхронной репликации и выходит что они нелинеаризованные. Однако причиной такого выбора чаще всего является латентность сети самой по себе, а не только из-за повышения устойчивости датацентров и падучести сети.</p>
<h1>Многие системы ни линеаризуемые, ни САР-доступные</h1>
<p>Как же создавать системы с учетом строгих определений в САР-теореме для целостности (линеаризованности) и доступности?</p>
<p>Например, возьмите любую БД с репликацией и одним ведущим (single leader), что является стандартной настройкой для большинства реляционных баз данных. В такой конфигурации клиент не может писать в базу, если он отделен от ведущего. Даже если клиент может читать из копий (read-only recplica), тот факт, что он не может писать данные означает что любая настройка с единым ведущим не САР-доступна. И неважно, что такие системы часто позиционируются как «системы с высокой доступностью».</p>
<p>Если репликация с одним ведущим не САР-доступна, то делает ли это её «СР»? Погодите, не так быстро! Если вы разрешите приложению читать с реплик, а реплики асинхронные (по умолчанию для большинства БД), тогда зависимая БД может быть слегка устаревшей во время чтения. В этом случае чтение будет не линеаризованным, т.е. не CAP-согласованным.</p>
<p>Более того, базы данных с <a href="http://research.microsoft.com/pubs/69541/tr-95-51.pdf">уровнем изоляции snapshot</a>/MVCC намеренно нелинеаризованны, потому что требование линеаризации уменьшит количество одновременно выполняющихся операций (concurrency). Например, <a href="http://drkp.net/papers/ssi-vldb12.pdf">PostgreSQL SSI</a> дает сериализуемость, но не линеаризуемость, с <a href="http://www.researchgate.net/publication/220225203_Making_snapshot_isolation_serializable/file/e0b49520567eace81f.pdf">Оракл такая же ситуация</a>. Только потому что база данных маркирована как ACID не означает, что БД удовлетворяет определению согласованности\непротиворечивости в CAP теореме.</p>
<p>Получается что эти системы ни CAP-согласованы, ни САР-доступны. Они ни «СР», ни «АР», они просто «Р», чтобы это ни значило. Да, формулировка «две из трех» <em>позволяет</em> вам выбрать только одну опцию из трех, или даже ни одной!</p>
<p>А что насчет «NoSQL»? Для примера можно взять MongoDB: она имеет одного ведущего на шард (по крайней мере так предполагается, если это не режим split-brain), так что учитывая все сказанное выше, уже нет САР-доступности. И Кайл (Kyle) <a href="https://aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads">недавно показал</a>, что это позволяет делать нелинеаризованное чтение даже при самом высоком уровне настроек согласованности, так что САР-согласованности нет так же.</p>
<p>Производные от Dynamo, такие как Riak, Cassandra и Voldemort, часто зовутся «АР» потому что оптимизированы для высокого уровня доступности? Ну, это зависит от ваших настроек. Если в реплики можно писать и читать данные (R=W=1) – они действительно CAP-available. Однако, если чтение и запись осуществляются кворумом (R+W&gt;N) и у вас разделение по сети, клиенты находящиеся на стороне меньшинства не могут достучаться до кворума, получается что кворум операции так же не САР-доступны (как минимум временно, пока база данных не поднимет дополнительные реплики на стороне меньшинства).</p>
<p>Порой вы можете встречаться с людьми, которые утвержадют что чтение и запись на основе кворума гарантирует линеаризацию, но я думаю это будет не очень умно полагаться на это – хрупкая комбинация фич, таких как sloppy quorums и чтение с восстановлением (read repair) могут привести к <a href="http://basho.com/riaks-config-behaviors-part-3/">хрупкой грани</a>, когда <span style="text-decoration: line-through;">мертвые восстанут</span> удаленные записи восстановятся, или количество реплик упадет меньше оригинально числа писателей (нарушение условий кворума), или количество реплик превысит первоначальное N (опять нарушение условий кворума). Всё это ведет к нелинеаризованному получению данных.</p>
<p>Все упомянутые системы не плохие: люди успешно используют их в боевом окружении. Однако, до сих пор мы не смогли строго определить из как «AP» или «CP», в том числе потому что это зависит от определенной операции или конфигурации, или потому что система не удовлетворяет строгому определению непротиворечивости или доступности в САР-теореме.</p>
<h1>Реальный пример: ZooKeeper</h1>
<p>Что насчет ZooKeeper? Эта система использует <a href="http://web.stanford.edu/class/cs347/reading/zab.pdf">алгоритм соглашений</a>, поэтому многие сходятся во мнении что это <a href="http://www.knewton.com/tech/blog/2014/12/eureka-shouldnt-use-zookeeper-service-discovery/">чистый пример предпочтения согласованности над доступностью</a> (т.е. «СР система»).</p>
<p>Однако, если вы посмотрите в <a href="http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html#ch_zkGuarantees">документацию</a>, там четко сказано, что ZooKeeper по умолчанию <strong>не</strong> предоставляет линеаризованного чтения. Каждый клиент подключен к одной из нод, и когда вы хотите начать чтение, вы видите данные только с вашей ноды, даже если есть обновленные данные на соседних нодах. Это позволяет читать данные гораздо быстрее, чем в случае необходимости сбора кворума или опрашивать лидера для каждого чтения, но это так же означает что ZooKeeper по умолчанию не отвечает требованиям САР теоремы по непротиворечивости.</p>
<p>Вообще сделать линеаризованное чтение в ZooKeeper возможно <a href="http://mail-archives.apache.org/mod_mbox/zookeeper-user/201303.mbox/%3CCAJwFCa0Hoekc14Zy6i0LyLj=eraF8JimqMZadohoKQJNTMtYSg@mail.gmail.com%3E">используя sync перед командой чтения</a>. Это не поведение по умолчанию, потому что получаем просадку по производительности. Команда sync используется, но не всё время.</p>
<p>Что насчет доступности в ZooKeeper? Что ж, ZK требует <a href="http://www.tcs.hut.fi/Studies/T-79.5001/reports/2012-deSouzaMedeiros.pdf">решение большинства</a> для достижения соглашения для записи данных. Если у вас есть разделение на большинство и меньшинство нод, то большинство будет функционировать как прежде, однако ноды оставшиеся в меньшинстве не смогут обрабатывать запросы на запись, несмотря на то, что все они исправны. Получается, функция записи в ZK не САР-доступна в разделенном (partition) режиме функционирования (даже с учетом того, что большинство нод может записывать данные).</p>
<p>Чтобы добавить во всё это еще больше веселья, в версии ZooKeeper 3.4.0 добавили <a href="http://zookeeper.apache.org/doc/r3.4.6/zookeeperAdmin.html#Experimental+Options%2FFeatures">режим только для чтения</a>, в котором ноды, оставшиеся в меньшинстве могут продолжать обслуживать запросы чтения – кворум не требуется! Т.е. режим для чтения <em>является</em> САР-доступным. Таким образом, ZK по умолчанию не является ни САР-согласованным («СР»), ни САР-доступным («АР») – это реально просто «Р». Впрочем, вы можете сделать систему «СР» используя метод sync, и только для операции чтения система «AP», если включить верные опции.</p>
<p>Но вот что раздражает: называть ZooKeeper «не согласованной» системой, просто потому что она нелинеаризуемая по умолчанию – действительно ужасная интерпретация фич. ZK на самом деле дает великолепную степень непротиворечивости! Он поддерживает <a href="http://web.stanford.edu/class/cs347/reading/zab.pdf">atomic broadcast</a> совместно с гарантированной <a href="http://research-srv.microsoft.com/en-us/um/people/lamport/pubs/multi.pdf">casual consistency </a>– что более <a href="http://arxiv.org/pdf/1302.0309.pdf">сильное</a> условие, чем <a href="http://www.researchgate.net/profile/Douglas_Terry3/publication/3561300_Session_guarantees_for_weakly_consistent_replicated_data/links/02e7e52cdbe60a6cb4000000.pdf">read your writes, monotonic reads</a> и <a href="http://research.microsoft.com/pubs/157411/ConsistencyAndBaseballReport.pdf">consistent prefix reads</a> вместе взятые. Документация говорит, что система дает <a href="http://research-srv.microsoft.com/en-us/um/people/lamport/pubs/multi.pdf">последовательную непротиворечивость</a>, но это недооценка самих себя, потому что ZooKeeper гарантирует более сильное определение, чем последовательная непротиворечивость.</p>
<h1>СР/АР: ложная дихотомия</h1>
<p>Тот обстоятельство, что мы не смогли однозначно классифицировать даже одно хранилище как «АР» или «СР» должно наводить на определенные мысли: это просто неподходящие определения для описываемых систем.</p>
<p>Я уверен, что мы должны прекратить пытаться определить различные хранилища в категории «АР» или «СР» потому, что:</p>
<ul>
<li>В рамках одно приложения может существовать несколько разных операций с <a href="http://groups.csail.mit.edu/tds/papers/Gilbert/Brewer2.pdf">различными характеристиками согласованности данных</a>.</li>
<li>Множество систем не отвечают определению согласованности и доступности в рамках САР-теоремы. Однако я никогда не слышал, чтобы кто-то называл свою систему просто «Р», наверно потому что это плохо звучит. Но это не плохо – это может быть идеально спланированная архитектура, которая просто не попадает в категории СР/АР.</li>
<li>Даже если большинство ПО не попадают точно в упомянутые категории, люди все равно стараются втиснуть его в одну из категорий, и получается, что неизбежно меняется смысл «согласованности» или «доступности» к тому, что они хотят под этим понимать. К сожалению, если значение слов меняется – САР теорема больше не может применятся, и разделение на СР/АР не имеет значения.</li>
<li>Огромное количество нюансов теряется при попытке втиснуть систему в одну из двух категорий. Существует огромное количество аспектов касательно устойчивости к сбоям, латентности, простоты модели программирования, взаимодействия и так далее, что может быть использовано в проектировании распределенных систем. Физически невозможно закодировать все эти нюансы в одном бите информации. Например, даже ZooKeeper поддерживает «AP» в режиме только для чтения, и этот режим дает возможность читать записи в том же самом порядке как они были записаны – это гораздо сильнее, чем «АР» в таких системах как Riak или Cassandra – так что было бы нелепо складывать их в одну кучу.</li>
<li>Даже Эрик Брюэр (Eric Brewer) <a href="http://cs609.cs.ua.edu/CAP12.pdf">признает</a>, что САР вводит в заблуждение и слишком всё упрощает. В 2000 году было важно начать обсуждение компромиссов в распределенных системах, и это сработало. Не было намерения создать какой-то прорывной формальный документ или строгую классификацию схем для хранилищ данных. 15 лет спустя у нас появился гораздо более богатый набор инструментов с разными подходами к обеспечению целостности данных и защитой к ошибкам. САР сделала свою задачу и теперь время двигаться дальше.</li>
</ul>
<h1>Учитесь думать самостоятельно</h1>
<p>Если «СР» и «АР» не подходят для описания и критики систем, что следует использовать взамен? Не думаю, что у меня есть единственный правильный ответ. Многие люди провели немало времени напряжено размышляя о проблемах распределенных систем, и предложили терминологию и модели, которые сейчас нам помогают понять проблемы. Чтобы узнать большое об этих идеях вам надо самостоятельно покопаться в литературе:</p>
<ul>
<li>Хорошей отправной точкой будет статья Дуга Терри где он <a href="http://research.microsoft.com/pubs/157411/ConsistencyAndBaseballReport.pdf">разъясняет различия между разными уровнями частичной согласованности используя бейсбол для примера</a>. Очень легко читается и понимается, даже если вы (так же, как и я) не американец и ничего не понимаете в бейсболе.</li>
<li>Если вы хотите узнать побольше про модели транзакционной изоляции (что не то же самое что и согласованность в распределенных репликах, но близко), мой маленький проект <a href="http://martin.kleppmann.com/2014/11/25/hermitage-testing-the-i-in-acid.html">Hermitage</a> может помочь.</li>
<li>Связь между согласованностью реплик, транзакциями и доступностью исследована <a href="http://arxiv.org/pdf/1302.0309.pdf">Питером Баилисом</a> (Peter Bailis). Документ так же объясняет значение иерархии уровней согласованности которые так <a href="https://aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads">любит показывать</a> Кайл Кингсбери (Kyle Kingsbury).</li>
<li>Когда вы всё это прочитаете, вы будете готовы копнуть глубже. Я перелопатил кучу ссылок и документов для этого поста – почитайте их, эксперты уже отлично описали многие вещи для вас.</li>
<li>В качестве последнего довода, если вы не можете читать первоисточники, я предлагаю вам взглянуть на мою книгу, которая содержит и суммирует наиболее важные идеи в удобном виде. Видите, я старался <em>очень сильно</em> не сделать из поста рекламную речь.</li>
<li>Если вас заинтересовала тема ZooKeeper и вы хотите обратить на него более детальный взгляд, то <a href="http://shop.oreilly.com/product/0636920028901.do">Flavio Junqueira и Benjamin Reed</a> написали хорошую книгу.</li>
</ul>
<p>Независимо от того, какой путь изучения вы выберете я призываю вас сохранять любопытство и терпение – это не просто. Но вы будете вознаграждены, потому что вы будете понимать причины компромиссов и сможете определить какой тип архитектуры в вашем конкретном случае. Но чтобы вы не делали, прекратите</p>
<p>&nbsp;</p>
<p>Оригинал: https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/07/20/cap-is-not-actual/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Проектирование Web API в 7 шагов</title>
		<link>http://softblog.violet-tape.ru/2015/07/20/7_step_api/</link>
				<comments>http://softblog.violet-tape.ru/2015/07/20/7_step_api/#comments</comments>
				<pubDate>Mon, 20 Jul 2015 08:02:02 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Build API]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[State Diagram]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2082</guid>
				<description><![CDATA[Разработка веб API это нечто большее чем просто URL, HTTP статус-коды, заголовки и содержимое запроса. Процесс проектирования – то, как будет выглядеть и восприниматься ваш API – очень важен и является хорошей инвестицией в успех вашего дела. Эта статья кратко описывает методологию для проектирования API с опорой на преимущества веба и протокола HTTP, в частности. ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/07/20/7_step_api/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7steps.jpg"><img class="alignleft size-full wp-image-2083" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7steps.jpg" alt="7steps" width="259" height="340" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7steps.jpg 259w, http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7steps-229x300.jpg 229w" sizes="(max-width: 259px) 100vw, 259px" /></a>Разработка веб API это нечто большее чем просто URL, HTTP статус-коды, заголовки и содержимое запроса. Процесс проектирования – то, как будет выглядеть и восприниматься ваш API – очень важен и является хорошей инвестицией в успех вашего дела. Эта статья кратко описывает методологию для проектирования API с опорой на преимущества веба и протокола HTTP, в частности. Но не стоит думать, что это применимо только для HTTP. Если по какой-то причине вам необходимо реализовать работу ваших сервисов используя WebSockets, XMPP, MQTT и так далее – применяя большую часть всех рекомендаций вы получите практически тот же API, который будет хорошо работать. К тому же полученный API позволит легче разработать и поддерживать работу поверх нескольких протоколов.</p>
<h1>Хороший дизайн затрагивает URL, статус-коды, заголовки и содержимое запроса</h1>
<p>Обычно руководства по проектированию Web API фокусируются на общих концепциях: как проектировать URL, как правильно использовать HTTP статус-коды, методы, что передавать в заголовках и как спроектировать дизайн содержимого, которое представлено сериализованными данными или графом объектов. Это всё очень важные детали реализации, но не настолько в смысле общего проектирования API. Проектирование API – это то, как сама суть сервиса будет описана и представлена, то что вносит значительный вклад в успех и удобность использования Web API.</p>
<p>Хороший процесс проектирования или методология предоставляют набор согласованных и воспроизводимых шагов для создания компонентов сервисов, которые будут доступны в виде Web API. Это значит, что такая прозрачная методология может быть использована разработчиками, дизайнерами и архитекторами для координации своих действий по реализации ПО. Использованная методология так же может уточнятся со временем по мере того, как улучшается и автоматизируется процесс без ущерба для деталей методологии. На самом деле, <em>детали реализации</em> могут меняться (например, платформа, ОС, фреймворки и стиль UI) независимо от <em>процесса проектировки</em>, когда эти две активности полностью разделены и задокументированы.</p>
<p><span id="more-2082"></span></p>
<h1>Проектирование API в 7 шагов.</h1>
<p>Далее следует краткий обзор методологии описанной в книге &#171;<a href="http://restfulwebapis.com/">RESTful Web APIs</a>&#187; за авторством Ричардсона и Амундсена (Richardson and Amundsen). Статья не предполагает детального разбора каждого шага, но постарается дать общее понимание что делается на каждом шаге. Также, читатели могут использовать этот обзор как руководство для разработки процесса проектирования Web API, который учитывает специфику ваших знаний и целей бизнеса.</p>
<p><em>Заметки на полях: Да, руководство в семь шагов может выглядеть достаточно большим, но реально тут только 5 шагов по проектированию и 2 как дополнения, касающиеся реализации и публикации сервисов. Эти два дополнения построены вокруг процессов и описывают весь процесс от начала до конца.  </em></p>
<p>В своём плане вы должны учесть возможную итеративную природу процесса создания сервиса. Например, вы можете проходить через Шаг 2 (Создание диаграмм состояний) и понять, что надо еще кое-чего сделать в Шаге 1 (Перечислить все компоненты). Когда вы будете писать код (Шаг 6), вы можете обнаружить, что пропустили пару моментов в Шаге 5 (Создание семантического профиля), и так далее. Ключевой момент заключается в использовании руководства для обнаружения как можно большего количества деталей и желании возвращаться на шаг-два назад, чтобы описать пропущенные моменты. <strong>Итеративность – ключ к построению наиболее полного представления вашего сервиса и видению как он может быть использован клиентскими приложениями.</strong></p>
<h1>Шаг 1: Перечислить все компоненты</h1>
<p>Первым шагом предлагается перечислить все типы данных, которые клиентское приложение может захотеть получить или передать с помощью сервиса. Мы зовём это семантическим описанием. <em>Семантическое</em> – потому что отображает значение данных в приложении, и <em>описание</em> – потому что содержит описание того, что происходит в самом приложении. <strong>Заметьте, что вы должны работать с точки зрения клиентского приложения, а не сервиса</strong>. Важно разработать удобный API для использования клиентом.</p>
<p>Например, простое приложения типа «Список дел», вы можете найти следующие семантические описания:</p>
<ul>
<li>id – уникальный идентификатор для каждой записи в системе</li>
<li>title – название для каждого «дела»</li>
<li>dateDue – дата, к которому «дело» должно быть завершено</li>
<li>complete – «да/нет» флажок, который показывает завершено ли «дело»</li>
</ul>
<p>В настоящем приложении здесь может быть очень много пунктов для отображения таких понятий как категории «дел» (работа, семья, сад и т.д.), пользовательской информации и прочего. Сейчас лучше остановиться на таком простом списке, чтобы можно было сфокусироваться на самом процессе.</p>
<h1>Шаг 2: Нарисовать диаграмму состояний</h1>
<p>Следующим шагом будет нарисовать диаграмму состояний для предполагаемого API. Каждый блок на диаграмме представляет возможное состояние – документ который включает одно или более семантических дескрипторов, найденных на первом шаге. Вы можете использовать стрелки для обозначения переходов от одного блока к другому, от одного состояния к следующему. Эти переходы инициируются запросами.</p>
<p>Пока не стоит беспокоится на счёт определения какой метод используется для каждого перехода. Просто укажите является ли переход безопасным (HTTP GET), небезопасный/не идемпотентный (HTTP POST) или небезопасный/идемпотентный (PUT)</p>
<p><em>Заметки на полях: Идемпотентные действия – такие, которые можно повторять без неожиданных сайд-эффектов. Например, HTTP</em><em> PUT</em><em> является идемпотентным потому что спецификация говорит, что сервер должен использовать значения состояния, полученные от клиента, для замены любых значений в целевом ресурсе. В то время как HTTP</em><em> POST</em><em> не идемпотентен, так как спецификация HTTP</em><em> указывается что значения, переданные с помощью POST</em><em> должны быть добавлены к существующим ресурсам, а не замещены. </em></p>
<p>В нашем случае, клиентское приложение для простейшего «Списка дел» может потребовать доступ к пунктам списка, возможность фильтрации, просматривать отдельные пункты и отмечать их как завершённые. Многие из этих действий используют значения состояний для передачи данных между клиентом и сервером. Например, действие «добавить элемент» позволяет клиенту передавать значения состояний title и dueDate. Ниже диаграмма, которая иллюстрирует основные действия:</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7s_1.png"><img class=" size-full wp-image-2084 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7s_1.png" alt="7s_1" width="369" height="434" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7s_1.png 369w, http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7s_1-255x300.png 255w" sizes="(max-width: 369px) 100vw, 369px" /></a></p>
<p>Действия, показанные на диаграмме и перечисленные, ниже так же являются семантическими дескрипторами – они описывают семантику действий для сервиса.</p>
<ul>
<li>read-list</li>
<li>filter-list</li>
<li>read-item</li>
<li>create-item</li>
<li>mark-complete</li>
</ul>
<p>В процессе работы над диаграммой, вы можете обнаружить, что вы пропустили какие-то действия или данные, которые требуются клиенту. В этом случае это прекрасная возможность вернуться на шаг назад и внести пропущенные данные и улучшить диаграмму на шаге 2.</p>
<p>Как только вы пройдёте пару раз через эти два шага у вас будет хорошее понимание всех данных и действий в которых нуждается клиент для взаимодействия с вашим сервисом.</p>
<h1>Шаг 3: Согласование магических строк</h1>
<p>Следующим шагом будет согласование всех «магических строк» в интерфейсе вашего сервиса. «Магическими строками» в нашем случае будут все названия дескрипторов – они не имеют смысла за пределами задачи, они просто представляют действия или элементы данных к которым клиенты будут обращаться при общении со службой. Согласование имён означает приведение их к широко используемым терминам, используя, например, следующие ресурсы:</p>
<ul>
<li><a href="http://schema.org/">schema.org</a></li>
<li><a href="http://microformats.org/">microformats.org</a></li>
<li><a href="http://dublincore.org/documents/dces/">Dublin Core</a></li>
<li><a href="http://www.iana.org/assignments/link-relations/link-relations.xhtml">IANA Link Relation Values</a></li>
</ul>
<p>Это всё репозитории для хорошо сформулированных, широко применяемых имён. Когда вы будете использовать имена из этих сервисов, убедитесь, что разработчики будут понимать их так же как вы. Такой процесс может значительно улучшить удобство пользования вашего API.</p>
<p><em>Заметки на полях: Использование общих имён для дескрипторов может быть хорошей идеей для внешнего интерфейса, однако вас никто не заставляет использовать их для ваших внутренних нужд. Имеются ввиду, например, имена для баз данных. Сервис самостоятельно может использовать карту соответствий между внешними и внутренними именами без каких-либо проблем. </em></p>
<p>Для To-Do сервиса из примера, у меня получилось найти приемлемые существующие имена для всех дескрипторов кроме одного – «create-item». В этом случае, я обратился к созданию уникального URI на основе правил из <a href="https://tools.ietf.org/html/rfc5988">Web-Linking RFC 5988</a>. Во время выбора конвенционных имён для интерфейса вас всегда будут преследовать компромиссы. Редко когда удаётся найти идеальное попадание к внутренним именам и это нормально.</p>
<p>Вот что у меня получилось:</p>
<ul>
<li>id -&gt;<a href="http://purl.org/dc/elements/1.1/identifier">identifier from Dublin Core </a></li>
<li>title -&gt;<a href="https://schema.org/name">name from Schema.org</a></li>
<li>dueDate -&gt;<a href="https://schema.org/scheduledTime">scheduledTime from Schema.org</a></li>
<li>complete -&gt;<a href="https://schema.org/status">status from Schema.org</a></li>
<li>read-list -&gt;<a href="http://www.iana.org/assignments/link-relations/link-relations.xhtml">collection from IANA Link Relation Values</a></li>
<li>filter-list -&gt;<a href="http://www.iana.org/assignments/link-relations/link-relations.xhtml">search from IANA Link Relation Values</a></li>
<li>read-item -&gt;<a href="http://www.iana.org/assignments/link-relations/link-relations.xhtml">item from IANA Link Relation Values</a></li>
<li>create-item -&gt; <a href="http://mamund.com/rels/create-item">http://mamund.com/rels/create-item</a> using RFC5988</li>
<li>mark-complete -&gt;<a href="http://www.iana.org/assignments/link-relations/link-relations.xhtml">edit from IANA Link Relation Values</a></li>
</ul>
<p>Итак, вот как стала выглядеть диаграмма после использования согласования имён:</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7s_2.jpg"><img class=" size-full wp-image-2085 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7s_2.jpg" alt="7s_2" width="448" height="434" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7s_2.jpg 448w, http://softblog.violet-tape.ru/wp-content/uploads/2015/04/7s_2-300x291.jpg 300w" sizes="(max-width: 448px) 100vw, 448px" /></a></p>
<h1>Шаг 4: Выбор типа гипермедиа</h1>
<p>Следующим шагом в процессе проектирования вашего API будет выбор типа данных, который будет использоваться для передачи сообщений между сервером и клиентом. Одним из отличительных знаков сети является то, что данные передаются стандартизированными документами через общий интерфейс. Очень важно выбрать такой тип, который поддерживает одинаково дескрипторы данных (&#171;identifier&#187;, &#171;status&#187;) и действий (&#171;search&#187;, &#171;edit&#187;). Таких форматов достаточно мало.</p>
<p>Вот некоторые из гипермедиа форматов с вершины списка (порядок не имеет значения в этом списке):</p>
<ul>
<li>HyperText Markup Language (<a href="http://www.w3.org/TR/html5/">HTML</a>)</li>
<li>Hypertext Application Language (<a href="http://stateless.co/hal_specification.html">HAL</a>)</li>
<li>Collection+JSON (<a href="http://amundsen.com/media-types/collection/">Cj</a>)</li>
<li><a href="https://github.com/kevinswiber/siren/blob/master/README.md">Siren</a></li>
<li><a href="http://jsonapi.org/">JSON-API</a></li>
<li>Uniform Basis for Exchanging Representations (<a href="http://g.mamund.com/uber">UBER</a>)</li>
</ul>
<p>На выбор так же должно влиять то, насколько хорошо выбранный формат гипермедиа работает с протоколом передачи данных. Большинство разработчиков предпочитает протокол <a href="https://tools.ietf.org/html/rfc7230">HTTP</a> для интерфейса сервисов. Однако так же используются и  <a href="https://tools.ietf.org/html/rfc6455">WebSockets</a>, <a href="http://xmpp.org/rfcs/rfc6120.html">XMPP</a>, <a href="http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html">MQTT</a> и <a href="https://tools.ietf.org/html/rfc7252">CoAP</a> – особенно для высоко-скоростных реализаций, с короткими сообщениями, соединениями точка-точка.</p>
<p>Для нашего примера я буду использовать HTML как протокол сообщений и HTTP как протокол связи. HTML уже имеет поддержку необходимых дескрипторов (&lt;UL&gt; для списков, &lt;LI&gt; для элементов, и &lt;SPAN&gt; для данных). Так же в нем есть адекватная поддержка для дескрипторов действий (&lt;A&gt; для безопасных ссылок, &lt;FORM method=&#187;get&#187;&gt; для безопасных переходов и &lt;FORM method=&#187;post&#187;&gt; для небезопасных переходов).</p>
<p><em>Заметки на полях: Диаграмма состояний сейчас показывает «редактирование» как идемпотентное (HTTP PUT), но HTML до сих пор не имеет встроенной поддержки для PUT</em><em>. Однако я могу добавить дополнительное поле чтобы эмулировать идемпотентный HTML POST</em><em>. </em></p>
<p>Отлично, теперь я могу «опробовать» интерфейс основываясь на состояниях из диаграммы. Для нашего примера, нам надо описать только две вещи: «To-Do List» и «To-Do Item»:<br />
<strong>Коллекция «</strong><strong>To</strong><strong>-Do</strong><strong> List</strong><strong>» в HTML</strong><strong> представлении</strong></p><pre class="crayon-plain-tag">&lt;html&gt;
  &lt;head&gt;
    &lt;!-- for test display only --&gt;
    &lt;title&gt;To Do List&lt;/title&gt;
    &lt;style&gt;
      .name, .scheduledTime, .status, .item {display:block}
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;!-- for test display only --&gt;
    &lt;h1&gt;To-Do List&lt;/h1&gt;
    &lt;!-- to-do list collection --&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;a href="/list/1" rel="item" class="item"&gt;
          &lt;span class="identifier"&gt;1&lt;/span&gt;
        &lt;/a&gt;
        &lt;span class="name"&gt;First item in the list&lt;/span&gt;
        &lt;span class="scheduledTime"&gt;2014-12-01&lt;/span&gt;
        &lt;span class="status"&gt;pending&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="/list/2" rel="item" class="item"&gt;
          &lt;span class="identifier"&gt;2&lt;/span&gt;
        &lt;/a&gt;
        &lt;span class="name"&gt;Second item in the list&lt;/span&gt;
        &lt;span class="scheduledTime"&gt;2014-12-01&lt;/span&gt;
        &lt;span class="status"&gt;pending&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="/list/3" rel="item" class="item"&gt;
          &lt;span class="identifier"&gt;3&lt;/span&gt;
        &lt;/a&gt;
        &lt;span class="name"&gt;Third item in the list&lt;/span&gt;
        &lt;span class="scheduledTime"&gt;2014-12-01&lt;/span&gt;
        &lt;span class="status"&gt;complete&lt;/span&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;!-- search transition --&gt;
    &lt;form method="get" action="/list/" class="search"&gt;
      &lt;legend&gt;Search&lt;/legend&gt;
      &lt;input name="name" class="identifier" /&gt;
      &lt;input type="submit" value="Name Search" /&gt;
    &lt;/form&gt;
    &lt;!-- create-item transition --&gt;
    &lt;form method="post" action="/list/" class="&gt;
      &lt;legend&gt;Create Item&lt;/legend&gt;
      &lt;input name="name" class="name" /&gt;
      &lt;input name="scheduledTime" class="scheduledTime" /&gt;
      &lt;input type="submit" value="Create Item" /&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre><p><strong>Коллекция «To-Do Item» </strong><strong>в HTML </strong><strong>представлении</strong></p><pre class="crayon-plain-tag">&lt;html&gt;
  &lt;head&gt;
    &lt;!-- for test display only --&gt;
    &lt;title&gt;To Do List&lt;/title&gt;
    &lt;style&gt;
      .name, .scheduledTime, .status, .item, .collection {display:block}
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;!-- for test display only --&gt;
    &lt;h1&gt;To-Do Item&lt;/h1&gt;
    &lt;a href="/list/" rel="collection" class="collection"&gt;Back to List&lt;/a&gt;
    &lt;!-- to-do list collection --&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;a href="/list/1" rel="item" class="item"&gt;
          &lt;span class="identifier"&gt;1&lt;/span&gt;
        &lt;/a&gt;
        &lt;span class="name"&gt;First item in the list&lt;/span&gt;
        &lt;span class="scheduledTime"&gt;2014-12-01&lt;/span&gt;
        &lt;span class="status"&gt;pending&lt;/span&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;!-- edit transition --&gt;
    &lt;form method="post" action="/list/1" class="edit"&gt;
      &lt;legend&gt;Update Status&lt;/legend&gt;
      &lt;input type="hidden" name="etag" value="q1w2e3r4t5y6" class="etag" /&gt;
      &lt;input type="text" name="status" value="pending" class="status" /&gt;
      &lt;input type="submit" value="Update" /&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre><p>Помните о том, что, работая с примерной реализацией вашей диаграммы состояний, вы можете обнаружить, что что-то пропущено и вам надо вернуться на шаг-два назад. Это нормально и не надо этого пугаться. Сейчас самое время все это опробовать в тестовых примерах – до того, как вы начнёте реализовывать всё в коде.</p>
<p>Когда вы будете довольны тем как всё представлено, остаётся последний шаг перед началом кодирования – создание <a href="http://semtechwiki.com/articles/semantic-profiling">семантического профиля</a>.</p>
<h1>Шаг 5: Создание семантического профиля</h1>
<p><strong>Семантический профиль</strong> – это документ который перечисляет все дескрипторы в вашем решении и описывает детали каждого из них, чтобы помочь разработчикам создать как клиентскую, так и серверную реализацию.</p>
<p>Следует чётко понимать, что это <em>руководство</em> по реализации, а не инструкция по реализации.</p>
<h2>Форматы описания сервиса</h2>
<p>Форматы для описания сервиса существуют достаточно давно и оказываются очень кстати, когда вы захотите сгенерировать код или задокументировать существующую реализацию сервиса.</p>
<p>Основные форматы, которые борются за сердца разработчиков:</p>
<ul>
<li>Web Service Definition Language (<a href="http://www.w3.org/TR/wsdl">WSDL</a>)</li>
<li>Atom Service Description (<a href="https://tools.ietf.org/html/rfc5023#section-8">AtomSvc</a>)</li>
<li>Web Application Description Language (<a href="http://www.w3.org/Submission/wadl/">WADL</a>)</li>
<li><a href="https://github.com/apiaryio/api-blueprint/blob/master/API%20Blueprint%20Specification.md">Blueprint</a></li>
<li><a href="https://github.com/wordnik/swagger-spec/blob/master/README.md">Swagger</a></li>
<li>RESTful Application Modeling Language (<a href="http://raml.org/spec.html">RAML</a>)</li>
</ul>
<p>&nbsp;</p>
<h2>Форматы для описания профиля</h2>
<p>Существует всего несколько форматов для описания профиля на данный момент. И вот те, которые я рекомендую:</p>
<ul>
<li>Application-Level Semantic Profiles (<a href="http://tools.ietf.org/html/draft-amundsen-richardson-foster-alps-00">ALPS</a>)</li>
<li><a href="http://www.w3.org/TR/json-ld/">JSON-LD</a>+ <a href="http://www.hydra-cg.com/">Hydra</a></li>
</ul>
<p>&nbsp;</p>
<p>Оба формата достаточно новые. JSON-LD спецификация получила статус W3C Recommendation в начале 2014. Hydra все ещё в состоянии неофициального драфта (на момент написания статьи), но имеет активное сообщество разработчиков. ALPS так же находится на ранней стадии драфта.</p>
<p>Так как идея документа заключается в том, чтобы описать реальные аспекты проблемной области (а не частное решение), формат весьма отличается от типичных описательных форматов:</p><pre class="crayon-plain-tag">&lt;html&gt;
&lt;alps version="1.0"&gt;
  &lt;doc&gt;
    ALPS profile for InfoQ article on "API Design Methodology"
  &lt;/doc&gt;
  &lt;!-- data descriptors --&gt;
  &lt;descriptor id="identifier" type="semantic" ref=" /&gt;
  &lt;descriptor id="name" type="semantic" ref=" /&gt;
  &lt;descriptor id="scheduledTime" type="semantic" ref=" /&gt;
  &lt;descriptor id="status" type="semantic" ref=" /&gt;
  &lt;!-- action descriptors --&gt;
  &lt;descriptor id="collection" type="safe" ref=" /&gt;
  &lt;descriptor id="item" type="safe" ref="&gt;
    &lt;descriptor href="#identifier" /&gt;
  &lt;/descriptor&gt;
  &lt;descriptor id="search" type="safe" ref="&gt;
    &lt;descriptor href="#name" /&gt;
  &lt;/descriptor&gt;
  &lt;descriptor id="create-item" type="unsafe" ref="&gt;
    &lt;descriptor href="#name" /&gt;
    &lt;descriptor href="scheduledTime" /&gt;
  &lt;/descriptor&gt;
  &lt;descriptor id="edit" type="idempotent" ref="&gt;
    &lt;descriptor href="#identifier" /&gt;
    &lt;descriptor href="#status" /&gt;
  &lt;/descriptor&gt;
&lt;/alps&gt;</pre><p>Вы наверно заметили, что документ выглядит как общий словарь всех возможных значений для полей и действий из интерфейса сервиса «Список дел» – и это является сутью идеи. Сервисы, которые соглашаются придерживаться этого профиля, могут принимать собственные решения на счёт протокола, формата сообщений и даже URL. Клиенты, которые соглашаются принимать этот профиль будут созданы таким образом, чтобы понимать и, если возможно, активировать дескрипторы.</p>
<p>Это так же замечательный формат для:</p>
<ul>
<li>генерации документации в формате удобном для чтения людям,</li>
<li>анализа схожих форматов,</li>
<li>отслеживания какие профили наиболее часто используются,</li>
<li>даже для генерации диаграммы состояний.</li>
</ul>
<p>Но это тема для другой статьи.</p>
<p>Теперь, когда у вас есть полный список дескрипторов с согласованными именами, краткие заметки для диаграммы состояний и семантический профиль – вы готовы к тому, чтобы начать написание кода для сервиса и клиента.</p>
<h1>Шаг 6: Написать немного кода</h1>
<p>С этого момента, вы можете передать свои наработки (диаграмму состояний и семантический профиль) разработчикам серверной части и клиентской для выполнения конкретной реализации.</p>
<p>HTTP сервер должен реализовать диаграмму со второго шага и запросы с клиента должны запускать переходы между состояниями сервиса. Каждое представление переданное с сервиса должно быть в формате, выбранном на шаге 3 и должно включать в себя ссылку на профиль созданный в шаге 4. Ответы должны включать соответствующие гипермедийные элементы управления, которые реализуют действия из диаграммы состояний и описаны в профиле документа. Разработчики клиентской и серверной части могут писать относительно независимый код с этого момента, однако не забывать прогонять тесты на предмет соответствия диаграмме состояний и профилю.</p>
<p>После того, как вы написали и стабилизировали ваш код, остаётся последний шаг из списка: Публикация.</p>
<h1>Шаг 7: Публикация вашего API</h1>
<p>Web API должно публиковать как минимум один URL, который всегда будет отвечать на запросы клиентов – даже в далёком-далёком будущем. Я называю это «billboard URL» –тот, который все знают. Так же будет хорошей идеей публиковать документ профиля для того, чтобы новые реализации сервиса могли ссылаться на него в ответах. Вы так же можете опубликовать по этому адресу читабельную документацию, уроки и прочую информацию, которая может помочь разработчикам понять и использовать ваш сервис.</p>
<p>В конце концов у вас должен получиться хорошо спроектированный, стабильный, доступный и работающий сервис, который к использованию.</p>
<h1>В заключении</h1>
<p>Эта статья освящает набор шагов для построения API для сети. Основной упор делается на получение корректных дескрипторов данных и действий. Документирование их для машинного чтения чтобы облегчить людям писать клиентские и серверные части даже если они не общаются напрямую.</p>
<p>Ещё раз 7 шагов:</p>
<ol>
<li><strong>Перечислите все части</strong><br />
Укажите все типы данных, которые необходимы клиенту для общения с сервисом.</li>
<li><strong>Нарисуйте диаграмму состояний</strong><br />
Задокументируйте все действия (переходы между состояниями), которые доступны для сервиса</li>
<li><strong>Согласуйте магические переменные</strong><br />
Приведите имена в вашем публичном интерфейсе к принятым стандартам</li>
<li><strong>Выберите тип гипермедиа</strong><br />
Выберите формат сообщений, который наиболее полно отображает переходы в сервисе с учётом выбранного протокола.</li>
<li><strong>Создание семантического профиля</strong><br />
Напишите документ, который будет содержать и определять все дескрипторы, используемые в сервисе</li>
<li><strong>Напишите реализацию</strong><br />
Распространите семантический профиль и диаграмму состояний среди разработчиков серверной и клиентской частей, чтобы они могли писать код в соответствии с рекомендациями и править профиль/диаграмму по мере необходимости.</li>
<li><strong>Опубликуйте ваш API</strong><br />
Опубликуйте «billboard URL» и семантический профиль, чтобы другие могли использовать их для создания новых сервисов и/или клиентские приложения.</li>
</ol>
<p>Скорее всего вам потребуется возвращаться к некоторым шагам и проходить их заново, для внесения пропущенных данных или для отображения компромиссов, найденных в процессе проектировки. Чем раньше такое будет происходить, тем лучше. Так же не исключено, что вы сможете использовать эти наработки по API в какой-то момент в будущем для создания новых реализаций с новыми форматами и протоколами, которые потребуются разработчикам.</p>
<p>В конце концов, эта методология лишь один из способов для создания надёжного, воспроизводимого, последовательного и цельного процесса по проектированию Web API. В процессе рассмотрения этого примера, вы можете решить, что в вашем случае какие-то шаги надо добавить, какие-то сократить и, конечно, решения по выбору формата обмена данными и протокол могут сильно меняться от проекта к проекту.</p>
<p>Надеюсь эта статья дала вам пищу для размышления как построить оптимальную методологию по созданию API в вашей организации или команде.</p>
<hr />
<p><em>Статья написана Майком Амундсеном, ведущим архитектором API в Layer</em><em> 7 Technologies</em><em>. Он так же известен как автор книг и спикер, консультант путешествующий по США и Европе. </em></p>
<p>http://www.infoq.com/articles/web-api-design-methodology</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/07/20/7_step_api/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
							</item>
		<item>
		<title>Гугл предлагает усилить JSON с помощью Jsonnet</title>
		<link>http://softblog.violet-tape.ru/2015/04/23/jsonnet/</link>
				<comments>http://softblog.violet-tape.ru/2015/04/23/jsonnet/#respond</comments>
				<pubDate>Thu, 23 Apr 2015 14:11:11 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Автоматизация]]></category>
		<category><![CDATA[edn]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonnet]]></category>
		<category><![CDATA[yaml]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2079</guid>
				<description><![CDATA[Гугл открыла исходный код своего проекта Jsonnet, языка для конфигурации, который заменяет стандартный JSON и добавляет новые возможности без нарушения обратной совместимости. Среди таких возможностей: комментарии, ссылки, арифметические и условные операторы, массивы и работа с объектами, импорт, функции, локальные переменные. Программы на Jsonnet транслируются в совместимый JSON формат данный. Комментарии. Jsonnet принимает комментарии в стиле ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/04/23/jsonnet/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p>Гугл открыла <a href="https://github.com/google/jsonnet">исходный код</a> своего проекта <a href="http://google.github.io/jsonnet/doc/">Jsonnet</a>, языка для конфигурации, который заменяет стандартный JSON и добавляет новые возможности без нарушения обратной совместимости. Среди таких возможностей: комментарии, ссылки, арифметические и условные операторы, массивы и работа с объектами, импорт, функции, локальные переменные. Программы на Jsonnet транслируются в совместимый JSON формат данный.</p>
<p><strong>Комментарии</strong>. Jsonnet принимает комментарии в стиле С ( /* … */ ) и С++ (//)</p>
<p><strong>Ссылки</strong>. Ключевое слово self может быть использовано для ссылки на текущий объект. Оператор $ позволяет использовать корневой объект.</p>
<p><strong>Арифметические и условные операторы</strong>. Оператор + может складывать числа, строки, массивы и объекты. Операторы == и != возвращают true или false. Оператор if работает как тернарный оператор ?: в С. Далее несколько примером с операторами языка и результат. Примеры взяты <a href="https://github.com/google/jsonnet/tree/master/examples">со страницы проекта</a>.</p><pre class="crayon-plain-tag">// bar_menu.3.jsonnet
{
    foo: 3,     
    bar: 2 * self.foo,  // Multiplication.
    baz: "The value " + self.bar + " is "
         + (if self.bar &gt; 5 then "large" else "small") + ".",
    array: [1, 2, 3] + [4],
    obj: {a: 1, b: 2} + {b: 3, c: 4},
    equality: 1 == "1",
}</pre><p>Результат:</p><pre class="crayon-plain-tag">{
   "foo": 3,
   "bar": 6,
   "baz": "The value 6 is large.",
   "array": [1, 2, 3, 4],
   "obj": {a: 1, b: 3, c: 4},
   "equality": false
}</pre><p><strong> </strong><span id="more-2079"></span></p>
<p><strong>Создание массивов и объектов</strong>. Для создания массивов и объектов используется конструкция с оператором for, как показано в примере ниже:</p><pre class="crayon-plain-tag">{
    foo: [1, 2, 3],
    bar: [x * x for x in self.foo if x &gt;= 2],
    baz: { ["field" + x]: x for x in self.foo },
    obj: { ["foo" + "bar"]: 3 },
}</pre><p>Результат:</p><pre class="crayon-plain-tag">{
   "foo": [ 1, 2, 3 ],
   "bar": [ 4, 9 ],
   "baz": {
      "field1": 1,
      "field2": 2,
      "field3": 3
   },
   "obj": { "foobar": 3 }
}</pre><p><strong>Модульность</strong>. Код написанный на Jsonnet может быть разбит на несколько файлов и затем объединятся с помощью оператора import. Внутренняя механика заключается в простом склеивании файлов.</p>
<p><strong>Функции</strong>. Jsonnet значения могут содержать функции. Они помечаются как скрытые поля и не транслируются в JSON. Пример такой функции представлен ниже:</p><pre class="crayon-plain-tag">// bar_menu_utils.jsonnet
{
    equal_parts(size, ingredients)::
        if std.length(ingredients) == 0 then
            error "No ingredients specified."
        else [
            { kind: i, qty: size/std.length(ingredients) }
            for i in ingredients
        ],
    id:: function(x) x,
}</pre><p>Jsonnet также включает в себя локальные переменные, способ для наследования объектов путём импортирования, вычисляемые и опциональные поля.</p>
<p>Движок языка написан на С++11 с предоставлением обёртки API в стиле С для более лёгкого портирования на другие языки. Команда разработчиков сразу может предоставить библиотеки для С и Питона. Реализация для С++ может быть скомпилирована в JS с Emscripten. Еще доступен <a href="https://github.com/yosuke-furukawa/node-jsonnet">неофициальный пакет</a> для nodejs.</p>
<p>Полные спецификации можно посмотреть на странице <a href="http://google.github.io/jsonnet/doc/spec.html">спецификации</a>.</p>
<h1>Некоторое сравнение с другими языками</h1>
<p><strong>JSON</strong>. Собственно, JSON описывает все данные буквально. Jsonnet имеет более свободный синтаксис и комментарии, для облегчения чтения данных людьми.</p>
<p><strong>YAML</strong>. Так же является некоторым расширением JSON, который позволяет генерировать правильный JSON. Синтаксис языка очень компактный и файлы на YAML гораздо, короче чем они потом выходят в JSON формате. Несмотря на то, что язык создан в тех же целях, что и Jsonnet, создание, трансляция и уточнение данных проигрывает Jsonnet. В частности, YAML и Jsonnet имеют различные точки зрения на то, что должно означать «1+1». YAML говорит, что это строка «1+1», тогда как Jsonnet считает, что результат должен быть 2.</p>
<p><strong>Другие языки с шаблонами. </strong>Jsonnet является шаблонным языком, который генерирует данные по алгоритмам с перемеживанием буквальных данных с вычислительными конструкциями. Большинство таких языков считают программы и результат простым текстом. Это значит, что на выходе может получится некорректный результат, если мы говорим о JSON. Большинство таких шаблонных языков не обладают знаниями о синтаксисе выходных данных и не могут проверять результат на правильность. Jsonnet такого недостатка лишён, так как это узкоспециализированный инструмент.</p>
<p><a href="http://google.github.io/jsonnet/doc/comparisons.html">Сравнение</a> с другими инструментами и языками, такими как Haskel, Nix, Coil, Pystachio и другими можно в деталях прочитать в руководстве к Jsonnet.</p>
<h1>Вопросы и ответы</h1>
<p>В оригинальном топике появились интересные вопросы и ответы от ведущего разработчика проекта Дэвида Каннингэма (David Cunningham).</p>
<p><strong>Вопрос</strong>: <em>Почему бы не воспользоваться уже существующим открытым стандартом </em><em><a href="https://github.com/edn-format/edn">EDN</a></em><em>? На мой взгляд в нем есть все те же самые фичи и уже есть порты под разные языки.</em></p>
<p><strong>Ответ</strong>: Хороший вопрос, но EDN не очень-то похож на Jsonnet. EDN – это «только данные», он не знает ничего о вычислениях или абстракциях. Он расширяем, и вы можете добавить недостающие конструкции, но тогда вы получите по факту новый язык, который будет непонятен другим системам.</p>
<p>Когда мы создавали Jsonnet, мы думали о том, что нам надо следовать общим стандартам. Мы выбрали JSON из-за его популярности, но мы так же пытались следовать существующим моделям программирования (главным образом js и python) так близко, как только возможно.</p>
<p>Хочу также заметить, что можно интегрировать Jsonnet в системы, которые работают с EDN, потому что возможно генерировать EDN с помощью нашей системы. Необходимо только написать специальную функцию «manifest». Такая работа проделана для INI файлов, конфигурационных файлов Lua и Python.</p>
<p>Наконец, Jsonnet доступна для 3х языков (С, Python, Javascript) и для любого языка, который может работать с С интерфейсом. Порты на другие языки запланированы, возможно с помощью портирования на Haxe.</p>
<p><strong><em>Вопрос</em></strong><em>. Мне очень нравится проект, но разработчики должны были использовать стандартные JavaScript</em><em> функции, а не изобретать из в stdlib</em><em>. Базовые функции пропущены и добавление новых не простая задача, так что это своего рода ограничитель и я, к сожалению, вернулся на старый предпроцессор JSON.</em></p>
<p><strong>Ответ</strong>. Stdlib определённо самая слабая часть проекта и то, что должно быть переписано, улучшено, и задокументировано прежде чем мы выпустим версию 1.0. Мы очень ждём ваших отзывов, особенно с примерами из реальной жизни.</p>
<p>В целом есть возможность расширить stdlib самостоятельно и написать свою собственную библиотеку для Jsonnet. Пример ниже сначала использует маленький трюк для добавления метода add2 в stdlib:</p><pre class="crayon-plain-tag">local std2 = std { // Temporarily define std2 to avoid self-reference.
   add2(x):: x + 2,
};
local std = std2; // Bind std2 over std.

// Rest of Jsonnet file below:
{
   foo: std.add2(10), // Expands to 12.
}</pre><p>&nbsp;</p>
<p>В общем случае, может быть невозможно скопировать функции из поддерживаемых языков, так как семантика может не иметь смысла в Jsonnet. Однако мы понимаем, что иметь необоснованные различия никому не поможет. И это является основной причиной, почему stdlib функции отвечающие за форматирование текста в точности совпадают с оператором % в Python.</p>
<p>&nbsp;</p>
<p>На основе материалов:</p>
<ul>
<li><a href="http://www.infoq.com/news/2015/04/jsonnet">http://www.infoq.com/news/2015/04/jsonnet</a></li>
<li><a href="http://google.github.io/jsonnet/doc/">http://google.github.io/jsonnet/doc/</a></li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/04/23/jsonnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Характеристики микросервисов, приложений и систем</title>
		<link>http://softblog.violet-tape.ru/2015/04/22/ms_scs_app_charachteristics/</link>
				<comments>http://softblog.violet-tape.ru/2015/04/22/ms_scs_app_charachteristics/#respond</comments>
				<pubDate>Wed, 22 Apr 2015 10:29:56 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2075</guid>
				<description><![CDATA[Всем привет! Сегодня хочу представить интересную презентацию Стефана Тилькова, со основателя и главного консультанта в innoQ. Стефан рассказывает об идее разделения больших систем на небольшие приложения, которые отвечают за разные аспекты системы. Сама идея не нова, но автор упирает на то, что основной причиной такого разделения должна быть изоляция. Благодаря границам приложений полученных таким образом, сложнее ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/04/22/ms_scs_app_charachteristics/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p>Всем привет!</p>
<p><iframe width="706" height="429" src="https://www.youtube.com/embed/HYiLzji7MuY" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Сегодня хочу представить интересную презентацию <a href="https://www.innoq.com/en/staff/st/">Стефана Тилькова</a>, со основателя и главного консультанта в <a href="https://www.innoq.com/">innoQ</a>. Стефан рассказывает об идее разделения больших систем на небольшие приложения, которые отвечают за разные аспекты системы. Сама идея не нова, но автор упирает на то, что основной причиной такого разделения должна быть <strong>изоляция</strong>. Благодаря границам приложений полученных таким образом, сложнее получить связанные модули, которые на самом деле должны быть независимыми. Тут еще можно вспомнить подход «domains boundary», для разделения доменных сущностей по областям применения, вместо того, чтобы создавать единую модель данных на всю большую организацию/процесс.</p>
<p>Дополнительным плюсом <strong>изоляции</strong> является возможность точечно масштабировать части системы в зависимости от нагрузок. Этот процесс можно локализировать в одной команде, чтобы они соразмерно своим знаниями и инструментам выполняли задачу в границах изолированной подсистемы.</p>
<p>В презентации Стефан также рассказывает о том, что традиционные предположения о том, каким образом строить программные системы подвергаются сегодня тотальному пересмотру. Одно из таких предположений, что большая система должна иметь единое окружение, часто с однозначным соответствием между функциональными требованиями проекта и реализацией, что выливается в формулу «1 проект = 1 система». Хотя такое решение не всегда самое лучшее, оно получается очень жестким.</p>
<p>Рассматривая способ построения логических систем из малых частей, Тильков описывает три стиля:</p>
<ul>
<li>Микросервисы – маленькие программы, каждая из которых работает сама по себе. Используют простые механизмы для общения и строятся вокруг нужд бизнеса.</li>
<li>Приложения – небольшие, отдельные, исполняемые программы, использующие модель «<a href="http://en.wikipedia.org/wiki/Shared_nothing_architecture">share nothing</a>». Имеют много общего с микросервисами.</li>
<li>Самодостаточные системы – это крупные автономные программы, которые содержат и данные и логику. Контролируются одной командой. Не используют синхронные удаленные вызовы, могут предоставлять API.</li>
</ul>
<p>Сравнивая различные подходы к реализации и характеристики таких систем, автор подчеркивает, что до сих пор нет единого мнения насчет того, как же делать правильно и эффективно. Однако Стефан хочет показать широту доступных возможностей.</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/Screenshot.png"><img class=" size-full wp-image-2076 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/Screenshot.png" alt="Screenshot" width="729" height="399" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/Screenshot.png 729w, http://softblog.violet-tape.ru/wp-content/uploads/2015/04/Screenshot-300x164.png 300w" sizes="(max-width: 729px) 100vw, 729px" /></a></p>
<p>Наиболее интересным параметром для Тилькова является количество модулей в системе, потому что это показывает <strong>степень декомпозиции</strong> большой системы.  Большие системы в этом плане проигрывают, но микросервисы сложнее в поддержке и оркестровке, тем самым увеличивая уровень сложности системы. В общем, нет какого-то одного правильного решения, «серебряной пули» и мы на конференции <strong>API &amp; Backend </strong>хотели бы поднять дискуссию на эту тему. Если у вас есть интересные случаи из практики касающиеся типичных проблем для той или иной модели, пути решения этих проблем – <a href="http://goo.gl/forms/EW8h028Ssc" target="_blank">мы ждем ваших историй</a>.</p>
<p>&nbsp;</p>
<p>Hard&#8217;n&#8217;Heavy!</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/04/22/ms_scs_app_charachteristics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Управление API и SOA</title>
		<link>http://softblog.violet-tape.ru/2015/04/20/api_soa_governance/</link>
				<comments>http://softblog.violet-tape.ru/2015/04/20/api_soa_governance/#respond</comments>
				<pubDate>Mon, 20 Apr 2015 08:32:32 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Процесс]]></category>
		<category><![CDATA[ALM]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Government]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Управление]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2068</guid>
				<description><![CDATA[Для Сервис-ориентированной Архитектуры (Service Oriented Architecture, SOA) достижение начального успеха определяется: созданием слабосвязанных соединений «потребитель-поставщик», соблюдение принципа разделения ответственностей между потребителем и поставщиком, публикация набора повторно используемых, общих сервисов и обеспечение того, чтобы потребители приняли и стали использовать сервис. Множество команд разработчиков разрабатывают и используют сервисы, но до сих пор идет мучительный подбор архитектуры, при ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/04/20/api_soa_governance/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p><img class=" alignnone" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/SX3242FX_P0812_Top_XL_enl.png" alt="" width="568" height="262" /></p>
<p>Для Сервис-ориентированной Архитектуры (Service Oriented Architecture, SOA) достижение начального успеха определяется:</p>
<ul>
<li>созданием слабосвязанных соединений «потребитель-поставщик»,</li>
<li>соблюдение принципа разделения ответственностей между потребителем и поставщиком,</li>
<li>публикация набора повторно используемых, общих сервисов</li>
<li>и обеспечение того, чтобы потребители приняли и стали использовать сервис.</li>
</ul>
<p>Множество команд разработчиков разрабатывают и используют сервисы, но до сих пор идет мучительный подбор архитектуры, при которой сервисы будут широко использованы, с потенциалом для повторного использования внутренними командами разработки. Вместо создания согласованной сервисной архитектуры и демонстрации множественного использования одних и тех же сервисов, разработчики вновь и вновь не нарочно создают «Просто Набор Веб Сервисов» (Just a Bunch of Web Services (JBOWS)) или «Просто Набор REST Сервисов» (Just a Bunch of REST Services (JBORS)).</p>
<p>Простое приложение чаще всего работает с неким сервисом и спагетти-сетью конечных точек, поставщиков данных этого сервиса, которые переплетены связями один-к-одному. Многие команды в этом случае сходятся во мнении что фокус на SOA и REST не то чтобы помогал в решении вопросов гибкости решений. Скорее просто происходит подмена набора IT инструментов, форматов сообщений и протоколов.</p>
<p><strong>Управление</strong> SOA, API, и приложением может стать мостом между этими концепциями и улучшить архитектурную согласованность всего решения.</p>
<h1>Сервисы, API и архитектура</h1>
<p>Когда вы будете решать, что использовать как лучшие практики для сервис-ориентированной архитектуры, определять дизайн RESTful сервисов, когда будете формировать план по управлению ими, четко определите, как ваши сервисы и API вместе будут укладываться в общую архитектурную картину.</p>
<p><span id="more-2068"></span></p>
<p>Внешне, набор RESTful API просто специализированные версии веб-сервисов и предоставляют схожие технические возможности. Дизайн и REST API, и SOA сервисов предполагает раскрытие атомарной функциональности с помощью четко определенных интерфейсов. Публичный контракт (API) оконечной точки и сервисная оконечная точка служат базовыми единицами для построения ядра систем, и разработчики представляют свои решения путем управления доступа, агрегации, композиции и оркестровки взаимодействия оконечных точек. Успешное и расширяемое решение как для API, так и для SOA требует решить вопросы касающиеся:</p>
<ul>
<li>инфраструктуры доставки сообщений через интернет/интранет,</li>
<li>управления на уровне сервисов,</li>
<li>безопасности, во всех смыслах этого термина.</li>
</ul>
<p>SOA и API имеют общие проблемы интеграции, расположения оконечных точек, определения модели сообщений, безопасности и качества сервиса. <strong>Управляемые API это «SOA реализованные как надо». </strong></p>
<p>Управляемые API это:</p>
<ul>
<li>Имеющие активную модель оповещений и дающие возможность подписки.</li>
<li>Поставляющиеся с соглашением о доступности (service-level agreement (SLA)).</li>
<li>Надежные, с авторизацией и аутентификацией, защищенные.</li>
<li>С возможностью мониторинга и монетизацией аналитики.</li>
</ul>
<p>Большинство оконечных точек сервисов развернуто на платформах, которые не предоставляют возможностей по управлению, хотя сервисы должны демонстрировать характеристики управляемого API. Использование шаблона «Фасад» для API позволяет разработчикам создать слой по управлению адресами оконечных точек, мониторингу использования, обеспечивать соблюдение квот по использованию, ограничивать трафик, и авторизовать потребителей.</p>
<p>Объединение управления для SOA и API может позволить командам продуктивно использовать плюсы как SOA сервисов (повторное использование и эволюционная реализация), так и API (расширенная область действия и расцепленные интерфейсы)</p>
<h1>SOA управление</h1>
<p>Во многих организация реализация SOA выливается в точечную интеграцию сервисов, а не в построение реальной архитектуры. Примерно, как на картинке ниже, все связано со всем.</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/soa_api_governance_01.png"><img class=" size-full wp-image-2069 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/soa_api_governance_01.png" alt="soa_api_governance_01" width="476" height="351" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/soa_api_governance_01.png 476w, http://softblog.violet-tape.ru/wp-content/uploads/2015/04/soa_api_governance_01-300x221.png 300w" sizes="(max-width: 476px) 100vw, 476px" /></a></p>
<p>Для достижения желаемого состояния архитектуры, разработчики должны модифицировать существующие программы по управлению сервисами, для смягчения факторов риска и поддержки принципов SOA. Откладывание решения по централизованному управлению сервисами часто приводит к тому, что сервисы получаются узкоспециализированными, без возможности повторного использования, быстрое распространение множества реализаций бизнес домена (и это будет не следование принципу bounded domain context), что в конечном счете приводит к удорожанию поддержки всего решения.</p>
<p><strong>Эффективные программы по управлению SOA контролируют разработку и функционирование сервис-ориентированных систем. </strong>Команды, реализующие управление SOA решений, используют предписания, процессы, измерения и организационные инициативы следующего рода:</p>
<ul>
<li><strong>Предписания</strong> определяют «как делать правильные вещи правильно». Они описывают законы, рекомендации, корпоративные правила и лучшие практики.</li>
<li><strong>Процессы</strong> – это действия, которые дают возможность проверить проект или артефакт на соответствие предписаниями, и вынести решение о том дать «зеленый свет» или же «забраковать». Некоторые процессы могут быть автоматизированы и выполнятся автоматически, другие требуют внимания и времени команды.</li>
<li><strong>Измерения </strong>помогают определить действенность программы управления, а также требуются для понимания насколько процессы соответствуют предписаниям.</li>
<li>Организация должна поощрять культуру, которая поддерживает и вознаграждает практики управления.</li>
</ul>
<p><strong>Программа управление SOA системами должна предоставлять руководства по всему жизненному циклу решения, включая: создание, тестирование, поддержка, удаление, управление и версионирование. </strong></p>
<p>Инфраструктура по управлению SOA компонентов должна предоставлять инструменты и сервисы для поддержки программы управления. Они должны предоставлять механизмы по управлению и поддержки предписаний. Механизмы для внедрения чек-поинтов в различные фазы разработки ПО и возможности проверки, что сервисы, API и прочие проекты соответствуют предписаниям. Поддерживают автоматические и ручные этапы приемки, обработки исключительных ситуаций.</p>
<p>Некоторые политики управления SOA содержат рекомендации по управлению во время разработки и во время операционной деятельности. Реестр сервисов может помочь в управлении компонентов, находящихся как в разработке, так и в активном использовании.</p>
<h1>Портфолио сервисов это «А» в SOA</h1>
<p>Ключевой целью любой SOA системы является составление и поддержка портфолио сервисов, которое представляет ясную и чистую архитектуру. Начать построение такого каталога сервисов можно основываясь на технологическом и бизнес доменах организации. Проработка взаимодействия сервисов и интерфейсов является лишь малой частью всех действий, которые должны быть выполнены для того, чтобы построить высокоэффективную систему по доставке, взаимодействию и поддержке доверия вашему набору сервисов.</p>
<p>Запуск таких дополнительных проектов, как оптимизация приложения, выявление скрытых бизнес-процессов или построение информационной архитектуры бизнеса – отличный механизм понимания динамики данных, декомпозиции бизнес-домена, определения какие из программ и сервисов должны поддерживать бизнес-процессы.</p>
<h1>Управление API</h1>
<p>Очевидно, что на управление публичными контрактами значительное влияние оказывают цели и задачи бизнеса. Ведущие платформы по управлению API предоставляют возможность ведения аналитики и оценки ценности для бизнеса. Платформа должна обеспечивать сбор информации о подписке, использовании, предоставлять метрики эффективности, а также иметь интеграцию с биллинговыми и платежными системами.</p>
<p>Управление API включает в себя управление подписками и продвижение мета-данных API. К последнему пункту относится оптимизация использования тэгов для составления категорий API и поддержка документации для разработчиков. Процесс управления должен обеспечивать прохождения чек-поинтов во время дизайна API и до того, как оно будет опубликовано.</p>
<p>Экономика API должна включать в себя замеры по полноте использования и нагрузке. Управление API в этом смысле включает в себя отслеживание API по использованию (по версии, по типу API) и нагрузке (по версии, по типу API), а также другие замеры и предписания. Через понимание использования и нагрузке на API – владельцы бизнеса и архитекторы API могут осознанно инвестировать в развитие, расширение инфраструктуры, оптимизировать структуру и полноту сервисов.</p>
<h1>Лучшие практики по управлению</h1>
<p>Для эффективного и продуктивного предоставления IT решений, команда разработчиков должна синхронизировать действия по управлению API и сервисов. Управление API включает в себя очевидный набор стадий развития (создание, публикация, сокращение, завершение поддержки, блокировка), каждый шаг которых может быть переопределен. Журналирование управления облегчает управление метаданными сервиса, дизайн, разработку, тестирование и оперативное вмешательство. Скриншот ниже показывает пересечение между двумя процессами управления:</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/soa_api_governance_02.png"><img class=" size-full wp-image-2070 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/soa_api_governance_02.png" alt="soa_api_governance_02" width="594" height="327" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/soa_api_governance_02.png 594w, http://softblog.violet-tape.ru/wp-content/uploads/2015/04/soa_api_governance_02-300x165.png 300w" sizes="(max-width: 594px) 100vw, 594px" /></a></p>
<h2>Обобщенное описание требований</h2>
<p>Документация и описание взаимодействия публичных контрактов или сервисов значительно влияет на то, насколько широко будут использованы возможности по потреблению, агрегированию, оркестровке или композиции API и сервисов через границы доменов организации. Сторонники API отказываются от тяжеловесных, формальных интерфейсов взаимодействия в сторону понятной для человека документации.</p>
<p>Лучшие практики REST начинают оказывать влияние на дизайн и описание систем. При создании RESTful API и SOA сервисов, следует обращать внимание на следующие моменты:</p>
<ul>
<li>Не раскрывать оконечные точки, которые предоставляют хрупкие модели данных и диктуют сложный шаблона взаимодействия.</li>
<li>Качественно описать как контекст сессии и ее состояние влияют друг на друга.</li>
<li>Качественно задокументировать модель сообщений.</li>
<li>Описать пределы использования и вопросы безопасности (например, протоколы авторизации, как аутентифицировать пользователя).</li>
<li>Скрыть детали реализации из внешних интерфейсов.</li>
</ul>
<h2>Документация по API и метаданных сервисов</h2>
<p>Работающие SOA и API должны включать определение метаданных и предписания, которые помогают в идентификации, классификации и описании потенциальных потребителей. Метаданные должны помогать в формировании данных о сервисе или API. Предписания используются для того, чтобы можно было сопоставить метаданные с опубликованными сервисами и оконечными точками. Метаданные могут отвечать на следующие вопросы:</p>
<ul>
<li>Общее представление (например, имя, описание)</li>
<li>Атрибуты жизненного цикла (версия, зависимости от версий других сервисов, статус разработки/поддержки)</li>
<li>Классификация (базовый сервис, составной, инфраструктурный, бизнес)</li>
<li>Атрибуты оконечной точки (протокол, адрес, WS-* спецификации)</li>
<li>Модель данных (схема JSON, RAML, XML, WSDL, версия, семантика, проверки)</li>
<li>Требования и предписания на уровне сервиса (доступность, отзывчивость, безопасность, пропускная способность, емкость)</li>
<li>Диспетчеризация (перенаправление, очередность, кэширование, трансформации)</li>
<li>Зависимости (API, сервисы, базы данных, расположение, фреймворки)</li>
<li>Физические зависимости (платформа для приложения, безопасность, управление)</li>
<li>Модель бизнес-процессов (UML диаграммы, бизнес классификации)</li>
<li>Информация о взаимодействии (потребители, поставщики, утилизация)</li>
<li>Статистика используемости (количество пользователей, доступность, пропускная способность, пики по времени)</li>
<li>Бухгалтерия и методы стимуляции (плата за показы, подписка, размеры возвратов)</li>
</ul>
<p>Метаданные позволяют задать формальное описание оконечной точке, обеспечить доступность/обнаруживаемость и повторное использование другими командами. Многие организации не используют все перечисленные опции, просто упрощают логику сервисов. Они работают над тем, чтобы создать единый сервис или API, которые позволят выполнить критические сценарии бизнеса, пересматривают систематизацию метаданных, и увеличивают возможности по повторному использованию для внутренних команд разработки.</p>
<h2>Баланс в управлении</h2>
<p>Для достижения продуктивного баланса между мягким направлением действий и тотальным контролем необходимо принимать во внимание всевозможные препятствия и культуру разработки внутри группы разработчиков. Действия, сопряженные с реализацией SOA/API, часто могут тормозить из-за:</p>
<ul>
<li>Недостаточного образования, знаний, и поддержки со стороны знающих людей</li>
<li>Недоверие или недостаток общения внутри организации</li>
<li>Противоречивые стимулы</li>
<li>Плохой дизайн самих по себе SOA/API</li>
<li>Недостаток метрик</li>
<li>Недостаток управления</li>
</ul>
<p>Руководство является необходимым, но, если процессы управления являются обременительными, они будут вызывать недовольство и сопротивление. Процессы должны выглядеть натурально или автоматизированы при любом удобном случае. Например, соответствие каким-то правилам может проверяться автоматически при чекине или во время регистрации сервиса в системе. Ищите инструменты, которые могут органично встроится в рабочий процесс разработчиков, чтобы они могли легко и просто получать информацию от системы, что какая-то часть результата их работы не соответствует предписаниям и необходимо исправление. Системы управления контрактами (Contract management systems) могут иметь неоценимое значение в управлении потребления ресурсов, запросов на улучшение сервиса, в процессе управления жизненным циклом разработки, и версионировании API.</p>
<h1>Дальнейшие шаги по организации управления API</h1>
<p>Успешные большие и малые SOA решения, API-ориентированные решения масштаба предприятия – основываются на широком повторном использовании сервисов и информации во всех областях бизнеса, сквозь все домены и группы разработчиков. Успешное управление включает в себя:</p>
<ul>
<li>Организация централизованного ревью дизайна системы</li>
<li>Усилить контроль за информационными моделями и способами их реализации</li>
<li>Реализация контроля за соблюдением предписаний</li>
<li>Создание общего соглашения об использовании сервисов</li>
<li>Инвентаризация возможностей приложений и интеграционных возможностей</li>
<li>Реализовать процесс пересмотра управления API для своевременного отражения изменений в каталоге возможностей ПО и сервисов.</li>
<li>Расширить управление жизненным циклом ПО для сохранения сервис-ориентированности.</li>
</ul>
<p>источник http://www.infoq.com/articles/converging-api-soa-governance</p>
<hr />
<p><i>Данным постом, я хочу привлечь внимание к использованию и проектированию API в ваших продуктах. В этой статье рассказывается о том, что SOA это не просто набор сервисов, это нечто большее, точно так же можно спроецировать эту мысль и на другие области разработки: создание настольных приложений, фреймворков, библиотек и так далее. От удобности и непротиворечивости API в некотором роде зависит успех вашего предприятия. </i></p>
<p><em>Так как на мой взгляд эта тема очень актуальная и будет все более актуальна, мы в GoSharp решили организовать конференцию на эту тему и <strong><a href="http://goo.gl/forms/EW8h028Ssc">ждем заявок</a> </strong>от тех, кому есть что сказать по теме проектирования, развития и поддержке API. </em></p>
<p>&nbsp;</p>
<p>Hard&#8217;n&#8217;Heavy</p>
<p>&nbsp;</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/04/20/api_soa_governance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>WPF 4.6 и дальнейшие планы</title>
		<link>http://softblog.violet-tape.ru/2015/04/15/wpf_4_6_and_beyond/</link>
				<comments>http://softblog.violet-tape.ru/2015/04/15/wpf_4_6_and_beyond/#comments</comments>
				<pubDate>Wed, 15 Apr 2015 10:49:33 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Общее]]></category>
		<category><![CDATA[dotnetConf]]></category>
		<category><![CDATA[New Features]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2064</guid>
				<description><![CDATA[На недавно прошедшей онлайн конференции dotNetConf организованной Microsoft, рассказывалось множество интересных вещей. И коль скоро было большое количество обсуждений по поводу WPF, что он живее всех живых, то хочется сделать краткий обзор доклада программных менеджеров WPF, что нового нас ждет в релизе, что уже можно посмотреть и к чему все идет. Действительно все так плохо ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/04/15/wpf_4_6_and_beyond/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p>На недавно прошедшей онлайн конференции <a href="http://channel9.msdn.com/Events/dotnetConf/2015">dotNetConf</a> организованной Microsoft, рассказывалось множество интересных вещей. И коль скоро было большое количество обсуждений по поводу WPF, что он <a href="http://habrahabr.ru/company/geekfamily/blog/253341/">живее всех живых</a>, то хочется сделать краткий обзор доклада программных менеджеров WPF, что нового нас ждет в релизе, что уже можно посмотреть и к чему все идет. Действительно все так плохо и будет ли аналог нового движка для WPF, как например Razor для ASP.NET.</p>
<p>12 ноября 2014 года <a href="http://blogs.msdn.com/b/wpf/">блог WPF</a> ожил (сейчас активен тоже) и был представлен генеральный план развития фреймворка.</p>
<p><img src="//habrastorage.org/files/7ea/6cb/fe8/7ea6cbfe8bf1458aa8d4c0e1aafb35e8.png" alt="" /><br />
<em>Здесь и далее, скриншоты с видео, так что качество не очень, но разглядеть все можно.</em></p>
<p>В начале <a href="http://channel9.msdn.com/Events/dotnetConf/2015/WPF-in-46-and-beyond">выступления</a>, ведущие Уни Равиндранатан (Unni Ravindranathan) и Харикришна Менон (Harikrishna Menon) обмолвились, что есть вещи, которые еще находятся в разработке, и они не имеют права о них рассказывать, NDA и все такое. Но то что они могут показать, внушает оптимизм и видно, что работа идет. Забегая вперед, скажу, что прежде всего разработчики подумали о быстродействии, например, как сократить визуальное дерево для конкретной целевой платформы.</p>
<p><span id="more-2064"></span></p>
<p>Ключевые области разработки показаны на скриншоте ниже:<br />
<img src="//habrastorage.org/files/6d9/314/364/6d931436420647619ca18fd4be86ba47.png" alt="" /></p>
<ul>
<li>Производительность, быстродействие при скроллинге, виртуализации данных. Поддержка экранов с высокой плотностью пикселей. Многие справедливо критикуют WPF за скорость работы, особенно при скроллинге.</li>
<li>Поддержка для DX11 и DX12</li>
<li>Поддержка современного оборудования. Отзывчивость и реакция на тач-события.</li>
<li>Инструментарий для разработки и дебага приложений.</li>
</ul>
<p><img src="//habrastorage.org/files/ccb/d2b/de6/ccbd2bde6a8142b3a9bec66feea003db.png" alt="" /></p>
<p>Разработчики уверяют, что WPF никуда не денется и вопреки бытующих слухам, что WPF выпиливается из операционной системы – это не правда. DotNet часть ОС, и WPF часть ОС и ему будет уделяться не меньшее количество внимания, чем другим составляющим. В Microsoft уверены в том, что приложения для ОС будут еще долго писаться на WPF.</p>
<h2>Ближайшие планы по улучшению WPF</h2>
<p>На портале Connect были пересмотрены и переоткрыты все баги, которые имели больше 10 голосов. И сейчас все еще есть возможность повлиять на то, какие фичи\баги будут разрабатываться.</p>
<p>В ближайшем релизе WPF будут решены проблемы, касающиеся вопросов:</p>
<ul>
<li>производительности и тач-девайсов</li>
<li>скроллинг и виртуализация</li>
<li>так же сделали возможность создавать прозрачные дочерние окна.</li>
</ul>
<p>Как было раньше туго с прозрачностью. Обходные пути видимо были, но сложные.</p>
<p><img src="//habrastorage.org/files/ab8/399/6e2/ab83996e2c5b4957a5922dc05d581a99.png" alt="" /></p>
<p>Для использования прозрачных дочерних окон вам требуется Windows 8 и выше, а также .NET 4.5.2.</p>
<p><img src="//habrastorage.org/files/6ce/800/ecd/6ce800ecd6044a7fb83818501c3173f4.png" alt="" /></p>
<p><img src="//habrastorage.org/files/145/39d/51e/14539d51eb00496faf1330e9ee7f14b0.png" alt="" /></p>
<p>Ну и еще одна деталь, в <strong>app</strong><strong>.manifest</strong> надо указать что эта фича поддерживается ОС. Т.е. в разделе application написать следующее:</p>
<p>&lt;application&gt;<br />
&lt;!&#8212; Windows 8&#8212;&gt;<br />
&lt;supportedOS Id=&#187;{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}&#187;/&gt;<br />
&lt;/application&gt;</p>
<p><img src="//habrastorage.org/files/957/95c/1ef/95795c1ef88a4db5a0cced7170c8b3ac.png" alt="" /></p>
<p>Другим популярным вопросом является что делать с курсорами при увеличении масштаба на экране. Курсор становится тоже большим. Приходилось вручную определять, что увеличился масштаб и перегружать курсоры на нужный размер. Чтобы все было красиво и аккуратно. Теперь можно указать в конструкторе курсора, что делать, если меняется масштаб отображения.</p>
<p><img src="//habrastorage.org/files/572/1d4/854/5721d48540ad4abda6d2b4dbd209a72d.png" alt="" /></p>
<p>Еще одним адом перфекциониста было то, что для выпадающего списка правая граница была обрезана, и он выглядел от этого куце при изменении масштаба. В новой версии это исправили.</p>
<p><img src="//habrastorage.org/files/388/c58/c24/388c58c242684f19809e4a885c14b640.png" alt="" /></p>
<p>Вообще эта проблема присутствует для всех компонентов при увеличенном масштабе отображения. Причина заключается в неправильном отображении фона для компонентов.</p>
<p>Описанные проблемы относятся к существующему коду, однако всех больше интересует, что же будет дальше, какие новые штуки ждать от WPF.</p>
<p><img src="//habrastorage.org/files/4e5/904/9a3/4e59049a341441ca8e2caa085248f553.png" alt="" /></p>
<p>Команда WPF хочет уменьшить цикл доставки обновлений и сократить насколько это возможно. Чтобы обновления выходили не раз в полгода, когда возможно вам уже ничего этого не надо, а по мере реализации запросов и найденных багов.</p>
<p>Кроме этого очень много внимания уделяется обратной совместимости. Так как WPF системная вещь, то поддержка DX12 или построение части компонентов на основе DX12 может повлиять на некоторое количество уже выпущенных программ. Мы не можем кинуть их на произвол судьбы и обязаны найти какое-то решение, для обеспечения обратной совместимости. Это конечно большая проблема. Если касаться вопросов быстродействия, то изменения должны почувствовать максимальное количество пользователей.</p>
<h2>AppLocal</h2>
<p>Абсолютно новая вещь, которая до момента конференции не упоминалась нигде – это AppLocal. Наверно это самое большое изменение сейчас. <strong>Оно заключается в том, что </strong><strong>WPF</strong><strong> как платформа может быть доставлена с помощью пакета NuGet</strong><strong> нужной версии</strong>. Т.е. каждая версия приложения поставляется со своей уникальной версией WPF. Разработчики гарантируют, что вы получите лучшее или такое же быстродействие по сравнению со встроенной версией. Чаще все же будет улучшение производительности.</p>
<p>Такая версия WPF будет совместима со встроенной, но в то же время, можно построить версии WPF поверх NetCore.</p>
<p><img src="//habrastorage.org/files/61c/ddf/1a9/61cddf1a9d1f4ff095f83e3e8c5e8e4e.png" alt="" /></p>
<p>В качестве демонстрации работы новой версии WPF приводится демо с таким вот оформлением.</p>
<p><img src="//habrastorage.org/files/483/f97/fd9/483f97fd9dc44a42a2644dd0c3b0d73e.png" alt="" /></p>
<p>Для начала приложение загружается со сборками 4.5.2. Видно, что ссылки идут на старую версию при разработке и будет обращение к GAC в runtime.</p>
<p><img src="//habrastorage.org/files/788/761/762/78876176203b484db5a66f346f6c9bae.png" alt="" /></p>
<p>Теперь будет происходить магия. В выпадающем меню для сборок, выбирается пункт «Добавить NuGet пакетов» и можно установить желаемую локальную сборку WPF. К сожалению, это пока что доступно только для разработчиков WPF, на скриншоте ниже видно, что используется локальный репозиторий.</p>
<p><img src="//habrastorage.org/files/094/4c2/7f0/0944c27f05a3448d930aee743e1c726d.png" alt="" /></p>
<p>Во время установки заменяются ссылки с GAC сборок на локальные и в списке Referencies появляется достаточно много новых сборок, которые нужны именно вашему приложению для определенной платформы.</p>
<p><img src="//habrastorage.org/files/10f/f8c/73a/10ff8c73a6a545858c63c77feebf71ae.png" alt="" /></p>
<p>Так как это еще не готовое решение, то надо сделать немного шаманства с конфигурационными файлами и тогда все заработает.</p>
<p><img src="//habrastorage.org/files/e1d/b3d/4b8/e1db3d4b8dca4419928568722a410e2e.png" alt="" /></p>
<p>После этого можно сделать сравнение с версией 4.5.2, на сколько сильно/слабо будет сокращено дерево элементов для графической интерфейса приложения. Итак, для достаточно простого интерфейса на версии .net 4.5.2 был создан 281 элемент.</p>
<p><img src="//habrastorage.org/files/e3f/5e5/572/e3f5e55722c2457ba1e46ad6d46da99b.png" alt="" /></p>
<p>После применения NuGet пакета с локальной версией WPF получилось 230.</p>
<p><img src="//habrastorage.org/files/b44/b38/5d4/b44b385d4bc247e2ad4f200749ed668b.png" alt="" /></p>
<h2>Улучшение быстродействия</h2>
<p>Разработчики обещают отложенную инициализацию компонентов, так что они будут инициализированы только когда попадут в активную пользовательскую зону. Обещают, что подключать это можно будет одним движением, т.е. атрибутом.</p>
<p><img src="//habrastorage.org/files/7a8/c2d/3f5/7a8c2d3f532f45d1a4b9f2f7c0191f9d.png" alt="" /></p>
<p>Далее обзор Blend и снятия метрик быстродействия, которые уже отдельно освящались во многих местах, как мне кажется.</p>
<p>Вообще ведущие очень напирали на то, чтобы сообщество присылало им побольше всяких интересных кейсов использования WPF и в каких местах случаются затыки и проблемы. Так что пишите им письма =)</p>
<p><img src="//habrastorage.org/files/6ff/712/3d7/6ff7123d7d404ce09334f0c61c442fbd.png" alt="" /></p>
<p><img src="//habrastorage.org/files/191/2ed/dde/1912eddded964ae484e3939bb22ab6d9.png" alt="" width="220" height="200" align="left" />В этом контексте становится еще интереснее узнать, что же будет с WPF и Universal Application. Стоит ли мигрировать, сложно ли это и вообще в каких случаях стоит мигрировать, а в каких нет. Конечно, основные навыки по работе с WPF остаются востребованы и актуальны для Universal App, но отчего тогда столько шума? На эти вопросы ответит <strong>Костя Кичинский</strong>, эксперт по технологиям разработки программного обеспечения, Microsoft, на конференции <strong><a href="http://www.gosharp.ru/DESKTOP2015?utm_source=habrahabr&amp;utm_medium=article&amp;utm_content=wpffuture&amp;utm_campaign=habrahabr">Desktop UI &amp; Business Application</a></strong>, которая состоится 11 апреля.</p>
<p>Доклад освящает основные вопросы касающиеся Universal App и WPF:</p>
<ul>
<li>Развитие WPF и появление WinRT</li>
<li>Унификация Windows-платформы и UAP</li>
<li>Инвестиции в WPF</li>
<li>Как WPF стыкуется с UAP + матрица миграции (когда и как стоит мигрировать, а когда нет)</li>
</ul>
<p><a href="http://www.gosharp.ru/DESKTOP2015#registration?utm_source=habrahabr&amp;utm_medium=article&amp;utm_content=wpffuture&amp;utm_campaign=habrahabr"><b>Приходите</b></a>, будет интересно!</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/04/15/wpf_4_6_and_beyond/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
							</item>
		<item>
		<title>Façade and AOP</title>
		<link>http://softblog.violet-tape.ru/2015/04/15/facade_aop/</link>
				<comments>http://softblog.violet-tape.ru/2015/04/15/facade_aop/#respond</comments>
				<pubDate>Wed, 15 Apr 2015 09:44:57 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[PostSharp]]></category>
		<category><![CDATA[Архитектура]]></category>
		<category><![CDATA[Общее]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Facade]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2061</guid>
				<description><![CDATA[Давненько я не писал по теме шаблонов и аспектов. И этот пост будет для разогрева темы снова. До этого были рассмотрены шаблоны, которые в той или иной степени получают профит от использования Аспектно-Ориентированного программирования. Однако есть один, который не получит никакой пользы от АОП. Сама суть шаблона «Фасад» заключается в том, чтобы выделить отдельный интерфейс ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/04/15/facade_aop/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p>Давненько я не писал по теме шаблонов и аспектов. И этот пост будет для разогрева темы снова.</p>
<p>До этого были рассмотрены шаблоны, которые в той или иной степени получают профит от использования Аспектно-Ориентированного программирования. Однако есть один, который не получит никакой пользы от АОП. Сама суть шаблона «Фасад» заключается в том, чтобы выделить отдельный интерфейс для облегчения доступа к некоторой сложной подсистеме.</p>
<p><a href="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/facade_aop.jpg"><img class=" size-medium wp-image-2062 aligncenter" src="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/facade_aop-300x189.jpg" alt="facade_aop" width="300" height="189" srcset="http://softblog.violet-tape.ru/wp-content/uploads/2015/04/facade_aop-300x189.jpg 300w, http://softblog.violet-tape.ru/wp-content/uploads/2015/04/facade_aop.jpg 385w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Википедия дает следующее определение:</p>
<p><strong>Шаблон фасад</strong> (<a href="https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA">англ.</a> <em>Facade</em>) — <a href="https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F">структурный</a> <a href="https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F">шаблон проектирования</a>, позволяющий скрыть сложность системы путем сведения всех возможных внешних вызовов к одному <a href="https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)">объекту</a>, делегирующему их соответствующим объектам системы.</p>
<p>С помощью аспектов не выделить отдельный класс для такого функционала.</p>
<p>По сути, исследователи признали, что только «Фасад» никоим образом из классических 23 шаблонов не может быть хотя бы частично реализован с помощью АОП.</p>
<p>Вот такой короткий рассказ.</p>
<p>&nbsp;</p>
<p>Hard’n’Heavy!</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/04/15/facade_aop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Бэкенд и «золотые молотки»</title>
		<link>http://softblog.violet-tape.ru/2015/03/31/golen-hammers/</link>
				<comments>http://softblog.violet-tape.ru/2015/03/31/golen-hammers/#respond</comments>
				<pubDate>Tue, 31 Mar 2015 04:24:54 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[Общее]]></category>
		<category><![CDATA[Утилиты]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2057</guid>
				<description><![CDATA[Привет, коллеги! Мы анонсировали конференцию, посвященную Desktop UI &#38; Business Application. В поддержку, чтобы посмотреть на настроения публики, была опубликована статья «WPF живее всех живых», которая оказалась дискуссионной и заставила нас в несколько другом свете взглянуть, на то, что и как мы хотим донести до широкой публики. Как показали комментарии, не WPF единым живет десктоп ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/03/31/golen-hammers/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p>Привет, коллеги!</p>
<p>Мы анонсировали конференцию, посвященную <strong>Desktop UI &amp; Business Application. </strong>В поддержку, чтобы посмотреть на настроения публики, была опубликована статья «<a href="http://habrahabr.ru/company/geekfamily/blog/253341/">WPF живее всех живых</a>», которая оказалась дискуссионной и заставила нас в несколько другом свете взглянуть, на то, что и как мы хотим донести до широкой публики.</p>
<p>Как показали комментарии, не WPF единым живет десктоп разработка. Есть порты <a href="https://github.com/ddobrev/QtSharp">Qt для .NET</a>, есть <a href="http://en.wikipedia.org/wiki/Windows_Runtime">WinRT</a>, если в эпсилон окрестности от дефолт-сити есть спецы по этим технологиям, которые хотят высказаться – <a href="http://www.gosharp.ru/DESKTOP2015?utm_source=habrahabr&amp;amp;utm_medium=article&amp;amp;utm_content=GoldenHammer&amp;amp;utm_campaign=habrahabr"><b>у нас есть трибуна!</b></a> Для этого все и задумано, чтобы показать различные варианты для ваших проектов.</p>
<p><img src="//habrastorage.org/files/e20/549/b38/e20549b385b248758704e43fc9be52c8.png" alt="" /></p>
<p>Буквально вчера закончилась онлайн конференция <a href="http://channel9.msdn.com/Events/dotnetConf/2015">dotNetConf 2015</a>, которую, исходя из сообщений, Microsoft скорее возродила, нежели придумала заново. Конференция, судя по содержанию старается покрыть все основные области использования языка, это мультиплатформенность, веб, десктоп, доставка приложений, интеграция с Xamarin, будущее .NET, .NET Core, Roslyn Analyzer и другие темы. На мой взгляд, это генеральная репетиция перед конференцией <a href="http://www.buildwindows.com/">//build</a>, которая состоится в конце апреля-начале мая.</p>
<p><span id="more-2057"></span></p>
<h2>Про золотые молотки</h2>
<p>Кроме WPF для энтерпрайз разработчиков есть еще много тем, на которое можно поговорить, и львиная доля разговоров всегда упирается в <strong>бэкенд</strong>. Различных дизайн-шаблонов для корпоративных приложений очень много, и большая их часть посвящена бэкенду. Мартин Фаулер посвятил этому <a href="http://martinfowler.com/eaaCatalog/">книгу</a>, которая, насколько я смог увидеть за время тренингов, является настольной для многих разработчиков и тим-лидов. Из шаблонов, описанных там, вырастают конкретные инструменты, которые позволяют решать задачи наиболее эффективным способом.</p>
<p>И вот здесь часто заключается ловушка, которая зовется «Золотой молоток», которую Абрахам Маслоу сформулировал так: если из инструментов у вас есть только молоток, то любая проблема вам видится гвоздем.</p>
<p><img src="//habrastorage.org/files/e9d/31f/977/e9d31f97700c4eb98de217432c8c30aa.png" alt="" /></p>
<p>Это высказывание как нельзя лучше подходит ко многим областям разработки программного обеспечения. За примерами далеко ходить не надо. Как мне кажется, самая популярная тема относительно бэкенда: «Как лучше получить и записать данные в базу?» После этого часто дискуссия скатывается к одной из дисциплин <a href="http://lurkmore.to/Special_Olympics">Специальной олимпиады</a>. Например, сейчас очень популярен EntityFramework, который уверенно теснит, или может быть уже потеснил NHibernate – старожила и монстра корпоративной разработки. Ничего не имею против NHibernate и EF, но когда все нужды проекта сводятся к чтению пары таблиц и вызову пары-тройки процедур, использование этих инструментов вызывает недоумение. Ведь есть Link2db (ex. BLToolkit), Dapper и куча других Micro ORM, которые могут быть легче в настройке и использовании, каждый может найти себе нужный инструмент. Даже базовые средства .NET Framework не стоит списывать со счетов.</p>
<p>Кто-то может сказать, что случай не подходит для корпоративной разработки, ведь под корпоративной разработкой мы подразумеваем часто большие приложения, которые оперируют многими сущностями за раз. На это можно возразить, что архитектура, построенная на <a href="http://martinfowler.com/articles/microservices.html">микросервисах</a>, никуда не пропадает, а набирает обороты. Да, администрировать их сложнее, но плюсы для некоторых доменов перевешивают. Поэтому Micro ORM никуда не уйдут.</p>
<p>Это только один из примеров, почему стоит организовывать и ходить на конференции – <strong>узнать</strong>, что твориться вокруг и <strong>узнать </strong>о новых для себя инструментах, <strong>узнать</strong> о новых для себя подходах. Ни одна конференция не научит вас использованию новой технологии, но трудно начать изучать то, о чем не имеешь ни малейшего представления, <a href="http://www.johndcook.com/blog/2010/03/03/just-in-case-versus-just-in-time/">так</a>?</p>
<p>На конференции <strong>Desktop</strong><strong> UI</strong><strong> &amp; Business</strong><strong> Application</strong> Андрей Колчанов, технический эксперт Flexberry platform, как раз расскажет об альтернативной ORM и сравнит использование и быстродействие в основных сценариях использования.</p>
<h2>Кривая обучения</h2>
<p>Есть у меня так же примеры касательно тестирования, реализации некоторых аналитических шаблонов, но в конце концов все сводится к тому, что называется «<a href="http://www.daedtech.com/how-developers-stop-learning-rise-of-the-expert-beginner">новичок эксперт</a>». И это совсем не то же самое, когда человек становится экспертом, но определение «начинающий» используется в ключе известности. Определение привести достаточно тяжело, на мой взгляд, поэтому я зайду последовательно, чуть издалека, как в той статье.</p>
<p>Когда долго работаешь над одним проектом, или используя один и тот же набор инструментов, то количество не обязательно переходит в качество. Можно производить одни и те же операции изо дня в день, набивать тупой код для клонирования объектов вручную и многие другие вещи, которые приводят к экономическому результату. В итоге приложение все же будет написано и возможно даже без сильного срыва сроков, потому что программисты будут печатать вслепую как лучшие стенографистки. Но это экстенсивный рост навыков, без глубины, без наполнения качеством. Почему-то даже луддиты вспоминаются. Наверно потому, что я опять вспоминаю тренерскую практику, когда у каждого установлен ReSharper, но никто, например, не использует Alt+Insert для создания шаблонных файлов, а также другие возможности. Но опыт использования может быть более 2х лет. Отчего же такое происходит?</p>
<p>Отчасти виновато наше эго, если коллектив постоянный и закрытый, а вы в нем стали звездой, и мозг, который не любит делать что-то новое. Кривую обучения можно изобразить так:</p>
<p><img src="//habrastorage.org/files/227/b6a/c53/227b6ac53c714ae090f88920c3e78891.jpg" alt="" /></p>
<p>Программист быстро набирает необходимые навыки для работы в конкретном коллективе и происходит стопор, так как соревновательный момент прошел и больше напрягаться для проекта и коллектива не надо. Роли могут уже быть распределены. Такая же ситуация повторяется для многих новичков, когда приходя в коллектив они быстро подтягиваются до общего уровня и всё, прогресса нет. Конечно же, это справедливо не для всех, но ситуация типична.</p>
<p><img src="//habrastorage.org/files/aff/221/e81/aff221e8108d4ccdbd1b7ddc8b0f4479.jpg" alt="" align="left" /></p>
<p>Тут можно заметить тонкий момент с профессионалами в узкой области, но в отличие от «новичка эксперта», такой специалист обладает не в пример более высокой эффективностью решения задач с осознанием глубины решения.</p>
<p>Отчего же появляются такие «новички»? На мой взгляд, причина не в какой-то особенной лени, а в незнании где взять вектор развития, некоторый вакуум общения с коллегами по индустрии. Именно живого общения с другими живыми программистами, потому что в этом случае не возникает идеализации образа и проще обсудить, как нам кажется порой «элементарные» вопросы, связанные с разработкой. Именно <strong>живое интерактивное общение</strong>, может вывести из тупика, помочь избавиться от синдрома «золотого молотка».</p>
<p>Несмотря на всю приписываемую программистам интровертность, мы остаемся социальным видом и общение жизненно необходимо, для обмена знаниями и рождения нового знания на стыке технологий. Таким стыком мы выбрали <strong>десктоп и бэкенд</strong>. Поэтому, даже если ваше «чувство прекрасного» = «функциональность», как на скриншоте &#8212; конференция будет полезна. Вы сможете узнать больше о том, как собрать и скомбинировать еще больше данных в удобной форме и быстро и эффективно сохранить/загрузить из хранилища данных. Это ли не прелесть?</p>
<p><img src="//habrastorage.org/files/0ad/7e2/157/0ad7e2157d374f4383b5a70c2d13baa2.png" alt="" align="right" /></p>
<p>&nbsp;</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/03/31/golen-hammers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>WPF живее всех живых</title>
		<link>http://softblog.violet-tape.ru/2015/03/20/long-live-wpf/</link>
				<comments>http://softblog.violet-tape.ru/2015/03/20/long-live-wpf/#respond</comments>
				<pubDate>Thu, 19 Mar 2015 21:01:49 +0000</pubDate>
		<dc:creator><![CDATA[koissakh kadderah]]></dc:creator>
				<category><![CDATA[Custom Controls]]></category>
		<category><![CDATA[Общее]]></category>
		<category><![CDATA[Процесс]]></category>
		<category><![CDATA[Analytics]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[WinRT]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://softblog.violet-tape.ru/?p=2053</guid>
				<description><![CDATA[Я долгое время был разработчиком систем для десктопа. Сначала это был WinForms, потом более мощный и гибкий WPF. С тех пор прошло много времени и курсирует множество слухов и мнений о том, что WPF завершает свою жизнь, ведь сейчас столько разговоров о том, что можно писать настольные приложения на JS. А еще Microsoft усиленно двигает ... <a class="read-more" href="http://softblog.violet-tape.ru/2015/03/20/long-live-wpf/">Подробнее</a>]]></description>
								<content:encoded><![CDATA[<p>Я долгое время был разработчиком систем для десктопа. Сначала это был WinForms, потом более мощный и гибкий WPF. С тех пор прошло много времени и курсирует множество слухов и мнений о том, что WPF завершает свою жизнь, ведь сейчас столько разговоров о том, что можно писать настольные приложения на JS. А еще Microsoft усиленно двигает в массы платформу WinRT для разработки новых приложений. Это не могло меня и коллег оставить равнодушным.</p>
<p><strong>Так почему же мы, команда GoSharp конференции (да, да, это о C#), решили сделать акцент на десктопной разработке в разрезе WPF</strong><strong>?</strong> Далее я хочу показать какие светлые и темные моменты есть в существующем положении фреймворка и почему все же стоит в него вкладывать силы и время.</p>
<p><img src="//habrastorage.org/files/938/afe/25e/938afe25e8e345939524d7534a77c258.png" alt="" /></p>
<p>Существует мнение, что развитие десктопной разработки остановилось в своем развитии и для этого есть несколько предпосылок. Одна из них – остановка, или даже лучше сказать стагнация, в самой базе, в визуальном фреймворке WPF. Значительных обновлений для него не было вот уже лет 5, как может показаться. <a href="https://wpf.codeplex.com/">Официальный тулкит</a> давно не обновлялся, точнее с февраля 2010 года, т.е. вот как раз те самые 5 лет. При этом компании, специализирующиеся на кастом-компонентах, как например DevExpress и Telerik успешно <a href="https://www.devexpress.com/Subscriptions/New-2014.xml?product=wpf">выпускают обновления</a> и <a href="http://www.telerik.com/support/whats-new/wpf/roadmap">составляют планы</a> на будущее относительно WPF. Даже если вы ориентированы на новинки, то компоненты для WinRT все равно используют концепции и общую структуру XAML, который никуда не уходит.<br />
Далее мы хотим представить причины, по которым WPF некоторые считают неактуальным, и опровержение этих причин.</p>
<p>&nbsp;</p>
<h2>Причины для беспокойства</h2>
<p>Причин для беспокойства можно выделить с дюжину. Но не все они реально так страшны и существенны. Пройдемся кратко по основным.</p>
<p><strong>Блог команды WPF</strong><strong> давно не обновлялся. </strong></p>
<p>Так же, как и у любой другой команды, у команды WPF есть свой <a href="http://blogs.msdn.com/b/wpf/">блог</a>, в котором по идее должны быть описаны планы и достижения команды. К сожалению, в блоге давно нет новой информации. Это может натолкнуть на мысли, что всех разогнали или что писать не о чем. Однако, это не так и блог стал обновляться 4 месяца назад и последняя запись появилась 20 дней назад. Более того, появился <a href="http://blogs.msdn.com/b/dotnet/archive/2014/11/12/the-roadmap-for-wpf.aspx">генеральный план развития</a> фреймворка, а также краткие <a href="http://blogs.msdn.com/b/wpf/archive/2014/11/12/the-roadmap-for-wpf-blog-post.aspx">описания новых фич</a> доступных с последними CTP.</p>
<p><span id="more-2053"></span></p>
<p><strong>Официальный WPF</strong><strong> тулкит давно не обновлялся</strong></p>
<p>Официальная страница <a href="https://wpf.codeplex.com/">WPF Toolkit</a> на CodePlex не обновлялась с 2010 года. А это ведь когда-то была площадка для обкатки новых компонентов, которые открыто допиливались и в случае успеха вливались в основные релизы фреймворка. Такое положение дел так же может внушать подозрения о том, что ничего нового нам ждать не приходится и останется только закупать компоненты у больших компаний или что-то делать на коленке, долго и мучительно, если это не профильное направление вашей деятельности. Но <em>неофициальный </em>тулкит <a href="http://wpftoolkit.codeplex.com/">Extended WPF Toolkit</a> живее всех живых и последний релиз пришелся на 13 февраля 2015 года. Т.е. вот на прошлой неделе был. Этот тулкит поддерживает <a href="http://xceed.com/">Xceed</a>, но вложения идут в опенсорс проект, а значит они видят будущее за ним. Титульный баннер однозначно выражает оптимизм по этому счету.</p>
<p><img src="//habrastorage.org/files/a76/fe1/231/a76fe1231f91423ebb7d91cf7d7ff362.png" alt="" /></p>
<p>Более того, обратившись к одному из крупнейших реселлеров компонентов, в разделе <a href="http://www.componentsource.com/bestsellers/index.html">Best Sellers</a>, можно видеть, что компоненты для WPF входят в топ 5 продаж среди всех продуктов.</p>
<p><strong>Сертификация по WPF</strong></p>
<p>В интернетах можно найти слухи и сообщения о том, что основная сертификация по <a href="https://www.microsoft.com/learning/en-us/exam-70-511.aspx">WPF 70-511</a> заканчивается в 2015 году и не будет продлеваться. Это не является правдой, в чем вы можете убедиться лично, пройдя по ссылке.</p>
<p>Сертификация по WPF до сих пор в силе и активно продается, хотя служба поддержки и признает этот курс несколько устаревшим. Однако никаких сообщений о том, что данная сертификация устаревает и уходит на покой нет.</p>
<p><strong>Нет интеграции с Win</strong><strong>8+ </strong></p>
<p>Во время релиза WPF4, значительная часть улучшений была посвящена интеграции с Windows 7, однако этого не наблюдается с новыми операционными системами. Уже на носу Windows 10, а никаких новых фич связанных с возможностями ОС в WPF не наблюдается.</p>
<p><strong>Новая стратегия Microsoft</strong></p>
<p>В феврале 2014 года новым СЕО стал <strong>Сатья Надела</strong>, который пришел из «облачного» департамента, что может намекать. Сатья заменил Балмера, который как-то не стремился развиваться в сторону мобильного рынка и облачных технологий. Возможно в этом кроется причина такого резкого рывка Microsoft в сторону мобильной разработки и такого продвижения Azure. Сейчас компания движется под лозунгом <strong>«сначала облака и мобильность»</strong>, что ведет к отходу от традиционной модели настольных приложений и активного использования WPF.</p>
<p><strong>Windows</strong><strong> Store</strong></p>
<p>Публикация WPF приложений в Windows Store <a href="https://social.msdn.microsoft.com/Forums/windowsapps/en-US/c491f23e-82ff-4115-9e00-6c4cd2cb96f1/a-wpf-app-to-publish-on-windows-store-possible?forum=windowsstore">невозможна</a>. Можно сделать приложение визитку, которое загрузит и установит полновесное приложение, но это выглядит как обходной путь. Однако Microsoft пытается сформировать некоторый условный рефлекс, как у Apple и Android пользователей, что все приложения устанавливаются только через Store. Это так же является некоторым звоночком не в пользу WPF.</p>
<p><strong>Мобильный рынок</strong></p>
<p>Это сумеречная зона для WPF, так как он никогда не задумывался как средство для мобильной разработки. Эту роль прочили Silverlight for Windows Phone, однако всем известна судьба этой затеи. Реалии мира же сейчас таковы, что все большее количество контента мы потребляем с помощью мобильных устройств и многие разрабатывают мобильные версии для основных программ. Если это ваш случай, то скорее всего вы будете использовать отличный от WPF стэк технологий.</p>
<p><strong>Кроссплатформенность </strong></p>
<p>Существование и развитие Mono позволяет говорить о некоторой кроссплатформенности .NET стека, и для большинства фреймворков есть версия под Mono. Однако только не для WPF. Хотя недавнее открытие исходных кодов и энтузиазм в этой связи настраивает на то, что WPF все же может переехать на Mono и выступать в роли провайдера пользовательского интерфейса.</p>
<p>Многие тревожные соображения нивелируются или же отменяются последними действиями Microsoft. И это действительно похоже на реальную активность, а не создание видимости активности. К тому же причин отменять панику и продолжать использовать WPF больше, чем негативных моментов.</p>
<h2>Позитивные моменты для будущего WPF</h2>
<p><strong>Активная команда WPF</strong></p>
<p>Команда WPF действительно проснулась и их блог стал обновляться.</p>
<p><strong>Есть потенциал для разработки</strong></p>
<p>Команда WPF работает над улучшением быстродействия фреймворка и над поддержкой тач-экранов и экранов с высокой плотностью, а это ведь характеристики современных мобильных девайсов. Поддержка отладки и профилирования в новой студии. Публикация глобальных планов. Всё это внушает оптимизм. Кстати, по этому поводу можно посмотреть <a href="http://channel9.msdn.com/Blogs/DevRadio/The-Future-of-WPF">интервью на Channel9 о будущем WPF</a>.</p>
<p><strong>Новые инструменты</strong></p>
<p>Популярный инструмент <a href="https://compositewpf.codeplex.com/">Prism</a>, набор инструментов и лучших практик разработки на WPF,  обновился до версии 5. Далее, активно развивается неофициальный расширенный набор инструментов для WPF <a href="https://wpftoolkit.codeplex.com/">Extended WPF Toolkit</a>, который обновился буквально пару дней назад. В разработке новых инструментов не уступают и флагманы типа DevExpress.</p>
<p>Два наиболее популярный MVVM фреймворка: <a href="https://mvvmlight.codeplex.com/SourceControl/latest">MVVM Light Toolkit</a> и <a href="https://github.com/Caliburn-Micro/Caliburn.Micro/commits/master">Caliburn.Micro</a> так же проявляют активность. Для первого последний чекин датируется 21 февраля 2015 года, для второго – 16 марта 2015 года. И это не единичные чекины раз в полгода, а регулярная работа.</p>
<p>Можно сказать что экосистема инструментария для WPF жива и эволюционирует, что особенно важно для бизнеса, потому что он не останется со своими проблемами один на один в случае чего.</p>
<p><strong>Изменения в управлении</strong></p>
<p>В конце 2012 года Стивен Синофски покинул пост President of the Windows Division и Microsoft вообще. Почему это хороший знак для WPF? Потому что он был известен как знатный ненавистник .NET и плохо ладил с другими командами. Возможно это и есть основная причина его отставки.</p>
<p><img src="//habrastorage.org/files/7a3/f84/c11/7a3f84c11fc94b8ab0f6b6cd423e59e3.jpg" alt="" /></p>
<p>Это так же частично может объяснять, наряду с техническими причинами, почему .Net не был использован как основной технологический стек для новый операционных систем Windows, тогда как по факту это один из лучших продуктов Microsoft. Снаружи конечно же сложно оценить верность слухов и сплетен вокруг Стивена и его влияния на то, как получились системы Windows 8 и старше.</p>
<p><strong>Инертность рынка ОС</strong></p>
<p>Инертность рынка ОС и добро и благо. Сейчас для WPF это хорошо, потому что <strong>бизнес и частные пользователи не переходят мгновенно на новые версии ОС</strong>, по целому ряду веских причин: это стоит денег, это отнимает время, это всегда риск, и часто это просто бесполезно.</p>
<p>Для компаний миграция на новую ОС это всегда головная боль и проблемы. Необходимо убедиться в совместимости всех сервисов, всех своих наработок. Убедиться что вендоры могут предоставить соответствующих экспертов и поддержку, подготовить свой персонал. Вообще переход на новую ОС может составлять 2 года и более. На этом фоне выглядит несколько странным и интригующим заявление о том, что каждые 2 года Microsoft будет выпускать новые версии своих продуктов, включая ОС. За примером далеко ходить не надо, многие компании не переходят с семерки на 8 и 8.1 ожидая, вполне закономерно как дела будут с новой версией и не стоит ли перейти сразу на нее.</p>
<p>На текущий момент распределение ОС от Microsoft выглядит примерно так:</p>
<ul>
<li>Windows 8 + 8.1 : ~15%</li>
<li>Windows 7 : ~55%</li>
<li>Windows Vista : ~5%</li>
<li>Windows XP : ~25%</li>
</ul>
<p>Т.е. более чем на 80% машин не доступны функции WinRT и остается только одна опция – WPF. Принимая во внимание, что цикл обновления ОС и приложений составляет около 5 лет, сейчас WPF является единственным выбором, если вы решаете сделать приложение не за выходные и на ближайшие полгода.</p>
<p><strong>Инертность ALM </strong></p>
<p>Не многие знают, что написать программу стоит немалых денег. Сначала в серии встреч со всеми заинтересованными сторонами, надо оценить, какое влияние имеет ПО на текущие процессы в общем бизнес-процессе. Надо найти ключевых пользователей и убедить их, что требуется обновление ПО. Затем новое ПО надо разработать, при этом старое должно работать как ни в чем не бывало. Новое приложение должно работать бок о бок со старым, чтобы можно было сравнить результаты и понять, что ничего не упущено и все работает как минимум на том же уровне, не хуже. Так же вовлекаются ребята их DB отделов, чтобы поработать с бэкапами, инженеры сети, чтобы настроить новые правила для файрволов и так далее.</p>
<p>И это только малая часть всего процесса, но и его хватает, чтобы понять, что приложений на только что появившихся технологиях еще долго не будет. Поддержка WPF со стороны бизнеса будет сильна, потому что это уже стабильная технология для которой есть специалисты и на этом можно строить свои процессы. Кстати, до сих пор порой требуются спецы по Delphi5 или Fortran для поддержки приложений и они стоят сейчас очень дорого. Хотя в целом так далеко ходить не надо, до сих пор актуальны огромное количество приложений написанных с использованием WinForms, так что списывать со счетов WPF было бы слишком преждевременно.</p>
<p><strong>WPF </strong><strong>зрелая технология</strong></p>
<p>Для многих разработчиков очевидно, что первая версия приложения отнимает наибольшее количество времени и сил. В таком ключе можно рассматривать выпуск WPF 3.0 и WPF 3.5. После победы над детскими болячками, приложения на WPF 4 уже стали «полными», разработчики стали уделять внимание быстродействию, что намекает на стабильность основной технологической базы. Наконец в версии 4.5 разработчики добавили еще украшательств и еще больше повысили производительность.</p>
<p>Чем более зрелая технология, тем меньше трудозатрат она требует. Таким образом после 8 лет разработки, поддержка WPF почти не требуется, что показывает зрелость. Но, как уже я писал выше, разработчики решили не забросили его, а решили оживить фреймворк в соответсвии с духом времени.</p>
<p><strong>Line of Business (LOB) Application</strong></p>
<p>Локальные бизнес приложения это та область в которой WPF не только выживет, но в которой доминирует и будет показывать себя лучшим образом. Почему?</p>
<p>Во-первых, потому что накоплен огромный опыт в разработке приложений на WPF и их развертывании в системе. Потому что это .Net платформа, которая сама по себе уже зрелый продукт. Если компании имеют достаточно приложений на .net, то нет никаких причин останавливаться и переходить на другой стек. Гораздо легче использовать существующих программистов для покрытия всех бизнес-потребностей. К тому же интеграция приложений на одной платформе будет существенно легче.</p>
<p>Еще одной причиной, почему WinRT пока не может прийти на смену WPF – это то, что нет такого же инструментария. Например, таких вещей как ORM в духе NHibernate или EntityFramework, которые необходимы любому in-house приложению.</p>
<p>Безопасность, для многих является краеугольным камнем, например в финансовых приложениях. Поэтому использование WinRT может быть не только не нужно, но и не желательно.</p>
<p><strong>Интеграция с WinForms</strong></p>
<p>За более чем 10 лет компании создали огромное количество приложений на WinForms и переделать их в один момент по другие технологии не представляется возможным. Огроным плюсом в этом случае является взаимная между WinForms и WPF возможность использовать компоненты друг друга и внедрять друг в друга. Таким образом миграция с одной технологии на другую может проходить постепенно и относительно безболезненно.</p>
<p><img src="//habrastorage.org/files/c41/df3/391/c41df33911074bf4b73ba648ea8d1baf.gif" alt="" /></p>
<p>Насколько я знаю, пока что WinRT никак не может внедряться в WinForms компоненты, формы.</p>
<p>&nbsp;</p>
<p>Как вы можете видеть, положительных моментов намного больше и именно это внушает нам оптимизм, что WPF не будет забыт и еще долгое время будет востребован для интересных задач. WPF не умирает и на уходит в закат. Сейчас он находится в зените своего развития и это именно поэтому мы хотим сделать конференцию по тому, как лучше создавать бизнес-приложения с использованием WPF и лучших практик по организации энтерпрайз интерфейсов пользователя.</p>
<p><img src="//habrastorage.org/files/b4e/6de/aa5/b4e6deaa5b4d4398860ecc58e5bfc2b5.png" alt="" /></p>
<p>Если вы так же вовлечены в разработку с использованием WPF, создаете сложные интерфейсы, работаете со сложным бизнес-доменом, вас интересуют вопросы, связанные лучшими практиками и тенденциями в десктоп приложениях, и вы хотите найти коллег и единомышленников, чтобы поделиться своим мнением по поводу всего вышесказанного &#8212; <a href="http://www.gosharp.ru/DESKTOP2015?utm_source=habrahabr&amp;utm_medium=article&amp;utm_content=WPFAlive&amp;utm_campaign=habrahabr">добро пожаловать на конференцию</a>. Нам есть, о чем рассказать друг другу!</p>
<p>Если более конкретно, то мы обсудим темы:</p>
<ul>
<li>История пользовательских интерфейсов и как сделать UI\UX удобным для корпоративного пользователя. Через окна в облака.</li>
<li>Не создавайте медлительных зомби-приложений. Используйте Rx! На реальном примере. А также что вы недооценили в TPL?</li>
<li>EF-ом ли единым живы большие приложения?</li>
<li>Прототипирование приложений</li>
<li>Как написать толковые UT на пользовательский интерфейс. Реальный опыт разработки.</li>
<li>Холивар на тему полного и анемичного домена</li>
<li>И другие захватывающие истории!</li>
</ul>
<p>&nbsp;</p>
<p><a href="http://www.gosharp.ru/DESKTOP2015?utm_source=habrahabr&amp;utm_medium=article&amp;utm_content=WPFAlive&amp;utm_campaign=habrahabr"><b>Регистрируйтесь!</b></a> <b>До 23 марта действует специальная цена.</b></p>
<p>&nbsp;</p>
]]></content:encoded>
							<wfw:commentRss>http://softblog.violet-tape.ru/2015/03/20/long-live-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
	</channel>
</rss>
