Uso de Kotlin para el desarrollo de back-end: una descripción general rápida
Publicado: 2022-03-11No tengo por qué presentar Kotlin a los desarrolladores nativos de Android, ya que en mayo de 2017 Google anunció que sería el lenguaje oficial para el desarrollo de Android. Desde entonces, ha ganado mucha tracción como la opción de idioma principal para desarrollar nuevas y brillantes aplicaciones de Android. Resuelve muchos puntos débiles de Java, por lo que la mayoría de las aplicaciones nuevas se escriben en él y las antiguas se reescriben en él.
No hay duda de que es genial en el lado frontal de las aplicaciones, y cuando mencionas Kotlin por primera vez, la mayoría de las personas lo asocian con el sistema operativo Android. Sin embargo, en este artículo, hablaría sobre Kotlin como un lenguaje de back-end y me gustaría compartir mi historia sobre la creación de un back-end de Kotlin rápido, confiable y asincrónico para mi proyecto de pasatiempo de Android. No discutiré de qué se trata el proyecto, ya que está fuera del alcance de este artículo; más bien, me centraré en explicar por qué elegí Kotlin y por qué creo que es un gran lenguaje para escribir aplicaciones del lado del servidor o API REST.
¿Por qué Kotlin?
Permítanme volver al comienzo mismo de mi viaje. Siempre tuve ambiciones empresariales y pensé que el primer paso en este camino es crear algo por mi cuenta. Nada enorme, nada que cambie el mundo, solo algo pequeño que yo y tal vez mi familia y amigos podamos usar. Después de tener una idea razonable, salté directamente a ella y comencé a implementarla. Lo primero que haces al comienzo de cualquier proyecto es elegir tus herramientas. Después de todo, el conjunto correcto de herramientas puede ahorrarle mucho tiempo y dinero a largo plazo. Así que esto es lo que hice.
Soy principalmente un desarrollador de Java. He escrito varios sistemas back-end y REST API usando Java y Spring, y creo que estos dos son excelentes herramientas para hacer esas cosas. Java por sí solo es un lenguaje completo, pero combinado con Spring, no hay nada que no puedas implementar.
Sin embargo, solo hay un cabello diminuto en la sopa. Verbosidad. Aunque Spring y las últimas versiones de Java ayudan mucho con eso, todavía tienes que manejar una gran cantidad de código repetitivo. Y como me dijo una vez un gran tipo: el código más seguro, confiable y libre de errores es el código que no está escrito. Tomemos, por ejemplo, esta clase trivial de Java:
public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
En mi opinión, esto es mucho código para simplemente decir: "Quiero una clase con dos campos de solo lectura". La peor parte es que el constructor y los métodos se generaron automáticamente. Aún así, cuando está revisando una solicitud de extracción, siempre la revisa porque, bueno, nunca sabe si es lo que necesita o no. Claro, esto se puede acortar con bibliotecas de terceros como Lombok, pero ¿no sería bueno si pudiéramos hacer esto de manera inmediata? Veamos esta misma clase exacta en Kotlin:
class Person( val name: String, val age: Int )
Definitivamente es más corto y más simple. Las variables son definitivas ya que usamos la palabra clave val ; el constructor y los captadores se generan en tiempo de compilación. Si preferimos no tener un objeto de persona inmutable, simplemente podemos cambiar val a var , y listo, tenemos una persona mutable, y todo lo que tenemos que hacer es cambiar una letra.
Mi segunda parte favorita en una clase Java POJO simple es equals()
y hashCode()
. Estos se generan automáticamente la mayor parte del tiempo, pero siempre tienes que revisarlos, solo para asegurarte. La buena noticia es que Kotlin también puede manejar esto. Simplemente cambie su class
a una data class
y obtendrá equals()
y hashCode()
para usar.
data class Person( val name: String, val age: Int )
En resumen, aunque me encanta Java, quería crear un producto mínimo viable para mi proyecto lo antes posible en poco tiempo. Y en el caso del desarrollo de software, la forma más sencilla de lograrlo es escribir menos código. Por lo tanto, continuó mi búsqueda de un lenguaje mejor para el desarrollo de back-end. Con este pensamiento en mente, primero cambié a Node.js. Tiene algunas ventajas significativas: unas pocas líneas y su servidor Express está en funcionamiento, escuchando en el puerto 8080 y respondiendo con Hello World. cada vez que envíe una solicitud de obtención.
let express = require('express') let app = express(); app.get('/', (req, res) => res.send('Hello World!')); app.listen(8080);
Fácil, sencillo y rápido. Justo lo que esperarías de uno de los lenguajes de programación más populares que existen. Disfruto trabajar con JavaScript y, por un breve momento, pensé que había encontrado la herramienta adecuada, pero luego me obsesionó el hecho de que JavaScript se escribe dinámicamente. No me malinterpreten, creo que la escritura dinámica es excelente en el front-end, pero en mi experiencia, tener un back-end escrito estáticamente simplemente le da una confianza adicional de que es menos probable que su servidor se bloquee en el tiempo de ejecución debido a la falta de coincidencia de tipos. . Y seamos honestos aquí, cuando su back-end está sirviendo a varios cientos de miles de usuarios, realmente no quiere que eso suceda. Node.js, sin embargo, ofrecía una gran característica que quería conservar, que es poder escribir fácilmente código y servicios asincrónicos.
Con estos requisitos en mente, elegí escribir mi back-end de Kotlin Android también en Kotlin.
Kotlin: una descripción general rápida
Para aquellos de ustedes que nunca han oído hablar de él antes, Kotlin es un lenguaje de programación de tipo estático y de código abierto que admite tanto la programación funcional como la orientada a objetos. Proporciona una sintaxis y conceptos similares a los de C#, Java o Scala y se dirige principalmente a JVM, pero también tiene variantes que se dirigen a JavaScript o código nativo. Es muy similar a Java en el sentido de que Kotlin/JVM compila hasta el código de bytes de Java, por lo que para aquellos ingenieros de back-end que tienen experiencia en JVM, Kotlin será fácil de comprender.

Como dice su página oficial, el objetivo de Kotlin no es ser único sino inspirarse y obtener las mejores prácticas de décadas de desarrollo del lenguaje. Se puede usar con cualquier IDE de Java o desde la línea de comandos, pero personalmente prefiero y recomiendo usarlo con IntelliJ. El equipo de JetBrains mantiene y actualiza activamente, y no se preocupe por comprar la versión paga; si acaba de comenzar con Kotlin, la versión comunitaria de IntelliJ satisfará todas sus necesidades. Los tres aspectos más importantes de Kotlin que me gustaría señalar son: a) conciso (reduce drásticamente el código repetitivo), b) seguro (por un lado, está diseñado para evitar excepciones de puntero nulo), y c ) interoperable (puede aprovechar las bibliotecas existentes para JVM, Android o el navegador).
Corrutinas de Kotlin
Todo el mundo quiere tener servicios que atiendan a los usuarios rápidamente. Para alcanzar la máxima capacidad de tu servidor, lo primero que puedes hacer es tener una aplicación multihilo. Java es bastante engorroso con eso. Cuando aprende Java, primero aprende que si desea una aplicación multiproceso, debe ampliar la clase Thread o implementar la interfaz Runnable. Los principiantes nunca entienden realmente cuál es la diferencia (si es que hay alguna), pero para aumentar la confusión, también se les dice que siempre inicien un hilo con el método de ejecución, que nunca usen el método de inicio. O espera, ¿fue al revés? Después de todo, no importa, no debe iniciar un subproceso manualmente de todos modos, es demasiado costoso, más bien use un grupo de subprocesos. Simple, excepto que no lo es.
Afortunadamente, Kotlin tiene una solución aún más simple llamada rutinas. En pocas palabras, las corrutinas hacen posible escribir código asíncrono y sin bloqueo de una manera muy fluida. La idea central es tener funciones que se puedan suspender; en otras palabras, el cálculo puede suspenderse en algún momento y reanudarse más tarde. La mejor parte es que cuando se escribe código sin bloqueo, el modelo de programación realmente no cambia, por lo que escribir código sin bloqueo es esencialmente lo mismo que escribir código con bloqueo. Veamos dos ejemplos:
fun sendRequest(): Int { /* do some heavy work */ return 1; }
Este ejemplo muestra una función de bloqueo. El subproceso que ejecuta este fragmento de código no realizará ningún otro trabajo hasta que la función regrese, lo que en el caso de una API o una llamada a la base de datos podría demorar un par de segundos. Realmente no queremos bloquear nuestro hilo mientras esperamos otro servicio, así que convirtamos esta función en una que no bloquee.
suspend fun sendRequest(): Int { /* do some heavy work */ return 1; }
Este ejemplo muestra cómo podemos convertir nuestro método en una función sin bloqueo que se puede suspender. Esto significa que si, por simplicidad, el trabajo pesado es una simple llamada a la función delay()
de 10 segundos, el subproceso de ejecución seguirá trabajando en otras tareas durante ese tiempo y reanudará la ejecución de la función después de que pasen los 10 segundos. Buen código sin bloqueo logrado con una palabra clave.
Servicio Asíncrono con Ktor
Cuando se trata de escribir API REST, hay algunos pasos adicionales que se deben seguir, como iniciar un servidor integrado o analizar la solicitud y, por supuesto, nadie quiere hacerlo manualmente. Java tiene Spring Boot, lo que facilita mucho las cosas y, afortunadamente, Kotlin tiene un marco llamado Ktor. Ktor es un marco web para construir servidores asíncronos. Como dice su sitio web, Ktor es "fácil de usar, divertido y asíncrono". Ahora, la diversión es subjetiva, por lo que no me gustaría probar eso, sin embargo, veamos un fragmento que resulta fácil de usar y asíncrono.
fun main() { embeddedServer(Tomcat, 8080) { routing { get { call.respond("Hello world!") } } }.start(wait = true) }
El ejemplo anterior presenta un servidor Kotlin Ktor completamente funcional que se ejecuta en un servidor Tomcat incorporado, escucha en el puerto 8080 y responderá de forma asíncrona con "¡Hola mundo!" para recibir solicitudes. Todo esto en menos de 10 líneas de código.
Obviamente, Ktor puede hacer mucho más que esto. Presentar todas las características de Ktor requiere su propio artículo, pero entre muchas cosas, hace que el inicio de sesión y la autenticación sean muy fáciles. Lea más sobre lo que Ktor puede hacer en el lado del servidor y cómo configurarlo aquí.
Otros beneficios de Kotlin en el back-end
El primer beneficio que me gustaría señalar es que puede usar bibliotecas de Java en Kotlin y, créame, hay muchas bibliotecas de terceros increíbles para Java que pueden facilitarle la vida. ¿Por qué escribiría su propia implementación cuando hay una biblioteca de código abierto lista para usar que hace el trabajo a la perfección? Usar estos con Kotlin funciona perfectamente.
Otra gran ventaja de Kotlin y Ktor son las extensas bibliotecas y marcos de prueba que puede usar. El marco Junit funciona de maravilla con Kotlin, y Ktor agrega además de esto su propia biblioteca de prueba que le permite escribir pruebas de extremo a extremo y pruebas de integración en muy poco tiempo. Puede usar un motor de prueba personalizado que ejecutará toda su aplicación y puede manejar las solicitudes tal como lo haría la aplicación en vivo.
Conclusión
Como mencioné anteriormente, soy principalmente un desarrollador back-end de Java que tiene varias aplicaciones del lado del servidor y API REST detrás de mí. Aunque me encanta programar en Java, creo que no existe un mejor lenguaje o marco que sea perfecto para cualquier trabajo y pueda resolver cualquier problema. Mi enfoque es familiarizarse con tantas herramientas como sea posible y, cuando surja un problema, elegir la mejor herramienta que pueda resolver ese problema en particular sin problemas.
Como dice el sitio de Kotlin, el objetivo de Kotlin no es ser único; en cambio, se inspira y se basa en las mejores prácticas de décadas de desarrollo del lenguaje, y creo que cuando se trata de desarrollo de back-end, Kotlin, Coroutines y Ktor forman un trío increíble para hacer el trabajo. Puedes leer más sobre Kotlin y su utilidad como lenguaje de programación aquí.