• Стоит ли переходить с Powershell DSC на Ansible и как это сделать

      Об IaC под Windows пишут мало, потому что DevOps/SRE ассоциируется в основном c Linux и Kubernetes. Мы решили исправить эту ситуацию и сравнить инструменты, которыми можно управлять IaC на базе Windows. Статья будет полезна разработчикам, которые работают с Windows-инфраструктурой и выбирают способы управления, и тем, кто уже внедрил Powershell DSC или Ansible, но сомневается в своем решении. Ниже поделимся опытом и расскажем:
      • как устроен Powershell DSC и чем он отличается от Ansible при управлении инфраструктурой на Windows;
      • почему мы перешли на Ansible;
      • с какими проблемами столкнулись и как их решали;
      • как соотносятся ожидания и реальность после перехода на Ansible;
      • кому стоит выбрать Powershell DSC, а кому — Ansible.
      Читать дальше →
    • Как с помощью нейросети определить лучшую дату отправки email и повысить доход рассылки в 8,5 раз

      Чтобы email-рассылка не затерялась во входящих, а клиенты чаще открывали письма и покупали, важно угадать правильное время отправки. С помощью нейросети мы проанализировали поведение клиентов и спрогнозировали дату отправки следующего email, чтобы порекомендовать клиенту товары в то время, когда он захочет их купить. Протестировали в зоомагазинах на рассылках с предложением повторной покупки и оценили результат с помощью AB-тестов. Получили следующие результаты:

      в 23 раза
      больше целевых отправок email с помощью нейросети по сравнению с триггером

      в 8,5 раз
      увеличился доход от email-рассылки по атрибуции last click

      в 2 раза
      уменьшился процент отписок

      в 17 раз
      выросло число открытий в абсолютном значении


      Ниже поделимся опытом и расскажем:

      • почему решили использовать LSTM-модель нейросети для предсказания даты отправки email вместо алгоритма градиентного бустинга;
      • как устроена LSTM;
      • какие данные нейросеть использует для обучения;
      • какую архитектуру нейросети использовали и с какими сложностями столкнулись;
      • каких результатов достигли и как их оценивали.
      Читать дальше →
    • Рост 100% в год и 400 тыс. RPM. Эволюция разработки 2018—2020: процессы, люди, техника и планы

        Mindbox — два миллиона строк кода b2b бизнес-логики под нагрузкой. Наши продукты: CDP, программа лояльности, персонализация сайта, транзакционные и массовые рассылки — критичные по надежности и скорости работы элементы инфраструктуры бизнеса.

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

        Это — третий ежегодный пост про разработку по итогам черной пятницы — недели максимальной нагрузки. Почему наконец думаем, что мы молодцы; что для этого сделали; почему столкнулись с трудностями и что планируем делать дальше.
        Читать дальше →
      • Data Science в обувном магазине: предсказали поведение клиентов и увеличили конверсию сайта на 16%

        Российский производитель обуви Mario Berluchi автоматизировал маркетинг, внедрил привычные для интернет-магазинов механики, но не остановился на этом и запустил направление Data Science. Теперь магазин с помощью алгоритмов машинного обучения предсказывает действия клиента: что он сделает после добавления товара в корзину — купит или уйдет, а если уйдет, то когда вернется.

        Предсказание помогает в нужный момент побуждать клиента к покупке или, наоборот, не трогать его, если он купит и так. В рамках AB-теста механика персонализации сайта на основе предсказания помогла увеличить конверсию интернет-магазина на 16,5% и ARPU на 35,7% относительно контрольной группы.

        Азамат Тибилов, директор по маркетингу Mario Berluchi, рассказывает о механике с предсказанием, измерении результатов, истории запуска направления Data Science и делится советами для интернет-магазинов, которые тоже хотят растить выручку за счет полезного и основанного на данных маркетинга.

        Mario Berluchi — российский производитель обуви, сумок и аксессуаров с пятью офлайн-магазинами в Москве и онлайн-магазином.

        Масштаб. 200 тысяч посетителей сайта в месяц.

        ИТ. Сайт на Bitrix, бэк-офис на «1С», платформа клиентских данных Mindbox.

        Задача. Повысить выручку за счет работы с накопленными данными.

        Результат. Рост конверсии сайта на 16,5% в рамках AB-теста, рост ARPU на 35,7%, снижение доли брошенных корзин на 17,2%.

        Читать дальше →
      • Открыт набор в Школу разработчиков с перспективой стажировки в Mindbox

          Школа разработчиков — первый шаг к стажировке в Mindbox. Программа предназначена для студентов 3–4 курса и выпускников технических вузов с базовыми навыками программирования.
          Первый набор Школы стартует 6 сентября, курс разбит на 8 занятий по 4–5 часов.

          Чтобы записаться, оставьте контактные данные — пришлем тестовое задание, рассчитанное на два часа. Но сначала убедитесь, что обучение в Школе разработчиков Mindbox — это то, что вам нужно. Все подробности — под катом.

          Читать дальше →
          • –3
          • 2,1k
          • 7
        • Черная пятница: взгляд на нагрузку глазами разработчика

            Прошлой весной мы начали каждую пятницу страдать от массовых рассылок: письма копились в очереди и уходили с большим опозданием. Это были обычные серые пятницы. Уже тогда, за полгода до черной пятницы, стало понятно, что осенью будет непросто. Пришлось масштабироваться. Рассказываю, как всё прошло.

            Читать дальше →
          • Как мы разрабатываем персональные товарные рекомендации

              image
              Наши клиенты-магазины хотят делать крутой маркетинг. Чтобы люди больше покупали, они регулярно шлют им email-рассылки. И каждый раз думают: “Что же написать в письме?”.




              Можно писать просто: “Покупайте у нас почаще!”, но это не очень-то работает. Идея получше — вставлять в письмо рекламу товаров. Желательно, рекламу товаров, которые заинтересуют покупателей.


              Дальше расскажу о том, как мы с нуля делали настоящие персональные рекомендации.

              Читать дальше →
            • Как вызвать перемены при помощи ретроспективы

                Ретроспектива — сложный формат совместной работы группой, содержащий элементы брейншторма (совета), коачинга и обратной связи.


                Регулярные ретроспективы вызывающие изменения снизу — важнейший признак организовавшейся живой команды.


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


                Для проведения ретроспективы желателен опытный фасилитатор. Особенно это важно в стартующих командах.


                Если вы такой человек и хотите углубить ретро, в статье вы найдете советы и оригинальный взляд на эту встречу с т.ч. работы мозга и цели стимуляции личностного роста участников.


                Цель


                Распространено мнение, что цель ретроспективы — улучшить работу. Это упускает ключевую деталь — самостоятельность. Считаю, цель ретроспективы — чтобы команда сама улучшила свою работу.


                А значит цель — изменение людей. Т.е. ретроспектива, это чуть-чуть психотерапия. Нужно создать новые привычки, изменить взгляд на что-то, продать всем изменения, а не просто придумать новые инструкции.


                Для контроля инструкций нужен менеджер. А автономная команда должна сама их контролировать, что требует принятия решений членами команды на личностном уровне.


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

                Читать дальше →
                • +12
                • 5,1k
                • 8
              • Как мы написали еще один алгоритм RFM-анализа

                  КДПВ Недавно мы рассказали, почему придумали свой RFM-сегментатор, который помогает сделать RFM-анализ за 20 секунд, и показали, как использовать его результаты в маркетинге.


                  Теперь рассказываем, как он устроен.


                  Читать дальше →
                  • +8
                  • 10,6k
                  • 2
                • RFM-анализ одной кнопкой или как мы облегчили клиентам жизнь

                    image
                    С тех пор как в компании Mindbox впервые произнесли Machine Learning, общей целью стала Большая Зеленая Кнопка. Это такая кнопка во весь экран, при нажатии на которую всё работает само и приносит прибыль.


                    В аналитическом проекте «RFM» цель менее амбициозная — Маленькая зеленая кнопка. Нажимаешь, и база автоматически делится на сегменты, по которым запускается отправка писем (например).




                    Чтобы добиться цели, мы написали автоматический RFM-сегментатор и разработали специальный отчет, чтобы наглядно представлять результаты.


                    Рассказываем, как это все случилось и почему теперь можно обойтись без аналитиков уделять больше времени менее тривиальным задачам .

                    Читать дальше →
                  • Немного о ретроспективе

                      Для команды разработки важно регулярно проводить ретроспективу, чтобы постоянно совершенствоваться. Но какой она должна быть?

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

                      • на ретро тратили по 2 часа и сильно выматывались
                      • обсуждения периодически уходили в затяжные бесполезные споры
                      • некоторые мелкие проблемы не успевали решить и постоянно переносили на следующее ретро
                      • отдельным членам команды надоедали ретроспективы из-за однообразия

                      Первую и вторую проблему мы считали данностью, что делать с третьей не понимали, а о последней я даже не знал.

                      Прошлой весной я сходил на Okademy от ScrumTrek. Это обширный курс, включающий в себя много полезного для скрам-мастера, но для меня самым полезным оказалась часть о том, как эффективнее проводить ретроспективы. Хочу рассказать, как это нам помогло.

                      image
                      Читать дальше →
                    • Одних тестов недостаточно, нужна хорошая архитектура

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

                        В статье я постарался описать одну из проблем, которую может решить хорошая архитектура: связанные участки кода могут разъезжаться между собой, это может приводить к багам, и тесты тут не спасут. А грамотный дизайн может помочь.
                        Читать дальше →
                      • Проектирование и разработка шаблонного движка на C# и ANTLR

                          Предыстория


                          Уже много лет мы помогаем нашим клиентам отправлять потребителям хорошие, информативные и человеческие письма. В них вместо сухого “Добрый день” мы пишем “Здравствуйте, Никита!”, а вместо “Ваш баланс пополнился” сообщаем “вы получили 25 баллов”. Но маркетологи становятся все изобретательнее, и современное письмо от интернет-магазина должно выглядеть так:


                          В реальной жизни всего этого на порядок больше в каждом письме


                          И мы хотим уметь генерировать такие письма автоматически.

                          Читать дальше →
                        • Про опыт обучения в OKademy

                            Вместо вступления


                            Всем привет. Делюсь впечатлениями от обучения в школе скрам-мастеров от ScumTrek, под хабракатом шесть страниц текста моих мыслей и впечатлений по этому поводу. Велкам.

                            Читать дальше →
                          • Трансляция запросов в SQL с использованием LinqToSql в тестах

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

                              В продукте примерно 700 000 строк кода со всеми кастомизациями, и на это всё мы имеем около 7 000 тестов, и их количество постоянно растёт. За счет них мы не боимся совершать большие рефакторинги, затрагивающие многие части системы. Но, к сожалению, тесты не панацея. Каких-то тестов может не быть, какие-то тесты могут оказаться слишком дорогими, а какие-то ситуации не воспроизводятся в тестовой среде.

                              Практически каждая транзакция в нашей системе связана с работой с MS SQL с использованием LinqToSql. Да, технология старенькая, но мигрировать с неё нам довольно сложно, и по бизнесу она нас вполне устраивает. Более того, как я уже писал раньше, у нас даже есть свой форк LinqToSql, где мы чуть-чуть чиним его баги и добавляем кое-какой функциональности.

                              Для того, чтобы делать запросы к БД, используя LinqToSql, нужно использовать интерфейс IQueryable. В момент получения Enumerator’а или выполнения Execute у QueryProvider’а построенное дерево выражений с помощью Extension-методов к IQueryable транслируется в SQL, который и выполняется на SQL Server.

                              Так как наша бизнес-логика сильно завязана на сущностях в базе данных, наши тесты много работают с базой данных. Однако в 95% тестов мы не используем реальную базу, так как это очень дорого по времени, а довольствуемся InMemoryDatabase. Она является частью нашей тестовой инфраструктуры, о которой можно написать отдельную статью, и на самом деле представляет из себя просто Dictionary<Type, List> для каждого существующего типа сущности. В тестах наш UnitOfWork прозрачно работает с такой базой, давая доступ к EnumerableQueryable, который просто получить из любого IEnumerable, вызвав у него AsQueryable().

                              Покажу пример теста для понимания происходящего:
                              Читать дальше →
                            • Как оценивать большие задачи

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

                                image
                                Читать дальше →
                              • Webpack в Visual Studio для больших солюшенов

                                  КПДВ У нас в солюшене 51 проект. В 10 из них используется TypeScript. Объем минимизированного JavaScript-кода ~1 MB. TypeScript-код одних проектов зависит от кода других проектов. Для многих React-компонентов используются глобальные переменные.


                                  Все вместе это приводит к долгим часам отладки front-end кода. Чтобы упростить себе жизнь, мы внедрили Webpack. А по пути отловили грабли.


                                  TL;DR


                                  1. Устанавливаем node 7 + npm
                                  2. Выполняем в консоли npm i -g webpack typescript
                                  3. Устанавливаем Webpack Task Runner
                                  4. Добавляем webpack.config.js
                                    в папку "основного" проекта
                                  5. Добавляем webpack.config.part.js
                                    в папку каждого зависимого проекта
                                  Читать дальше →
                                • Как мы перестали бояться тикетов на UI

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

                                    Зачем всё это


                                    Мы — маленькая компания, наш штат составляет порядка 50 человек, 20 из которых разработчики. Сейчас у нас 4 команды разработки, в каждой из которых сидит по 5 fullstack разработчика. Но одно дело называть себя fullstack-разработчиком, а другое — действительно хорошо разбираться в тонкостях работы SQL Server'а, ASP.NET, разработке на C#, OOP, DDD, знать HTML, CSS, JS и уметь этим всем разумно пользоваться. Конечно каждый разработчик тяготеет к чему-то своему, но все мы, так или иначе, специалисты именно в разработке на .NET и 90% кода мы пишем на C#.
                                    Наш продукт — система автоматизации маркетинга, — подразумевает большой объем настроек для каждого конкретного клиента. Для того, чтобы наши менеджеры могли заниматься настройкой продукта под клиентов, есть административный сайт, в котором можно заводить рассылки, создавать триггеры и другие механики, кастомизировать сервисы и многое другое. Этот административный сайт содержит много различного нетривиального UI'а, и чем более тонкие моменты мы даём настраивать, чем большее количество фич мы выпускаем в продакшн, тем более интересным UI становится.
                                    Читать дальше →
                                  • 40 ключевых концепций информационных технологий доступно и понятно

                                    • Перевод
                                    Представляю вашему вниманию перевод очень ёмкой, и в то же время достаточно краткой (для такого масштаба проблемы) статьи Карла Чео. Я решил, что очень хочу сделать её перевод практически сразу, как только начал читать, и очень рад, что в итоге сделал это.
                                    Для того, чтобы сделать обучение более веселым и интересным, представляю вам перечень важных теорий и концепций информатики, объяснённых с помощью аналогий с минимальным количеством технических деталей. Это будет похоже на очень быстрый курс информатики для всех с целью просто дать вам общее представление об основных концепциях.

                                    Важные замечания:
                                    • Пункты с неуказанным источником написаны мной самостоятельно. Поправьте меня, если вы заметите какие-то неточности. Предложите лучшую аналогию, если это возможно.
                                    • Заголовки ссылаются на соответствующие им статьи в Wikipedia. Пожалуйста, читайте эти статьи для более серьезных и детальных объяснений.
                                    • Аналогии — отличный способ объяснить материал, но они не идеальны. Если вы хотите по-настоящему понять перечисленные концепции, вам следует начать с фундаментальных азов и рассуждать, исходя из них.

                                    Также зацените эту инфографику (вариант на русском), если вы просто начинающий программист.
                                    Читать дальше →
                                  • Типичные взаимные блокировки в MS SQL и способы борьбы с ними

                                      Чаще всего deadlock описывают примерно следующим образом:
                                      Процесс 1 блокирует ресурс А.
                                      Процесс 2 блокирует ресурс Б.
                                      Процесс 1 пытается получить доступ к ресурсу Б.
                                      Процесс 2 пытается получить доступ к ресурсу А.
                                      В итоге один из процессов должен быть прерван, чтобы другой мог продолжить выполнение.
                                      Но это простейший вариант взаимной блокировки, в реальности приходится сталкиваться с более сложными случаями. В этой статье мы расскажем с какими взаимными блокировками в MS SQL нам приходилось встречаться и как мы с ними боремся.


                                      Читать дальше →

                                    Самое читаемое