Diario de Python | #2. Mi propio plan Full Stack
Tags: python, spanish, devjournal
Published: 2023-01-19 14:35:10

Si hay algo que me encanta de cualquier cosa que haga, es la mezcla entre la planificación y la improvisación.

Puedo planificar un mes de estudio, pero improvisar sobre la marcha una serie de contenidos distintos por el placer del descubrimiento.

Lo más interesante es que la propia improvisación termina siendo, a largo plazo, una nueva planificación. Se que puede sonar extraño, pero dejame aclararlo con el motivo de este artículo.

## Planificación vs Improvisación
Cuando empecé a estudiar Python la primera vez, mi idea era centrarme en el desarrollo web: ya tenía las bases de HTML, CSS y Javascript, incluído Typescript y alguno que otro framework backend (Laravel) y frontend (Angular).

Mi planificación era terminar el año siendo un desarrollador web en Django. La realidad es que a medida que fui aprendiendo, me di cuenta de que las posibilidades se podían abrir más: videojuegos, análisis de datos, ciencia de datos, aplicaciones de escritorio y más.

Uno de los lemas de los caballeros radiantes (del libro [El camino de los Reyes](https://es.wikipedia.org/wiki/El_camino_de_los_reyes)) dice lo siguiente:

> Viaje antes que destino.

El significado implica que el proceso es más importante que la meta en si. Y parece una frase cliché, pero es más poderosa de lo que aparenta cuando la ponemos en práctica.

Como explicaba más arriba, mi destino era aprender Django, pero en el viaje aprendí a explorar y profundizar otras tecnologías.

Improvisar implica hacer cosas que estan fuera de la planificación inicial. Puede ser negativo si consideras a la meta un objetivo implacable, pero en cambio si te mantenes flexible, podés incluso crecer en areas que no habías contemplado en tu primer acercamiento.

## El que mucho abarca...
Poco aprieta. Es cierto que explorar las tecnologías como una juguetería implica volverse un mediocre y no especializarse en nada en particular.

Pero esto cambia cuando llevas años haciéndolo, porque el conocimiento no ocupa lugar, y todo esta relacionado y es aplicable a otras ramas en el mundo de sistemas.

Hoy día considero que todo lo aprendido me esta sirviendo, tanto en la práctica como en la teoría. En futuros capítulos de este diario vamos a trabajar bastante sobre este punto.

## Qué es un Full Stack Developer
Hubo una época donde todas las empresas buscaban cubrir este puesto por las razones que voy a comentar a continuación.

La definición de Full Stack es algo subjetiva porque sería algo como un "todólogo" de varias tecnologías. Según [Coderhouse](https://www.coderhouse.com/blog/que-hace-un-desarrollador-full-stack):

> Es un profesional que cuenta con diversas habilidades informáticas; es decir, es un perfil híbrido, multiskill que puede desenvolverse en el front-end, back-end de un desarrollo web. Son integrales con conocimientos y herramientas que le permiten afrontar cualquier etapa en la construcción de portales en línea.

Coderhouse habla de proyectos web porque ahi nació el rol, pero yo quiero darle una definición un poco mas integral según mi experiencia laboral: En mi opinión, un full stack developer es un desarrollador capaz de crear un producto tanto en las tecnologías web como mobile. Esto implica habilidades de liderazgo y trabajo en equipo porque no se espera que una persona haga todo, sino que pueda comunicar las necesidades y requerimientos a los demás.

Vamos a llevarlo a un ejemplo: una persona que puede desarrollar una aplicación en Android o iOS que interactúe con una API del backend (en PHP con Laravel, por ejemplo) y por otro lado pueda crear un sitio web estilo landing page combinado con un dashboard para revisar permisos de usuario, inventario, etcétera; es un full stack en mi opinión.

Por supuesto, no va a dominar a la perfección todas las tecnologías. Es probable que se especialice en una puntual y trabaje sobre las otras al menos para cumplir los objetivos mínimos del producto.

## Mi plan Python Full Stack
Con todas esas improvisaciones, terminé armando una planificación más sólida: armé un rol de Full Stack propio y plenamente personal. Incluí una serie de tecnologías que me parecen relevantes a día de hoy (puede variar en los próximos meses), las cuales implican cubrir todas las areas posibles de un producto desde la perspectiva del desarrollo:

- [Python](https://www.python.org/): Este es el lenguaje de programación core en el que basé todo el plan. Como lo comenté en otros artículos, posee la suficiente versatilidad para poder abarcar múltiples areas de desarrollo que veremos a continuación.
- [FastAPI](https://fastapi.tiangolo.com/): Es una especie de primo de Flask, pero pensado para ser muy rápido (como lo dice su nombre) tanto en el desarrollo como la ejecución de APIs. Sería la parte backend del rol.
- [Django](https://www.djangoproject.com/): Con Django se puede programar tanto una API como dashboards y sitios web enteros. Pero me parece más relevante dejar a Django para crear todo lo que no implique el terreno que cubre FastAPI. Podríamos decir que cubre tanto frontend como backend en el rol, acompañado por la siguiente tecnología.
- [React](https://es.reactjs.org/): Quizá en este punto nos hayamos torcido un poco del stack de Python, pero es inevitable hablar de tecnologías frontend sin mencionar un framework de Javascript. A React lo vamos a combinar con Django para crear sitios web basados en componentes reactivos. Por supuesto, esto implica la parte frontend del rol.
- Pandas, Numpy y Matplotlib: Quizá en el pasado pensara distinto o directamente no lo había contemplado, pero hoy en día el análisis de datos me parece fundamental a la hora de formar un rol Full Stack. Utilizamos Pandas para la parte exploratoria de la información, combinado con Numpy para trabajar con matrices que poseen mucho mejor rendimiento que las listas tradicionales de Python. Finalmente con Matplotlib trabajaremos en la visualización de los datos con herramientas tales como gráficas de dispersión, bars y cakes. En este caso tenemos involucrado el procesamiento de la información conjunto de la visualización; por lo cual hablamos de backend y frontend en simultáneo. Detalle importante: debemos utilizar estas librerías como parte de Django (en un dashboard, por ejemplo) o FastAPI.
- Bases de datos SQL y NoSQL: No logro decidirme en esta parte, dado que hay varios motores muy potentes, pero me voy a decantar por MongoDB para NoSQL (no relacional) y Postgresql para SQL (relacional). Por supuesto, las bases de datos siempre van acompañadas de tecnologías de backend tales como Django o FastAPI.
- [Android](https://www.android.com/intl/es_es/) con [Kotlin](https://dev.to/maxwellnewage/curso-kotlin-1-introduccion-al-curso-3be1) o iOS con Swift: Es importante aclarar que no me gustan las soluciones híbridas como React Native, Cordova, Ionic o Flutter. Entiendo la necesidad de una empresa de abaratar costos y contratar una persona que pueda salir a producción con una única app que cubra los dos frentes; pero no comparto a nivel técnico que sea la mejor práctica. Por lo tanto, incluyo a Kotlin y Swift como los lenguajes nativos por excelencia de cada tecnología movil. Aplican al mundo de frontend, siendo las que consumen las APIs que generaremos por FastAPI.

Como ves, tengo una idea muy específica y subjetiva de la definición del rol de Full Stack. Quizá hasta cierto punto tengas la misma inclinación que yo y te esté dando una dirección con este artículo. Espero haberte dado una visión más completa del asunto.

¡Nos vemos en el siguiente artículo! 👋