{"id":672144,"date":"2026-01-06T04:42:21","date_gmt":"2026-01-06T03:42:21","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=672144"},"modified":"2026-01-06T04:42:26","modified_gmt":"2026-01-06T03:42:26","slug":"escalando-a-adocao-do-kotlin-em-toda-a-sua-empresa","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/pt-br\/kotlin\/2026\/01\/escalando-a-adocao-do-kotlin-em-toda-a-sua-empresa\/","title":{"rendered":"Escalando a ado\u00e7\u00e3o do Kotlin em toda a sua empresa"},"content":{"rendered":"<p><em>Postagem convidada de <a href=\"https:\/\/www.linkedin.com\/in\/urs-peter-70a2882\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/bit.ly\/urs-peter-linked-in\">Urs Peter<\/a>, Engenheiro de Software S\u00eanior e Instrutor de Kotlin certificado pela JetBrains. Para leitores que preferirem uma maneira mais estruturada de adquirir conhecimentos sobre Kotlin, Urs tamb\u00e9m dirige o\u00a0<\/em><a href=\"https:\/\/academy.xebia.com\/upskilling\/kotlin-academy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Programa de Qualifica\u00e7\u00e3o em Kotlin<\/em><\/a><em> da Xebia Academy.<\/em><\/p>\n<p><em>Esta \u00e9 a quinta postagem da s\u00e9rie <strong>O guia definitivo para a ado\u00e7\u00e3o bem-sucedida do Kotlin em um ambiente dominado pelo Java<\/strong>, que acompanha o processo de ado\u00e7\u00e3o do Kotlin por equipes reais, desde a curiosidade de um s\u00f3 desenvolvedor at\u00e9 uma transforma\u00e7\u00e3o geral da empresa.<\/em><\/p>\n<p><strong>Todas as partes da s\u00e9rie:<\/strong><\/p>\n<ol>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/10\/getting-started-with-kotlin-for-java-developers\/\" target=\"_blank\" rel=\"noreferrer noopener\">Como iniciar a ado\u00e7\u00e3o do Kotlin por desenvolvedores em Java<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/10\/evaluating-kotlin-in-real-projects\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/10\/evaluating-kotlin-in-real-projects\/\">Avalia\u00e7\u00e3o do Kotlin em projetos reais<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/11\/growing-kotlin-adoption-in-your-company\/\" target=\"_blank\" rel=\"noreferrer noopener\">Como aumentar a ado\u00e7\u00e3o do Kotlin na sua empresa<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/11\/helping-decision-makers-say-yes-to-kotlin\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/11\/helping-decision-makers-say-yes-to-kotlin\/\">Como ajudar os tomadores de decis\u00e3o a dizerem &#8220;sim&#8221; para o Kotlin<\/a><\/li>\n<li>Escalando a ado\u00e7\u00e3o do Kotlin em toda a sua empresa<\/li>\n<\/ol>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<h2 class=\"wp-block-heading\"><strong>Fatores de sucesso para a ado\u00e7\u00e3o do Kotlin em larga escala<\/strong><\/h2>\n<p>Fazer com que os desenvolvedores comprem a ideia e a administra\u00e7\u00e3o apoie o Kotlin \u00e9 um marco significativo, mas n\u00e3o \u00e9 a linha de chegada. O verdadeiro desafio come\u00e7a quando voc\u00ea tem que encarar bases de c\u00f3digo existentes em Java que precisam coexistir com o Kotlin ou fazer a transi\u00e7\u00e3o para ele. Como navegar esse mundo h\u00edbrido de forma eficaz?<\/p>\n<p>A chave para administrar bases antigas de c\u00f3digo \u00e9 desenvolver uma estrat\u00e9gia alinhada com as metas da sua empresa e a realidade operacional. Esta \u00e9 uma abordagem comprovada, que tem funcionado bem na pr\u00e1tica.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Estrat\u00e9gia do ciclo de vida dos aplicativos<\/strong><\/h2>\n<p>Aplicativos diferentes requerem abordagens diferentes, baseadas nas fases do seu ciclo de vida. Vamos examinar tr\u00eas categorias distintas:<\/p>\n<h3 class=\"wp-block-heading\"><strong>Aplicativos no final da vida \u00fatil<\/strong><\/h3>\n<p><strong>Estrat\u00e9gia: n\u00e3o fazer nada.<\/strong><\/p>\n<p>Se um aplicativo estiver programado para ser desativado, n\u00e3o h\u00e1 um caso de neg\u00f3cios para a migra\u00e7\u00e3o. Mantenha esses sistemas em Java e concentre as suas energias onde elas fizerem mais diferen\u00e7a. O custo de migrar esses aplicativos nunca ser\u00e1 justificado pela vida \u00fatil restante para eles.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Novos sistemas<\/strong><\/h3>\n<p><strong>Estrat\u00e9gia: usar o Kotlin como padr\u00e3o.<\/strong><\/p>\n<p>Em empresas nas quais a ado\u00e7\u00e3o do Kotlin est\u00e1 completa, projetos novos come\u00e7am naturalmente em Kotlin. Se o processo de ado\u00e7\u00e3o estiver em andamento, as equipes costumam poder escolher entre o Java e o Kotlin. Escolha com sabedoria ;-).<\/p>\n<h3 class=\"wp-block-heading\"><strong>Aplicativos em atividade<\/strong><\/h3>\n<p><strong>Estrat\u00e9gia: uma migra\u00e7\u00e3o pragm\u00e1tica, orientada pelos recursos.<\/strong><\/p>\n<p>Os aplicativos em atividade s\u00e3o os que requerem uma pondera\u00e7\u00e3o cuidadosa: reescrev\u00ea-los sem um bom motivo \u00e9 uma ideia dif\u00edcil de vender para o propriet\u00e1rio do produto. Em vez disso, combine os esfor\u00e7os de migra\u00e7\u00e3o com o desenvolvimento de novos recursos. Esta abordagem traz um valor de neg\u00f3cios tang\u00edvel e tamb\u00e9m moderniza a sua base de c\u00f3digo. J\u00e1 discutimos os diferentes \u00e2ngulos de ataque na se\u00e7\u00e3o <a href=\"https:\/\/docs.google.com\/document\/d\/1CBnxrE1KB_YOF_su8bVRJpGDD5G2Jo870pjSwZb5yaQ\/edit?tab=t.0#heading=h.wzs8ids1wb0d\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Ampliar ou converter um aplicativo em Java j\u00e1 existente<\/em><\/a>.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Abordagens para a convers\u00e3o de Java para Kotlin<\/strong><\/h2>\n<p>Ao converter de Java para Kotlin, h\u00e1 v\u00e1rias op\u00e7\u00f5es, cada uma com diferentes vantagens e desvantagens:<\/p>\n<p><strong>1. Reprograma\u00e7\u00e3o total<\/strong><\/p>\n<p><strong>Melhor op\u00e7\u00e3o para:<\/strong> bases pequenas de c\u00f3digo\u00a0<\/p>\n<p><strong>Desafio:<\/strong> demorada para sistemas maiores<\/p>\n<p>Reprogramar uma base de c\u00f3digo do zero resulta no c\u00f3digo mais limpo e idiom\u00e1tico em Kotlin. Esta abordagem \u00e9 adequada para bases pequenas de c\u00f3digo, como um microsservi\u00e7o. Para bases grandes de c\u00f3digo, esta abordagem geralmente tende a ter um custo proibitivo.<\/p>\n<h3 class=\"wp-block-heading\"><strong>2. Convers\u00e3o autom\u00e1tica pelo IDE, com refinamentos manuais<\/strong><\/h3>\n<p><strong>Melhor op\u00e7\u00e3o para:<\/strong> bases m\u00e9dias de c\u00f3digo, com tempo dedicado para refatora\u00e7\u00e3o<\/p>\n<p><strong>Desafio:<\/strong> os refinamentos manuais s\u00e3o obrigat\u00f3rios\u00a0<\/p>\n<p>O recurso <em>Convert Java to Kotlin<\/em>, do IntelliJ IDEA, fornece uma tradu\u00e7\u00e3o literal, que est\u00e1 longe de ser idiom\u00e1tica. Veja este exemplo:<\/p>\n<p>Primeira rodada:\u00a0<\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">record Developer(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0String name,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0List languages\n) {}<\/pre>\n<p><strong>Resultado bruto da convers\u00e3o autom\u00e1tica:<\/strong><\/p>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@JvmRecord\ndata class Developer(\n\u00a0\u00a0\u00a0val name: String?,\n\u00a0\u00a0\u00a0val languages: MutableList?\n)<\/pre>\n<p>Esta convers\u00e3o tem v\u00e1rios problemas:<\/p>\n<ul>\n<li>Tudo pode ter valores nulos (defensivo demais).<\/li>\n<li>As cole\u00e7\u00f5es do Java viram uma <code>MutableList<\/code>, em vez da lista-padr\u00e3o somente para leitura do Kotlin.<\/li>\n<\/ul>\n<p><strong>Como melhorar a convers\u00e3o com anota\u00e7\u00f5es jspecify:<\/strong><\/p>\n<p>Felizmente, h\u00e1 uma solu\u00e7\u00e3o para converter todos os tipos do Java em tipos Nullable do Kotlin, atrav\u00e9s de anota\u00e7\u00f5es @NonNull\/@Nullable. Est\u00e3o dispon\u00edveis diversas op\u00e7\u00f5es; a mais moderna \u00e9 <a href=\"https:\/\/jspecify.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">jspecify<\/a>, que recentemente tamb\u00e9m ganhou suporte no Spring:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u00a0\u00a0\u00a0org.jspecify\n\u00a0\u00a0\u00a0jspecify\n\u00a0\u00a0\u00a01.0.0\n\n\nimplementation(\"org.jspecify:jspecify:1.0.0\")<\/pre>\n<p>@jspecify torna poss\u00edvel anotar o c\u00f3digo em Java com @Nullable and @NonNull.<\/p>\n<p>Segunda rodada:\u00a0<\/p>\n<p><strong>Java<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import org.jspecify.annotations.NonNull;\nimport org.jspecify.annotations.Nullable;\n\nrecord Developer(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@NonNull String name,\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@NonNull List languages,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@Nullable String email\n) {}<\/pre>\n<p>Agora a convers\u00e3o autom\u00e1tica produz resultados muito melhores:<\/p>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@JvmRecord\ndata class Developer(\n\u00a0\u00a0\u00a0\/\/\ud83d\ude03 non-null as requested\n\u00a0\u00a0\u00a0val name: String,\u00a0\n\u00a0\u00a0\u00a0\/\/\ud83d\ude03 both, collection and type are non-null\n\u00a0 val languages: MutableList,\n\u00a0\u00a0\u00a0\/\/\ud83d\ude03 nullable as requested\n\u00a0 val email: String?,\u00a0\n)<\/pre>\n<p><strong>Limita\u00e7\u00f5es da abordagem de convers\u00e3o autom\u00e1tica:<\/strong><\/p>\n<p>Mesmo com anota\u00e7\u00f5es de jspecify, padr\u00f5es complexos em Java n\u00e3o se convertem bem. Veja este exemplo de c\u00f3digo convertido automaticamente, mostrado na se\u00e7\u00e3o <em>3. O c\u00f3digo em Kotlin n\u00e3o tem mais exce\u00e7\u00f5es verificadas, mas \u00e9 mais seguro<\/em><strong>:<\/strong><\/p>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fun downloadAndGetLargestFile(urls: MutableList): String? {\n\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83e\udd28 using Stream, instead of Kotlin Collections\n\u00a0\u00a0\u00a0\u00a0\u00a0val contents = urls.stream().map { urlStr: String? -&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83e\udd28 still using Optional, rather than Nullable types\n\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83e\udd28 var but we want val!\n\u00a0\u00a0\u00a0\u00a0\u00a0var optional: Optional\n\u00a0\u00a0\u00a0\u00a0\u00a0\/\/\ud83e\udd28 useless try-catch, no need to catch in Kotlin\n\u00a0\u00a0\u00a0\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0optional = Optional.of(URI(urlStr).toURL())\n\u00a0\u00a0\u00a0\u00a0\u00a0} catch (e: URISyntaxException) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0optional = Optional.empty()\n\u00a0\u00a0\u00a0\u00a0\u00a0} catch (e: MalformedURLException) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0optional = Optional.empty()\n\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0optional\n\u00a0\u00a0\u00a0}.filter { it!!.isPresent() }\/\/\ud83e\udd28 discouraged !! to force conversion to non-null\n\u00a0\u00a0\u00a0\u00a0.map {it.get() }\n\u00a0\u00a0\u00a0\u00a0.map { url: URL -&gt;\n      \/\/\ud83e\udd28 useless try-catch, no need to catch in Kotlin\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url.openStream().use { `is` -&gt;\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0String(`is`.readAllBytes(), StandardCharsets.UTF_8)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} catch (e: IOException) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw IllegalArgumentException(e)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}.toList()\n\u00a0\u00a0\u00a0\/\/\ud83e\udd28 usage of Java collections\u2026\n\u00a0\u00a0\u00a0return Collections.max(contents)\n}<\/pre>\n<p>A convers\u00e3o autom\u00e1tica fica muito longe do resultado desejado, idiom\u00e1tico:<\/p>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fun downloadAndGetLargestFile(urls: List): String? =\n\u00a0\u00a0\u00a0urls.mapNotNull {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0runCatching { URI(it).toURL() }.getOrNull()\n\u00a0\u00a0\u00a0}.maxOfOrNull{ it.openStream().use{ it.reader().readText() } }<\/pre>\n<p>A convers\u00e3o autom\u00e1tica d\u00e1 um ponto de partida, mas \u00e9 necess\u00e1rio fazer um significativo refinamento manual e ter conhecimento de Kotlin verdadeiramente idiom\u00e1tico para se alcan\u00e7ar este.<\/p>\n<p><strong>3. Convers\u00e3o assistida por IA<\/strong><\/p>\n<p><strong>Melhor op\u00e7\u00e3o para:<\/strong> bases de c\u00f3digo maiores, com uma infraestrutura robusta de testes<\/p>\n<p><strong>Desafio:<\/strong> \u00e9 necess\u00e1ria revis\u00e3o manual<\/p>\n<p>Potencialmente, a IA pode produzir resultados mais idiom\u00e1ticos que uma convers\u00e3o autom\u00e1tica b\u00e1sica, mas o sucesso depende de uma prepara\u00e7\u00e3o cuidadosa:<\/p>\n<p><strong>Pr\u00e9-requisitos:<\/strong><\/p>\n<ol>\n<li><strong>Cobertura abrangente de testes:<\/strong> como LLMs s\u00e3o imprevis\u00edveis, voc\u00ea precisa de testes confi\u00e1veis para detectar alucina\u00e7\u00f5es da IA.<\/li>\n<li><strong>Prompts de sistema bem pensados:<\/strong> crie instru\u00e7\u00f5es detalhadas para usar convers\u00f5es idiom\u00e1ticas para Kotlin, alinhadas aos seus padr\u00f5es. Voc\u00ea pode usar <a href=\"https:\/\/gist.github.com\/upeter\/554dcb541cd3fb4bf9ea0be0a6887405\" target=\"_blank\" rel=\"noreferrer noopener\">este prompt de sistema<\/a> como ponto de partida.<\/li>\n<li><strong>Extensa revis\u00e3o do c\u00f3digo:<\/strong> a sa\u00edda da IA requer uma revis\u00e3o minuciosa, examinando a corre\u00e7\u00e3o l\u00f3gica e idiom\u00e1tica, o que pode ser muito cansativo mentalmente em bases grandes de c\u00f3digo.<\/li>\n<\/ol>\n<p>O resultado \u00e9 bem satisfat\u00f3rio com o uso deste <a href=\"https:\/\/gist.github.com\/upeter\/554dcb541cd3fb4bf9ea0be0a6887405\" target=\"_blank\" rel=\"noreferrer noopener\">prompt de sistema<\/a> proposto para guiar a convers\u00e3o, mas n\u00e3o \u00e9 perfeito:<\/p>\n<p><strong>Kotlin<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fun downloadAndGetLargestFile(urls: List): String? {\n\u00a0\u00a0\u00a0val contents = urls\n      .mapNotNull {\u00a0\n            urlStr -&gt; runCatching { URI(urlStr).toURL() }.getOrNull()\u00a0\n      }.mapNotNull { url -&gt; runCatching {\u00a0\n            url.openStream().use { it.readAllBytes().toString(UTF_8)\n      \u00a0\u00a0\u00a0}\u00a0\n      }.getOrNull() }\n\n\u00a0\u00a0\u00a0return contents.maxOrNull()\n}<\/pre>\n<p><strong>4. Convers\u00e3o autom\u00e1tica em escala<\/strong><\/p>\n<p><strong>Melhor op\u00e7\u00e3o para:<\/strong> bases imensas de c\u00f3digo, que requeiram transforma\u00e7\u00e3o sistem\u00e1tica<\/p>\n<p>No momento, n\u00e3o h\u00e1 nenhuma ferramenta oficial para converter bases de c\u00f3digo em Java para Kotlin em escala. Por\u00e9m, a Meta e a Uber encararam esse desafio com sucesso em suas bases de c\u00f3digo para Android, usando abordagens que funcionam igualmente bem para aplicativos de back-end. A documenta\u00e7\u00e3o e as palestras a seguir fornecem insights sobre como a Meta e a Uber abordaram essa miss\u00e3o:<\/p>\n<p><strong>A abordagem da Meta:<\/strong><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-656947\" style=\"width: 150px;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/unnamed-1.png\" alt=\"Meta\" width=\"1600\" height=\"900\" \/><\/p>\n<ul>\n<li><strong>Estrat\u00e9gia:<\/strong> transforma\u00e7\u00e3o determinista baseada em regras<\/li>\n<li><strong>Recursos:<\/strong>\n<ul>\n<li><a href=\"https:\/\/engineering.fb.com\/2024\/12\/18\/android\/translating-java-to-kotlin-at-scale\/\" target=\"_blank\" rel=\"noreferrer noopener\">Postagem em um blog de engenharia<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=zfnOjAYdWrc&amp;ab_channel=%40Scale\" target=\"_blank\" rel=\"noreferrer noopener\">Palestra em congresso<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>A abordagem da Uber:<\/strong><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-656958\" style=\"width: 150px;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/unnamed.png\" alt=\"Uber\" width=\"225\" height=\"225\" \/><\/p>\n<ul>\n<li><strong>Estrat\u00e9gia:<\/strong> transforma\u00e7\u00e3o determinista baseada em regras, usando IA para gerar as regras de convers\u00e3o<\/li>\n<li><strong>Recurso:<\/strong><a href=\"https:\/\/kotlinconf.com\/talks\/811915\/\" target=\"_blank\" rel=\"noreferrer noopener\"> apresenta\u00e7\u00e3o na KotlinConf<\/a><\/li>\n<\/ul>\n<p>As duas empresas tiveram sucesso em criar processos sistem\u00e1ticos e repet\u00edveis, em vez de dependerem da convers\u00e3o manual ou da automa\u00e7\u00e3o simples. Suas abordagens baseadas em regras garantem consist\u00eancia e qualidade em milh\u00f5es de linhas de c\u00f3digo.<\/p>\n<p><strong>Importante<\/strong>: Converter Java em Kotlin em escala introduz um desafio em n\u00edvel social: para que o c\u00f3digo gerado seja confi\u00e1vel, voc\u00ea ainda ir\u00e1 querer &#8220;um humano no meio&#8221; fazendo uma revis\u00e3o. Por\u00e9m, se isso n\u00e3o for planejado com cuidado, os engenheiros podem facilmente ficar sobrecarregados pela enxurrada de solicita\u00e7\u00f5es de pull criadas pela convers\u00e3o autom\u00e1tica. Portanto, o impacto social precisa ser examinado com cuidado.\u00a0<\/p>\n<p>Lembre-se: a ado\u00e7\u00e3o bem-sucedida do Kotlin em escala n\u00e3o consiste apenas em converter c\u00f3digo \u2014 tamb\u00e9m envolve criar expertise na equipe, estabelecer padr\u00f5es de programa\u00e7\u00e3o e criar processos sustent\u00e1veis que tragam valor de longo prazo \u00e0 sua empresa.<\/p>\n<p><strong>Recapitula\u00e7\u00e3o r\u00e1pida de quando usar cada abordagem:<\/strong><\/p>\n<ul>\n<li>Aplicativo pequeno ou que esteja mesmo para ser refeito?<br \/>\u2192 <strong>Reescrever em Kotlin (1)<\/strong><strong><br \/><\/strong><\/li>\n<li>Bases m\u00e9dias de c\u00f3digo, com tempo dedicado para refatora\u00e7\u00e3o, ou com a equipe aprendendo Kotlin?<br \/>\u2192 <strong>Convers\u00e3o autom\u00e1tica pelo IntelliJ IDEA + refinamento<\/strong> (come\u00e7ar pelos testes) <strong>(2)<\/strong><\/li>\n<li>C\u00f3digo m\u00e9dio ou grande, com padr\u00f5es repetitivos e bons testes?<br \/>\u2192 <strong>Abordagem assistida por IA (3) <\/strong><strong><br \/><\/strong><\/li>\n<li>Migra\u00e7\u00e3o para o Kotlin no n\u00edvel de toda a empresa e em muitos servi\u00e7os?<br \/>\u2192 <strong>Convers\u00e3o autom\u00e1tica em escala, com um plano concreto<\/strong> (conduzido pela plataforma) <strong>(4)<\/strong><\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\"><strong>Libere todo o potencial do Kotlin<\/strong><\/h2>\n<p>O Kotlin torna os desenvolvedores produtivos rapidamente. Sua sintaxe concisa, seus recursos de seguran\u00e7a e sua rica biblioteca-padr\u00e3o ajudam muitos desenvolvedores a escreverem c\u00f3digo melhor em semanas, n\u00e3o raramente atrav\u00e9s de autoestudo ou aprendizado no trabalho. Mas sem orienta\u00e7\u00e3o, muitos caem na armadilha de usar o Kotlin <em>ao estilo do Java<\/em>: continuando a usar estruturas mut\u00e1veis e padr\u00f5es prolixos e deixando de usar recursos idiom\u00e1ticos.<\/p>\n<p><strong>Como alcan\u00e7ar um novo patamar<\/strong><\/p>\n<p>Muitos desenvolvedores n\u00e3o conseguem atingir um <em>novo patamar<\/em> \u2014 adotando a imutabilidade, c\u00f3digo orientado para express\u00f5es, DSLs e concorr\u00eancia estruturada com corrotinas (com ou sem threads virtuais).<\/p>\n<p>Neste est\u00e1gio, descobri que um treinamento externo faz muito mais diferen\u00e7a que o autoestudo. At\u00e9 desenvolvedores com anos de experi\u00eancia em Kotlin costumam se beneficiar de um treinamento com foco em adotar padr\u00f5es idiom\u00e1ticos e liberar todo o potencial da linguagem.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-656971\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/kotlin-heroes.png\" alt=\"Her\u00f3is do Kotlin\" width=\"1698\" height=\"1142\" \/><\/figure>\n<h2 class=\"wp-block-heading\"><strong>Usar ou n\u00e3o o Kotlin: que tipo de empresa voc\u00ea quer ser?<\/strong><\/h2>\n<p>No fim das contas, a decis\u00e3o de adotar o Kotlin reflete a sua cultura de engenharia. Voc\u00ea valoriza:<\/p>\n<ul>\n<li><strong>A abordagem tradicional (Java)<\/strong>: conservadora, cerimoniosa, est\u00e1vel?<\/li>\n<li><strong>A abordagem progressista (Kotlin)<\/strong>: pragm\u00e1tica, moderna, adaptativa?<\/li>\n<\/ul>\n<p>As duas t\u00eam seus m\u00e9ritos. Java vai fazer o trabalho. Provavelmente, Kotlin o far\u00e1 melhor, com desenvolvedores mais satisfeitos e menos bugs. A quest\u00e3o n\u00e3o \u00e9 se o Kotlin \u00e9 melhor \u2014 \u00e9 se a sua empresa est\u00e1 pronta para investir em ser melhor.<\/p>\n<p>A jornada desde aquele primeiro teste do Kotlin at\u00e9 a ado\u00e7\u00e3o em toda a empresa nem sempre \u00e9 suave, mas com a abordagem certa, \u00e9 notavelmente previs\u00edvel. Comece pequeno, demonstre o valor, crie uma comunidade e escale criteriosamente.<\/p>\n<p>Seus desenvolvedores \u2014 atuais e futuros \u2014 lhe agradecer\u00e3o.<\/p>\n<p><em>Artigo original em ingl\u00eas por:<\/em><\/p>\n<div class=\"about-author \">\n<div class=\"about-author__box\">\n<div class=\"row\">\n<div class=\"about-author__box-img\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/10\/a3f7-400o400o1-QYUavRYyARnAVJLCpM1m8M.webp\" alt=\"\" \/><\/div>\n<div class=\"about-author__box-text\">\n<h4>Urs Peter<\/h4>\n<p>Urs \u00e9 um calejado engenheiro de software, arquiteto de solu\u00e7\u00f5es, palestrante e instrutor, com mais de 20 anos de experi\u00eancia no desenvolvimento de sistemas resilientes, escal\u00e1veis e cr\u00edticos, a maioria envolvendo Kotlin e Scala.<\/p>\n<p>Al\u00e9m de seu trabalho como consultor, ele tamb\u00e9m \u00e9 um instrutor apaixonado e autor de uma grande variedade de treinamentos, desde cursos das linguagens Kotlin e Scala at\u00e9 treinamentos em arquiteturas como microsservi\u00e7os e arquiteturas dirigidas por eventos.<\/p>\n<p>Sendo uma pessoa por natureza voltada para outras pessoas, ele adora compartilhar conhecimentos, inspirar e ser inspirado por colegas em encontros e congressos. Urs \u00e9 um instrutor de Kotlin certificado pela JetBrains.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/08\/photo_2021-08-03_15-27-43-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Alyona Chernyaeva\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Alyona Chernyaeva<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":672148,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/672144"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=672144"}],"version-history":[{"count":3,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/672144\/revisions"}],"predecessor-version":[{"id":672170,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/672144\/revisions\/672170"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/672148"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=672144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=672144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=672144"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=672144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}