Персональный блог одного разработчика

Разработка, внедрение, эксплуатация и вот это вот всё.

Кому с Redux жить хорошо

После почти трёхлетнего молчания, у меня есть новый материал. Эту статью я написал для корпоративного блога компании ManyChat на Хабре. Спустя некоторое время, могу опубликовать и у себя в оригинальной редакции.

Существует мнение, что разработка через тестирование, или по канонам Test Driven Development (TDD) для фронтенда не применима. В данной статье я постараюсь развенчать этот миф и покажу, что это не только возможно, но и очень удобно и приятно.

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

Читать целиком


ACID Транзакции и MongoDB

Летом 2018 года (т.е. прямо сейчас, на момент написания данной статьи) случилось невероятное — в MongoDB завезли честные ACID транзакции. С выходом четвёртой версии этой документ-ориентированной СУБД, её можно использовать для чуть более серьёзных приложений.

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

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

Читать целиком


Мой подход к тестированию. Часть вторая

В первой статье цикла о тестировании, которая вышла почти два года назад, я описал свой подход к тестированию, который был актуален в 2016 году. Время идёт, всё изменяется, стандартная библиотека Go становится лучше и вот пару-тройку мажорных версий назад в пакете testing появился новый метод Run(), который позволяет запускать именованные подтесты. Теперь Гоблина можно отправить обратно в пещеру и уменьшить число зависимостей проекта.

Читать целиком


Двойной API для асинхронных функций

Когда пишешь публичные асинхронные методы на JavaScript, желательно придерживаться двух простых правил:

  1. Если метод может вернуть ошибку в колбэке, то ошибка должна идти первым аргументом. Часто, даже если метод никогда не возвращает ошибку, первым аргументом передают null для того, чтобы унифицировать все асинхронные вызовы;
  2. Если в метод не передана колбэк-функция, то метод должен вернуть Promise.

Читать целиком


Мой подход к тестированию. Часть первая

Сколько бы «в прошлой жизни» я не пытался заставить себя писать тесты, получалось довольно плохо. Точнее, оно получалось, но как-то всё хромало, как у Винни-Пуха правильнописание. Казалось, что быстрее и проще потыкать в браузере, или клавиши понажимать, проверить, а дальше просто будет работать.

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

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

Читать целиком


Версионирование go программ

Читая новости на отличном ресурсе по Go, наткнулся на статью Дейва Чени Гоферы, тэгируйте свои релизы. Вкратце, там говорится о полезности тэгов к комитам пакета в git репозитории, а так же о том, что при указании версии, стоит обратить внимание на формат SemVer 2.0.0.

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

Читать целиком


Прокаченный таймер на Go

У языка Go шикарная стандартная библиотека, инструменты на все случаи жизни, при этом достаточно лаконичные. Например, рассмотрим отличный пакет time. За всё время работы с Go, мне всего лишь дважды приходилось расширять его возможности.

Первый раз, около года назад, понадобилось строковое представление времени и периодов на русском языке, что привело к созданию пакета russian-time. Он не очень красивый, создан на скорую руку, потому не буду на нём останавливаться.

Второй инструмент мне кажется более интересным. Предпосылкой к созданию этого небольшого пакета, была необходимость контроля времени выполнения скриптов во встроенном интерпретаторе JavaScript Google V8. Так уж повелось, что JavaScript, как правило, характеризуется асинхронным поведением, что несколько затрудняло выполнение поставленной задачи. Одним из компонентов решения должен был стать таймер, который можно приостанавливать на неопределённое время, а после запускать снова с момента остановки. Так появился timer.

Читать целиком


go-logger – простой и информативный логгер для Go

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

Читать целиком


Amigo – лучший друг Golang и Asterisk

Начиная писать свой первый Peach Dialer, я выбрал язык, который довольно хорошо знал, благо работал с ним с 1999 года — PHP. Меня не смущало, что он, в принципе, не предназначен для создания долгоживущих процессов, но то, что получилось в итоге, работает по несколько месяцев и радует своих владельцев.

Потом пошла мода на Websocket, который захотелось применить в интерфейсе, а PHP в то время не очень-то умел с ними работать (может, и сейчас не умеет). Я обратил внимание на node.js. Классная штука, любовь на века, подумал я, но вскоре захотелось большего.

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

Итак, по сусекам поскребя, да по амбару пометя́, испёк я Amigo — удобную библиотеку для работы с астериском посредством AMI протокола.

Читать целиком


Шаблонизатор экселя для Go

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

Сервер написан на Go, поэтому первым делом я принялся изучать что уже придумано умными людьми для решения подобных задач. Оказалось, что совсем не много. Обсуждения, в основном, скатываются в область — есть решения на Яве, используйте их. Неее, не для того мы на Go пишем, чтобы за собой Яву тянуть.

Читать целиком