Pull to refresh
24
0.8
Игорь Манушин @imanushin

User

Send message

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

Reading time14 min
Views7.2K

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


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


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


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


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

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

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

Reading time12 min
Views17K

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


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


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

Читать дальше →
Total votes 28: ↑26 and ↓2+24
Comments2

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

Reading time13 min
Views9.7K


Виктор Васнецов, Рыцарь на распутье; 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.


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

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

Джинн

Reading time37 min
Views3.5K

Незнакомец


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

Читать дальше →
Total votes 16: ↑12 and ↓4+8
Comments8

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

Reading time11 min
Views11K

Привет хабр!


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


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 лет. Всё это не имеет смысла, если в проекте один разработчик лет на пять, или же если после релиза никаких изменений не планируется. И логично, если проект необходим всего на пару месяцев, нет смысла вкладываться в четкую модель данных.


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

Читать дальше →
Total votes 27: ↑24 and ↓3+21
Comments5

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

Reading time7 min
Views9.7K

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


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


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

Читать дальше →
Total votes 15: ↑13 and ↓2+11
Comments22

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

Reading time11 min
Views4.8K

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


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


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

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

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

Reading time8 min
Views2.7K

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


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

Читать дальше →
Total votes 27: ↑13 and ↓14-1
Comments9

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

Reading time8 min
Views7.2K

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


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

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

Читать дальше →
Total votes 26: ↑20 and ↓6+14
Comments22

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

Reading time8 min
Views7.4K

Привет Хабр!


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


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


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

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

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

Reading time10 min
Views42K

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


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


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


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


Читать дальше →
Total votes 76: ↑56 and ↓20+36
Comments75

Игрок

Reading time4 min
Views6.5K

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


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

Читать дальше →
Total votes 10: ↑7 and ↓3+4
Comments24

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

Reading time7 min
Views50K

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


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


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


КДВП

Читать дальше →
Total votes 12: ↑11 and ↓1+10
Comments8

KDB

Reading time6 min
Views11K

кдвп


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


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

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

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

Reading time7 min
Views12K


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

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

Пишем Guard

Reading time4 min
Views6.2K


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


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

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

Читать дальше →
Total votes 13: ↑10 and ↓3+7
Comments13

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

Reading time3 min
Views18K


Всем привет!

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

SolutionCop

Reading time4 min
Views12K


Привет хабр! Основная речь пойдет про разработку на .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!
И как всё это проверить ?!
Total votes 22: ↑18 and ↓4+14
Comments20

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

Reading time5 min
Views14K
Привет, Хабр!

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

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

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

Исходный код можно посмотреть тут.
Посмотреть простые действия
Total votes 23: ↑22 and ↓1+21
Comments9

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

Reading time1 min
Views23K
Всем привет,

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

Information

Rating
1,427-th
Location
London, England - London, Великобритания
Date of birth
Registered
Activity