
Recientemente escribí un artículo sobre si necesitas un título en informática para conseguir un trabajo en tecnología. Pensé que sería útil repasar mi transcripción. Con suerte, hablar de lo que estudié ayudará a la gente. Quiero que todos puedan tomar la decisión más informada posible al elegir su camino para seguir una carrera tecnológica.
Descargo de responsabilidad : esto está escrito desde mi recuerdo de las clases y desde la perspectiva de un desarrollador móvil. Muchos de los temas de estas clases podrían especializarse y convertirse en una carrera. Entonces, todos son importantes para alguien en el mundo. Escribo desde mi perspectiva y desde el punto de vista de alguien que eligió la trayectoria profesional de un desarrollador móvil.

Programación I, II
Esta fue la esencia de todo lo que aprendí y me puso en marcha con la programación. Estas fueron las clases en las que aprendiste a programar. Antes de tomar estas clases, apenas había programado nada. Intenté adelantarme, pero no llegué más allá de los bucles.
Esta clase comenzó creando un archivo vacío y compilándolo en un IDE (usé Code :: Blocks). Y trabajamos hasta el final para crear nuestro propio juego de batalla basado en texto. Mirar hacia atrás en el código que escribí me da vergüenza. He recorrido un largo camino desde entonces. Aquí está el repositorio si desea reírse (solo uso un archivo main.cpp con 1063 líneas de código).
Entonces, ¿qué aprendí aquí? Quiero decirlo todo. Estos cursos fueron increíblemente valiosos y me dieron al menos el 70% del conocimiento que necesitaba para trabajar profesionalmente como programador. Aprendí declaraciones if, bucles, lógica booleana, creación de clases, creación de estructuras, creación de interfaces, polimorfismo, herencia y más. También hubo cierto uso de estructuras de datos básicas como matrices y vectores.

Estructuras discretas en informática
Esta clase se agregó a la transcripción para que la gente se acostumbre a la lógica booleana. Que tuvimos en las dos primeras semanas de la clase. Desafortunadamente para nosotros, estudiantes desprevenidos, llega bastante lejos por la madriguera del conejo. Estos son algunos de los temas que cubrió: “lógica, operaciones de conjuntos y conjuntos, métodos de prueba, definiciones recursivas, combinatoria y teoría de grafos”.
Ahora, todas estas son cosas útiles que debe saber. Pero el problema es que se animó a los estudiantes a tomar esta clase temprano. Por lo general, junto con Progamming I y II. Y estos son algunos temas avanzados. Lucharía ahora para usar métodos matemáticos de prueba. Y recuerdo que realmente luché en ese entonces. Además, tuve que buscar en Google qué es la combinatoria, así que obviamente no los uso demasiado.
El hecho es que muchas de las cosas que enseñaron en este curso no parecían aplicables a una carrera en informática en el momento en que tomé el curso. Ahora sé que la lógica, las operaciones de conjuntos y conjuntos, las definiciones recursivas y la teoría de grafos pueden ser útiles. Pero eso es solo con la perspectiva de ser programador durante unos años.
Lo que aplico a diario en mi carrera actual es la lógica y quizás establecer operaciones. Las definiciones recursivas y la teoría de grafos solo han sido útiles para las entrevistas. Pero tómate esto con un grano de sal porque soy un desarrollador móvil. Un desarrollador de back-end probablemente encontrará muy útil la teoría de grafos.

Estructuras de datos
Esta clase fue buena. Muy bien. Las estructuras de datos se utilizan en toda la programación informática y son la columna vertebral de la mayoría de los códigos que la gente escribe. Nos permiten almacenar datos de una manera útil para los programas que escribimos. La capacidad de mirar datos y saber la mejor manera de almacenarlos para el rendimiento del tiempo y el espacio es una habilidad muy útil.
Aprendí sobre matrices, pilas, listas enlazadas, listas doblemente enlazadas, árboles, gráficos, montones y todos los diferentes sabores de estas estructuras de datos (como árboles de autoequilibrio). Esta clase no solo me ayudó a comprender las estructuras de datos, sino que también me ayudó a organizar mejor los datos que estaba almacenando.
Esta clase se hizo en C, lo que la hizo aún más interesante. C puede ser muy delicado pero también muy poderoso si se usa correctamente. Tenía que tener mucho cuidado con la forma en que asignaba y limpiaba la memoria, lo que también era muy bueno para enseñar sobre la gestión de la memoria.
Había tantas cosas útiles en esta clase que es difícil cubrirlas todas. Ni siquiera he mencionado el hecho de que este es un componente de conocimiento clave para las entrevistas en tecnología. Si tiene dudas sobre las estructuras de datos, comience a repasar algunos conceptos básicos porque son muy importantes.

Análisis de algoritmos
Esta clase fue algo útil. Los algoritmos son útiles. Impulsan el mejor software del mundo y los hacen lo suficientemente potentes como para seguir siendo relevantes en el mundo moderno. Pero esta clase tuvo algunos problemas.
La parte más útil de esto fue aprender la notación Big O. La notación Big O le permite evaluar el código y comprender qué tan bien funcionaría en el tiempo y en el espacio. En general, si está midiendo el rendimiento del código en una empresa, utilizará un temporizador para realizar un seguimiento del tiempo entre interacciones. Esto le permite ver qué tan bien está funcionando su software. Esto requiere que escriba código y luego evalúe los resultados.
La notación Big O le permite realizar evaluaciones del rendimiento del código con solo mirar el código. No quiero entrar demasiado en esto, pero si no conoce la notación Big O, lea esta publicación de blog.
Los algoritmos reales que revisamos no fueron tan útiles. Todo lo que recuerdo es el problema de la mochila y el problema del viajante. También tuve que escribir código para estos en grupos, lo cual no fue genial porque había una persona en mi grupo que iba más allá de lo que estaba previsto. Eso significaba que terminé escribiendo menos código para la implementación final cada vez de lo que me hubiera gustado.
Una comprensión básica de qué algoritmos famosos existen, su propósito y cómo se implementan puede ser útil (principalmente para entrevistas). La notación Big O es la clave aquí. Es muy útil en el trabajo y también increíblemente útil para las entrevistas.

Desarrollo web
Esta clase tenía la mayor cantidad de habilidades directamente aplicables a un trabajo en tecnología. Aprendí sobre HTML, CSS, JQuery, JavaScript, PHP y JSON. Aprendí cómo se envía una solicitud desde el front-end de un sitio web a un back-end, cómo se procesa en el back-end y luego se envía de regreso al front-end con una respuesta. Aprendí cómo crear una interfaz de usuario y cómo interactuar con una capa de datos que luego interactúa con la red.
Al final de la clase, había construido mi propio sitio web y tomé la iniciativa de aprender Angular. Usé Angular para hacer que mi sitio se viera llamativo, lo que terminó consiguiendo mi primera pasantía. También adquirí una buena comprensión de cómo funciona un sitio web bajo el capó.
Este conocimiento por sí solo fue excelente, pero también aprendí a captar y aprender un idioma, marco o formato de datos desconocido y trabajar con ellos sobre la marcha. Busqué mucho en Google sobre estos temas para ver ejemplos concretos. Aprendí a utilizar la documentación y la investigación en línea para comprender mejor un concepto que necesitaba aplicar directamente en un corto período de tiempo. Esta es una habilidad clave para ser un programador experto.

Introducción a las bases de datos
Casi siempre aprendí SQL en esta clase. Estoy seguro de que repasamos algunos otros conceptos como fragmentación y agrupación, pero no los recuerdo. A veces uso SQL en mi trabajo actual para ejecutar consultas de datos para eventos que he registrado. SQL será parte integral de su trabajo o apenas lo usará. Si lo necesitas, apréndelo y conviértete en un experto. Si no es así, no se preocupe demasiado por eso.

Ingeniería de software I, II
También otra clase que realmente no puedo recordar. Creo que repasamos un montón de conceptos generales en esta clase. Cubrimos los métodos de gestión de proyectos Scrum y Waterfall. Repasamos las pruebas y todos los diferentes tipos de pruebas que existen. Cubrimos algunos conceptos de usabilidad y accesibilidad. En realidad, se trataba de un compendio de conceptos que realmente no encajaban en sus propias clases.
Debido a la naturaleza de mosaico de la clase, realmente no internalicé demasiado bien ninguno de los conceptos. Fue bueno tener una descripción básica de los conceptos cubiertos, pero me gustaría que se dedicara más tiempo a los temas individuales importantes, como las pruebas.

Arquitectura informática y lenguaje ensamblador
Recuerdo esta clase vívidamente. Esta clase explica cómo funciona una computadora. Cómo las instrucciones de la máquina son enviadas y procesadas por la computadora. También pudimos escribir algo de código en MASM, que es un lenguaje ensamblador que interactúa muy de cerca con el código de máquina.
La mayoría de los lenguajes de programación que había usado para tomar esta clase eran lenguajes de alto nivel. Los lenguajes de alto nivel tienden a estar más cerca del lenguaje humano que del código máquina. MASM está muy cerca del código máquina y yo diría que está más cerca del lenguaje máquina que del lenguaje humano.
La parte más importante de esta clase es tener una idea de lo que le sucede a su código una vez que se compila. Entender las diferentes unidades lógicas en una computadora y cómo su código es manejado por ellas fue muy interesante de aprender.
A efectos prácticos, no creo que esta clase haya sido fundamental para contribuir a mi carrera tecnológica. Hasta ahora, no he usado mucho del conocimiento que obtuve en esta clase durante mi carrera.

Sistemas operativos
Seré honesto, me está costando mucho recordar lo que aprendí en esta clase. Lo único que puedo recordar es la construcción de un programa de mensajería que utiliza la programación de socket en C para comunicarse. También aprendí a abrir archivos y manipular carpetas usando scripts.
Quiero ser sincero sobre lo que recuerdo de mi carrera y el hecho es que no recuerdo mucho de esta clase. Simplemente no utilicé gran parte del conocimiento adquirido en mi carrera actual.

Introducción a las redes informáticas
Esta clase fue muy útil. Repasó cómo funcionaban las redes informáticas. Esto incluyó la revisión de protocolos de red como HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH y DNS. Aprendí para qué se usa cada uno de estos protocolos, cómo se implementan y entendí por qué se crearon.
Los protocolos de red que mencioné anteriormente se utilizan para funciones críticas del software moderno. Esto incluye el manejo de correo electrónico (POP3 e IMAP), el envío de solicitudes de red entre el cliente y el servidor (HTTP, HTTPS) y el manejo de dispositivos de forma segura a través de una red (SSH). Esto realmente le permite comprender cómo funciona Internet y cómo los dispositivos de todo el mundo pueden interactuar entre sí.
Esto no solo es fascinante, sino que también puede resultar útil. He utilizado las cosas que aprendí en esta clase para depurar problemas que encontré cuando recibía errores de la red. Pude identificar los problemas con los que me estaba encontrando y ayudar al desarrollador de back-end con el que estaba trabajando a encontrar el error en su extremo.

Introducción a la ingeniería de usabilidad
Esta clase cubrió cómo hacer una aplicación intuitiva, pero también cómo hacer que una aplicación o un sitio web sea accesible. La accesibilidad se refiere a hacer que un software sea utilizable por cualquier persona, incluidas las personas con discapacidades. Esto cubre aspectos como el uso de texto a voz y el diseño de software que no depende completamente solo de elementos de audio.
Los temas tratados fueron útiles si nunca antes había oído hablar de accesibilidad. Al menos te hizo considerar estas cosas cuando diseñas software. También me hizo empezar a pensar realmente en la experiencia del usuario y en lo importante que es para un buen software. Si nadie está usando la funcionalidad clave de su aplicación porque es confusa, su software eventualmente perderá a todos sus usuarios.
Si bien el conocimiento fue interesante, las implementaciones específicas de cómo crearía una pieza de software utilizable y accesible depende de la plataforma. Por ejemplo, Apple tiene su propio conjunto de pautas de interfaz de usuario que describen principios generales de diseño y detalles específicos sobre cómo debe diseñar el software que se ejecutará en cualquiera de las plataformas de Apple.
Debido a la información específica que se necesita por plataforma, no estoy seguro de que esta clase sea increíblemente útil. Fue una buena introducción, pero terminé teniendo que aprender las pautas de interfaz de Apple, que repasaban todos los temas cubiertos en esta clase.

Desarrollo de software móvil y en la nube
Mantendré este breve. Ya era ingeniero móvil cuando tomé esta clase. Creé una aplicación móvil de mierda en unas pocas horas para terminar mi título lo antes posible. En este punto, ya había logrado mi objetivo de conseguir un trabajo como ingeniero de software, pero solo necesitaba terminar mi licenciatura en ciencias porque casi había terminado. Mi corazón no estaba interesado en aprender en este momento.
Incluso con eso dicho, no creo que esta clase se haya dirigido bien. Fue diseñado con pereza. Animaron a la gente a escribir código para una aplicación de teléfono de Windows para esta clase, y la demanda de esos trabajos es mucho menor que la de otros. Y creo que solo fue alentado porque el entorno es más fácil de configurar y el código se puede escribir en JavaScript y se parece al desarrollo web.
Además, para mí estaba claro que la persona que dirigía la clase no conocía todas las plataformas de aplicaciones móviles. Se nos pidió que escribiéramos una pequeña parte del back-end, pero realmente no quería. Terminé fingiendo una solicitud web leyendo desde el disco y devolviendo una respuesta almacenada después de unos segundos. Esto funcionó porque solo tuve que enviar una demostración y el código fuente. Y tengo la sensación de que la persona que califica solo miró la demostración.
En general, la clase enseñó tecnología obsoleta y no utilizada, no se evaluó adecuadamente y realmente no ofreció mucha orientación. Esta no fue una muy buena clase.

Proyecto de software Capstone
Hablando de tecnología obsoleta, este proyecto requirió que construyéramos una GUI para acceder a una base de datos usando curses. Aquí está el proyecto completo si está interesado. No pudimos elegir cuál era nuestro proyecto final, nos lo asignaron. Y todos tenían que hacer el mismo proyecto. También se hizo en grupos de 3, por lo que solo cubriste una pequeña parte del proyecto. Esta fue una clase realmente mal dirigida.
La interacción con el profesor fue prácticamente inexistente. No tenía ningún interés en el proyecto y lo que estábamos aprendiendo parecía absolutamente inútil. Para crear interés en un tema, debe permitir que las personas tengan algo de libre albedrío a la hora de elegir lo que aprenden. No tener otra opción en su proyecto final es una tontería. Este proyecto es inútil para la mayoría de trayectorias profesionales y no tiene sentido forzarlo a la gente.
La clase debería haber hecho que cada estudiante presentara una propuesta con estimaciones aproximadas para un cronograma de cuándo terminarían cada subparte del proyecto. Esto logra dos cosas: hacer que las personas comiencen a practicar la estimación del trabajo y permitir que las personas trabajen en lo que les interesa. La clase habría sido 100 veces mejor de esta manera.

Pensamientos finales
No podría haber tomado una buena parte de las clases y seguir siendo el ingeniero de software que soy hoy. Pero creo que perderse algunos de estos cursos podría dejar una gran brecha en su conocimiento como desarrollador. Los temas en los que creo que todo ingeniero de software debería tener algún conocimiento son las estructuras de datos y los algoritmos.
Las otras clases dependen de la carrera que elijas. Si decidió dedicarse al desarrollo integrado, debería aprender sobre arquitectura informática. Si decide convertirse en ingeniero de front-end, debe aprender sobre redes informáticas.
La conclusión clave aquí es que un buen ingeniero está aprendiendo constantemente. Si te falta algún conocimiento que sabes que sería útil y aplicable en tu trabajo, entonces ve a una clase para adquirir ese conocimiento. Así es como se mejora al escribir un buen código. Siempre esté aprendiendo.
¿Te gustó lo que leíste? Mira mis otros artículos
Comenzar una carrera tecnológica de la nada.
Elija la mejor carrera tecnológica para usted: Dev Ops, Mobile Engineer, Data Scientist, Project Manager y Front End.
Consejos para su primera entrevista técnica.
¿Debería obtener un título en informática?
Swift contra Objective-C