Quiero desarrollar software, ¿Por dónde inicio?

El post original lo puede leer en el [blog de satur](
https://saturninopimentel.com/quiero-desarrollar-software-por-donde-inicio/)

Vamos a empezar por los hechos, en estos momentos las carreras relacionadas con TI tienen una demanda mayor de la que las universidades pueden solucionar, en el caso de México que es mi país cada cierto tiempo salen artículos relacionados a esto y a la dificultad de agregar nuevos alumnos a las carreras de ingeniería (recuerdo que más de uno menciona el miedo a las matemáticas ¿será cierto?). En fin esto no es para convencerte de que vayas a la universidad aunque naturalmente surge la pregunta ¿Te recomiendo que vayas? Sí, pero no es el único camino.

El panorama en TI en general es bueno ya sea para emprender, para ser freelance o para tener un trabajo al salir de la universidad, en mi experiencia he pasado por las tres y actualmente estoy en la última opción, es decir ya tuve experiencia como emprendedor, he sido freelance y tengo un trabajo fijo :P.

Otra de las cosas es que es cierto que cuándo sales de la universidad tienes serias deficiencias algunas por el sistema educativo y otras tantas por que no dedicas tiempo a mejorar, no entraré en discusiones de si el sistema educativo debe mejorar y asuntos relacionados, mejor te diré lo que desde mi perspectiva son los conocimientos básicos para ser un programador, es decir un buen inicio, para que tú te hagas cargo de aprender por tu cuenta ya sea en la universidad o en alguna de las muchas otras formas que existen.

¿Por dónde inicio?

Problema y algoritmo

Empieza por lo básico es decir antes de escribir tu primer línea de código entiende que son estas dos palabras, tienes que definir bien cuál es tu problema y como generar tus algoritmos para resolver cada uno de los problemas. En este camino es probable que te quedes con definiciones como la siguiente:

Un algoritmo es un conjunto de pasos bien definidos, ordenados y finitos utilizados para resolver un problema.

Tal vez con algunas palabras más en la definición de algoritmo, pero lo importante es que debes iniciar por cambiar tu forma de ver los problemas, ya que esto te ayudará mucho, me vienen a la mente pequeños chistes como los que puedes ver en la siguiente imagen que se vuelven más fáciles de entender cuando eres programador :D.

Lenguajes de bajo nivel y lenguajes de alto nivel

Lo primero que debes saber es que las computadoras hasta el momento entienden código binario (Sí 0 y 1), en realidad las computadoras no son inteligentes, solo tienen una capacidad de cálculo mucho mayor que la de un humano promedio.

Así que debes tener conocimientos básicos de que es un lenguaje de bajo nivel, que de forma general se entienden como los lenguajes que se comunican directamente con el hardware y que están ligados a la computadora física. En este punto podrás darte cuenta de los dolores de cabeza que muchos de los primeros programadores tuvieron que soportar (ya no se diga de los que aún vieron las tarjetas perforadas) y podrás ver como esta necesidad llevo a crear los lenguajes de alto nivel, que son más parecidos al lenguaje humano y que ya no están ligados al hardware como lo estuvieron sus predecesores. Esto te dará un panorama general y sabrás a grandes rasgos cómo funcionan los ordenadores.

En este punto y sobre todo cuando estés viendo los lenguajes de bajo nivel toma la oportunidad y programa con lenguaje ensamblador.

Paradigma

Antes de seguir adelante toma un tiempo para investigar que es un paradigma, aquí te dejo una descripción breve pero te invito a buscar aún más información de todos los paradigmas que hemos utilizado a lo largo de la historia de la computación.

Paradigma de programación representa un enfoque particular o filosofía para diseñar soluciones.

¿Por qué debes saber que es un paradigma?
La respuesta es simple vas a convivir con ellos mucho del tiempo que dediques al desarrollo y simplificarán tu trabajo y la comunicación con otros desarrolladores a continuación mencionaré los que han sido más relevantes a lo largo de la historia.

Programación estructurada

Paradigma de programación estructurada nace en los 70-80 (no recuerdo bien la fecha) en respuesta a la falta de estructura de los programas, lo que defiende este paradigma es que se puede mejorar el desarrollo de programas utilizando únicamente subrutinas y tres estructuras: secuencia, selección e iteración. Toma en cuenta que en estas épocas aún había muchos saltos en memoria así que se volvió muy popular.

Programación Orientada a Objetos

Hasta la fecha el paradigma que soporta a una gran cantidad de sistemas y el que debes sí o sí conocer. En este punto puedes elegir cualquiera de los lenguajes disponibles en el mercado, pero debes manejar muy bien los conceptos de Herencia, cohesión, abstracción, polimorfismo, acoplamiento, encapsulamiento, clase, objeto y demás conceptos que son la base de todo el paradigma y que todos los lenguajes orientados a objetos utilizan.

Vas a convivir con este paradigma mucho tiempo así que investiga y practica para evitarte dolores de cabeza e implementaciones mal realizadas.

Programación Funcional

Otro de los grandes paradigmas de programación utilizado por lenguajes como JavaScript y que está cobrando cada día más importancia (aún más de la que ya tenía), este paradigma no es nada nuevo y sus inicios son casi al mismo tiempo que la Programación Orientada a Objetos, de este paradigma debes tener conceptos claros de funciones de orden superior, expresiones lambda y como manejan la inmutabilidad.

Este paradigma tiene tal importancia que lenguajes como C# (que como base tienen la Programación Orientada a Objetos aun cuando es multiparadigma) ha realizado su propia implementación de programación funcional aunque con ciertos cambios.

Puedes darle un ojo al siguiente post de expresiones lambda si deseas saber más.

Conclusión

Creo que esto es un buen inicio y que aprender estas bases te llevará un buen tiempo de estudio y de práctica así que disfrútalo y forma buenas bases, lo digo porque en algunas ocasiones me he encontrado con alumnos de universidades que hacen aplicaciones en "x" o "y" plataforma pero que de fundamentos no tiene buenas bases y también en algunos otros casos personas con títulos universitarios que adolecen de estos fundamentos.

Siempre he dicho que:

Escribir código es muy sencillo y que todo lo deberíamos hacer, sí "todos", pero hacer aplicaciones robustas, que cumplan las expectativas de los usuarios, que sean óptimos y fáciles de mantener, eso requiere grupos de gente experta y con conocimientos sólidos de programación, bases de datos, administración de servidores, etc.

Así que te invito a que tomes las riendas de tu educación y que sobre todo te diviertas. ¡Saludos!