Sin importar el lenguaje de programacion que uses, o el tipo de aplicacion que desarrolles, hay herramientas y conceptos que yo creo que todo desarrollador de aplicaciones deberia conocer por lo menos de forma básica.
Y como en un artículo anterior ya hemos hablado de Las Herramientas que todo desarrollador debe conocer, en este artículo nos enfocaremos en los temas que todo desarrollador debe conocer.
Ahora, puede que mucho de ustedes este pensando en temas como algoritmos, estructuras de datos, paradigmas de programacion, patrones de diseño, o temas similares, que son temas importantes, pero no me refiero a estos temas en realidad.
Es decir, en el desarrollo de Software no todo se trata de la escritura de código. Nadie es buen desarrollador solo porque sabe estructura de datos y algoritmos, porque en la practica cuando tenemos que crear aplicaciones reales, temas como los protocolos de Red, la seguridad de aplicaciones, e Infraestructura de computadores tambien se vuelven temas importantes para crear sistemas que solucionen problemas reales.
Así que en este artículo voy a darte una lista de temas que yo creo que son importantes y que muy a menudo te los vas a encontrar en una enorme cantidad de aplicaciones.
Si tienes prisa la lista completa de temas que mencionaré es esta:
- Protocolos de Red: HTTP
- Formatos de Intercambio de datos
- Modelado de Datos
- Encriptacion
- Infraestuctura de Aplicaciones
Empecemos con el que yo creo, es el tema indispensable de hoy.
Protocolos de red: HTTP
No importa si usas una aplicacion de consola, una aplicacion de escritorio, o una aplicacion web o app movil, estos días es normal, que todas estas, esten conectadas de algun modo.
Por ejemplo hoy es comun que cuando abras una app, y la uses, los datos que colocaste en la app tambien puedas accederlos a traes de la web, o una app de escritorio o tu SmartTV, o tu Smart Watch o cualquier otro dispositivo.
Bueno todo esto es gracias a la web, y su protocolos, más especificamente al protocolo HTTP.
Un protocolo solo es un conjunto de reglas que permiten a dos o más computadores comunicarse.
Y Durante muchos años hemos uando distintos protocolos para realizar distintas tareas:
- ¿Quieres enviar archivos?, usa FTP (File Transfer Protocol)
- ¿quieres conectarte remotamente a otro computador?, usa SSH (Secure Shell Protocol)
- ¿Quieres que los datos viajen de forma segura? usa SSL, (Secure Socket Layer)
- ¿Quieres enviar correos? usa SMTP, (Simple Mail Transfer protocol)
Y así.
pero muy a aparte de estos, un protocolo que usamos mucho al dia de hoy para comunicar distintas aplicaciones es el protocolo HTTP.
Este protocolo inicio como una forma de compartir documentos de hipertexto, es decir compartir simples paginas web, pero al dia de hoy es el protocolo más usado para la creacion de APIs, que es código que permite comunicar a distintos sistemas.
Ahora entre los fundamntos que cualquier desarrollador debe saber de HTTP, estan.
- Saber que es HTTP y como nacio
- Conocer muy bien el modelo Client/Servidor que es basicamente el diseño que usa este protcolo para diferenciar al computador que solicita datos dle que responde
- HTTP Request y Response, que te permitira conocer que datos son los que un servidor y una aplicacion cliente como una navegador o una app movil se estan enviando
- HTTP Methods, para saber para que operaciones un servidor puede hacer
- Desarrollo de APIs, es decir crear aplicaciones que permitan comunicar a distintos sistemas. Hay muchas opciones aqui, como las API REST, API GraphQL, o tRPC que se usan mucho en las apps moviles y web.
- Conocer las bases HTTPS, que es la version de HTTP pero con una capa de encriptado adicional cuando los datos estan en transito
Si estudias estas bases, podras entender como es que funcionan muchas plataformas de la web como Netflix, Spotify, Youtube, Twitch, Twitter, entre otras.
Ahora si usando HTTP podemos comunicar distintos computadores, la pregutna es ¿que datos se envian?
Bueno es aqui donde entra los Formatos de Intercambio de datos
Formatos de Intercambio de Datos
Los formatos de intercambio de datos son una forma de representar datos de una manera estructurada y que este estandarizada, esto para que puedan ser interpretados por distintos sistemas y aplicaciones.
Por ejemplo si queremos enviar un dato como la siguiente informacion:
Nombre: Jack Silva
Edad: 30
tengo que usar un formato para poder intercambiarlo entre sistemas. Uno de estos es JSON, que me permitiria colocar esos datos usando una sintaxis de pares clave y valor entre llaves:
{
"Nombre": "Jack Silva",
"Edad": 30
}
El sistema que recibe esta informacion puede extraer estos datos y usarlo quizas para guardarlo en una base de datos, mostrarlo en una interfaz web, movil, o lo que quiera realmente.
Ahora, escoger el formato depdende de los desarrolladores. Hay muchos formatos de intercambio de datos diferentes, cada uno con sus propias características y ventajas. Algunos de los otros formatos más utilizados son XML
<Datos>
<Nombre>Jack Silva</Nombre>
<Edad>30</Edad>
</Datos>
CSV
Nombre,Edad
Jack Silva,30
YAML
Nombre: Jack Silva
Edad: 30
Aunque en realiad la lista es bastate extensa. Otros formatos de intercambio de datos por ejemplo sn :
- Protocol Buffers: es un formato binario de serialización de datos desarrollado por Google. Es eficiente y escalable, y se utiliza comúnmente en sistemas distribuidos y de alta carga.
0a 09 4a 61 63 6b 20 53 69 6c 76 61 12 1e
- Parquet: es un formato de archivo de datos columnar que se utiliza para el almacenamiento y procesamiento de grandes conjuntos de datos. Es especialmente útil para aplicaciones de análisis de datos y big data.
50 41 52 31 1b 05 00 04 4e 61 6d 65 12 0a 4a 61 63 6b 20 53 69 6c 76 61 15 08 00 00 00 1e
- Avro: es un formato de serialización de datos que se utiliza para almacenar y transportar datos estructurados. Es similar a JSON y puede contener datos complejos, como objetos anidados y matrices.
240c4a61636b2053696c76610c1e
- BSON (Binary JSON): es un formato binario de serialización de datos similar a JSON. Se utiliza comúnmente en aplicaciones que requieren una alta velocidad de procesamiento de datos, como bases de datos NoSQL.
\x1f\x00\x00\x00\x02Nombre\x00\x0b\x00\x00\x00Jack Silva\x00\x05Edad\x00\x1e\x00\x00\x00\x00
- ORC (Optimized Row Columnar): es un formato de archivo de datos columnar desarrollado por Apache. Se utiliza para el almacenamiento y procesamiento de grandes conjuntos de datos en aplicaciones de análisis de datos y big data.
- MessagePack: es un formato binario de serialización de datos que se utiliza para el intercambio de datos entre aplicaciones. Es más eficiente que JSON y se utiliza comúnmente en aplicaciones de alto rendimiento.
Modelado de Datos
Sin importar que base de datos uses, ya sea SQL o NoSQL, todo desarrollador sabe que datos se estan almacenando en su base de datos.
De hecho si la aplicacion es muy pequeña es facil alamacenar los datos en algunas tablas o documentos, y saber facilmente como se relacionan estos datos, pero cuando la base de dato crece, y se van creando más tablas o documentos, es muy dificil recordar todo, y las relaciones ya no son tan obvias.
Asi que tenemos que empezar a diseñar un modelo de como los datos seran almacenados y que relaciones se necesitan, para poder coninuar con el desarrollo. Y esto se hace aun si usaramos NoSQL.
Menciono esto, porque cuando hablamos de Modelado de datos para una base de datos, muchos piensan en esto:
Una serie de tablas relacionadas, y pueden llegar a crear que esto solo aplica para las bases de datos relacionales. Pero esto no es tanto asi.
De hecho en NoSQL tambien neesitamos relacionar datos muchas veces, solo que no se usan tablas ni SQL.
Pero la forma en la que pensamos las relaciones usando datos padres e hijos, y relaciones de uno a uno, de uno a muchos, o muchos a muchos siguen existiendo. asi que cuando hablao de modelar datos no estoy hablando crear tablas sino en como diseñar distintas entidades que estan relacionadas.
De hecho en UML, un lenguaje para diagrams de sistemas, hay una diagram especificamente diseñado para elaborar estas relaciones y entidades se llama Diagrama de entidad relacion
Aunque hay muchas más.
claro en muchas bases de datos no existen las relaciones perse, algunas ofrecen embeber datos, u otras ofrecen referencias. pero todas de nuevo utilizan los mismos conceptos para referirse a las relaciones, y el crear este tipos de entidades, asi que tambien vale la pena estudiar este tema.
Encriptacion
La encriptacion en palabras simples es convertir datos que son perfectamente entendibles, usando algoritmos, a datos que nadie puede comprender, esto para poder transmitirlos en comunicaciones inseguras o mantener almacenada informacion de forma segura.
En realiadd la encriptacion es un tema más de seguridad que de desarrollo de aplicaciones, es bastante complejo, y lleva muchos años en desarrollo.
De hecho desde la segunda Guerra mundial, los alemanes ya usaban la encriptacion a traves de su maquina enigma, y que tiempo despues permitio a Alang Turing crear su maquina "The Bomb" que permitia descifrar los mensajes de enigma.
Ahora como programadores, es immportante tener al menos un conocimiento básico de encriptación para proteger la información confidencial de los usuarios y las aplicaciones. Algunas áreas en las que la encriptación es particularmente importante son:
- Almacenamiento de datos: Es necesario proteger los datos almacenados en una base de datos o en un archivo para evitar que sean leídos o alterados por usuarios no autorizados. Los desarrolladores deben tener conocimiento de técnicas de encriptación y de cómo aplicarlas para asegurar los datos almacenados.
- Transmisión de datos: Cuando se transmiten datos a través de una red, es importante protegerlos para evitar que sean interceptados por usuarios no autorizados. Los desarrolladores deben saber cómo implementar protocolos seguros, como SSL/TLS, para encriptar los datos en tránsito.
- Contraseñas y autenticación: Las contraseñas son un área crítica en la seguridad de las aplicaciones. Los desarrolladores deben entender cómo almacenar contraseñas de forma segura utilizando técnicas de encriptación, y cómo implementar un sistema de autenticación seguro para garantizar que sólo los usuarios autorizados puedan acceder a la aplicación. Aunque al dia de hoy tambien hay otras formas de autenticar uando OAuth, Magik Links o servicios de la nube que lo hacen por nosotros como Okta o AUth0.
Y algunos temas adicional que todo programdor deberia saber yo creo estaria:
- Criptografía simétrica y asimétrica: debe saber cómo funcionan los algoritmos de cifrado y cómo se utilizan para proteger los datos.
- Funciones hash: las funciones hash son utilizadas en la encriptación para proteger la integridad de los datos.
- Autenticación y autorización: debe conocer los mecanismos de autenticación y autorización, como el uso de contraseñas y tokens, y cómo se utilizan para proteger el acceso a los datos.
- Ataques de seguridad: debe tener conocimientos sobre los diferentes tipos de ataques de seguridad, como el phishing, el spoofing, el malware, y cómo prevenirlos.
El conocer estos temas de hecho no solo te ayudara a crear aplicaciones un poco más seguras sino tambien te ayudara a entender que aplicaiones no son usar en tu dia a dia.
Infraestructura de aplicaciones
Aun si no seas un desarrollador que crear aplicaciones web o moviles, estos dias es muy importante tener conoimiento basico de como funciona la infraestructura de Internet. Porque toda nuestra informacion esta en esta.
Tu dinero e hitorial creditiio esta en servidores de banco, tu hstorial medico, registros educativos, e informacion personal esta en servidores del gobierno, y asi.
Y por si fuera poco hoy consumimos muhos servicios que estan encima de infraestructura.
Asi que si eres desarrollador, sobretodo uno web o movil deben tener una comprensión muy básica de la infraestructura de TI y cómo las aplicaciones se despliegan en entornos de producción. Esto incluye temas como:
- Saber que es el Cloud Computing
- Virtualizacion y contenedores
- Saber de que se tratan herramientas de automatización de despliegue, como Docker y Kubernetes.
- Conocer los distintos niveles de infraestructura que ofrecen los serviios de la nube como IaaS, PaaS, SaaS, FaaS, son cosas muy comunes en desarrolladores.
- IaaS (Infrastructure as a Service): es un modelo que ofrece a los usuarios la infraestructura básica de TI, como servidores virtuales, redes, almacenamiento y sistemas operativos, a través de internet. Los usuarios tienen un mayor control sobre la configuración de la infraestructura y pueden configurar y mantener sus propios sistemas operativos, aplicaciones y bases de datos.
- PaaS (Platform as a Service): es un modelo que proporciona a los usuarios una plataforma completa para desarrollar, ejecutar y administrar aplicaciones sin preocuparse por la infraestructura subyacente. Los proveedores de PaaS ofrecen herramientas de desarrollo, bases de datos, middleware y entornos de ejecución de aplicaciones.
- SaaS (Software as a Service): es un modelo que ofrece aplicaciones completas a través de internet, sin necesidad de instalar ni mantener ningún software o hardware en el cliente. Los usuarios acceden a las aplicaciones a través de un navegador web o una aplicación móvil, y los proveedores de SaaS se encargan de todo, desde la infraestructura hasta el soporte y la seguridad.
Aunque hay muchos más com BaaS, FaaS, DaaS (Desktop as a Service), o DraS (Disaster Recovery as a Service). Todos estos temas al final forman parte de los servicios de la nube.
Más Temas
Por supuesto estos no son los unicos temas que deberias aprender, otros temas que tambien pueden ser buena idea aprender son:
- UX/UI
- Analisis estadistico
- Matematica
- Gestion de Proyectos
Pero estos yo creo que son mucho más puntuales dependiendo del area a la que te dediques, aun asi, si tienes temas que crees que todo programador deberia conocer puedes dejarlo en los comentarios.
Conclusion
En fin todas estas areas que te he mencionado son bastante extensas, asi que no tienes que dominar todos estos temas, pero si por lo menos tener una nocion básica de cada uno de estos para que al momento que desarrolles aplicaciones te sea mucho más fácil tener el proposito de ciertas bibliotecas, frameworks o SDKs, y crear sistemas más robustos.