• Записки правдивого архитектора: просто о самом главном (Ч.1)

      Все нижеизложенное является исключительно частным мнением автора, не имеющим отношения к какому-либо работодателю либо вендору.

      «Хмм… правдивого архитектора… А что, такие бывают? – спросите вы и подумаете. — Врет, поди! Сейчас будет нам рассказывать очередную концепцию „бла-бла-бла.2.0“. Знаем, плавали, видали мы „витающих в небесах архитекторов“ и их умозрительные конструкции».
      И будете правы: нормальный «пацанский» архитектор — человек очень занятой, и времени писать статьи у него, как правило, нет… Но! Бывает, что настает момент – и желание человека поделиться опытом, рассказать о своих удачах и сложностях миру настолько высоко, что и время находится, и присущий нашему брату-технарю страх публичных высказываний отступает. К тому же коллеги по цеху давно призывали меня начать подобную деятельность.

      Стартовать я решила с темы несколько общего характера – ИТ-архитектуры в целом. Почему бы сразу не перейти непосредственно к деталям, которые наиболее занимают читателей технических блогов?
      Ответ прост: уж больно много вопросов, трактовок и кривотолков возникают вокруг работы и задач архитекторов. И чтобы двигаться дальше, нужно выстроить некую «общую систему координат» — некую отправную точку.
      За время моей работы сложилось некое «видение» происходящего, которым хотелось бы поделиться и обсудить с коллегами.

      Итак, попробуем поискать ответы на следующие вопросы.
      • Что такое архитектура?
      • Что такое целевая архитектура?
      • Что такое архитектурные стандарты и фреймворки и зачем они нужны?
      • Кто заказывает архитектуру, какие у нашего заказчика могут быть желания и потребности, высказанные и невысказанные?
      • Какую архитектуру можно назвать хорошей архитектурой?
      • Зачем нужны архитекторы? Какова их роль? Чего от них ожидать и почему?
      • Когда компании нужно вкладываться в архитектуру? Что будет, если этого не делать?

      Если вы когда-либо задавались подобными вопросами, и они представляют для вас интерес, то эта статья для вас — приглашаю поразмыслить вместе.
      Читать дальше →
      • +12
      • 34,7k
      • 7
    • Лучшие светодиодные лампы 2015 года

        На сайте lamptest.ru я публикую результаты измерений параметров светодиодных ламп. Цифр там немало и многим сложно в них разобраться. Всё чаще я слышу вопрос — «так какая лампочка самая лучшая»? Хороших ламп много и я решил регулярно публиковать списки лучших ламп.



        На рынке сейчас огромное количество светодиодных ламп и те 226 моделей ламп, которые я протестировал, едва ли составляют десятую их часть. Поэтому помимо тех ламп, о которых я расскажу сегодня, есть множество других хороших ламп других брендов.

        Читать дальше →
      • Погружение в ASP.NET 5 Runtime

        Вступление от переводчика


        Данная статья является переводом ASP.NET 5 — A Deep Dive into the ASP.NET 5 Runtime — введения в архитектуру DNX и построенного на нем ASP.NET 5. Так как оригинальная статья была написана в марте 2015 года, во время, когда ASP.NET 5 был еще в стадии активной разработки (примерно beta 3), многое в ней устарело. Поэтому при переводе вся информация была актуализирована до текущей версии ASP.NET 5 (RC1), также были добавлены ссылки на связанные ресурсы (в основном на docs.asp.net) и исходный код на GitHub (смотрите только в случаях, если вам интересна реализация). Приятного погружения!

        .NET Runtime Environment (DNX)


        ASP.NET 5 базируется на гибком, кроссплатформенном runtime, который может работать с разными .NET CLR (.NET Core CLR, Mono CLR, .NET Framework CLR). Вы можете запустить ASP.NET 5 используя полный .NET Framework или можете запустить используя новый .NET Core docs, который позволяет вам просто копировать все необходимые библиотеки вместе с приложением в существующее окружение, без изменения чего-либо еще на вашей машине. Используя .NET Core вы также можете запустить ASP.NET 5 кроссплатформенно на Linux docs и Mac OS docs.

        Инфраструктура позволяющая запускать и исполнять приложения ASP.NET 5 называется .NET Runtime Environment docs или кратко DNX. DNX предоставляет все что необходимо для работы .NET приложений: host process, CLR hosting логику, обнаружение управляемой Entry Point и т.д.

        Логически архитектура DNX имеет пять слоев. Я опишу каждый из этих слоев вместе с их обязанностями.
        Изображение взято из статьи DNX-structure wiki
        Архитектура ASP.NET 5 и DNX

        Читать дальше →
      • 400 потрясающих бесплатных сервисов

        • Перевод

        Рад представить дополнение оригинального списка из 300 потрясающих бесплатных сервисов. Автор оригинальной статьи Ali Mese добавил ещё +100 новых сервисов, которые помогут найти все — от источников вдохновения и редакторов фотографий до создания опросов и бесплатных иконок.

        И еще подборку +500 инструментов от 10 марта 2017 г. смотрите здесь.



        A. Бесплатные веб-сайты

        • HTML5 UP: Адаптивные шаблоны HTML5 и CSS3.
        • Bootswatch: Бесплатные темы для Bootstrap.
        • Templated: Коллекция 845 бесплатных шаблонов CSS и HTML5.
        • Wordpress.org | Wordpress.com: Бесплатное создание веб-сайта.
        • Strikingly: Конструктор веб-сайтов.
        • Layers: Создание сайтов на WordPress (new).
        • Bootstrap Zero: Самая большая коллекция бесплатных шаблонов Bootstrap (new).
        • Landing Harbor:  Продвижение мобильного приложения c помощью бесплатного лендинга (new).
        Читать дальше →
      • Лучшие доклады конференции DotNext 2015 Piter: Часть 2 (Видео внутри)

          Три дня назад я рассказал о тех докладах конференции DotNext 2015 Piter, которые, согласно опросу участников, заняли места с 6 по 10. Теперь пришло время рассказать про лучшую пятерку докладов.




          5 место


          Кирилл Скрыган, JetBrains — ReSharper vs. Roslyn
          Средняя оценка: 4.33



          Казалось бы, ReSharper — плагин к Visual Studio, который расширяет возможности IDE. Roslyn — компилятор (набор компиляторов). Что общего?

          Дело в том, что для того, чтобы делать все возможные рефакторинги, подсказки и пр., ReSharper строит собственную модель, собственное синтаксическое дерево. А значит, в нем есть, фактически, половина компилятора, компиляторный front-end. А значит, его можно сравнить с фронтэндом Roslyn, что Кирилл и сделал в этом докладе.

          Акценты Кирилл расставил не в пользу Roslyn:
          • ReSharper на 10 лет старше, в нем гораздо больше фич
          • Roslyn работает только для C# и VB, никаких JavaScript и прочих прелестей
          • синтаксическое дерево у ReSharper изменяемое и поэтому быстрое, а у Roslyn неизменяемое, генерит много memory traffic и поэтому медленное.




          Основной вывод, который сделал я — Roslyn еще пока довольно сырой продукт, а почти все описанные Кириллом болезни — «детские». Пройдет время и наверняка от всех от них Рослин избавится. Ну а что будет на самом деле — покажет время.

          Первые 4 места...
          • +22
          • 16,4k
          • 3
        • Автоматическая калькуляция вычислимых свойств моделей представлений в .NET

          Мотивация на примере моделей представлений для WPF UI


          Начать обсуждение и познакомиться с обсуждаемой проблематикой предлагается на примере подхода к архитектуре пользовательских интерфейсов в WPF.

          Как известно, одна из главных фич WPF — это мощная система байндингов, позволяющая достаточно легко отделить модель представления (далее модель) от самого представления (далее View) как такового. Обычно программист создает XAML для представления, привязывает свойства его элементов к модели в том же XAML посредством байндингов и, фактически, забывает о View. Это становится возможным поскольку большинство UI-логики может быть реализовано через воздействие на модель и автоматически прокинуто на UI посредством байндингов. При таком подходе модель играет роль состояния View, являясь его прокси для слоя, реализующего UI-логику. Например, меняя свойство модели, мы тем самым меняем соответствующее ей свойство View (или его элементов). Последнее происходит автоматически благодаря системе байндингов, которая отслеживает изменения как в модели, так и во View, синхронизируя состояния на обоих концах по мере надобности. Одним из способов, посредством которых модель может сообщить наблюдателю (коим в нашем случае является байндинг) о своем изменении, является бросание события PropertyChanged с именем изменившегося свойства в качестве параметра. Это событие принадлежит интерфейсу INotifyPropertyChanged, который, соответственно, должен быть реализован в модели.

          Рассмотрим описанную идею на конкретном примере. Начнем с простой модели, которая представляет собой некий Заказ и содержит два свойства — Цена и Количество. Оба свойства будут изменяемыми, поэтому для каждого нужно реализовать нотификацию об изменении. Это делается следующим кодом:
          Читать дальше →
        • Видео докладов от SPB .NET Community



            C июня этого года мы начали проводить митапы SPB .NET Community в Санкт-Петербурге и за это время у нас скопилось немало видео, которым я и хочу поделиться. Кому интересно посмотреть доклады про новшества в Visual Studio 2015, безопасность платформы ASP .NET, детали разработки многозадачных приложений и про взаимодействие с unmanaged миром из C#, прошу под кат.
            Читать дальше →
            • +10
            • 11,5k
            • 2
          • Рентабельный код 2: крадущийся DDD, затаившийся CQRS

            • Tutorial

            Трем программистам предложили пересечь поле, и дойти до дома на другой стороне. Программист-новичок посмотрел на короткую дистанцию и сказал, «Это не далеко! Это займет у меня десять минут». Опытный программист посмотрел на поле, немного подумал, и сказал: «Я мог бы добраться туда за день». Новичок посмотрел на него с удивлением. Гуру-программист посмотрел на поле и сказал. «Кажется минут десять, но я думаю пятнадцати будет достаточно». Опытный программист рассмеялся.

            Программист-новичок двинулся в путь, но в течение нескольких мгновений, начали взрываться мины, оставляя после себя большие ямы. От взрывов он отлетал назад, и ему приходилась начинать сначала снова и снова. У него ушло два дня чтобы достичь цели. К тому же он весь трясся и был ранен, когда пришел.

            Опытный программист пополз на четвереньках. Осторожно щупая землю и ища мины, двигаясь только если был уверен, что это безопасно. Медленно и осторожно он пересек поле в течение дня. Только задев пару мин.

            Гуру программист пустился в путь, и пошел прямо через поле. Целеустремленно и прямо. Он достиг цели всего за десять минут.
            «Как тебе это удалось?» — спросили двое других — «Как ты умудрился не зацепить ни одной мины?»
            «Легко» — ответил он. «Я не закладывал мины на своем пути».

            Как ни прискорбно, придется признать – мы сами закладываем себе мины. В первой части я подробно разобрал основные риски в разработке ПО и описал технологические и методологические способы ослабления этих рисков. За прошедший год я получил множество комментариев, основной смысл которых сводился к следующему: «все круто, но с чего начать и как все это будет выглядеть в реальном мире». Действительно, первый текст носит скорее теоретический характер и представляет собой каталог ссылок. В этой статье я постараюсь привести как можно больше примеров.
            Читать дальше →
          • Рентабельный код

            • Tutorial


            Жили-были в двух соседних деревушках Вилларибо и Виллабаджо две команды разработчиков. И те и другие делали ревью кода, писали тесты, приводили рефакторинг, но через год разработки в Вилларибо уже выпустили релиз и вышли в продакшн, а в Виллабаджо все еще проводят рефакторинг и чинят баги. В чем же дело?

            Разработка ПО – область, подверженная рискам. В нашей сфере при наступлении одного или нескольких рисков, срок поставки рабочей версии может сдвинуться не на привычные и комфортные 10-20%, а на все 150-300%. И надо признаться, что это далеко не предел.

            Мы можем либо скрестить пальцы и надеяться, что удача будет сопутствовать проекту во всем, либо признать, что по статистике большая часть проектов по разработке ПО «проваливается» и предпринять дополнительные усилия по ослаблению возможных рисков.
            Моя практика показывает, что клиенты крайне неохотно работают по схеме T&M и чаще предпочитают Fixed Price. В условиях зафиксированной стоимости наступление рискового случая означает автоматическое снижение рентабельности проекта: сотрудники получают зарплату ежемесячно, а не за сданные проекты.

            До Agile и XP вся ответственность за работу с рисками ложилась на менеджеров. В гибких методологиях разработчики гораздо больше вовлечены в процесс и делят ответственность с менеджерами. Однако, принципы XP и Agile – больше методологические, чем технологические. Я думаю, что с рисками эффективнее работать комплексно на всех уровнях, в том числе на самом низком уровне, т.е. во время проектирования и написания кода.

            Почему об этом следует думать разработчику, если есть менеджер?
            1. Не секрет, что если факап случится, менеджмент примет единственное «супер-умное» решение: «давайте поработаем сверхурочно и в выходные»
            2. Премии сотрудники получают тоже обычно за в срок сданные, а не за проваленные проекты
            3. Чувство сделанного дела, в конце концов. Гораздо приятнее сдать проект во время и видеть улыбку клиента, чем с опозданием в полгода отвязаться от «трудного ребенка»

            С моей точки зрения спокойная рабочая обстановка вместо авралов и бонусы – неплохая мотивация, чтобы начать заботиться об этом.
            Читать дальше →
          • Искусство командной строки



              Вот уже как неделю английская версия the art of command line висит в секции trending на Github. Для себя я нашел этот материал невероятно полезным и решил помочь сообществу его переводом на русский язык. В переводе наверняка есть несколько недоработок, поэтому милости прошу слать пулл-реквесты мне сюда или автору оригинальной работы Joshua Levy вот сюда. (Если PR отправите мне, то я после того, как пересмотрю изменения отправлю их в мастер-бранч Джоша). Отдельное спасибо jtraub за помощь и исправление опечаток.

              Enjoy!
            • Снова о разработке на основе предметной области (Domain-Driven Design, DDD)

              • Перевод

              Введение


              Слишком много раз я встречал приложения, о которых говорили, что у них есть модель предметной области и приложение было спроектировано на основе это предметной области. Однако в действительности всё, что я видел, было коллекцией сущностей (я бы даже сказал DTO), имеющих кучу свойств без какой бы то ни было реальной логики, связанной с сущностью. Кроме того, я могу найти много сервисов всех видов, которые содержат красочную смесь бизнес-логики и/или инфраструктуры. Если приложение вдобавок использует шину сообщений (как NServiceBus, Mass Transit Bus или Azure Bus), то конечно же заметно, что некие сообщения передаются от одного модуля к другому или нескольким модулям. К сожалению, сообщения часто имеют очень обобщённые названия, содержащие слова “обновить”, “изменить”, “добавить” или “удалить”, и несут большое количество полезной нагрузки — десятки разнообразных свойств. Часто из названия сообщения совершенно не очевидно, является ли оно командой или событием, и чтобы определить это, приходится глубоко зарыться в реализацию.

              Я искренне хотел бы, чтобы все написанное выше было бы преувеличением или же имело смысл только для «старых» приложений, которые разрослись и вышли из-под контроля. Но печальная истина в том, что это относится ко многим новым проектам, даже тем, которым всего несколько месяцев от роду. Почему так происходит? Конечно, есть много разных причин: отсутствие знаний является одной из наиболее важных.
              Читать дальше →
              • +12
              • 47,1k
              • 4
            • 15 лучших JavaScript-библиотек для построения диаграмм и сводных таблиц

              • Перевод
              Практически невозможно представить себе информационную панель без диаграмм и графиков. Они быстро и эффективно отображают сложные статистические данные. Более того, хорошая диаграмма также улучшает общий дизайн вашего сайта.

              В этой статье я покажу вам некоторые из лучших JavaScript библиотек для построения диаграмм/схем (и сводных таблиц). Эти библиотеки помогут вам в создании красивых и настраиваемых графиков для ваших будущих проектов.

              Хотя большинство библиотек являются бесплатными и свободно распространяемыми, для некоторых из них есть платные версии с дополнительным функционалом.

              Читать дальше →
            • Модульный подход к разработке web-приложений с использованием JavaScript: AMD и RequireJS

                RequireJSПри разработке приложений с модульной структурой на JavaScript возникает две проблемы:
                • описание и удовлетворение зависимостей различных частей приложения, необходимость организации подключения зависимостей на серверной стороне;
                • экспорт переменных в глобальную область видимости и их коллизия.

                Обе эти задачи решаются при использовании подхода Asynchronous Module Definition. Он сводится к описанию модулей функцией define и подключению их с помощью require. На данный момент есть несколько инструментов, реализующих AMD. Я начал своё знакомство с ними с RequireJS и был удивлён, насколько удобно и просто можно описывать зависимости модулей. Расскажу, как это работает, на простом примере.
                Читать дальше →
              • Мысли вслух о разработке javascript-приложений на примере небольшого Line Of Business фреймворка

                • Tutorial
                Привет, Хабр!

                Не так давно мы сами себе поставили задачу — построить SPA-приложение. Сложное, большое, быстрое, с поддержкой множества устройств, без утечек памяти. К тому же, постоянно развивающееся, чтобы его было легко поддерживать. В общем, как мы и любим — всё и сразу.

                Тема SPA-приложений и javascript-приложений в целом не нова, но нам не удалось найти даже на платных ресурсах основательных руководств по разработке приложений. Они являются скорее рассказом о той или иной MV*-библиотеке, чем примером для подражания. При этом не рассматриваются примеры разбиения по слоям, построения иерархий наследования и тонкостей наследования в javascript и т.д.

                Мы попробуем зайти с другой стороны и описать, скорее, ход мыслей при разработке (с кодом и ссылками), чем какой-то конкретный инструмент. Начать мы вынуждены с уровня hello world, чтобы задать одну стартовую точку для читателей и писателя. Но уже со второго раздела повествование резко ускорится.

                Мы считаем, что данная статья будет полезна:

                1. Front-end разработчикам, у которых уже есть небольшой опыт, но хочется вырасти.
                2. Back-end разработчикам, которым в какой-то момент пришлось начать заниматься js-разработкой и которые чувствуют некую неуверенность при работе с javascript.
                3. Верстальщикам, которые начали заниматься js-разработкой и хотели бы прокачать свои навыки.



                Чтиво получилось весьма объемистым, но надеемся, что настолько же полезным.
                Читать дальше →
                • +5
                • 18,4k
                • 8
              • Логика мышления. Часть 11. Динамические нейронные сети. Ассоциативность



                  Этот цикл статей описывает волновую модель мозга, серьезно отличающуюся от традиционных моделей. Настоятельно рекомендую тем, кто только присоединился, начинать чтение с первой части.

                  Наиболее просты для понимания и моделирования нейронные сети, в которых информация последовательно распространяется от слоя к слою. Подав сигнал на вход, можно так же последовательно рассчитать состояние каждого из слоев. Эти состояния можно трактовать как набор описаний входного сигнала. Пока не изменится входной сигнал, останется неизменным и его описание.

                  Более сложная ситуация возникает, если ввести в нейронную сеть обратные связи. Чтобы рассчитать состояние такой сети, уже недостаточно одного прохода. Как только мы изменим состояние сети в соответствии с входным сигналом, обратные связи изменят входную картину, что потребует нового пересчета состояния всей сети, и так далее.

                  Идеология рекуррентной сети зависит от того, как соотносится задержка обратной связи и интервал смены образов. Если задержка много меньше интервала смены, то нас, скорее всего, интересуют только конечные равновесные состояния, и промежуточные итерации стоит воспринимать, как исключительно расчетную процедуру. Если же они сопоставимы, то на первый план выходит именно динамика сети.
                  Читать дальше →
                  • +31
                  • 23,4k
                  • 6
                • Логика мышления. Часть 8. Выделение факторов в волновых сетях



                    В предыдущих частях мы описали модель нейронной сети, которую назвали волновой. Наша модель существенно отличается от традиционных волновых моделей. Обычно исходят из того, что каждому нейрону свойственны собственные осцилляции. Совместная работа таких склонных к систематической пульсации нейронов, приводит в классических моделях к определенной общей синхронизации и появлению глобальных ритмов. Мы вкладываем в волновую активность коры совсем другой смысл. Мы показали, что нейроны способны фиксировать информацию не только за счет изменения чувствительности своих синапсов, но и благодаря изменениям в мембранных рецепторах, расположенных вне синапсов. В результате этого нейрон приобретает способность реагировать на большой набор определенных паттернов активности окружающих его нейронов. Мы показали, что срабатывание нескольких нейронов, образующих определенный узор, обязательно запускает волну, распространяющуюся по коре. Такая волна это не просто возмущение, передающееся от нейрона к нейрону, а сигнал создающий по мере продвижения определенный узор активности нейронов, уникальный для каждого излучившего его паттерна. Это означает, что в любом месте коры по тому узору, что принесла с собой волна, можно определить какие паттерны на коре пришли в активность. Мы показали, что через небольшие пучки волокон волновые сигналы могут проецироваться на другие зоны коры. Сейчас мы поговорим о том как может происходить синаптическое обучение нейронов в наших волновых сетях.
                    Читать дальше →
                    • +16
                    • 22,2k
                    • 9
                  • Логика мышления. Часть 7. Интерфейс человек-компьютер



                      Для тех, кто только присоединился, я советую начать с первой части или хотя бы с описания волновой модели коры. Наша волновая модель показывает как вызванная активность нейронов коры порождает волны фоновой активности, распространяющиеся как внутри зон коры, так и через проекционные связи по всему пространству мозга. Проходя по какому-либо участку коры, волна, кодирующая определенное явление, воспроизводит свой уникальный узор. Это позволяет нейронам в любом месте коры получать информацию о том, что происходит в других частях мозга.
                      Читать дальше →
                      • +21
                      • 27,6k
                      • 8
                    • Логика мышления. Часть 5. Волны мозга



                        Итак, мы подошли к описанию одного из ключевых принципов описываемой модели. Этот принцип ранее не использовался ни в нейронных сетях, ни при описании работы мозга. В связи с этим я крайне рекомендую ознакомится с предыдущими частями. Как минимум необходимо прочитать четвертую часть без которой описанное ниже, будет совершенно непонятно.

                        В предыдущей части мы говорили о том, что активность нейронов делится на вызванную и фоновую. Отголоски фоновой активности наблюдают, снимая электроэнцефалограмму. Записываемые сигналы имеют сложную форму и зависят от места приложения электродов к голове, но, тем не менее, в них достаточно четко прослеживаются отдельные гармонические составляющие.
                        Читать дальше →
                      • Логика мышления. Часть 4. Фоновая активность



                          Мы подошли к моменту, когда от пересказа азов нейробиологии и теории нейронных сетей нам предстоит перейти к тому новому, что содержит предлагаемая модель. Тем, кто только приступил к чтению цикла я советую начать с первой части.

                          Вернемся к описанию работы реальных нейронов. Сигналы от одних нейронов через их аксоны поступают на входы других нейронов. В химических синапсах происходит выброс медиатора, который в зависимости от типа синапса оказывает либо активирующее, либо тормозящее воздействие на принимающий сигнал нейрон. Чувствительностью синапса, которая может меняться, определяется вклад этого синапса в общее возбуждение. Если суммарное воздействие превышает определенный порог, то происходит деполяризация мембраны и нейрон генерирует спайк. Спайк – это одиночный импульс, продолжительность и амплитуда которого не зависит от того, какая синаптическая активность его породила.
                          Читать дальше →
                        • Логика мышления. Часть 6. Система проекций



                            Для тех, кто только присоединился, я советую начать с первой части или хотя бы с описания используемой нами волновой модели коры. Суть волновой модели в том, что информация кодируется одновременно двумя способами. Первый способ – это паттерны вызванной активности, соответствующие обнаруженным нейронами-детекторами явлениям. Второй – волны идентификаторы, распространяющиеся от паттернов вызванной активности и несущие уникальные узоры. Уникальность узора каждой из волн позволяет на удалении от источника сигнала узнать о его активности. При таком подходе хорошо объясняется сформулированное Мак-Каллоком и Питсом несоответствие между объемом зон коры и количеством волокон в пучках, проецирующих информацию от них на другие зоны.
                            Читать дальше →