Как стать автором
Обновить
24
0.6
Игорь Манушин @imanushin

User

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

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

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

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


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


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


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


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

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

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

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

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


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


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

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

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

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


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

Незнакомец


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

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

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

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

Привет хабр!


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


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 мин
Количество просмотров9.7K

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


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


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

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

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

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

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


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


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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

Привет Хабр!


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


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


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

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

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

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

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


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


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


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


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

Игрок

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

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


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

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

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

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

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


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


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


КДВП

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

KDB

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

кдвп


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


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

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

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

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


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

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

Пишем Guard

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


Привет, Хабр! Есть несколько способов проверять аргументы на правильность. Например, для проверки на 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


Всем привет!

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

SolutionCop

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


Привет хабр! Основная речь пойдет про разработку на .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
Привет, Хабр!

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

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

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

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

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

Время на прочтение1 мин
Количество просмотров23K
Всем привет,

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

Информация

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