Varias buenas respuestas, ya, pero permítanme hacer algunas distinciones adicionales.
Y permítanme presentar esto diciendo que el “diseño” ocurre en múltiples niveles de desarrollo de sistemas y software.
Comenzando de arriba hacia abajo:
- Si Microsoft evitara el 100% de las versiones ilegales de su software, ¿todos se convertirían a Linux?
- Si escribimos el software correctamente, ¿siempre se ejecutará sin problemas?
- ¿Dónde puedo encontrar agencias de outsourcing de proyectos de software en los Estados Unidos?
- ¿Qué lenguaje de programación debo aprender a codificar software para la industria química para que puedan cambiar el valor de un ejemplo de vapor?
- ¿Qué lenguajes de programación debe saber un desarrollador de software?
Ingeniería: hay una variedad de definiciones de diccionario, pero en general se trata de resolver un problema, generalmente terminando construyendo y desplegando 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, incluido el concepto de operaciones, arquitectura, integración, gestión del equipo de diseño y proceso, a menudo desglosado en:
- Análisis de requerimientos
- Arquitectura de sistemas: el panorama técnico general. Todas las piezas principales (p. Ej., Hardware, software, red), especificaciones funcionales para cada pieza, interfaces. Y, por lo general, diseño de nivel superior (por ejemplo, selección de tecnologías clave, enfoque y plan de prueba, 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 ingeniería de sistemas: planificación, tareas, supervisión, etc.
Ingeniería de software: El proceso general de arquitectura, diseño, construcción, prueba e implementación de software. Dentro de la Ingeniería del Software, las cosas se descomponen en:
- Arquitectura del software: el panorama general del software: concepto general del sistema (p. Ej., Centrado en la base de datos, controlado por eventos versus bucle principal), subsistemas de software principales (p. Ej., Servidores web, servidores de bases de datos, nivelación de carga), flujos de datos y control, selección de tecnología (por ejemplo, qué tipo de base de datos), módulos principales, interfaces, arquitectura de datos y bases de datos (particularmente para datos compartidos entre subsistemas).
- Diseño de nivel superior: Agregar algunos detalles a la arquitectura. Algoritmos y heurística clave (selección y / o diseño), evaluación y selección de tecnología, diseño / documentación / estándares y procesos de prueba, especificaciones detalladas para cada módulo, quizás un enfoque de nivel superior para módulos clave.
- Diseño de software: diseño detallado para cada pieza de software. Por ejemplo, definir todas las variables y estructuras de datos, definir cada función dentro de un módulo, algoritmos y heurística, datos y flujos de control dentro de un módulo, generalmente a nivel de pizarra, diagrama de flujo o pseudocódigo. (Piense en ello como el esbozo detallado de un capítulo de libro). Algunas personas adoptan el enfoque de “escribir la documentación primero”.
- Codificación: Realmente escribiendo el código.
- Documentación
- Examen de la unidad
- Pruebas de integración
- Despliegue (en un sistema) o Empaque (p. Ej., De un producto, para entrega e instalación).
Ahora, no todos estos se aplican a un proyecto específico. Si uno está creando un nuevo sistema de transacciones, debe hacer todo esto. Si uno está escribiendo una herramienta de software para su implementación en computadoras portátiles con Windows, entonces no hay mucha Ingeniería de Sistemas, y uno va directamente a Ingeniería de Software (en el nivel de Sistemas, el entorno ya está especificado, y uno podría no necesitar hacer más de establecer requisitos ambientales básicos, como qué GPU se admitirán, requisitos mínimos de memoria y espacio en disco).