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

Пользователь

Отправить сообщение

Транзакции в БД на Go с использованием многослойной архитектуры

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров1.4K

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

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

Работа в новой компании — это всегда увлекательно. Я осознал, что даже если какой-то аспект кажется простым, например, SQL-транзакции, его легко упустить из виду.

SQL кажется чем-то, что мы все хорошо знаем, и мало чем может удивить. (Ему уже 50 лет!) Возможно, пришло время пересмотреть подходы, так как мы уже прошли фазу хайпа по поводу NoSQL, и снова возвращаемся к “используйте просто Postgres”, а иногда и к “SQLite тут за глаза”.

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

Основной принцип многослойной архитектуры заключается в разделении критически важных частей кода (логики) от деталей реализации (например, SQL-запросов). Одним из способов достижения такого разделения является паттерн «Репозиторий». Однако, наиболее сложным аспектом такой архитектуры является обработка транзакций.

Читать далее
Всего голосов 8: ↑7 и ↓1+7
Комментарии7

Мемоизация в HMPL. DevBlog №1

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров311

В версии 2.1.3, помимо прочего, был введён новый функционал для улучшения производительности сайтов, использующих hmpl.js.

Мемоизация запроса - это один из отличнейших способов оптимизации в программировании. «Что это? Как оно работает?» - на эти вопросы я постараюсь ответить в данной статье.

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

Новый подход к безопасному управлению состояниями в Kotlin-приложениях

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

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

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

Читать далее
Всего голосов 6: ↑6 и ↓0+9
Комментарии0

Игры, которые помогают понять абстракции

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров4.7K

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

Читать далее
Всего голосов 10: ↑9 и ↓1+10
Комментарии15

Типы в программировании как математические множества

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров5.1K

Типы в программировании можно(и нужно) рассматривать как математические множества.

Мысль хоть и очевидная, но из моей головы давно выветрилась.

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

Читать далее
Всего голосов 12: ↑11 и ↓1+14
Комментарии23

Как жить и работать при нарушениях внимания?

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров26K

▍ Предисловие. Флейта хулуси


Щёлк — я обнаруживаю себя за просмотром ролика на YouTube, в котором музыкант рассказывает, как ухаживать за флейтой из сушёной тыквы. Как я оказался здесь?! Зачем? На мгновение я пугаюсь того, что не могу вспомнить, каким образом попал на этот ролик. Я ведь не планировал узнавать про эти флейты и вообще сел работать. Холодок пробегает по коже.

Пытаюсь размотать предысторию, пройти путь своих блужданий обратно. Листаю историю браузера и вижу, что это уже третий по счёту ролик, а до этого я был на вкладке с «Авито». И тут понимаю, как это произошло. Я сел работать и на мгновение решил заглянуть на сайт по продаже вещей, посмотреть, есть ли сообщения, и там залип на странице с предложенными товарами, среди которых была эта самая флейта. Мне стало интересно, я полез сначала на Википедию, потом на YouTube. Ну нужно же послушать, как она звучит… Вот небольшой пример того, как живётся людям с неустойчивым вниманием.


▍ Дисклеймер


Я ожидаю справедливого негодования от тех, кого раздражает использование психологических проблем для оправдания нытья, бездействия и как аргумента для просьбы о снисхождении к себе. Давайте сразу проведём чёткую границу между теми, кто ведёт себя инфантильно, сваливая ответственность на психологические расстройства. Таких людей я не одобряю и их незрелое поведение порицаю. По другую сторону этой черты будут те, кому осознание своих проблем помогает стать более адаптивными, спокойными и обрести опору в понимании происходящего с ними.
Читать дальше →
Всего голосов 101: ↑97 и ↓4+117
Комментарии149

Планируем потоки как Томас Джефферсон

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

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

Читать далее
Всего голосов 5: ↑5 и ↓0+8
Комментарии0

Разбираемся с сетевым программированием на Rust

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

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

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

Читать далее
Всего голосов 21: ↑12 и ↓9+10
Комментарии10

Просто не копируй это

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров40K

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

- bool LoadAnimation(str::string filename);
- void DrawLines(std::vector path);
- Matrix RotateObject(Matrix m, Angle angle);
- int DrawSprite(Sprite sprite);

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

Читать далее
Всего голосов 27: ↑23 и ↓4+29
Комментарии79

Паттерны применения многопоточности на коммерческом проекте (на примере Java)

Уровень сложностиСредний
Время на прочтение22 мин
Количество просмотров2K

После прочтения у вас сложится понимание того как работать с многопоточностью на реальном проекте

Список рассмотренных паттернов:

Запуск асинхронного процесса по сигнал
Параллельное выполнение задач без ожидания результата
Ограничение количества потоков для вызова внешнего сервиса
Выполнение Scheduled задач
Параллельное обращение к разным источникам, с последующим объединением результатов
Контекст
Ожидание асинхронного ответа

При этом в статье я намеренно не касался низкоуровневых механизмов, таких как synchronized, lock, volatile, барьеров (разве что semaphore), потому что они значительно реже применяются в работе

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

Самые опасные сетевые порты: как найти и закрыть все лазейки

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

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

Привет! Меня зовут Ваня, я ведущий инженер по информационной безопасности в Selectel. В этом материале разберу, какие порты наиболее интересны хактивистам и как быть в курсе актуальных уязвимостей. А в конце поделюсь чек-листом с планом действий при обнаружении открытых портов в своей инфраструктуре. Подробности под катом!
Читать дальше →
Всего голосов 45: ↑41 и ↓4+47
Комментарии26

Оконные функции простым языком — Фреймы

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров5.3K

Привет всем!

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

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

P.S. Если автор что-то не разобрал и не написал, значит он посчитал это не обязательным в рамках этой статьи :-)

Будем разбирать примеры на такой небольшой таблице, где указана прибыль (net_profit) компании на каждый месяц в рамках одного года.

Читать далее
Всего голосов 6: ↑5 и ↓1+6
Комментарии5

Koin: как сделать свой DI за 10 минут

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

Привет, меня зовут Иван Курак, я Android-разработчик приложения Ozon Job. В этой статье мы реализуем свой механизм, на котором построен Koin. Тем самым мы пройдём путь, который проходили его авторы при решении проблемы построения собственного DI.

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

Дополнительная (но от того не менее важная) цель статьи — показать, что базовый механизм, на котором построен Koin, не такой уж и страшный :)

Тестовый текст
Всего голосов 14: ↑14 и ↓0+20
Комментарии7

Как я познавал ci/cd, Гитхаб экшены

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

Гитхаб экшены, как я познавал ci/cd

   Всем Алоха. Все слышали про ci/cd, про то что он должен быть в каждой компании и то что он упрощает нам жизнь. У всех свой ci/cd. 

   Кто-то предпочитает Jenkins. Особенно если у вас куча микросервисов, команд и процессов, то при помощи Дженкинса можно достаточно гибко настроить ci/cd в компании. Кто-то использует GitLab actions и для каждого репозитория настраивает свои пайплайны и процессы. Достаточно удобно и просто настраиваемый механизм сборки и доставки артефактов на стенды. Не чуть не хуже GitHub actions. Это было открытием для меня что в GitHub появился такой функционал, о котором мы поговорим позже. Ну и конечно всеми «любимый» скриптовый ci/cd. Пачка скриптов, которые нужно выполнить в определенной последовательности чтобы собрать и задеплоить артефакты. Есть ещё так сказать хэнд мэнуал ci/cd. Но это особый вид извращения, с которым не пожелаю столкнуться никому. В котором нужно собрать артефакты у себя на машине и по какому нить ридми выполнять команды в терминале, лазить по ssh смотреть, что все копировалось, перезапускать сервисы и другие развлечения. 

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

Read more about GitHub Actions
Всего голосов 12: ↑12 и ↓0+12
Комментарии55

Как я управляю временем, чтобы все успевать: адская смесь Time Blocking, Pomodoro и дофаминовых циклов

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров41K

Привет! Я Женя, CPO в корпоративном мессенджере Compass. Было бы круто управлять временем, как в старенькой TimeShift, в которой я зависал в 2008 году, но нет. Зато можно поностальгировать, глядя на скриншоты.

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

Путь к нему оказался трудным и полным ошибок. До того, как я пришел к подходу, я попробовал несколько популярных методик контроля времени и внимания — ни одна не помогла, а иногда даже фрустрировали.

Поэтому мне пришлось подтянуть теорию и найти свое удобное решение.

Читать далее
Всего голосов 42: ↑37 и ↓5+40
Комментарии45

База джуна на Flutter

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров6.7K

Йоу, юзер! Данная статья будет являться вводной в серию статей о том, какой базой должен обладать разработчик для первой коммерции на Flutter. Интересно? Тогда ныряй в статью!

Нырнуть в статью
Всего голосов 20: ↑15 и ↓5+12
Комментарии10

ООП в Dart

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров2.3K

Йоу, юзер! Даннаястатья относится к циклу статей «База джуна на Flutter». Если ты не видел начальную ноду — ознакомиться можешь тут, а если уже видел — погнали дальше!

Okaaaay let's go!
Всего голосов 8: ↑5 и ↓3+4
Комментарии4

Как правильно писать тесты? Часть 1

Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров6.5K

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

Обсудим три базовых подхода к тестированию чего‑либо в программе:

Читать далее
Всего голосов 5: ↑2 и ↓3+3
Комментарии6

С 80-х по 2024-й: как создавались и оптимизировались CI-тесты

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

Современные команды разработки тестируют каждое изменение кода перед мержем. Это не просто общепринятая традиция: наряду с ревью кода, это стандарт по умолчанию, применяемый практически во всех кодовых базах компаний. Мы называем его тестами CI (непрерывной интеграции). В результате их внедрения среднестатистическая организация запускает сотни наборов тестов в день.

В прошлом непрерывное интеграционное тестирование было с нами не всегда, в отличие от обычного тестирования. По моим наблюдениям, CI — это результат того, что тестирование всё больше ускоряется. Разберёмся, как это произошло и как тестирование будет ускоряться дальше.

Читать далее
Всего голосов 11: ↑10 и ↓1+13
Комментарии0

Разбираемся с Redis

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

Этот материал представляет собой глубокое исследование всего, что связано с Redis. В частности — речь пойдёт о различных способах организации хранилищ Redis, о постоянном хранении данных, о форках процессов.

Читать далее
Всего голосов 46: ↑45 и ↓1+62
Комментарии7

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Software Developer, Application Developer
Middle
От 450 $
High-loaded systems
Kubernetes
Docker
PostgreSQL
C++
Rust
Algorithms and data structures
Flutter
Flutter Bloc
Redis