# Engenharia de Software ## Introdução à Engenharia de Software ### 1.1 Explique porque o software profissional não são apenas os programas que são desenvolvidos para um cliente. O software profissional não são apenas os programas que são desenvolvidos para um cliente, são também toda a documentação, manutenção do mesmo e requisitos. ### 1.2 Qual é a diferença mais importante entre o desenvolvimento de software genérico e o desenvolvimento de software personalizado? O que isto pode significar na prática para os utilizadores de produtos de software genéricos? Fornece exemplos de software genérico e customizado. A diferença mais importante é que um produto de **software genérico** é desenvolvido, colocado no mercado e vendido a qualquer cliente (ex: IDEs da Jetbrains) e um produto de **software personalizado** é desenvolvido para um propósito específico, para um cliente específico (ex: um telemóvel empresarial). Em produtos genéricos o desenvolvedor pode alterar as especificações conforme quiser, em resposta a um fator externo (como um produto concorrente), mas em produtos personalizados, as especificações devem ser, em primeiro lugar, negociadas com o cliente. Na prática, os utilizadores de produtos genéricos não terão muito controlo sobre as aplicações que estão a receber, uma vez que não têm qualquer controlo sobre a especificação, evolução ou manutenção do produto que estão a pagar. Isto significa que várias funcionalidades que querem podem ou não ser incluídas, enquanto outras que podem não querer, podem ser incluídas. Além disso, as interfaces do utilizador podem mudar, o que implicará a reconversão do utilizador. ### 1.3 Quais são os atributos mais importantes que todo software profissional deve ter? Sugera outros atributos que podem às vezes ser significativos. **Adaptabilidade, Flexibilidade, saber trabalhar em equipa, capacidades técnicas** e: * **Manutenção:** A capacidade de manutenção do software. O código deve ser escrito de forma clara e de modo a que possa facilmente mudar e ser mantido; * **Fiabilidade e Segurança:** A capacidade do software de ser resiliente à falha do sistema e não causar danos económicos ou do utilizador. Não deve permitir ataques de utilizadores maliciosos e deve ser fiável e seguro; * **Eficiência:** O software deve funcionar sem problemas e ser otimizado para que não desperdice recursos do sistema. Deve ser responsivo, ter pouco tempo de processamento e usar a memória de forma eficiente; * **Aceitabilidade:** O software deve ser aceitável para os utilizadores para os quais foi concebido, ou seja, deve ser compreensível, fácil de usar, utilizável e compatível com os sistemas utilizados pelos utilizadores; * **Portabilidade:** A capacidade de o software ser portátil, ou seja, ser capaz de funcionar num grande número de sistemas de hardware e software; * **Útil:** A capacidade de o software trazer algo significativo aos seus utilizadores; * **Reutilização:** A capacidade de reutilização do software noutro software; * **Distribuição:** A capacidade do software a ser distribuído por uma rede. ### 1.4 Explique porque existem ideias fundamentais de engenharia de software que se aplicam a todos os tipos de sistemas de software. Muitos sistemas precisam de técnicas individuais de engenharia de software, devido à sua natureza. No entanto, existem ideias que se aplicam a todos os sistemas de software, estas ajudam sempre a desenvolver um sistema melhor, mais rápido e mais barato. Estas ideias são: * Todos os sistemas devem ser desenvolvidos utilizando um processo de software; * Todos os sistemas devem ter os atributos de fiabilidade e segurança; * Todos os sistemas devem ser construídos em torno da especificação dos requisitos do sistema; * Quando apropriado, os sistemas devem reutilizar o código para escrever um novo software, em vez de escrever um novo. ### 1.5 Para ajudar a combater o terrorismo, muitos países estão a planear ou desenvolveram sistemas informáticos que rastreiam um grande número dos seus cidadãos e as suas ações. É óbvio que isto tem implicações na privacidade. Discuta a ética de trabalhar no desenvolvimento deste tipo de sistema. É muito importante combater o terrorismo, mas a **privacidade** é uma das **principais preocupações do Engenheiro de software**. Com isto, pretendo concluir que a confidencialidade dos dados do cidadão poderão estar comprometidos ao público e isso é, claramente, um problema ético. ### 1.6 No contexto da Engenharia de Software, comente a imagem abaixo. ![](https://i.imgur.com/ekMDWP1.png) A imagem tem como contexto demonstrar que às vezes aquilo que o cliente pretende e o produto durante o seu desenvolvimento podem ter uma grande descrepancia, devido a problemas de comunicação entre ambos ou maneiras de ver diferentes. ### 1.7 Explique porque a mudança é inevitável em sistemas complexos e dê exemplos (além da prototipagem e entrega incremental) de atividades de processo de software que ajudam a prever mudanças e tornar o software que está a ser desenvolvido mais resistente à mudança. A mudança é inevitável em sistemas complexos devido às **mudanças sociais**, **económicas** e **empresariais** (como novos concursos, novas tecnologias, novas exigências), os sistemas complexos têm de mudar em conformidade, para que não fiquem ultrapassados. Além disso, o ambiente em que são colocados ão fundamentais para essas mudanças. As atividades de software que ajudam a prever alterações e a tornar o software mais resistente à mudança são: * **Registo de requisitos fundamentais**, ou seja, registo da justificação da razão pela qual um determinado requisito foi escrito; * **Escrita de código claro e modular**, para que a mudança possa ser facilmente acomodada. ### 1.8 Historicamente, a introdução da tecnologia tem causado profundas mudanças no mercado de trabalho e, temporariamente, alterando empregos. Discuta se a introdução da automação de processos extensivos pode ter as mesmas consequências para engenheiros de software. Acha que vai reduzir as oportunidades de emprego, será ético para os engenheiros afetados resistir passiva ou ativamente à introdução dessa tecnologia? Na minha opinião, NÃO. A automação veio com o objetivo de tornar as coisas mais simples, mais rápidas e até mesmo mais eficazes. O mundo está em constante evolução e nós, humanos, temos de nos adaptar a ele. A automação também cria novos empregos e um ES deve manter-se em constante atualização, com as suas bases e conceitos, acredito ter as capacidades suficientes para enfrentar a evolução do mercado de trabalho.