Pull to refresh
6
0
Alexander Kardapolov @akardapolov

User

Send message

Best practices в Code Review

Reading time6 min
Views16K

Правильный процесс ревью кода — это процесс итеративного улучшения продукты и контроля.
Контроля того, что:
1) Cоблюдены общие правила и договорённости
2) Решение не избыточное и масштабируемое.
3) Решение покрывает все критерии приемки указанные в описании к задаче

Для начала будет хорошо задать в своей команды такие вопросы:
1) Сколько времени занимает ревью кода для средней (сферической в вакууме) задачи
2) Как вы минимизируете время ревью?
3) Как вы определяете, что ревью конкретной задачи сделано правильно?

Читать далее
Total votes 18: ↑18 and ↓0+18
Comments18

Ваши процессы попахивают. Как это понять и что делать?

Reading time13 min
Views22K

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

Читать далее
Total votes 42: ↑40 and ↓2+55
Comments17

Транзакционное юнит-тестирование приложений с БД

Reading time6 min
Views9K

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

В этой статье я хочу провести обзор разных способов юнит-тестирования приложения с БД и рассказать о способе, который я не видел в русскоязычном сегменте интернета. Статья будет посвящена Python 3, pytest и ORM-фреймворку SQLAlchemy, но методы переносимы на другие инструменты.
Читать дальше →
Total votes 44: ↑44 and ↓0+44
Comments28

Недорасшифрованные письменности Крита, Кипра и филистимлян. Часть 1: Прорыв

Reading time14 min
Views12K

Текст написан иностранным агентом – лицом, проживающим за пределами России (в Канаде). Иллюстрации взяты из открытых источников - если не указано иное, из Википедии.

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

Это хорошо видно на примере изучения древних письменностей острова Крит, из которых была дешифрована только одна – наиболее позднее Линейное письмо В (и то не до конца). Что же касается более ранних надписей, то тут есть многочисленные нюансы…

Читать далее
Total votes 53: ↑52 and ↓1+70
Comments16

Как заманить сотрудников обратно в офисы? Уже никак

Reading time4 min
Views41K

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




Идёт месяц за месяцем, и Великое увольнение продолжает свою поступь по США [в России ситуация чем-то схожа / прим. перев.]. Некоторые считали, что люди потянутся обратно в офисы после того, как в США им прекратят раздавать щедрое пособие по безработице. А вот и нифига. Прошло уже много месяцев после того, как в республиканских штатах прекратили раздавать людям по $300 в неделю, а назад в офисы никто не торопится. И тому есть множество причин. Люди не хотят заразиться короной. Людям надоела плохая работа. Они решили раньше выйти на пенсию. А одна из причин – боссы думают, что смогут заставить квалифицированных работников вернуться в офисы.

Повторюсь: этого уже не произойдёт. Талантливые люди высокой квалификации, такие, как большинство технарей, не вернутся в традиционные офисы. Но вам не обязательно верить мне на слово – посмотрите сами на цифры.
Читать дальше →
Total votes 75: ↑70 and ↓5+93
Comments276

LJV: Чему нас может научить визуализация структур данных в Java

Reading time26 min
Views29K

Эта статья является пересказом моего доклада на Java-конференции SnowOne 2021 года. LJV — проект, созданный в 2004 году как инструмент для преподавания языка Java студентам. Он позволяет визуализировать внутреннее устройство структур данных. В этом докладе я запускаю LJV на разных структурах (от String до ConcurrentSkipListMap) в разных версиях Java и разбираю, что там внутри, как оно менялось от версии к версии, и как это всё работает.


image

Читать дальше →
Total votes 85: ↑85 and ↓0+85
Comments11

Теорема Байеса: просто о сложном

Reading time8 min
Views62K

В этой статье мы рассказываем об основах и применении одного из самых мощных законов статистики - теоремы Байеса. 

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

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

Читать далее
Total votes 18: ↑16 and ↓2+17
Comments5

Bitrix и Kafka: настраиваем интеграцию с брокером очередей

Reading time8 min
Views7.2K

Привет! Меня зовут Саша Шутай, я тимлид в AGIMA. В прошлой статье я рассказывал, что делать, если на проекте Bitrix сожительствует с Vue.js и поисковые боты не видят контента сайта. А в этой помогу разобраться, как на Bitrix-проекте произвести интеграцию с брокером очередей Apache Kafka, почему этот вариант кажется мне более удобным, чем привычная система очередей в RabbitMQ, и как это можно подвязать на автотесты, не отправляя тестовые сообщения в продюсера.

Читать далее
Total votes 22: ↑20 and ↓2+18
Comments6

Как жить без документации. Если бы реальность тестировщика была сюжетом аниме

Reading time5 min
Views12K

Наверное, любой тестировщик хоть раз в жизни слышал фразу «‎Тестирование нужно начинать как можно раньше»‎. И это правда. Чем раньше у отдела качества появится информация о проекте, тем меньше вероятность пропуска логических ошибок. Но жизнь — не сказка, и очень часто продукт попадает в руки тестировщика на предпоследнем этапе. Разумеется, и так можно работать, и весьма продуктивно. Но что делать в ситуации, когда отдел QA еще и не получает информации, ибо ее попросту нет. Весь проект в голове лида/менеджера, там все стройно, четко, красиво. Но как только он порционно выдает задачи команде, начинается то, о чем я хочу рассказать. Поэтому давайте попробуем поднять ставки и погрузиться в фантастическую вселенную, где каждая ошибка фатальна.

Погрузиться в мир
Total votes 4: ↑0 and ↓4-4
Comments5

Нарастающий итог в SQL с разрывами в данных

Reading time6 min
Views13K

Ранее мы рассмотрели способы расчёта нарастающего (накопительного) итога в SQL. Самый распространённый вопрос - как посчитать тоже самое, но на данных с разрывами? После написания исходной статьи мне его задавали неоднократно – так что есть смысл написать об этом отдельно.

Читать далее
Total votes 10: ↑10 and ↓0+10
Comments9

Spring AOP: как работает проксирование

Reading time6 min
Views50K

Четкое разделение бизнес логики с другими сквозными задачами является обязательным условием для создания чистого и читабельного кода. И говоря о сквозных задачах я имею ввиду управление транзакциями, безопасность и прочие важные задачи, которые хоть и не относятся к бизнес логике напрямую - но оказывают существенное влияние на работу приложения в целом. В случае "жесткого связывания" основной логики и подобных задач - мы можем получить кучу проблем в случае ошибки последних. АОП, собственно, и нацелено на решение подобных задач.

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

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

Читать далее
Total votes 4: ↑4 and ↓0+4
Comments8

Миграция Spring Boot приложения на Java 17 — сложный путь: День 2

Reading time17 min
Views7.5K

Добро пожаловать в статью о миграции приложения Spring Boot на Java 17.

В первый день мы пытались использовать Java 17 со Spring Boot и завершили день компиляцией нашего кода и зелеными юнит тестами.

В этом посте мы рассмотрим миграции: Spring Cloud, Spring Data, Spring Kafka

Читать далее
Total votes 7: ↑6 and ↓1+7
Comments2

Я написал более быстрый алгоритм сортировки

Reading time34 min
Views45K

Может показаться откровенной наглостью в наши дни утверждать, что Вы изобрели алгоритм сортировки, который на 30% быстрее, чем лучший существующий. Увы, я должен сделать гораздо более наглое заявление: я написал алгоритм сортировки, который в два раза быстрее, чем std :: sort для многих входных данных. И за исключением случаев, когда я специально конструирую воспроизведение нахудших для него ситуаций, алгоритм никогда не бывает медленнее, чем std :: sort (и даже когда попадаются эти худшие случаи, они обнаруживаются и происходит автоматический возврат к std :: sort).

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

Читать далее
Total votes 44: ↑41 and ↓3+55
Comments36

Старое доброе ООП: решаем тестовое задание

Reading time48 min
Views14K


Да, это еще одна статья, вызванная к жизни все тем же тестовым заданием, про решение которого я уже писал. И которое, вообще-то, объективно не заслуживает такого внимания, но так получилось, что меня оно зацепило. Еще когда я разбирался с крутым решением этого задания во второй посвященной ему статье, меня никак не оставляла в покое мысль — а как решить его, чтобы, с одной стороны, не "на отвали" (как в исходной статье), а с другой — без монад и goto, как в крутом решении во второй статье. И тогда я вспомнил про старое доброе объектно-ориентированное программирование (ООП), про те далекие времена, когда я писал сервисы для Windows на Delphi и подумал: а не написать ли мне решение именно в духе того старого доброго ООП. Я подумал — и я написал. И как ненастоящий программист, не обязанный писать код по долгу службы, но пишущий код исключительно ради своего удовольствия, я решил поделиться и кодом, и удовольствием (если получится) с читателями.


Я не обещаю в этом решении сократить объем кода, используя крутые сторонние библиотеки, или увеличить его производительность крутой оптимизацией под JIT. Я просто хочу продемонстрировать, как можно решить эту задачу, используя старую добрую объектно-ориентированную парадигму, без монад и без goto, руководствуясь здравым смыслом (ну, и небольшим объемом знаний). И как при этом можно написать код — легко* читаемый (* — если вы привыкли использовать ООП) и легко расширяемый, без сторонних библиотек, и оптимизировать его чисто на алгоритмическом уровне, без помощи тонких настроек JIT.


Итак, кому интересно решение этого неинтересного тестового задания в духе старого доброго ООП, и кто не забыл ещё (но уже осилил), что означает ключевое слово virtual — добро пожаловать под кат.

Читать дальше →
Total votes 5: ↑3 and ↓2+3
Comments15

Как обучить джунов QA за 3 дня (сборник материалов)

Reading time5 min
Views168K

Чему нужно обучить junior QA, чтобы он начал приносить пользу проекту? Конечно, было бы здорово «всему и сразу», но это может затянуться надолго. А вот с основами тестирования можно познакомить буквально за пару-тройку дней. Особенно если это фулл-тайм дни (рабочее время).

Я обучаю новичков больше 6 лет, больше тысячи людей выпустила, книгу вот написала. И на опыте студентов вижу, что «план-минимум» на самом деле небольшой.

Если перед вами стоит задача «завтра выйдут два джуниора, обучи их», начните с основ. Один из вариантов: 

дали посмотреть видео или прочитать статьи;

собрались вместе в переговорке или зуме, обсудили;

дали ДЗ на закрепление материала;

через три дня получили более-менее адекватного джуна, профит!

В этом посте я собрала ссылки в помощь по каждой теме:

видео — варианты из публичного доступа. Выбираете то, что больше по душе, отдаете падаванам;

статьи — даете как дополнительный материал.

В итоге затраты на подготовку — меньше, а польза от новичков — быстрее.

Читать далее
Total votes 23: ↑19 and ↓4+17
Comments26

Кэш первого уровня JPA и Hibernate

Reading time5 min
Views16K

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

В терминологии JPA кэш первого уровня называется Persistence Context, и он представлен интерфейсом EntityManager. В Hibernate кэш первого уровня представлен интерфейсом Session, который является расширением к JPA EntityManager.

Читать далее
Total votes 9: ↑4 and ↓5-1
Comments3

Инструменты тестирования Java: 10 лучших практик написания тест-кейсов

Reading time10 min
Views23K

О чем рассказывается в этой статье:

Станьте экспертом в разработке Java - научитесь тестировать
Почему программистам важно разбираться в Java тестировании?
Методы тестирования для Java
Почему модульное тестирование так важно?
Фреймворки модульного тестирования для Java
Как написать тест-кейс JUnit
С помощью автоматизации модульное тестирование становится лучше
Сделать тестирование Java проще и легче с помощью искусственного интеллекта
Тестирование безопасности в Java
Выводы о Java тестировании

Читать далее
Total votes 5: ↑3 and ↓2+1
Comments2

Почему никто не понимает REST

Reading time5 min
Views53K

Современное представление о REST сильно отличается от концепции архитектурного стиля, описанной в диссертации его создателя, Роя Филдинга. В этой статье разберемся, как ограничения REST понимал их автор.

Читать далее
Total votes 26: ↑21 and ↓5+20
Comments26

Что такое сборщик продукта

Reading time19 min
Views25K

Когда вы Когда вы открываете любой сайт — например, google или facebook, вы видите конечный продукт. Но чтобы этот продукт увидеть, и пощупать, нужно:

1. Написать код приложения

2. Собрать проект

3. Поднять его на сервере приложения

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

Читать далее
Total votes 19: ↑14 and ↓5+13
Comments14

Автоматическое создание changeSet'ов Liquibase из Java entity

Reading time6 min
Views10K

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

Каждый раз при добавление или изменение Entity, мы должны добавить новый changSet. Но что если я скажу, что есть плагин, который сам создает changeSetы на основе нашей Entity и уже существующей структуры базы данных?

Нам понадобится java, spring, gradle и liquibase plugin.

Начальные данные

Для начала нужно создать проект и пару простых Entity.

В файл build.gradle добавляем плагин:

plugins {
id 'org.liquibase.gradle' version '2.0.4'
}

Можно так же указать в переменных файл

liquibase {

activities {

main {

changeLogFile "$buildDir/generated-migrations.yaml"

url database.getProperty("dbUrl")

username database.getProperty("dbUsername")

password database.getProperty("dbPassword")

referenceUrl 'hibernate:spring:entity?dialect=org.hibernate.dialect.PostgreSQL10Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy'

logLevel 'debug'

}

runList = "main"

}

}

Читать далее
Total votes 3: ↑3 and ↓0+3
Comments8

Information

Rating
Does not participate
Location
Екатеринбург, Свердловская обл., Россия
Date of birth
Registered
Activity