{"id":672145,"date":"2026-01-06T04:44:57","date_gmt":"2026-01-06T03:44:57","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=672145"},"modified":"2026-01-06T04:45:01","modified_gmt":"2026-01-06T03:45:01","slug":"escalar-la-adopcion-de-kotlin-en-su-organizacion","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/es\/kotlin\/2026\/01\/escalar-la-adopcion-de-kotlin-en-su-organizacion\/","title":{"rendered":"Escalar la adopci\u00f3n de Kotlin en su organizaci\u00f3n"},"content":{"rendered":"<p><em>Art\u00edculo 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>, ingeniero de software s\u00e9nior y formador de Kotlin certificado por JetBrains. Para los lectores que busquen una forma m\u00e1s estructurada de desarrollar sus habilidades en Kotlin, Urs tambi\u00e9n dirige el <\/em><a href=\"https:\/\/academy.xebia.com\/upskilling\/kotlin-academy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Kotlin Upskill Program<\/em><\/a><em> en Xebia Academy<\/em>.<\/p>\n<p><em>Este es el quinto art\u00edculo de <\/em><strong><em>La gu\u00eda definitiva para adoptar Kotlin en un entorno dominado por Java<\/em><\/strong><em>, una serie que sigue c\u00f3mo crece la adopci\u00f3n de Kotlin entre equipos reales, desde la curiosidad de un \u00fanico desarrollador hasta la transformaci\u00f3n de toda la empresa.<\/em><\/p>\n<p><strong>Todos los art\u00edculos de la serie:<\/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\">Introducci\u00f3n a Kotlin para desarrolladores 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\/\">Evaluaci\u00f3n de Kotlin en proyectos reales<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2025\/11\/growing-kotlin-adoption-in-your-company\/\" target=\"_blank\" rel=\"noreferrer noopener\">Aumentar la adopci\u00f3n de Kotlin en su 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\/\">Ayudar a los responsables a decir s\u00ed a Kotlin<\/a><\/li>\n<li>Escalar la adopci\u00f3n de Kotlin en su organizaci\u00f3n<\/li>\n<\/ol>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<h2 class=\"wp-block-heading\"><strong>Factores de \u00e9xito para la adopci\u00f3n de Kotlin a gran escala<\/strong><\/h2>\n<p>Lograr la aceptaci\u00f3n de Kotlin por parte de los desarrolladores y el apoyo de la direcci\u00f3n es un hito importante, pero no es la l\u00ednea de meta. El verdadero reto comienza cuando se enfrenta a bases de c\u00f3digo Java existentes que deben coexistir con Kotlin o hacer la transici\u00f3n a este. \u00bfC\u00f3mo navegar eficazmente por este mundo h\u00edbrido?<\/p>\n<p>La clave para gestionar las bases de c\u00f3digo antiguas es desarrollar una estrategia que se alinee con sus objetivos organizativos y sus realidades operativas. Este es un enfoque demostrado que ha funcionado bien en la pr\u00e1ctica.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Estrategia del ciclo de vida de las aplicaciones<\/strong><\/h2>\n<p>Las distintas aplicaciones requieren enfoques diferentes en funci\u00f3n de la fase de su ciclo de vida. Examinemos tres categor\u00edas distintas:<\/p>\n<h3 class=\"wp-block-heading\"><strong>Aplicaciones al final de su vida \u00fatil<\/strong><\/h3>\n<p><strong>Estrategia: d\u00e9jelas tranquilas.<\/strong><\/p>\n<p>Si se ha programado que una aplicaci\u00f3n se retire, no hay motivos empresariales para la migraci\u00f3n. Mantenga estos sistemas en Java y concentre su energ\u00eda donde m\u00e1s importa. El coste de la migraci\u00f3n nunca estar\u00e1 justificado por la vida \u00fatil restante de la aplicaci\u00f3n.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Nuevos sistemas<\/strong><\/h3>\n<p><strong>Estrategia: por defecto a Kotlin.<\/strong><\/p>\n<p>En las organizaciones en las que ya se ha adoptado Kotlin por completo, los proyectos nuevos comienzan de forma natural con Kotlin. Si el proceso de adopci\u00f3n est\u00e1 en marcha, los equipos suelen tener que elegir entre Java y Kotlin. Elija sabiamente ;-).<\/p>\n<h3 class=\"wp-block-heading\"><strong>Aplicaciones activas<\/strong><\/h3>\n<p><strong>Estrategia: migraci\u00f3n pragm\u00e1tica y basada en funcionalidades.<\/strong><\/p>\n<p>Las aplicaciones activas son las que requieren una consideraci\u00f3n atenta: reescribir por reescribir no ser\u00e1 un argumento que convenza al propietario del producto. En su lugar, combine los esfuerzos de migraci\u00f3n con el desarrollo de nuevas funcionalidades. Este enfoque ofrece un valor empresarial tangible a la vez que moderniza su base de c\u00f3digo. Los diferentes \u00e1ngulos de ataque ya los hemos tratado en el apartado: <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 o convertir una aplicaci\u00f3n Java existente<\/em><\/a>.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Enfoques de conversi\u00f3n de Java a Kotlin<\/strong><\/h2>\n<p>Al convertir Java a Kotlin, tiene varias opciones, y cada una presenta sus propios compromisos:<\/p>\n<p><strong>1. Reescritura completa<\/strong><\/p>\n<p><strong>Ideal para:<\/strong> peque\u00f1as bases de c\u00f3digo\u00a0<\/p>\n<p><strong>Reto:<\/strong> requiere mucho tiempo para los sistemas m\u00e1s grandes<\/p>\n<p>Reescribir una base de c\u00f3digo desde cero le ofrece el c\u00f3digo Kotlin m\u00e1s limpio e idiom\u00e1tico. Este enfoque es adecuado para bases de c\u00f3digo peque\u00f1as, como un microservicio. Para bases de c\u00f3digo grandes, este enfoque suele ser prohibitivamente caro.<\/p>\n<h3 class=\"wp-block-heading\"><strong>2. Autoconversi\u00f3n del IDE con perfeccionamiento manual<\/strong><\/h3>\n<p><strong>Ideal para:<\/strong> bases de c\u00f3digo medianas con tiempo dedicado a la refactorizaci\u00f3n<\/p>\n<p><strong>Reto:<\/strong> las reparaciones manuales son obligatorias\u00a0<\/p>\n<p>La funci\u00f3n <em>Convert Java to Kotlin<\/em> de IntelliJ IDEA proporciona una traducci\u00f3n literal que dista mucho de ser idiom\u00e1tica. Veamos este ejemplo:<\/p>\n<p>Intento 1:\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 de la autoconversi\u00f3n:<\/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 conversi\u00f3n tiene varios problemas:<\/p>\n<ul>\n<li>Todo se vuelve anulable (demasiado defensivo).<\/li>\n<li>Las colecciones de Java se convierten en <code>MutableList<\/code> de Kotlin en lugar de en la lista de solo lectura predeterminada de Kotlin.<\/li>\n<\/ul>\n<p><strong>Mejora de la conversi\u00f3n con anotaciones jspecify:<\/strong><\/p>\n<p>Por suerte, para la conversi\u00f3n de todos los tipos Java a tipos Nullable en Kotlin, existe una soluci\u00f3n en forma de anotaciones @NonNull\/@Nullable. Existen diferentes opciones; la m\u00e1s moderna es <a href=\"https:\/\/jspecify.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">jspecify<\/a>, que recientemente tambi\u00e9n ha sido admitida oficialmente por 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>Con jspecify, podemos anotar el c\u00f3digo Java con @Nullable y @NonNull.<\/p>\n<p>Intento 2:\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>Ahora la autoconversi\u00f3n da mucho mejores resultados:<\/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>Limitaciones del enfoque de autoconversi\u00f3n:<\/strong><\/p>\n<p>Incluso con anotaciones jspecify, los patrones Java complejos no se traducen bien. Vea este ejemplo de c\u00f3digo autoconvertido mostrado en el apartado: <em>3. No m\u00e1s excepciones comprobadas, pero el c\u00f3digo en Kotlin es m\u00e1s 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>La autoconversi\u00f3n est\u00e1 muy lejos del resultado deseado e 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>La autoconversi\u00f3n proporciona un punto de partida, pero se requiere un perfeccionamiento manual significativo y conocimientos de Kotlin para conseguir un Kotlin verdaderamente idiom\u00e1tico.<\/p>\n<p><strong>3. Conversi\u00f3n asistida por IA<\/strong><\/p>\n<p><strong>Ideal para:<\/strong> bases de c\u00f3digo m\u00e1s grandes con una infraestructura de pruebas robusta<\/p>\n<p><strong>Reto:<\/strong>se requiere una revisi\u00f3n manual<\/p>\n<p>La IA puede producir resultados m\u00e1s idiom\u00e1ticos que la autoconversi\u00f3n b\u00e1sica, pero para obtenerlos se necesita una preparaci\u00f3n cuidadosa:<\/p>\n<p><strong>Requisitos previos:<\/strong><\/p>\n<ol>\n<li><strong>Amplia cobertura de pruebas: <\/strong>dado que los LLM son impredecibles, necesita pruebas fiables para detectar las alucinaciones de la IA.<\/li>\n<li><strong>Peticiones al sistema bien elaboradas:<\/strong> cree instrucciones detalladas para conversiones idiom\u00e1ticas de Kotlin que est\u00e9n alineadas con sus est\u00e1ndares. Puede utilizar<a href=\"https:\/\/gist.github.com\/upeter\/554dcb541cd3fb4bf9ea0be0a6887405\" target=\"_blank\" rel=\"noreferrer noopener\"> esta petici\u00f3n del sistema<\/a> como punto de partida.<\/li>\n<li><strong>Revisi\u00f3n exhaustiva del c\u00f3digo:<\/strong> el resultado de la IA requiere una revisi\u00f3n exhaustiva para comprobar la correcci\u00f3n l\u00f3gica e idiom\u00e1tica, lo que puede resultar mentalmente agotador en el caso de grandes bases de c\u00f3digo.<\/li>\n<\/ol>\n<p>Utilizando la <a href=\"https:\/\/gist.github.com\/upeter\/554dcb541cd3fb4bf9ea0be0a6887405\" target=\"_blank\" rel=\"noreferrer noopener\">petici\u00f3n del sistema<\/a> propuesta para guiar la conversi\u00f3n, el resultado es bastante satisfactorio, aunque no perfecto:<\/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. Autoconversi\u00f3n a gran escala<\/strong><\/p>\n<p><strong>Ideal para:<\/strong> bases de c\u00f3digo enormes que requieren una transformaci\u00f3n sistem\u00e1tica<\/p>\n<p>Actualmente, no existe ninguna herramienta oficial para convertir bases de c\u00f3digo Java a Kotlin idiom\u00e1tico a gran escala. Sin embargo, tanto Meta como Uber han abordado con \u00e9xito este reto para sus bases de c\u00f3digo de Android utilizando enfoques que funcionan igual de bien para las aplicaciones de backend. Los siguientes documentos y charlas ofrecen una visi\u00f3n de c\u00f3mo Meta y Uber abordan esta b\u00fasqueda:<\/p>\n<p><strong>El enfoque de 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>Estrategia:<\/strong> transformaci\u00f3n determinista basada en reglas<\/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\">Art\u00edculo de un blog sobre ingenier\u00eda<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=zfnOjAYdWrc&amp;ab_channel=%40Scale\" target=\"_blank\" rel=\"noreferrer noopener\">Conferencia<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>El enfoque de 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>Estrategia:<\/strong> transformaci\u00f3n determinista basada en reglas que utiliza la IA para generar las reglas de conversi\u00f3n<\/li>\n<li><strong>Recurso:<\/strong><a href=\"https:\/\/kotlinconf.com\/talks\/811915\/\" target=\"_blank\" rel=\"noreferrer noopener\"> Presentaci\u00f3n en la KotlinConf<\/a><\/li>\n<\/ul>\n<p>Ambas empresas tuvieron \u00e9xito creando procesos sistem\u00e1ticos y repetibles en lugar de confiar en la conversi\u00f3n manual o en la simple automatizaci\u00f3n. Sus enfoques basados en reglas garantizan la coherencia y la calidad en millones de l\u00edneas de c\u00f3digo.<\/p>\n<p><strong>Importante<\/strong>: La conversi\u00f3n de Java a Kotlin a gran escala introduce un reto a nivel organizativo: para que sea fiable, sigue siendo necesario que haya una persona en el proceso revisando el c\u00f3digo generado. Sin embargo, si no se planifica con cuidado, los ingenieros pueden verse f\u00e1cilmente desbordados por la avalancha de solicitudes de incorporaci\u00f3n de cambios resultantes de la conversi\u00f3n automatizada. Por lo tanto, es necesario considerar cuidadosamente el impacto en la organizaci\u00f3n.\u00a0<\/p>\n<p>Recuerde que el \u00e9xito de la adopci\u00f3n de Kotlin a gran escala no consiste \u00fanicamente en convertir el c\u00f3digo, sino tambi\u00e9n en desarrollar la experiencia del equipo, establecer normas de codificaci\u00f3n y crear procesos sostenibles que aporten valor a largo plazo a su organizaci\u00f3n.<\/p>\n<p><strong>Breve recapitulaci\u00f3n sobre cu\u00e1ndo utilizar cada enfoque:<\/strong><\/p>\n<ul>\n<li>\u00bfPeque\u00f1a aplicaci\u00f3n o aplicaci\u00f3n que se est\u00e1 reescribiendo?<br \/>\u2192 <strong>Reescribir en Kotlin (1)<\/strong><strong><br \/><\/strong><\/li>\n<li>\u00bfBases de c\u00f3digo medianas con tiempo dedicado a la refactorizaci\u00f3n o un equipo aprendiendo Kotlin?<br \/>\u2192 <strong>Autoconversi\u00f3n de IntelliJ IDEA + refinamiento<\/strong> (empezar primero con las pruebas) <strong>(2)<\/strong><\/li>\n<li>\u00bfC\u00f3digo de tama\u00f1o medio\/grande con patrones repetidos y buenas pruebas?<br \/>\u2192 <strong>Enfoque asistido por IA (3) <\/strong><strong><br \/><\/strong><\/li>\n<li>\u00bfMigraci\u00f3n de toda la organizaci\u00f3n a Kotlin a trav\u00e9s de muchos servicios?<br \/>\u2192 <strong>Autoconversi\u00f3n a escala con un plan concreto<\/strong> (basado en la plataforma) <strong>(4)<\/strong><\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\"><strong>Desencadene todo el potencial de Kotlin<\/strong><\/h2>\n<p>Kotlin hace que los desarrolladores sean productivos r\u00e1pidamente. Su sintaxis concisa, sus funcionalidades de seguridad y su rica biblioteca est\u00e1ndar ayudan a muchos desarrolladores a escribir mejor c\u00f3digo en cuesti\u00f3n de semanas, a menudo mediante autoaprendizaje o aprendizaje en el puesto de trabajo. Pero sin orientaci\u00f3n, muchos caen en la trampa de utilizar Kotlin <em>al estilo Java<\/em>: ci\u00f1\u00e9ndose a estructuras mutables, patrones verbales y perdi\u00e9ndose funcionalidades idiom\u00e1ticas.<\/p>\n<p><strong>Pasar al siguiente nivel<\/strong><\/p>\n<p>El paso al <em>siguiente nivel<\/em> (adoptar la inmutabilidad, el c\u00f3digo orientado a expresiones, los DSL y la concurrencia estructurada con corrutinas, con o sin hilos virtuales) es donde muchos desarrolladores se atascan.<\/p>\n<p>A estas alturas, he descubierto que la formaci\u00f3n externa marca una diferencia mucho mayor que el autoaprendizaje. Incluso a los desarrolladores con a\u00f1os de experiencia en Kotlin les suele venir bien una formaci\u00f3n espec\u00edfica para adoptar patrones idiom\u00e1ticos y liberar todo el potencial del lenguaje.<\/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=\"H\u00e9roes de Kotlin\" width=\"1698\" height=\"1142\" \/><\/figure>\n<h2 class=\"wp-block-heading\"><strong>Kotlin o no Kotlin, esa es la cuesti\u00f3n. \u00bfQu\u00e9 tipo de empresa quiere ser?<\/strong><\/h2>\n<p>En \u00faltima instancia, la decisi\u00f3n de adoptar Kotlin refleja su cultura de ingenier\u00eda. Usted prefiere:<\/p>\n<ul>\n<li>\u00bfEl <strong>enfoque tradicional (Java)<\/strong>: conservador, ceremonial, estable?<\/li>\n<li>\u00bfEl <strong>enfoque progresivo (Kotlin)<\/strong>: pragm\u00e1tico, moderno, adaptativo?<\/li>\n<\/ul>\n<p>Ambos tienen sus m\u00e9ritos. Java har\u00e1 el trabajo. Kotlin probablemente lo har\u00e1 mejor, con desarrolladores m\u00e1s contentos y menos errores. La cuesti\u00f3n no es si Kotlin es mejor, sino si su organizaci\u00f3n est\u00e1 preparada para invertir en ser mejor.<\/p>\n<p>El camino desde esa primera prueba de Kotlin hasta su adopci\u00f3n en toda la organizaci\u00f3n no siempre es f\u00e1cil, pero con el enfoque adecuado, es notablemente predecible. Empiece poco a poco, demuestre su valor, cree una comunidad y escale poco a poco.<\/p>\n<p>Sus desarrolladores \u2014actuales y futuros\u2014 se lo agradecer\u00e1n.<\/p>\n<p><em>Art\u00edculo original en ingl\u00e9s de:<\/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 es un experimentado ingeniero de software, arquitecto de soluciones, conferenciante y formador con m\u00e1s de 20 a\u00f1os de experiencia en la creaci\u00f3n de sistemas resistentes, escalables y cr\u00edticos, principalmente con Kotlin y Scala.<\/p>\n<p>Adem\u00e1s de su trabajo como consultor, tambi\u00e9n es un formador apasionado y autor de una gran variedad de cursos que van desde cursos de los lenguajes Kotlin y Scala hasta formaciones de arquitectura como los microservicios y las arquitecturas orientadas a eventos.<\/p>\n<p>Como persona sociable por naturaleza, le encanta compartir conocimientos e inspirar y dejarse inspirar por sus compa\u00f1eros en quedadas y conferencias. Urs es un formador de Kotlin certificado por 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":672173,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/kotlin\/672145"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/comments?post=672145"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/kotlin\/672145\/revisions"}],"predecessor-version":[{"id":672196,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/kotlin\/672145\/revisions\/672196"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media\/672173"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media?parent=672145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/categories?post=672145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/tags?post=672145"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/cross-post-tag?post=672145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}