¿Por qué soy bueno en cursos intensivos de programación, pero sigo reprobando en cursos de teoría de informática? ¿Estoy en condiciones de ser ingeniero de software?

Definitivamente hay una distinción entre la informática y la ingeniería de software. Los informáticos desarrollan nuevos algoritmos y formas de resolver problemas, mientras que los ingenieros de software realmente resuelven esos problemas de una manera que da como resultado productos confiables, confiables y de alta calidad. Es como la diferencia entre un químico y un ingeniero químico. El químico descubre nuevos químicos y propiedades de los químicos, mientras que el ingeniero químico construye plantas de procesamiento químico, plantas de fabricación de pinturas, plantas de purificación de agua y otros sistemas que realmente utilizan el conocimiento químico para hacer sistemas útiles. Así como un ingeniero químico necesita saber mucho sobre química, también un ingeniero de software necesita saber mucho sobre informática. Pero hay una gran diferencia en lo que hacen y cuánto está involucrada la teoría en sus actividades diarias.

En su mayor parte, los informáticos se encuentran en universidades y en organizaciones gubernamentales y corporativas de investigación. Los ingenieros de software se encuentran principalmente en entornos que no son de investigación, aunque hay algunas investigaciones de ingeniería de software.

Dicho esto, hay otra distinción importante: la distinción entre un programador y un ingeniero de software. Es como la diferencia entre una persona que construye casas y una persona que las diseña para ser estructuralmente sólidas. La diferencia está en “ingeniería” en lugar de construir. Uno puede ser un excelente albañil o enmarcador sin saber cómo diseñar una casa para que sea estructuralmente sólida o administrar un proyecto de construcción para mantenerlo dentro de un presupuesto y un cronograma. Y uno puede ser un excelente ingeniero estructural sin saber cómo enmarcar una casa o colocar ladrillos muy bien. Un ingeniero estructural puede determinar cuánto peso puede soportar un diseño de techo en particular o si una base en particular puede soportar las tensiones y tensiones del suelo sobre el que se coloca. Un excelente enmarcador puede construir una casa donde las paredes sean rectas y verdaderas. Cada uno sabe algo sobre el comercio del otro, pero se especializa en un aspecto diferente del problema.

Una persona puede ser un excelente programador sin saber cómo estimar el rendimiento del producto que está construyendo o estimar el costo de un proyecto o administrar un proyecto para que se mantenga a tiempo o interactúe fuertemente con los otros ingenieros en un proyecto masivo (como un nuevo avión o una presa o una planta de energía o una fábrica) para producir un producto final de alta calidad. Un verdadero ingeniero de software debe saber programar, pero no necesariamente tiene que ser el mejor programador. Por otro lado, el verdadero ingeniero de software hace mucha ingeniería. Esto incluye actividades como analizar problemas, determinar la viabilidad de las soluciones propuestas, estimar el costo y el cronograma, liderar equipos de desarrollo, diseñar una estrategia de prueba y validación completa, rentable y exitosa, o integrar software con redes y hardware de computadora y hardware que no sea de computadora para producir Un producto final de calidad.

Naturalmente, hay mucha área gris entre estas y muchas personas funcionan en esa área gris. Es bastante común que un programador migre para realizar más y más tareas de ingeniería de software. Suenas como una persona a la que le gusta programar (me encantó cuando empecé), y eso puede conducir a una carrera exitosa. Es posible que desee pasar a la ingeniería de software (eso es lo que hice), pero eso puede requerir mucha educación en cosas como diseño de software, administración de software, análisis, medición y otras materias de “ingeniería”. Por cierto, aunque hice ingeniería de software durante más de 30 años, rara vez hice mucha programación durante los últimos 20 años de mi carrera; estaba demasiado ocupado tratando de organizar, administrar, planificar, integrar y automatizar.

Estás hablando de tres habilidades que están todas juntas pero que son distintas. Su título universitario en informática puede hacer que parezca que son iguales (el mío), pero en última instancia hay mucho más que aprender. Voy a dividir estas habilidades como:

  • Teoría CS
  • Programación
  • Ingeniería de software

Vamos a compararlos de dos en dos.

Teoría CS vs. Programación

Me gustaría diferir esto a la respuesta de Adam D’Angelo a ¿Por qué soy malo en la programación a pesar de que soy bueno en matemáticas discretas? ¿Hay una solución?

Ingeniería de Software vs. Programación

La ingeniería de software es diferente de hacer matemática o teoría un poco. Tener una buena teoría / experiencia en programación es una gran base para la ingeniería de software, pero tendrá que aprender algunas cosas más en el camino. Se trata de comprender cómo se une un grupo de personas para escribir código y cómo hacerlo bien. La gran diferencia es la comprensión de que el código debe leerse más de lo que debe escribirse. Realmente recomiendo leer Team Geek: una guía del desarrollador de software para trabajar bien con otros: Brian W. Fitzpatrick, Ben Collins-Sussman: 9781449302443: Amazon.com: libros para una idea de cómo es realmente la ingeniería de software en industy.

Teoría CS vs. Ingeniería de Software

Una vez más, recomendaría el libro, pero además de eso, realmente encontraría sus habilidades para pensar desde los primeros principios (que una educación en CS le enseñaría) muy útiles para aplicar para construir grandes sistemas de personas, superponiendo efectivamente las abstracciones y escogiendo los problemas correctos a resolver para construir software.

En última instancia, no se preocupe si es apto para ser ingeniero de software. Si eso es lo que quieres hacer, y si eres un gran programador, entonces encontrarás una manera de sobresalir en eso.

Parece que eres más un programador que un informático. Esta bien. Los trabajos de ingeniería de software están ocupados por ambos tipos.

Los tipos de programadores aquí tienden a trabajar en la corrección de errores y los tipos de informáticos tienden a trabajar en IRAD y diseño. Todos obtienen un nuevo trabajo de desarrollo, pero los programadores están implementando el diseño de otra persona. Me imagino que eso será indicativo de tu carrera.

La respuesta del Sr. Abhinav Sharma es excelente pero un poco complicada. Veamos si puedo parafrasearlo y acortarlo.

Hay codificadores técnicos y personas teóricas que codifican. En general, un proyecto tendrá una o dos personas basadas en la teoría y (si todo está bien) el resto serán técnicos sólidos. Si eres un codificador técnico fuerte, absorbe tanta teoría como sea posible y continúa desarrollando tus habilidades técnicas.

Se necesitan ambas habilidades para construir un gran producto.

No para secuestrar el hilo, pero me pregunto si alguien está dispuesto a defender la respuesta alternativa de “no”.

Creo que estás en condiciones de ser un ingeniero de software, ya que solo necesitas el conocimiento básico de pregrado de algo (esto supone que conoces bien los sistemas), pero me pregunto si alguien que realmente cree lo contrario estaría dispuesto a decirlo.

Tú y yo los dos. Vamos a rockear y crear programas increíbles.

no

More Interesting

Dada una matriz sin clasificar que contiene un número impar de ocurrencias para todos los números, excepto un número, ¿cómo se puede encontrar ese número?

¿Qué tan importante es que un lenguaje de programación sea Turing completo?

En informática, ¿la reversibilidad lógica implica reversibilidad física?

¿Cuáles son los requisitos previos (matemáticos, de programación, etc.) que uno debe tener para convertirse en ingeniero de control?

Si tuviera la oportunidad de rediseñar el programa de cuatro años de Ciencias de la Computación de su universidad, entonces, ¿qué programa diseñaría?

¿Por qué este programa da '0' como salida?

¿El algoritmo de Bellman-Ford es pseudo polinomial?

¿Por qué se acepta la tesis de Church-Turing? Tengo problemas para concebir un programa para una máquina de Turing que sume dos números arbitrariamente grandes.

¿Cómo se me ocurre una fórmula de suma para iterar sobre una matriz y cambiar el índice inicial con cada iteración?

Sistemas distribuidos: ¿El resultado de imposibilidad de FLP y el teorema de CAP de Brewer son básicamente equivalentes?

¿Cuáles son los problemas que no podemos resolver debido a los límites de la computación?

¿Cuáles son algunas propiedades interesantes de una caminata aleatoria en un gráfico?

¿Qué problemas matemáticos se pueden hacer con las computadoras? ¿Cómo?

¿Podrán las computadoras multiplicarse 99,999,999,999 veces 999,999,999,999?

¿Con qué campos de la ciencia será más emocionante trabajar en el futuro cercano?