Kotlin Result DSL
Эдит: вариант для чтения на мобилках
И кстати в догонку про обработку ошибок.
Я в своё время прям сильно впечатлился Rust-овским try! (Который уже оказывается стал ?-оператором)
И недавно запилил драфт похожей штуки для Котлина:
Это аналог вот такому коду:
Совсем однострочник сделать не получается, т.к. в Котлине нет полноценных макросов, а для того чтобы этот приём абстрагировать в функцию, в ней надо сделать ретарн из произвольной вызывающей функции с неизвестным типом возврата.
Но спрашивается зачем всё это?
В Котлине возврат того или иного Result - это единственный способ явно показать вызывающему коду, что функция может ошибиться. А очевидность вообще и очевидность мест где что-то может пойти не так - это основа эргономичного кода.
Но если это делать наивно, то получается код как из втрого примера.
Вообще Result-ы как правило являются монадами и с ними можно работать так:
И так получается даже короче. Но в Котлине нет спец синтаксиса для монад и поэтому они не масштабируются.
Например, если надо выполнить ИО-операцию на базе результата первых двух (и только в случае их успеха), то будет вот такой адок:
С моим же DSL-ем, всё будет прилично:
Полный код DSLя
#error_handlin@ergonomic_code #kotlin@ergonomic_code #posts@ergonomic_code #ergo_approach@ergonomic_code
Эдит: вариант для чтения на мобилках
И кстати в догонку про обработку ошибок.
Я в своё время прям сильно впечатлился Rust-овским try! (Который уже оказывается стал ?-оператором)
И недавно запилил драфт похожей штуки для Котлина:
fun testReturn(): WorkflowResult<Int, Throwable> {
val int = doIo()
.onError { return it }
return Result(int + 1)
}
Это аналог вот такому коду:
fun testLong(): WorkflowResult<Int, Throwable> {
val res = doIo()
if (res is Error) {
return res
}
val int = (res as Success).result
return Result(int + 1)
}
Совсем однострочник сделать не получается, т.к. в Котлине нет полноценных макросов, а для того чтобы этот приём абстрагировать в функцию, в ней надо сделать ретарн из произвольной вызывающей функции с неизвестным типом возврата.
Но спрашивается зачем всё это?
В Котлине возврат того или иного Result - это единственный способ явно показать вызывающему коду, что функция может ошибиться. А очевидность вообще и очевидность мест где что-то может пойти не так - это основа эргономичного кода.
Но если это делать наивно, то получается код как из втрого примера.
Вообще Result-ы как правило являются монадами и с ними можно работать так:
val res = doIo()
return res.map { it + 1}
И так получается даже короче. Но в Котлине нет спец синтаксиса для монад и поэтому они не масштабируются.
Например, если надо выполнить ИО-операцию на базе результата первых двух (и только в случае их успеха), то будет вот такой адок:
fun testCompositeM(): Optional<Int> {
val first = mIo()
val second = first.flatMap { mIo2(it) }
return first.flatMap { firstVal ->
second.flatMap { secondVal ->
mIo2(firstVal + secondVal)
}
}
}
С моим же DSL-ем, всё будет прилично:
fun testComposite(): WorkflowResult<Int, Throwable> {
val first = doIo().onError { return it }
val second = doIo2(first).onError { return it }
return doIo2(first + second)
}
Полный код DSLя
#error_handlin@ergonomic_code #kotlin@ergonomic_code #posts@ergonomic_code #ergo_approach@ergonomic_code
Telegraph
Kotlin Result DSL
И кстати в догонку про обработку ошибок. Я в своё время прям сильно впечатлился Rust-овским try! (Который уже оказывается стал ?-оператором) И недавно запилил драфт похожей для штуки для Котлина:
Молния!
В компилятор JetBrains Compose вмёржили поддержку JS-а: https://twitter.com/shikasd_/status/1379757917893722114
#tools@ergonomic_code #kotlin@ergonomic_code
В компилятор JetBrains Compose вмёржили поддержку JS-а: https://twitter.com/shikasd_/status/1379757917893722114
#tools@ergonomic_code #kotlin@ergonomic_code
JetBrains
Compose Multiplatform UI Framework | JetBrains
Compose Multiplatform is a declarative framework for sharing UIs across Android, iOS, web, and desktop, based on Kotlin Multiplatform and Jetpack Compose.
Ну и раз уж я вас сегодня заспамил, то вот ещё немного:)
Запилил оператор terminateOn для Kotlin sequence&flow
Предполагаемый юзкейс - функциональное описание эффективной операции до получения терминального значения - считай ретрай
юзается примерно так:
#tools@ergonomic_code #kotlin@ergonomic_code
Запилил оператор terminateOn для Kotlin sequence&flow
Предполагаемый юзкейс - функциональное описание эффективной операции до получения терминального значения - считай ретрай
юзается примерно так:
val res = sequnceOf(1, 2, 3)
.map { delay(it) ; getEntityStatusOnServer() }
.take(15)
.terminateOn { it.isSuccess() || it.isFailed }
.last()
when (res.status) {
success -> println("success")
pending -> println("timeout")
failure-> println("process failed on server")
network_failure-> println("status fetch failed")
}
#tools@ergonomic_code #kotlin@ergonomic_code
Gist
(flow|sequence).termiateOn
(flow|sequence).termiateOn. GitHub Gist: instantly share code, notes, and snippets.
Привет!
Я готовлю серию постов о SOLID, и чёт это не так просто оказалось, поэтому залип:)
А пока немного агитации за Котлин:)
Q: I want know what is benefit use of kotlin instanced of java for android app development
A: besides the subjective things like "fun to write" etc, there are also objective metrics - we found that among top apps for the ones that are written in Kotlin users see on average a 10% reduction in crashes.
https://www.reddit.com/r/Kotlin/comments/nm2eaf/kotlin_team_ama_3_ask_us_anything/gzm654b?utm_source=share&utm_medium=web2x&context=3
#kotlin@ergonomic_code
Я готовлю серию постов о SOLID, и чёт это не так просто оказалось, поэтому залип:)
А пока немного агитации за Котлин:)
Q: I want know what is benefit use of kotlin instanced of java for android app development
A: besides the subjective things like "fun to write" etc, there are also objective metrics - we found that among top apps for the ones that are written in Kotlin users see on average a 10% reduction in crashes.
https://www.reddit.com/r/Kotlin/comments/nm2eaf/kotlin_team_ama_3_ask_us_anything/gzm654b?utm_source=share&utm_medium=web2x&context=3
#kotlin@ergonomic_code
Reddit
meilalina's comment on "Kotlin Team AMA #3: Ask Us Anything"
Explore this conversation and more from the Kotlin community
Привет!
Вышел Kotlin 1.6.
На мой взгляд релиз минорный, но двум фичам я прям рад:
1) Теперь можно в качестве значений параметров suspend функций передавать обычные функции (Suspend conversions)
2) Наконец-то сделали инструмент для оценки покрытия тестами в мультиплатформенных проектах
#tools@ergonomic_code #kotlin@ergonomic_code
Вышел Kotlin 1.6.
На мой взгляд релиз минорный, но двум фичам я прям рад:
1) Теперь можно в качестве значений параметров suspend функций передавать обычные функции (Suspend conversions)
2) Наконец-то сделали инструмент для оценки покрытия тестами в мультиплатформенных проектах
#tools@ergonomic_code #kotlin@ergonomic_code
The JetBrains Blog
Kotlin 1.6.0 Released | The Kotlin Blog
Kotlin 1.6.0 is now officially released with Stable exhaustive whens, Kover, and new memory manager for Kotlin/Native!
Привет!
Немного пиара Котлина вам в ленту:)
Вышел Compose Multiplatform 1.0 Release :)
Анонсировали AWS SDK для Котлина (и Swift с Rust)
#tools@ergonomic_code #kotlin@ergonomic_code
Немного пиара Котлина вам в ленту:)
Вышел Compose Multiplatform 1.0 Release :)
Анонсировали AWS SDK для Котлина (и Swift с Rust)
#tools@ergonomic_code #kotlin@ergonomic_code
The JetBrains Blog
Compose Multiplatform 1.0 Is Going Live! | The Kotlin Blog
Compose Multiplatform by JetBrains, the declarative UI framework for Kotlin, has reached version 1.0, which makes it ready for production use! Here are a few highlights that we hope will make you as e
Привет!
Вышли корутины 1.6.0 с парой долгожданных (мной) фич:
1) наконец-то можно писать мультиплатформенные тесты на suspend код без костылей
2) наконец-то можно создавать диспетчеры с ограниченным параллелизмом
#tools@ergonomic_code #kotlin@ergonomic_code
Вышли корутины 1.6.0 с парой долгожданных (мной) фич:
1) наконец-то можно писать мультиплатформенные тесты на suspend код без костылей
2) наконец-то можно создавать диспетчеры с ограниченным параллелизмом
#tools@ergonomic_code #kotlin@ergonomic_code
The JetBrains Blog
Introducing kotlinx.coroutines 1.6.0 | The Kotlin Blog
Following the release of Kotlin 1.6.0, the 1.6.0 version of the kotlinx.coroutines library is out. Here are the main features it brings: A new API and multiplatform support for kotlinx-coroutines-t
Привет!
Я пропустил, что неделю назад вышел Kotlin 1.6.20 с прототипом соблазнительных, но пугающих context receiver-ов.
#kotlin@ergonomic_code #tools@ergonomic_code
Я пропустил, что неделю назад вышел Kotlin 1.6.20 с прототипом соблазнительных, но пугающих context receiver-ов.
#kotlin@ergonomic_code #tools@ergonomic_code
Kotlin Help
What's new in Kotlin 1.6.20 | Kotlin
Привет!
Во-первых, с радостью обращаю ваше внимание, что наc стало 150:)
Во-вторых, написал микропост о том, как фичи и идиомы Kotlin способствует локализации рассуждений о коде
В-третьих, апдейт статуса макропоста о диаграмме эффектов: я его перелопатил чуть более чем полностью. Для диаграммы ввёл две нотации - краткую и полную и сделал её совместимой с моделью С4. А сам пост разбил на два - спецификация и пример построения.
Процесс вроде начал сходиться, есть шанс, что сойдётся на следующей недели
#kotlin@ergonomic_code
Во-первых, с радостью обращаю ваше внимание, что наc стало 150:)
Во-вторых, написал микропост о том, как фичи и идиомы Kotlin способствует локализации рассуждений о коде
В-третьих, апдейт статуса макропоста о диаграмме эффектов: я его перелопатил чуть более чем полностью. Для диаграммы ввёл две нотации - краткую и полную и сделал её совместимой с моделью С4. А сам пост разбил на два - спецификация и пример построения.
Процесс вроде начал сходиться, есть шанс, что сойдётся на следующей недели
#kotlin@ergonomic_code
Telegraph
Kotlin и локальность рассуждений
Этот пост написан по мотивам другого поста о том, как F# способствует локальности рассуждений (reasoning locality). Код обладает свойством локальности рассуждений тогда, когда его можно понять только глядя на целевой код. И код написанный в императивном стиле…
👍2
Привет!
Играюсь тут в MapStruct+kotlin
сначала застрелился выяснять, что у меня процессинг аннотаций не работет, потому что я скопипасти приме для джавы, а не котлина и написал annotationProcessor, вместо kapt.
Потом когда наконец всё это добро завёл тут же словил нарушение LSP в стандартной либе Котлина и дикий ВТФ с императивным стилем мапструкта
В Котлине emptyList() возвращает объект, который имплементит List, но не имплементит clear().
Ну это типа в целом можно понять, империтивное наследие джавы совместимость с джавой, все дела
но вот то, что мапструк работает через clear+addAll - меня сначала вырубило. я бы тупо перетащил ссылку из исходника в таргет. А потом до меня дошло, что с изменяемыми структурами так нельзя - вдруг ссылка на целевой лист куда-то утекла и уже у того человека будет ВТФ, когда у него "один и тот же объект" не совпадут.
Это к вопросу, чем неизменяемые структуры данных и декларативный стиль проще.
пойду ещё покапаюсь, может это можно как-то захачить
#tools@ergonomic_code #kotlin@ergonomic_code
Играюсь тут в MapStruct+kotlin
сначала застрелился выяснять, что у меня процессинг аннотаций не работет, потому что я скопипасти приме для джавы, а не котлина и написал annotationProcessor, вместо kapt.
Потом когда наконец всё это добро завёл тут же словил нарушение LSP в стандартной либе Котлина и дикий ВТФ с императивным стилем мапструкта
В Котлине emptyList() возвращает объект, который имплементит List, но не имплементит clear().
Ну это типа в целом можно понять, империтивное наследие джавы совместимость с джавой, все дела
но вот то, что мапструк работает через clear+addAll - меня сначала вырубило. я бы тупо перетащил ссылку из исходника в таргет. А потом до меня дошло, что с изменяемыми структурами так нельзя - вдруг ссылка на целевой лист куда-то утекла и уже у того человека будет ВТФ, когда у него "один и тот же объект" не совпадут.
Это к вопросу, чем неизменяемые структуры данных и декларативный стиль проще.
пойду ещё покапаюсь, может это можно как-то захачить
#tools@ergonomic_code #kotlin@ergonomic_code
👍1
Привет!
Прочитал Java to Kotlin: A Refactoring Guidebook - мне понравилась.
Её с тем же успехом можно было назвать "Рефакторинг императивного стиля в функциональный" и она хорошо дополняет Grokking Simplicity - на мой вкус менее фундаментальная, но более бакэндерская и со статической типизацией. Хотя, опять же, тема персистанса практически не раскрыта.
И в качестве инструкции по переходу на Котлин она тоже хороша.
Рекомендую, в общем.
Ещё пару находок оттуда:
1. Идея "волокон" (grains) языков программирования. "Вдоль" которых работать проще, чем поперёк - как с деревом. И ФП укладывается вдоль волокон Котлина, но идёт поперёк волокон Джавы. С одной стороны. С другой стороны, монады - не укладываются в волокна Котлина.
2. У Фаулера есть статья про баги вызванные алиасингом
3. Один из соавторов этой книги - также соавтор и Growing Object-Oriented Software Guided by Tests - книги, которую я долгое время считал идеологически вредной. В Java to Kotlin же он пишет, что в GOOS моки не предполагалось использовать в качестве стабов - поставщиков данных через ридонли методы. Возможно, мне стоит перечитать GOOS и поменять своё мнение о ней.
#books@ergonomic_code #functional_architecture@ergonomic_code #kotlin@ergonomic_code #java@ergonomic_code
Прочитал Java to Kotlin: A Refactoring Guidebook - мне понравилась.
Её с тем же успехом можно было назвать "Рефакторинг императивного стиля в функциональный" и она хорошо дополняет Grokking Simplicity - на мой вкус менее фундаментальная, но более бакэндерская и со статической типизацией. Хотя, опять же, тема персистанса практически не раскрыта.
И в качестве инструкции по переходу на Котлин она тоже хороша.
Рекомендую, в общем.
Ещё пару находок оттуда:
1. Идея "волокон" (grains) языков программирования. "Вдоль" которых работать проще, чем поперёк - как с деревом. И ФП укладывается вдоль волокон Котлина, но идёт поперёк волокон Джавы. С одной стороны. С другой стороны, монады - не укладываются в волокна Котлина.
2. У Фаулера есть статья про баги вызванные алиасингом
3. Один из соавторов этой книги - также соавтор и Growing Object-Oriented Software Guided by Tests - книги, которую я долгое время считал идеологически вредной. В Java to Kotlin же он пишет, что в GOOS моки не предполагалось использовать в качестве стабов - поставщиков данных через ридонли методы. Возможно, мне стоит перечитать GOOS и поменять своё мнение о ней.
#books@ergonomic_code #functional_architecture@ergonomic_code #kotlin@ergonomic_code #java@ergonomic_code
Java to Kotlin
Java to Kotlin: A Refactoring Guidebook
Supplementary resources
👍6
Привет!
Я тут такую штуку в Котлине откапал.
Для локальных и возвращаемых из приватных функций анонимных объектов можно обращаться к поля
Что тут просиходит:
1. У меня есть функция createTest, которая возвращает анонимный объект с полем id
2. Я генерирую список таких объектов и сохраняю его в tests
3. Я беру первый элемент из списка и беру у него поле id. И всё работает. Но если попытаться проставить тип для функции или коллекции - там можно вставить только Any (aka Object) и всё ломается.
У меня есть сомнения в целесообразоности использования такого трюка, но код ручного маппинга 1-N в дерево неизменяемых объектов он мне сделал чуть понагляднее
#kotlin@ergonomic_code
Я тут такую штуку в Котлине откапал.
Для локальных и возвращаемых из приватных функций анонимных объектов можно обращаться к поля
fun test() {
val tests = (1..2).map {
createTest(mapOf("id" to 10))
}
println(tests[0].id == 10L)
}
private fun createTest(map: Map<String, Any>) = object {
val id: Long = map["id"] as Long
}
Что тут просиходит:
1. У меня есть функция createTest, которая возвращает анонимный объект с полем id
2. Я генерирую список таких объектов и сохраняю его в tests
3. Я беру первый элемент из списка и беру у него поле id. И всё работает. Но если попытаться проставить тип для функции или коллекции - там можно вставить только Any (aka Object) и всё ломается.
У меня есть сомнения в целесообразоности использования такого трюка, но код ручного маппинга 1-N в дерево неизменяемых объектов он мне сделал чуть понагляднее
#kotlin@ergonomic_code
👍3
GitHub
GitHub - ergonomic-code/Trainer-Advisor: Информационная система йогатерапевта и демонстрационный проект Эргономичного подхода
Информационная система йогатерапевта и демонстрационный проект Эргономичного подхода - ergonomic-code/Trainer-Advisor
Привет!
На выходных спинным мозгом чутка подвигал Trainer Advisor
Переезд на Kotlin 2.0.20
Начал с того, что с третьей попытки наконец осилил переехать с Kotlin 1.9.20 на 2.0.20.
Летом при переезде на 2.0.0 (и, возможно, 2.0.10 - не помню уже точно) было какое-то совершенно невнятное сообщение об ошибке компиляции, которое ставило меня в тупик.
В этот раз было даже не сообщение об ошибке компиляции, а вообще какая-то кровавая жесть из кишёк компилятора, но победить её удалось. Случайно.
Я начал пытаться локализовать строчку, на которой компилятор взрывается (он писал файл). И долокализовался до того, что файл вообще удалил, а компилятор продолжил взрываться 🤯
Потом каким-то чудом я обнаружил, что у меня есть одноимённый файл в Gradle Test Fixtures source set. И вот когда я туда залез - там у меня ужеIDEA GigaIDE начала взрываться, что не найдены Spring-овые классы. Пошёл гуглить WTF и по первой же ссылке выяснил, что во 2-ой версии, impl-зависимости продового кода не перекидываются в testFixture - прокинул, завелось.
Мораль - чёрт его знает. Проект на 13К нетривиального кода (люблю я знаете ли проверять компиляторы на прочность) перевести мне удалось. Но чудом. Если ждали знака, чтобы попробовать перевести свой проект - вот он. Но будьте готовы к приключениям.
Переезд на HTMX 2.0.3
Следующим шагом переехал на новую мажорную версию HTMX. Просто обновил и всё заработало. Вряд ли это кому-то ещё интересно, но если вдруг - на HTMX 2 можно достаточно смело ехать.
Greenmail для локальной работы в докере
Но кое-какой нюанс с переездом всё таки был - если покрытие серверного кода, включая рендеринг HTML у меня близок к 100%, то динамика UI (у меня там ещё и alpine.js немного есть) у меня очень слабо покрыта e2e тестами - есть только тесты на критичные сценарии - регистрация и логин и создание карточки клиента и приёма.
Поэтому я на всякий случай после переезда на HTMX 2 решил руками прогнать полный регресс.
И упёрся в небольшую шероховатость DevX-а проекта.
Наполовину по историческим причинам и наполовину во имя простоты бэка, сейчас при регистрации пароль отправляется письмом на почту юзера.
Примерно по тем же причинам, в проде для отправки почты у меня используется бесплатный ящик на Яндексе. И креды от него, по понятным причинам, куда-то заныканы.
Соответственно, при локальной разработке, после чекаута проекта зарегаться нельзя - надо сначала как-то настроить отправку писем.
Об это я и споткнулся, когда начал делать регресс в новом проекте - обычно я 99% работы делаю через тесты и ещё для 0.99% работы мне достаточно юзера, который добавляется в демо-данных при локальной разработке.
А вот регистрация из коробки не работала.
Вот это я и залечил, добавив Greenmail в проект компоуза локальной инфры.
И написав shell-однострочник для выковыривания пароля оттуда:
PS>
Напоминаю, что мне в ТА можно поконтрибьютить.
Если вы опытный разработчик и вам не комфортно работать в том стиле, в котором пишете сейчас - это хороший способ пощупать ЭП руками и понять нравится ли вам такой DevX.
Если вы молодой разработчик - это хороший способ получить мой менторинг на реальном проекте в замен за работу. Я очень тщательно провожу ревью и в целом стараюсь давать максимум полезной обратной связи.
Код двух подписчиков уже есть в TA - так что это вполне реально:)
Отзыв одного из них:
Если интересно - пишите в личку, договоримся о звонке для онбоардинга
#trainer_advisor@ergonomic_code #tools@ergonomic_code #kotlin@ergonomic_code #devx@ergonomic_code
На выходных спинным мозгом чутка подвигал Trainer Advisor
Переезд на Kotlin 2.0.20
Начал с того, что с третьей попытки наконец осилил переехать с Kotlin 1.9.20 на 2.0.20.
Летом при переезде на 2.0.0 (и, возможно, 2.0.10 - не помню уже точно) было какое-то совершенно невнятное сообщение об ошибке компиляции, которое ставило меня в тупик.
В этот раз было даже не сообщение об ошибке компиляции, а вообще какая-то кровавая жесть из кишёк компилятора, но победить её удалось. Случайно.
Я начал пытаться локализовать строчку, на которой компилятор взрывается (он писал файл). И долокализовался до того, что файл вообще удалил, а компилятор продолжил взрываться 🤯
Потом каким-то чудом я обнаружил, что у меня есть одноимённый файл в Gradle Test Fixtures source set. И вот когда я туда залез - там у меня уже
Мораль - чёрт его знает. Проект на 13К нетривиального кода (люблю я знаете ли проверять компиляторы на прочность) перевести мне удалось. Но чудом. Если ждали знака, чтобы попробовать перевести свой проект - вот он. Но будьте готовы к приключениям.
Переезд на HTMX 2.0.3
Следующим шагом переехал на новую мажорную версию HTMX. Просто обновил и всё заработало. Вряд ли это кому-то ещё интересно, но если вдруг - на HTMX 2 можно достаточно смело ехать.
Greenmail для локальной работы в докере
Но кое-какой нюанс с переездом всё таки был - если покрытие серверного кода, включая рендеринг HTML у меня близок к 100%, то динамика UI (у меня там ещё и alpine.js немного есть) у меня очень слабо покрыта e2e тестами - есть только тесты на критичные сценарии - регистрация и логин и создание карточки клиента и приёма.
Поэтому я на всякий случай после переезда на HTMX 2 решил руками прогнать полный регресс.
И упёрся в небольшую шероховатость DevX-а проекта.
Наполовину по историческим причинам и наполовину во имя простоты бэка, сейчас при регистрации пароль отправляется письмом на почту юзера.
Примерно по тем же причинам, в проде для отправки почты у меня используется бесплатный ящик на Яндексе. И креды от него, по понятным причинам, куда-то заныканы.
Соответственно, при локальной разработке, после чекаута проекта зарегаться нельзя - надо сначала как-то настроить отправку писем.
Об это я и споткнулся, когда начал делать регресс в новом проекте - обычно я 99% работы делаю через тесты и ещё для 0.99% работы мне достаточно юзера, который добавляется в демо-данных при локальной разработке.
А вот регистрация из коробки не работала.
Вот это я и залечил, добавив Greenmail в проект компоуза локальной инфры.
И написав shell-однострочник для выковыривания пароля оттуда:
curl -X GET "http://localhost:58080/api/user/test%40ya.ru/messages/" \
-H 'accept: application/json' | jq -r '.[] | .mimeMessage ' | grep -A7 0JfQ | python3 -m base64 -d | grep 'Пароль'
PS>
Напоминаю, что мне в ТА можно поконтрибьютить.
Если вы опытный разработчик и вам не комфортно работать в том стиле, в котором пишете сейчас - это хороший способ пощупать ЭП руками и понять нравится ли вам такой DevX.
Если вы молодой разработчик - это хороший способ получить мой менторинг на реальном проекте в замен за работу. Я очень тщательно провожу ревью и в целом стараюсь давать максимум полезной обратной связи.
Код двух подписчиков уже есть в TA - так что это вполне реально:)
Отзыв одного из них:
В целом, мне понравилось делать изменения у тебя. Не могу сказать, что согласен со всем. Мне пока кажется почти идеальным вот этот layout https://github.com/gushakov/cargo-clean
Если интересно - пишите в личку, договоримся о звонке для онбоардинга
#trainer_advisor@ergonomic_code #tools@ergonomic_code #kotlin@ergonomic_code #devx@ergonomic_code
🔥6👍2🥰2
Привет!
На днях перевёл Проект Р и Trainer Advisor на Kotlin 2.1.0 и Spring Boot 3.4.0
В целом всё прошло без проблем, делюсь впечатлениями
Проект Р/Котлин 2.0.0 -> 2.1.0
1. Т.к. переходил с версии 2.0.0 так же возникла проблема с пропажей продовых зависимостей в testFixtures source sets. И со второй попытки я её определил и починил быстро
2. В паре data классов с приватными конструкторами пришлось развесить @ConsistentCopyVisibility, чтобы варнинг убрать
Проект Р/Спринг 3.3.1 -> 3.4.0
1. Тест на корс, который ломился без авторизации на закрытый урл начал валиться по 401/3 (забыл уже) - перевёл его на запрос к публичному пути - заработало
Trainer Adviser/Котлин 2.0.21 -> 2.1.0
1. Заглючила идея 2024.2 и опять на testsFixtures - гредлом всё ок собирается, в редакторе ошибок нет, но при попытке сборки проектов идеевским билд тулом (я юзаю его для разработки, так как он быстрее гредлового) - ругается что не может в коде тестов найти символ из кода фикстур. Это поличилось обновлением самой идеи до 2024.3
Trainer Advisor/Спринг 3.3.5 -> 3.4.0
1. Начало взрываться
2. В одном из эндпоинтов на параметр принципала не был навешан
—
На обновление Проекта Р у меня ушло часа три.
Львиная доля ушла на:
1. переход на обратнонесовместимый Kover 0.8.3
2. datafaker в котором задепрекейтили один из методов
3. не связанные с обновлением разборки с гредлом
Trainer Advisor вообще за час максимум обновил.
Держите свои зависимости актуальными - если это делать своевременно, то это требует минимума усилий. А вот нагонять большое отставание - это уже беда. Для некоторых трудозатраты на такое приключение становятся фактически заградительными и проект начинает планомерно превращаться в мамонта.
#kotlin@ergonomic_code #spring@ergonomic_code #projectr@ergonomic_code #trainer_advisor@ergonomic_code
На днях перевёл Проект Р и Trainer Advisor на Kotlin 2.1.0 и Spring Boot 3.4.0
В целом всё прошло без проблем, делюсь впечатлениями
Проект Р/Котлин 2.0.0 -> 2.1.0
1. Т.к. переходил с версии 2.0.0 так же возникла проблема с пропажей продовых зависимостей в testFixtures source sets. И со второй попытки я её определил и починил быстро
2. В паре data классов с приватными конструкторами пришлось развесить @ConsistentCopyVisibility, чтобы варнинг убрать
Проект Р/Спринг 3.3.1 -> 3.4.0
1. Тест на корс, который ломился без авторизации на закрытый урл начал валиться по 401/3 (забыл уже) - перевёл его на запрос к публичному пути - заработало
Trainer Adviser/Котлин 2.0.21 -> 2.1.0
1. Заглючила идея 2024.2 и опять на testsFixtures - гредлом всё ок собирается, в редакторе ошибок нет, но при попытке сборки проектов идеевским билд тулом (я юзаю его для разработки, так как он быстрее гредлового) - ругается что не может в коде тестов найти символ из кода фикстур. Это поличилось обновлением самой идеи до 2024.3
Trainer Advisor/Спринг 3.3.5 -> 3.4.0
1. Начало взрываться
responseEntity.contentLength = storedFileInputStream.metaData.size
при size = 0
. Добавил if (size > 0) - завелось2. В одном из эндпоинтов на параметр принципала не был навешан
@AuthenticationPrincipal
. Раньше это как-то работало, после преезда перестало, после добавления аннотации снова заработало.—
На обновление Проекта Р у меня ушло часа три.
Львиная доля ушла на:
1. переход на обратнонесовместимый Kover 0.8.3
2. datafaker в котором задепрекейтили один из методов
3. не связанные с обновлением разборки с гредлом
Trainer Advisor вообще за час максимум обновил.
Держите свои зависимости актуальными - если это делать своевременно, то это требует минимума усилий. А вот нагонять большое отставание - это уже беда. Для некоторых трудозатраты на такое приключение становятся фактически заградительными и проект начинает планомерно превращаться в мамонта.
#kotlin@ergonomic_code #spring@ergonomic_code #projectr@ergonomic_code #trainer_advisor@ergonomic_code
Telegram
Эргономичный код
Привет!
Существует расхожее мнение, что разработчик большую часть жизни проводит в легаси браун филд проектах.
Но моя карьера его опровергает.
Первые 12 лет работы в найме, мне действительно приходилось довольно много работать с чужим кодом: я поработал…
Существует расхожее мнение, что разработчик большую часть жизни проводит в легаси браун филд проектах.
Но моя карьера его опровергает.
Первые 12 лет работы в найме, мне действительно приходилось довольно много работать с чужим кодом: я поработал…
👍4❤3👌1
Привет!
Начинаю потихоньку собирать отзывы по #project_r.
Начал с простого - спросил у второго разработчика, которая раньше на Котлин не писала: "Какие у тебя впечатления от Котлина? Не появилось непреодолимого желания переехать на него?:)"
Ответ:
Выделение моё.
В общем если пишите на Java и сомневаетесь нужен ли вам Kotlin - попробуйте:)
#retro@ergonomic_code #project_r@ergonomic_code #kotlin@ergonomic_code
Начинаю потихоньку собирать отзывы по #project_r.
Начал с простого - спросил у второго разработчика, которая раньше на Котлин не писала: "Какие у тебя впечатления от Котлина? Не появилось непреодолимого желания переехать на него?:)"
Ответ:
только положительные 😀
очень много рутиных вещей из джавы уже есть в готовых функциях, читаемость намного лучше, легче конструкции логические всякие городить)
А про переехать 🤔
Если бы меня отправили работать в микросервис на котлине, я бы точно фу не сказала, спокойно бы писала, как и на джаве)
Выделение моё.
В общем если пишите на Java и сомневаетесь нужен ли вам Kotlin - попробуйте:)
#retro@ergonomic_code #project_r@ergonomic_code #kotlin@ergonomic_code
👍7💯6