Diferença entre design de produto de software e design de engenharia de software

Várias boas respostas já, mas deixe-me fazer algumas distinções adicionais.

E deixe-me começar isso dizendo que o "design" acontece em vários níveis de desenvolvimento de sistemas e software.

Começando de cima para baixo:

Engenharia: Há uma variedade de definições de dicionário, mas no geral se resume a resolver um problema - geralmente terminando com a construção e a implantação de algo (seja uma ponte, um sistema de computador, um produto, sistema hidráulico, uma fábrica de produtos químicos, qualquer que seja).

Engenharia de sistemas: o panorama geral, incluindo o conceito de operações, arquitetura, integração, gerenciamento da equipe de design e processo - geralmente dividido em:

  • Análise de Requisitos
  • Arquitetura de sistemas: o panorama técnico geral. Todas as principais peças (por exemplo, hardware, software, rede), especificações funcionais de cada peça, interfaces. E, geralmente, design de nível superior (por exemplo, seleção de tecnologias-chave, abordagem e plano de teste, processos de design / construção a serem aplicados).
  • Integração de sistemas: juntando todas as peças e fazendo as coisas funcionarem como um sistema.
  • Gerenciamento de engenharia de sistemas: planejamento, tarefas, supervisão etc.

Engenharia de software: O processo geral de arquitetura, design, construção, teste e implantação de software. Na Engenharia de Software, as coisas se decompõem em:

  • Arquitetura de software: A visão geral do software - conceito geral do sistema (por exemplo, centralizado em banco de dados, orientado a eventos x loop principal), principais subsistemas de software (por exemplo, servidores Web, servidores de banco de dados, nivelamento de carga), fluxos de dados e controle, seleção de tecnologia (por exemplo, que tipo de banco de dados), principais módulos, interfaces, dados e arquitetura de banco de dados (particularmente para dados compartilhados entre subsistemas).
  • Design de nível superior: adicionando alguns detalhes à arquitetura. Principais algoritmos e heurística. (Selecionar e / ou projetar), avaliação e seleção de tecnologia, design / documentação / padrões e processos de teste, especificações detalhadas para cada módulo, talvez abordagem de nível superior para os principais módulos.
  • Design de software: Design detalhado para cada peça de software. Por exemplo, definindo todas as variáveis ​​e estruturas de dados, definindo cada função em um módulo, algoritmos e heurísticas, fluxos de dados e controle em um módulo - geralmente no quadro branco, fluxograma ou pseudo-código. (Pense nisso como o esboço detalhado de um capítulo do livro.) Algumas pessoas adotam a abordagem de “escrever a documentação primeiro”.
  • Codificação: realmente escrevendo o código.
  • Documentação
  • Teste de Unidade
  • Teste de integração
  • Implantação (em um sistema) ou Empacotamento (por exemplo, de um produto, para entrega e instalação).

Agora, nem todos eles se aplicam a um projeto específico. Se alguém está construindo um sistema de transações totalmente novo - você precisa fazer tudo isso. Se alguém está escrevendo uma ferramenta de software para implantação em laptops com Windows - então não há muita Engenharia de Sistemas, e uma entra diretamente na Engenharia de Software (no nível de Sistemas, o ambiente já está especificado e talvez não seja necessário fazer mais do que estabelecer requisitos ambientais básicos - como quais GPUs devem ser suportadas, requisitos mínimos de memória e espaço em disco).