Как стать автором
Обновить
21
Карма
0
Рейтинг
Игорь Манушин @imanushin

User

Компилируем Kotlin в Runtime

Время прочтения 14 мин
Просмотры 5.7K
Блог компании Технологический Центр Дойче Банка Java *Компиляторы *Kotlin *
🔥 Технотекст 2020

Привет, хабр!


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


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


В качестве задачи можно взять относительно популярную вещь — мы сделаем некоторое подобие AOP для разбора ответов от базы данных. Таким образом, программист сможет разметить атрибутами свой код, а мы сгенерим и скомпилируем рабочий оптимизированный код сразу в runtime. Однако на самом деле, область применения подобной тактики намного шире: можно делать программируемую конфигурацию, можно оптимизировать существующий код (за счет замены условий на заранее подсчитанные значения, которые уже не изменятся). Ну и, конечно же, можно избежать копипаста даже в тех случаях, когда выразительности языка недостаточно, чтобы выделить обобщенный кусок кода.


Весь код доступен на GitHub, для запуска необходима Java 11. В статье я привожу сокращенные варианты кода, без логов, диагностики и т.д.

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

Удобные архитектурные паттерны

Время прочтения 12 мин
Просмотры 16K
Блог компании Технологический Центр Дойче Банка Высокая производительность *Анализ и проектирование систем *Облачные сервисы *Инженерные системы *
🔥 Технотекст 2020

Привет, Хабр!


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


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

Читать дальше →
Всего голосов 28: ↑26 и ↓2 +24
Комментарии 2

Spring — эффективный роутинг

Время прочтения 13 мин
Просмотры 8.1K
Высокая производительность *Java *Kotlin *
Перевод


Виктор Васнецов, Рыцарь на распутье; fatcatart.com


Привет, Хабр! Здесь краткий пересказ интересной баги c GitHub. Для воспроизведения см. проект spring-flux-callstack.


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


at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:78)
at reactor.core.publisher.Operators.complete(Operators.java:135)
at reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:45)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.Mono.subscribe(Mono.java:4110)

Как вы уже поняли, это методы из Project Reactor, который обеспечивает асинхронную работу для Router Function в WebFlux.


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

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

Джинн

Время прочтения 37 мин
Просмотры 3.4K
Читальный зал

Незнакомец


— Погоди, ты всерьез считаешь, что генетика ничего не дает?
— Нет, конечно. Ну сам по суди. Ты помнишь наш класс двадцать лет назад. Кому-то легче давалась история, кому-то физика. Кто-то побеждал на олимпиадах, кто-то нет. По твоей логике призеры все поголовно должны иметь более крутую генетическую платформу, хотя это не так.
— Однако практически все победители с классом С как минимум, если мне не изменяет память
— Это мы вряд ли проверим. К тому же В-шек у нас не было, насколько я помню. А D-шки были в основном не из самых благополучных семей, так что тут генетика имеет опосредованное значение.
— Да, ты прав. Проверить сложно. Однако разве ты не замечал, что простые работяги с вон того завода за окном говорят так, словно воспроизводят цепь маркова: взял N слов, по ним просто по памяти вывел M слов. Например, после фразы "союз советских" они продолжат автоматом "социалистических республик", так как это наиболее вероятное продолжение.
— Неудачный пример, если честно.
— Да, согласен, надо повспоминать еще…
— К тому же твои слова отдают некой ноткой фашизма. Ты взял и огульно обозвал целую группу людей "недоразвитыми". Хотя я частично с тобой согласен, я сам замечал подобное раньше.
— Вот-вот!
— Скорее речь некоторых людей похожа на ответы Джона Сёрла из эксперимента с китайской комнатой.
— Это тот, который не знает иероглифов, однако отвечает по заданному алгоритму? Ну по сути он выдает не осознавая ни вопроса, ни даже своего ответа.
— Да-да, тот самый. Однако я и за собой иногда замечаю подобное. Потому и считаю, что генетика не так важна. Скорее уж человека определяет характер, чем некая генетическая платформа

Читать дальше →
Всего голосов 16: ↑12 и ↓4 +8
Комментарии 7

Типизируйте уже наконец свой код

Время прочтения 11 мин
Просмотры 11K
Java *Совершенный код *.NET *Проектирование и рефакторинг *ООП *
Перевод

Привет хабр!


На днях мне в очередной раз на глаза попал код вида


if(someParameter.Volatilities.IsEmpty())
{
    // We have to report about the broken channels, however we could not differ it from just not started cold system.
    // Therefore write this case into the logs and then in case of emergency IT Ops will able to gather the target line
    Log.Info("Channel {0} is broken or was not started yet", someParameter.Key)
}

В коде есть одна довольно важная особенность: получателю крайне хотелось бы знать, что произошло на самом деле. Ведь в одном случае у нас проблемы с работой системой, а в другом — мы просто прогреваемся. Однако модель не дает нам этого (в угоду отправителю, который зачастую является автором модели).
Более того, даже факт "возможно, что-то не так" происходит из того, что коллекция Volatilities пуста. Что в некоторых случаях может быть и корректно.


Я уверен, что большинство опытных разработчиков встречало в коде строки, в которых заключалось тайное знание в стиле "если выставлена эта комбинация флажков, то от нас просят сделать A, B и C" (хотя по самой модели этого не видно).


С моей точки зрения, подобная экономия на структуре классов сказывается крайне негативно на проекте в будущем, превращая его в набор хаков и костылей, постепенно трансформируя более-менее удобный код в legacy.


Важно: в статье я привожу примеры, которые полезны для проектов, в которых несколько разработчиков (а не один), плюс которые будут обновляться и расширяться в течении хотя бы 5-10 лет. Всё это не имеет смысла, если в проекте один разработчик лет на пять, или же если после релиза никаких изменений не планируется. И логично, если проект необходим всего на пару месяцев, нет смысла вкладываться в четкую модель данных.


Однако если же вы занимаетесь долгоиграющим — добро пожаловать под кат.

Читать дальше →
Всего голосов 27: ↑24 и ↓3 +21
Комментарии 5

Типичные ошибки при логгировании

Время прочтения 7 мин
Просмотры 8.7K
Высокая производительность *Java *Совершенный код *.NET *Kotlin *
Recovery mode
Перевод

Привет, Хабр!


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


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

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

Быстрое логгирование

Время прочтения 11 мин
Просмотры 4.2K
.NET *
Recovery mode
Перевод

В этой статье я поместил бенчмарки наиболее частных вызовов логгеров. Все эксперименты я проводил над log4net и NLog, на Windows 10 x64 Intel с M.2 SSD.


Сырые результаты можно посмотреть на GitHub. В том же репозитории код (для запуска потребуется .Net 4.7.2 + Microsoft Visual Studio 2017+).


Что, как и почему — под катом.

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

Маркетинговые войны (и причем здесь Хабр)

Время прочтения 8 мин
Просмотры 2K
Habr Управление продажами *

Привет хабр! Достаточно давно я прочитал книгу Маркетинговые войны. В неё рассказывается о довольно интересной точке зрения: на попытку ассоциировать стратегии в маркетинге со стратегиями в войне.


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

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

Товар или сервис

Время прочтения 8 мин
Просмотры 6.8K
Программирование *Проектирование и рефакторинг *Управление разработкой *Управление проектами *Управление продуктом *

На Хабре (да и в реальной IT жизни) встречаeтся много вопросов вида:


  • Надо ли обновлять систему (или зависимости в приложении), если и так всё работает?
  • Нужны ли вообще тесты (автотесты) в приложении (вы ведь на них потратите своё время и деньги заказчика)?
  • Если ли смысл в паттернах и выделении абстракций (ведь подобное размазывает код, приводит к снижению производительности и т.д.)?

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

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

Как оценить качество продукта

Время прочтения 8 мин
Просмотры 6.7K
ERP-системы *Управление проектами *Управление продажами *Управление медиа *Бизнес-модели *

Привет Хабр!


Недавно мне попалась на глаза статья про Service Now. В ней описывалось про то, какой же хороший у них продукт. Даже показали менеджера среднего звена с микрофоном, которая без цифр что-то говорила (из статьи — "сократило время административного труда, и врачи смогли сфокусироваться на своём основном предназначении").


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


После статьи я попытался осознать — а как можно по подобным рекламным презентациям оценить, продукт действительно пользователям, или же он только помог менеджерам среднего звена получить очередной бонус?

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

Вам не следует проводить собеседования, потому что… [спойлер — вы сами не ходите на собеседования]

Время прочтения 10 мин
Просмотры 41K
Управление проектами *Управление персоналом *Карьера в IT-индустрии

Тезис: вам не следует проводить собеседования, если вы не ходили хотя бы на три интервью как соискатель за последние полгода.


Более того, вы сами это прекрасно знаете, сознательно или подсознательно, однако корпоративная этика мешает заявить прямо о своих сомнениях.


Для привлечения внимания покажем картинку и продолжим.


Народ нарывается на ЯРОСТЬ


Читать дальше →
Всего голосов 76: ↑56 и ↓20 +36
Комментарии 75

Игрок

Время прочтения 4 мин
Просмотры 6.5K
Профессиональная литература *

Идет две тысячи большой год...


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

Читать дальше →
Всего голосов 10: ↑7 и ↓3 +4
Комментарии 24

Измеряем скорость кода Java правильно (используя JMH)

Время прочтения 7 мин
Просмотры 42K
Высокая производительность *Программирование *Java *Scala *Kotlin *
Туториал
Recovery mode

Привет, Хабр!


Это вводная статья про то, как следует делать тесты производительности на JVM языках (java, kotlin, scala и тд.). Она полезна для случая, когда требуется в цифрах показать изменение производительности от использования определенного алгоритма.


Все примеры приведены на языке kotlin и для системы сборки gradle. Исходный код проекта доступен на github.


КДВП

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

KDB

Время прочтения 6 мин
Просмотры 10K
Data Mining *NoSQL *Администрирование баз данных *Big Data *Хранение данных *

кдвп


Привет, Хабр !


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

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

Как эффективнее читать данные с диска (при условии, что у вас .Net)

Время прочтения 7 мин
Просмотры 12K
Блог компании Технологический Центр Дойче Банка Тестирование IT-систем *Программирование *.NET *Разработка под Windows *


Привет, Хабр! Некоторое время назад меня заинтересовал вопрос: как эффективнее всего читать данные с диска (при условии, что у вас .Net)? Задача чтения кучи файлов встречается во множестве программ, которые при самом старте начинают вычитывать конфигурации, некоторые самостоятельно подгружают модули и т.д.

В интернете я не нашел подобных сравнений (если не считать тюнинга под определенные конфигурации).
Читать дальше →
Всего голосов 21: ↑19 и ↓2 +17
Комментарии 18

Пишем Guard

Время прочтения 4 мин
Просмотры 5.9K
Open source *Java *.NET *


Привет, Хабр! Есть несколько способов проверять аргументы на правильность. Например, для проверки на null можно использовать:


  1. if (!ReferenceEquals(arg, null)) throw…
  2. Code Contracts: Contract.Requires(!ReferenceEquals(arg, null))
  3. Guard.IsNotNull(arg, nameof(arg))

В статье я рассмотрю только третий вариант (все примеры кода — для C#, однако некоторые из них будут полезны и в Java).

Читать дальше →
Всего голосов 13: ↑10 и ↓3 +7
Комментарии 13

Полезные дополнения к ReSharper

Время прочтения 3 мин
Просмотры 18K
.NET *Visual Studio *Разработка под Windows Phone *C# *Разработка под Windows *


Всем привет!

Как я заметил, немало людей использует ReSharper, однако полностью игнорируют его расширения (плагины). В этой статье я опишу те из них, которые показались мне полезными.
Названия расширений кликабельны и ведут на их детальное описание.
Читать про плагины
Всего голосов 24: ↑18 и ↓6 +12
Комментарии 12

SolutionCop

Время прочтения 4 мин
Просмотры 12K
Разработка веб-сайтов *Совершенный код *.NET *Visual Studio *C# *


Привет хабр! Основная речь пойдет про разработку на .Net, то есть с использованием Microsoft Visual Studio, ReSharper, Nuget и пр.
Я думаю, многие из вас разрабатывали большие решения (в msdn — solution), со множеством подпроектов. И в этом случае нередко становилась проблема синхронизации Nuget пакетов, настроек сборки и т.д. Причем, ReSharper здесь поможет слабо, разве что он тоже начнет путаться во множестве используемых библиотек.
Чтобы проверять исходный код, было сделано Open Source решение — SolutionCop, которое бесплатно для использования.
Для начала приведу парочку примеров, когда не помешали бы проверки наших решений.

Пример 1: разные версии Nuget библиотек.


Например, есть три проекта: exe, dll1 и dll2. exe ссылается на обе библиотеки, каждая из них ссылается, например, на RX. Но dll1 использует RX 2.2.0, а dll2 — RX 2.2.5. На деле, далеко не сразу можно получить ошибку, так как сигнатуры функций более-менее совпадают, более того, MsBuild чаще всего собирает проекты в одном и то же порядке. Однако подобная конфигурация может привести к проблемам, которые появятся после deployment'а, когда все модульные тесты пройдут (т.к. они ссылаются только на свою библиотеку), и когда будет готовиться результирующий набор файлов.

Пример 2: проект ссылается на библиотеку напрямую, а не через Nuget.


Опять возьмем три наших проекта: exe, dll1 и dll2. Допустим, мы также используем еще Jetbrains.Annotations, чтобы размечать код NotNull/CanBeNull аттрибутами и получать симпатичный статический анализ. Но вот незадача: для dll1 мы честно скачали пакет версии 9.2.0, а в dll2 мы просто попросили ReSharper добавить ссылку, что он и сделал. В итоге, в packages.config файле dll2 нет пакета с аттрибутами, а значит, если проект будет собираться в порядке dll2 --> dll1 --> exe, то мы получим ошибку, ведь Nuget пакет скачается только при сборе dll1!
И как всё это проверить ?!
Всего голосов 22: ↑18 и ↓4 +14
Комментарии 20

Пишем простой анализатор кода на Roslyn

Время прочтения 5 мин
Просмотры 14K
.NET *Visual Studio *C# *
Привет, Хабр!

Не так давно я сходил на конференцию CLRium от sidristij, где увидел довольно простой и удобный способ для анализа исходного кода C# в MSVS 2015.

Задача взята из проекта, в котором я участвую: каждый аргумент со ссылочным типом должен иметь аттрибут NotNull или CanBeNull (которые потом использует ReSharper). В реальности, конечно, в самом проекты атрибуты являются только частью проверок, однако это не мешает им быть обязательными. Уже есть тесты, которые проверяют сборку и падают, если методы или конструкторы не содержат требуемых атрибутов, однако разработчики все равно довольно часто забывают их проставить, что приводит к падениям билдов, обновлению кода и т.д. Вот если бы Visual Studio вместе с ReSharper выдавали бы предупреждения, что код не совсем хороший, то можно было бы сэкономить время и нервы…

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

Исходный код можно посмотреть тут.
Посмотреть простые действия
Всего голосов 23: ↑22 и ↓1 +21
Комментарии 9

Как валютная кадриль повлияла на зарплаты в IT?

Время прочтения 1 мин
Просмотры 23K
Статистика в IT Финансы в IT
Всем привет,

пару месяцев назад я немного опросил людей из IT по поводу изменений курса валют и заработной платы. Прошло пару месяцев, открылись новые вакансии, а потому интересно узнать: а что поменялось на рынке труда в IT?
Ответить на вопросы и посмотреть результаты
Всего голосов 43: ↑35 и ↓8 +27
Комментарии 131
1

Информация

В рейтинге
Не участвует
Откуда
London, England - London, Великобритания
Дата рождения
Зарегистрирован
Активность