Как стать автором
Обновить

Компания Developer Soft временно не ведёт блог на Хабре

Сначала показывать

О записи багов, или Найди кота

Время на прочтение 9 мин
Количество просмотров 33K

Эта статья родилась из поста на внутреннем форуме нашей конторы, немножко пообсуждалась, слегка дополнилась, а потом я решил выложить её в итоговом виде тут, чтобы ссылаться было удобнее.
Да, пост капитанский, это ожидаемое поведение :) я просто хочу это иметь собранным, упорядоченным и общедоступным.


Введение: найди кота


В продуктах, которые мы разрабатываем, есть баги.
Мы их иногда находим. Иногда даже записываем.
Для того, чтобы помочь нашим коллегам, сделать их продукт лучше.
И очень обижаемся, когда коллеги нам пишут – "я нихрена не понял", "у меня не воспроизводится", "приди покажи".
Иногда так говорю я.
Потому что достаточно часто баги выглядят как картинка "найди кота".


Найди кота


Тот, кто записал баг, точно знает, где кот. Он его уже нашёл. Он уже не может его развидеть.
А я должен сидеть, пыриться в монитор и искать грёбаного кота.

Читать дальше →
Всего голосов 63: ↑62 и ↓1 +61
Комментарии 104

Размыкаем замыкания и внедряем Dependency Injection в JavaScript

Время на прочтение 5 мин
Количество просмотров 20K

image


В этой статье мы рассмотрим, как писать чистый, легко тестируемый код в функциональном стиле, используя паттерн программирования Dependency Injection. Бонусом идет 100% юнит-тест coverage.

Читать дальше →
Всего голосов 36: ↑34 и ↓2 +32
Комментарии 19

Kivy. Xamarin. React Native. Три фреймворка — один эксперимент (часть 3)

Время на прочтение 10 мин
Количество просмотров 10K

Задача сравнения фреймворков очень неблагодарное занятие, предпочтения у разработчиков разные, технологии меняются очень быстро. Слишком быстро. Эта статья, устареет еще до того момента как я нажму кнопочку “опубликовать“.
Полетели
Всего голосов 23: ↑20 и ↓3 +17
Комментарии 20

Kivy. Xamarin. React Native. Три фреймворка — один эксперимент (часть 2)

Время на прочтение 10 мин
Количество просмотров 13K

Это вторая статья из цикла, где мы проводим сравнение Kivy, Xamarin.Forms и React Native. В ней я постараюсь написать такой же планировщик задач, но с использованием Xamarin.Forms. Посмотрю, как у меня это получится, и с чем мне придется столкнуться.

Повторять ТЗ я не буду, его можно посмотреть в первой статье: Kivy. Xamarin. React Native. Три фреймворка — один эксперемент

Третья часть про React Native: Kivy. Xamarin. React Native. Три фреймворка — один эксперимент (часть 3)
Читать дальше →
Всего голосов 31: ↑30 и ↓1 +29
Комментарии 21

Optimistic UI, CQRS and EventSourcing

Время на прочтение 3 мин
Количество просмотров 8.3K

Optimistic UI, CQRS and EventSourcing


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


Но для хорошего масштабирования разделения API на чтение/запись недостаточно. Нужно разделить и базы данных, с которыми это API работает. Тут нам на помощь приходит EventSourcing. Он предлагает нам хранить всем события системы в одной базе данных, назовем ее EventStore, а все остальные базы данных и таблицы строить уже на ее основе.


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


В этой статье мы рассмотрим один из нюансов проектирования клиентской части для такой системы — оптимистические обновления в UI.

Всего голосов 25: ↑24 и ↓1 +23
Комментарии 10

Hyperapp для беженцев с React/Redux

Время на прочтение 5 мин
Количество просмотров 18K

image


Я люблю Redux


Именно благодаря Redux для меня началось путешествие в мир удивительного функционального программирования. И это первое из функциональщины, что я попробовал в production. Прошли те времена, когда я использовал DOM для хранения состояния и неуверенно манипулировал им с помощью jQuery.


Redux — это инструмент для управления состоянием приложения (state), который позволяет полностью отделить его от представления (view). Представление (view) становится производным состояния (state), которое предоставляет пользователю интерфейс для его изменения. Действия пользователя (actions) не изменяют состояние (state) напрямую. Вместо этого они попадают в редюсер (reducer). Это такая чистая функция, которая на основе предыдущего состояния (state) и действия (action) генерирует следующее состояние (state). Такой подход к обновлению данных во многом был вдохновлен архитектурой языка программирования Elm и концепцией однонаправленного потока данных Flux. Это, возможно, самая популярная JavaScript-библиотека для иммутабельного изменения состояния из тех, что существуют сегодня. Авторы Redux сфокусировались на решении одной единственной проблемы — управление состоянием приложения (state), и сделали это хорошо. Redux получился достаточно модульным, чтобы работать с различными библиотеками для отображения представления (view).


React использует аналогичный сфокусированный подход для представления (view), имеет эффективный виртуальный DOM, который можно подключить к DOM браузера, нативным мобильным приложениям, VR и прочим платформам.


Что бы создавать надежные, функциональные и легко отлаживаемые web-приложения, можно использовать React и Redux. Правда, потребуются вспомогательные библиотеки вроде react-redux и куча boilerplate-кода. А можно попробовать Hyperapp.

Читать дальше →
Всего голосов 51: ↑48 и ↓3 +45
Комментарии 39

Стек: анализируем значения параметров

Время на прочтение 8 мин
Количество просмотров 8.6K

Очень часто, глядя на стек падения, хочется увидеть, а с какими значениями параметров были сделаны вызовы. Под отладчиком в VisualStudio мы эти значения посмотреть можем. А как быть в случае, если программа запущена без отладчика и обрабатывает исключения самостоятельно? За ответами добро пожаловать под кат.
Читать дальше →
Всего голосов 40: ↑39 и ↓1 +38
Комментарии 4

Упрощаем лог действий пользователя

Время на прочтение 6 мин
Количество просмотров 11K

В предыдущих статьях мы сделали большое и доброе дело — научились автоматически собирать предысторию падения программы и отправлять её с крэш-репортом. Для WinForms, WPF, ASP, Javascript. Теперь научимся показывать все эти горы информации в удобоваримом виде.
Читать дальше →
Всего голосов 35: ↑33 и ↓2 +31
Комментарии 12

Противоестественная диагностика

Время на прочтение 10 мин
Количество просмотров 9.6K

Разбираться с падениями программы у конечных пользователей — дело важное, но довольно тяжкое. Доступа к машине клиента обычно нет; если есть доступ, то нет отладчика; когда есть отладчик, оказывается, что проблема не воспроизводится и т.п. Что делать, когда нет даже возможности собрать специальную версию приложения и установить её клиенту? Тогда добро пожаловать под кат!
Читать дальше →
Всего голосов 47: ↑47 и ↓0 +47
Комментарии 14

Собираем пользовательскую активность в JS и ASP

Время на прочтение 6 мин
Количество просмотров 6.6K
После написания функционала авторекордера действий пользователя, названного нами breadcrumbs, в WinForms и Wpf, пришло время добраться и до клиент-серверных технологий.

image
Начнем с простого — JavaScript. В отличии от десктопных приложений тут все довольно просто — подписываемся на события, записываем необходимые данные и, в общем-то, всё.
Читать дальше →
Всего голосов 34: ↑27 и ↓7 +20
Комментарии 0

Собираем пользовательскую активность в WPF

Время на прочтение 7 мин
Количество просмотров 10K
Недавно мы рассказывали о том, как можно логировать действия пользователей в WinForms приложениях: Оно само упало, или следствие ведут колобки. Но что делать, если у вас WPF? Да нет проблем, и в WPF есть жизнь!



В WPF не надо будет вешать никаких хуков и трогать страшный винапи, собственно за пределы WPF мы и не выйдем. Для начала вспомним, что у нас есть routed events, и на них можно подписываться. В принципе, это все, что нам надо знать, чтобы реализовать поставленную задачу :)
Читать дальше →
Всего голосов 39: ↑38 и ↓1 +37
Комментарии 20

Дашборд — что это и почему он будет вам полезен или современный способ сделать тайное явным

Время на прочтение 12 мин
Количество просмотров 261K


Наверное, мало кто из нас задумывался, что практически с рождения пользовался дашбордами. Мы получали некую информацию, анализировали, принимали решение или даже испытывали какие-то эмоции благодаря им. Да-да, градусник, измеряющий температуру, когда вы болели; часы; стрелка спидометра, перевалившая за 200 км/час (ну, это может быть не у всех) — все эти приборы по сути являются дашбордами или их элементом. Но мне бы хотелось рассказать об интерактивных аналитических дашбордах. И, самое главное — показать, что в наше время такие дашборды могут быть полезны каждому человеку, а не только крупным банкам или корпорациям.

Если у вас есть данные — не важно, домохозяйка вы с пачкой чеков от закупок продуктов, спортсмен с данными о пробежках из Strava или кто-либо ещё — вы сможете представить это наглядно, оценить важные показатели, в результате чего принимать более оптимальные решения.

Вы не используете дашборды и думаете, что вам это не нужно? Мнение может поменяться, а кругозор расширится, так как далее: что такое дашборды, какие цели достигаются с помощью них, ключевые понятия и сферы использования, существующие инструменты, множество ссылок на актуальные ресурсы по теме, а также реальный пример, как из обычных на первый взгляд данных, можно извлечь интересные знания…
Читать дальше →
Всего голосов 39: ↑36 и ↓3 +33
Комментарии 24

Оно само упало, или следствие ведут колобки

Время на прочтение 9 мин
Количество просмотров 18K

Вот задеплоили мы своё приложение, и, как правильные и опытные разработчики, не забыли вставить в него крэш-репортер. Получаем первые репорты, открываем стек, смотрим на окружение, пробуем воспроизвести, обламываемся и задаём в пространство вопрос «чем ты это сказал? а как так получилось-то?» Что же там пользователь сделал такого, что приложение завалилось?
Читать дальше →
Всего голосов 52: ↑48 и ↓4 +44
Комментарии 13

Drone CI в облаке AWS для DevExtreme

Время на прочтение 5 мин
Количество просмотров 5K

В этой статье я расскажу о том, как настраивал непрерывную интеграцию в Amazon AWS для репозитория DevExtreme.


Супер-коллаж от нашего дизайнера Димы


Уже несколько месяцев мы ведём разработку DevExtreme в открытом репозитории на GitHub. Непрерывная интеграция у нас с самого начала была построена на базе Docker, чтобы не зависеть от CI-платформы (будь то Travis, Shippable или что-то другое), но с момента публикации репозитория мы не выделялись и использовали для прогона тестов хорошо знакомый Travis CI. На GitHub у нас "бегает" только небольшая часть автоматических тестов, так сказать, первая линия, и возможностей Travis для техники Fork and Pull Request хватало.


Со временем коллеги начали сетовать на очередь из пулл-реквестов (но терпели). Мысль о том, что пора уже что-то предпринять, возникла в конце октября, когда на два дня Travis потерял связь с Docker Hub, а мы как раз готовились к beta-релизу DevExtreme 17.2.


Получив добро на эксперименты в корпоративном AWS-аккаунте, я решил дать второй шанс проекту Drone. Почему второй? Потому что мы его уже пробовали в процессе "обкатки выхода на GitHub". Тогда наш репозиторий был приватным, Drone был ещё более сырым, чем сегодня, и запускали мы его на временной наколеночной инфраструктуре, точнее на старых рабочих станциях, оставшихся после апгрейда рабочих мест (наш IT-отдел обещал их вот-вот забрать, но не торопился).

Читать дальше →
Всего голосов 29: ↑28 и ↓1 +27
Комментарии 11

Hello Logify, или мониторим ошибки на установленных приложениях

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

Самое главное, что, скорее всего, вам о них просто не сообщат. Как часто вы отправляли ошибки в Microsoft, когда вас об этом просили? :) Пользователи, как правило, либо просто перезапускают приложение, матерятся и продолжают пользоваться дальше, либо удаляют его полностью. Если вам повезет, и о падении вам сообщат, то зачастую это выглядит как-то так:



и это не вносит абсолютно никакой ясности в понимание проблемы. В результате у пользователей формируется негативный опыт от использования вашей программы, а вы не имеете никакой возможности что-то с этим сделать.
Читать дальше →
Всего голосов 39: ↑37 и ↓2 +35
Комментарии 33

Тайм-менеджмент для кинестетиков

Время на прочтение 6 мин
Количество просмотров 11K

Время — самый ценный ресурс, который у нас есть. Чтобы использовать его максимально продуктивно, существуют всякого рода техники тайм-менеджмента. Если говорить о тайм-менеджменте в масштабах рабочего дня, то одна из самых популярных техник называется Pomodoro. Но эта статья не про GTD, а про код (и немного про железо ^^).


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


Сегодня мы будем интегрировать клиент Tomighty с устройстовм "Большая Красная Кнопка". Нам для этого понадобится:


  • Большая Красная Кнопка (со светодиодом). У меня оказалась не очень большая, но очень красная.
  • ESP8266 — один из наиболее оптимальных микроконтроллеров по соотношению удобство/цена. Это даже не микроконтроллер вовсе, но как микроконтроллер он абсолютно прекрасен!
  • MicroPython. Я не знаю языка удобнее чем Python, а вы? Разве что Ruby, но его вроде бы не портировали на ESP8266.
  • Протокол MQTT для связи между компом и девайсом.
  • Visual Studio.
  • Опционально, расширение CodeRush for Roslyn. Оно сильно упрощает работу с как со своим, так и с незнакомым кодом.


Зачем? Чтобы получить опыт работы с чужим кодом. В связи с грядущим Hacktoberfest, этот скилл будет крайне актуален.


Welcome!

Читать дальше →
Всего голосов 22: ↑21 и ↓1 +20
Комментарии 7

О поддержке языковых фич C# в Visual Studio и в CodeRush for Roslyn

Время на прочтение 5 мин
Количество просмотров 7.1K

C# постоянно развивается. Весной вышла уже седьмая версия. В этой статье будет обзор поддержки последних фич C# в CodeRush for Roslyn. Про C# 7.0 уже было несколько публикаций на хабре, поэтому основное внимание именно на то, как это поддерживается в CodeRush for Roslyn.


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


Читать дальше →
Всего голосов 21: ↑19 и ↓2 +17
Комментарии 6

Возможности CodeRush for Roslyn для XAML

Время на прочтение 3 мин
Количество просмотров 3.6K

Редактировать XAML-разметку в Visual Studio достаточно удобно благодаря таким фичам как IntelliSense, автозакрытие тэгов, сворачивание тэгов. Но при реальной работе с этими фичами приходит понимание, что XAML в чистой студии достаточно обособлен: например, плохо отслеживаются связи между кодом и разметкой. Это не позволяет чистой студии делать многие полезные вещи, которые умеет делать студия c CodeRush for Roslyn. Под катом подробности...



Читать дальше →
Всего голосов 18: ↑16 и ↓2 +14
Комментарии 11

Использование SpreadsheetCloudAPI для написания приложений и облегчения жизни

Время на прочтение 4 мин
Количество просмотров 3.7K

Всем привет! Есть у нашей команды хобби — мы любим 3Д печать. И не просто любим, а активно печатаем все и вся — от простых игрушек на стол до деталек, которые даже в Китае не продаются. Каждый у нас в комнате хоть раз что-нибудь да напечатал.


image


В этой статье хотелось бы поделиться нашим опытом решения проблемы закупки пластика для принтера и как нам в этом помог сервис SpreadsheetCloudAPI. Подробности под катом.

Читать дальше →
Всего голосов 14: ↑14 и ↓0 +14
Комментарии 1

DevExtreme: теперь на GitHub и с бесплатной лицензией

Время на прочтение 3 мин
Количество просмотров 19K

У нас сразу две отличные новости. DevExtreme, наш набор компонентов для фронтенд-разработки, переехал на GitHub и стал доступен бесплатно для некоммерческого использования!


DevExpress 😍 GitHub


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


Вести разработку на GitHub — одно удовольствие. Механизм pull-реквестов с удобным code review — то, чего нам не хватало, пока мы жили во внутреннем Mercurial-репозитории. Теперь каждое изменение видят несколько пар глаз, что обеспечивает больший уровень прозрачности и позволяет процессам разработки плавно интегрироваться в методологии, принятые в команде (© SeOd).


В первые дни репозиторий выглядит пустовато, так как при импорте кода мы схлопнули историю коммитов. Но это продлится недолго! В дополнение к традиционным релизам, которые никуда не денутся, мы будем также оформлять Releases на GitHub и там же выпускать промежуточные pre-release и hotfix версии. Подписавшись на DevExpress/DevExtreme, например, с помощью сервиса Sibbell вы всегда будете в курсе наших последних новостей.

Читать дальше →
Всего голосов 48: ↑43 и ↓5 +38
Комментарии 9