En el mundo del software utilizamos constantemente abstracciones para facilitarnos el trabajo.Estas nos abstraen de otros dominios y reducen significativamente la complejidad con la que tenemos que lidiar. Un ejemplo de abstracción son los ORMs. Un ORM permite abstraernos en el código de la aplicación de la base de datos que se utilicemos por debajo. En lugar de tener que escribir queries (específicas del motor de base de datos) para acceder a los datos, el ORM nos permite utilizar el lenguaje de programación que estemos usando para codificar la aplicación, también para acceder a los datos. Cualquiera que haya utilizado ORMs sabe que en muchos casos la abstracción funciona bien y aporta mucho valor, pero cuando la aplicación nos requiere obtener múltiples entidades relacionadas, entre otros ejemplos, es cuando empezamos a ver las limitaciones. En estos casos, es común que los ORMs no siempre generen las queries óptimas, o que nos requieran escribir un código excesivamente complejo, haciendo que haya veces en las que tengamos que acabar escribiendo directamente las queries en el lenguaje de la DB subyacente. Lo cual significa dejar de la lado la abstracción para esos casos.
Es en estos momentos en los que las abstracciones empiezan a «hacer agua», cuando un conocimiento de los dominios o capas abstraídas se hace necesario. Sin embargo, en multitud de ocasiones los desarrolladores nos convertimos en meros usuarios de las abstracciones y obviamos interesarnos por lo que hay debajo. A veces hacemos esto por falta de tiempo, pero en muchas otras es por falta de base o de interés.
Actualmente han proliferado las escuelas que te enseñan a programar desde 0 en cuestión de meses, en general estas escuelas se centran en enseñarte los lenguajes y los frameworks a nivel usuario. Todo es muy hands-on y casi desde el principio estás programando. Pero cualquiera que haya hecho el camino de aprender a programar, sabe que es algo que lleva años, no meses. Y que es necesario mucho más conocimiento que saber utilizar un framework. Es solo cuestión de tiempo que los estudiantes de estas escuelas se encuentren con las limitaciones de las abstracciones. En estos casos tendrán dos opciones: intentar evitar el problema, con un workaround de efectos más o menos graves; o reconocer que tienen que profundizar en el dominio abstraído y trabajar en ello. Y solo uno de estos caminos les acercará a ser programadores.
Sin embargo, este no es solo un problema que afecte a los estudiantes de programación, todos los desarrolladores que programen aplicaciones con un mínimo grado de complejidad, tarde o temprano se topan con esto. Y creo que muchas veces los programadores aceptamos las abstracciones como perfectas, nos “enamoramos” de las abstracciones. Y olvidamos que no dejan de ser herramientas para facilitarnos la vida, y como todo herramienta tienen limitaciones.
En la actualidad nos encontramos ante la que probablemente sea una de las mayores abstracciones de la historia, me refiero a los modelos del lenguaje de IA, que permiten generar código fuente a partir de lenguaje natural. Esta abstracción es tan potente que muchos piensan que ya no será necesario saber programar para crear software. Sin embargo, los que hemos utilizado esta tecnología para generar código, sabemos que todavía tiene limitaciones importantes que requieren de conocimientos sólidos de programación para salvarse. Aunque es muy probable que la abstracción se vaya perfeccionando con el tiempo, creo que puede ser un error pensar que podemos entrenar a una nueva generación de desarrolladores sin conocimientos de programación, al igual que los ORMs no han eliminado la necesidad de saber de bases de datos.
Si bien es indiscutible el valor que nos aportan las abstracciones, ya que nos permiten elevarnos y acometer metas más grandes con menor esfuerzo y complejidad. Veo muy importante ser conscientes de que no todo son virtudes, y estas también tienen limitaciones que no pueden pasarse por alto. De todo esto extraigo dos conclusiones: por un lado la elección de una abstracción tiene que hacerse analizando tanto las virtudes como sus inconvenientes, estando dispuestos a descartarlas si este análisis es desfavorable , y por otro lado, hay que tener en cuenta que cuando nos topemos con las limitaciones de las abstracciones tendremos que tener un buen conocimiento del dominio subyacente para dar una respuesta sólida. Si nosotros o nuestro equipo nos limitamos a tener un conocimiento a nivel usuario de las mismas, es cuestión de tiempo que nos encontremos con problemas que no podamos resolver de forma satisfactoria.