¿Cuál es la diferencia entre el diseño de software y la ingeniería de software?

Varias buenas respuestas, ya, pero permítanme hacer algunas distinciones adicionales.

Y permítanme prever esto diciendo que el "diseño" ocurre en múltiples niveles de desarrollo de sistemas y software.

Empezando de arriba hacia abajo:

Ingeniería: Hay una variedad de definiciones de diccionario, pero en general se reduce a la solución de un problema - por lo general termina con la construcción y el despliegue de algo (ya sea un puente, un sistema informático, un producto, obras hidráulicas, una planta química, lo que sea).

Ingeniería de Sistemas: El panorama general, incluyendo el concepto de operaciones, la arquitectura, la integración, la gestión del equipo de diseño y el proceso - a menudo dividido en:

  • Análisis de requisitos
  • Arquitectura de sistemas: El panorama técnico general. Todas las piezas principales (por ejemplo, hardware, software, red), especificaciones funcionales para cada pieza, interfaces. Y, por lo general, el diseño de alto nivel (por ejemplo, la selección de tecnologías clave, el enfoque y el plan de pruebas, los procesos de diseño/construcción que se aplicarán).
  • Integración de sistemas: Unir todas las piezas y hacer que las cosas funcionen como un sistema.
  • Gestión de la ingeniería de sistemas: Planificación, asignación de tareas, supervisión, etc.

Ingeniería de software: El proceso general de arquitectura, diseño, construcción, prueba y despliegue de software. Dentro de la ingeniería de software, las cosas se descomponen en:

  • Arquitectura de software: El panorama general del software: el concepto global del sistema (por ejemplo, centrado en la base de datos, impulsado por eventos frente a un bucle principal), los principales subsistemas de software (por ejemplo, servidores web, servidores de bases de datos, nivelación de carga), los flujos de datos y de control, la selección de la tecnología (por ejemplo, qué tipo de base de datos), los principales módulos, las interfaces, los datos y la arquitectura de la base de datos (en particular para los datos compartidos a través de los subsistemas).
  • Diseño de alto nivel: Añadir algunos detalles a la arquitectura. Algoritmos y heurísticos clave (selección y/o diseño), evaluación y selección de tecnología, normas y procesos de diseño/documentación/prueba, especificaciones detalladas para cada módulo, quizás enfoque de alto nivel para los módulos clave.
  • Diseño de software: Diseño detallado de cada pieza de software. Por ejemplo, la definición de todas las variables y estructuras de datos, la definición de cada función dentro de un módulo, los algoritmos y la heurística, los flujos de datos y de control dentro de un módulo, generalmente a nivel de pizarra, diagrama de flujo o pseudocódigo. (Piense en ello como el esquema detallado de un capítulo de un libro). Algunas personas adoptan el enfoque de "escribir primero la documentación".
  • Codificación: Escribir el código.
  • Documentación
  • Pruebas de unidad
  • Pruebas de integración
  • Despliegue (en un sistema) o empaquetado (por ejemplo, de un producto, para su entrega e instalación).

Ahora bien, no todo esto se aplica a un proyecto específico. Si uno está construyendo un nuevo sistema de transacciones, tiene que hacer todo esto. Si uno está escribiendo una herramienta de software para el despliegue en los ordenadores portátiles de Windows - entonces no hay una gran cantidad de ingeniería de sistemas, y uno va directamente a la ingeniería de software (en el nivel de sistemas, el medio ambiente ya está especificado, y uno podría no tener que hacer más que establecer los requisitos básicos del medio ambiente - tales como qué GPUs deben ser compatibles, la memoria mínima y los requisitos de espacio en disco).