¿Cuáles son los fundamentos de la ingeniería del software?

Una pregunta corta, sin duda, pero llena de
complejidad. ¿Están preguntando por las habilidades? ¿Ingeniería? Cursos?
¿Conceptos que son tan inmutables como las leyes? ¿Cosas que nadie puede discutir?

Difícil de decir.

Mi inclinación es más naturalmente hacia lo filosófico que hacia lo puramente
pragmático en estas discusiones, aviso.

*******

Cómo se aborda un problema u oportunidad determina cómo acabará la solución
.

Uno de los aspectos clave de la ingeniería de software es la capacidad de investigar con curiosidad la forma y el espacio del problema, para entender sus partes y ser capaz de ensamblarlas en algo útil y valioso.

Esto se aplica no sólo al software real, sino a todo el sistema de concepción, invención, implementación, despliegue y mantenimiento. No sólo se trata de cómo esta característica particular va a ser dividida en objetos, funciones, procedimientos, o lo que sea, sino cómo esas partes van a ser verificadas, validadas y ensambladas, y cómo las personas que están trabajando en estas partes y conjuntos van a trabajar juntos.

Así que uno de los fundamentos de la Ingeniería de Software es:

**Ser capaz de ver el todo así como las partes,
cómo se separan y encajan de nuevo.**

*******

Hay que aprender a hacer esto, por supuesto, ya que la mayoría de la gente no nace con esta habilidad. Algunas personas la adquieren antes que otras,
algunas pueden no adquirirla nunca, pero es algo que se puede enseñar y
aprender.

¿Pero cómo?

La ingeniería civil es posiblemente el primer tipo de ingeniería que los humanos
desarrollaron. Aprender a hacer puentes que salvaran ríos, abismos y
facilitaran el comercio ha formado parte de la civilización humana durante
milenios.

¿Pero cómo empezó? Principalmente, porque los puentes se cayeron. Lanzar un par de troncos al otro lado de la corriente era suficiente, pero si querías que algo durara más que la siguiente inundación, tenías que encontrar la manera de evitar que esas cosas se desvanecieran o se cayeran y mataran a la gente en el proceso.

Así que los primeros ingenieros aprendieron a estudiar el fracaso y a aprender por qué las cosas que construimos se rompen y se desmoronan. Un ingeniero de software debe hacer lo mismo para entender cómo construir un mejor software. No es suficiente con estudiar el fracaso, por supuesto;
también hay que entender los proyectos exitosos.

En esto, estudiamos mejor cuando estudiamos juntos, que es una de las razones por las que el movimiento de código abierto ha sido un beneficio real para el aprendizaje de la ingeniería de software. Incluso en el desarrollo propietario, sin embargo, compartir el código
con los colegas a través de las revisiones por pares, el emparejamiento, y el estudio es muy
beneficioso.

Así que otro de los fundamentos de la Ingeniería del Software es:

**Un profundo sentido de la curiosidad acerca de las interioridades del software y
proyectos que funcionan y que fallan, y la comprensión de lo que hace
algo bueno y lo que va a causar problemas en el futuro.**

*******

Mencioné la noción de "Leyes", o Conceptos Fundamentales de la Ingeniería del Software.

Hay algunas que se acercan a este tipo de inmutabilidad pero ninguna con
tanta rapidez como la Ley de la Gravedad.

Me limitaré a enumerar algunos de ellos, ya que hay información más que suficiente sobre ellos, y diferentes personas tienen sus favoritos.

* No te repitas
* Principio del mínimo asombro
* Principio del mínimo conocimiento
* Haz que funcione, luego hazlo bonito, luego hazlo rápido.

**Entiende los principios sobre lo que hace una buena arquitectura de software.

*******

Cambiando un poco, ahora voy a hablar más técnica y
pragmáticamente, y estos serán un poco más dirigidos.

* No aprendas una sintaxis, aprende los modismos de un lenguaje o framework,
las prácticas, los espacios de problemas en los que funciona mejor, los que no

* No aprendas un solo lenguaje o framework. En *Pragmatic
Programmer*, te instan a aprender un nuevo lenguaje cada año. La
cosa es que no aprendas sólo un lenguaje del mismo tipo, aprende uno
que tenga diferentes formas de resolver problemas. Si usas un lenguaje imperativo como C, aprende Lisp o Smalltalk. Si escribes principalmente en Perl, aprende Ruby y Python. El aprendizaje nunca tiene desperdicio.

* Trabaja tanto con ejercicios (kata) como con problemas reales. No hay
nada realmente más satisfactorio que resolver uno de tus propios
problemas, y estos son los vehículos ideales para aplicar el aprendizaje.

* Si te encuentras con alguna pieza de un proyecto que no
sabes cómo implementar, o un área en la que necesitas más habilidad, despréndete de un
pequeño ejemplo y practica eso hasta que lo entiendas.

Otro principio de la Ingeniería de Software es:

**Estar constantemente practicando y aprendiendo tu oficio.**

*******

Seguro que otras personas aportan otros pensamientos e ideas. Mucha
suerte.