<!-- .slide: data-background-image="https://raw.githubusercontent.com/irvingbadolato/lessons/main/UERJ.png" --> ![Logo UERJ](https://raw.githubusercontent.com/irvingbadolato/lessons/main/logofen2.svg) ![Logo UERJ](https://raw.githubusercontent.com/irvingbadolato/lessons/main/Uerj_RGB_WEB_branca.svg) <!-- .element: style="height:20vh" --> # C2 - Aula 01 prof. Irving Badolato ---- <!-- .slide: data-background-image="https://raw.githubusercontent.com/irvingbadolato/lessons/main/4dfavela.png" --> ## Computação Aplicada à Cartografia II ### Introdução à Engenharia de _Software_ --- <!-- .slide: data-background="https://raw.githubusercontent.com/irvingbadolato/lessons/main/flow.png" --> ### Conceitos básicos ---- #### Objetivos - Seu foco está na concepção, desenvolvimento, manutenção e melhoria de **sistemas de _software_**; - Utilizamos princípios de engenharia para garantir um projeto estruturado, atendendo às necessidades dos usuários, com qualidade, eficiência, confiança e sustentabilidade; - Como toda engenharia, visa a otimização de recursos e a redução de custos, maximizando o valor entregue aos interessados (_stakeholders_). <!-- .element: style="font-size: xx-large;" --> ---- #### Definindo _software_ 1. Substantivo coletivo de origem inglesa segundo o Vocabulário Ortográfico da Lingua Portuguesa (VOLP 23-24); 2. Um conjunto de instruções, dados e/ou programas que são executados por um computador para realizar tarefas específicas; 3. Pode ser dividido em diferentes tipos: 1. Sistema: Windows, Android, OSX, etc. 2. Aplicação: Word, QGIS, e-foto, etc. 3. Desenvolvimento: Compiladores, etc. 4. Intangível, ou seja, produto intelectual que pode ser criado, distribuído e modificado conforme necessário. <!-- .element: style="font-size: xx-large;" --> ---- #### Ciclo de vída de _software_ O _software_ passa por fases, desde sua concepção inicial até seu fim de vida útil. De forma minimalista: - Desenvolvimento: com a análise de requisitos, o projeto, a implementação, os testes e a implantação; - Operação (uso): com suporte e relacionamento com usuários; - Evolução: com a manutenção corretiva e os incrementos de funcionalidades. <!-- .element: style="font-size: xx-large;" --> ---- <!-- .slide: data-background="#888" --> #### Visão minimalista do ciclo de vida ```flow ini=>start: Início após assumir que precisamos desenvolver o programa dvl=>operation: Desenvolva prd=>operation: Utilize test1=>condition: Atende? test2=>condition: Vale o esforco para corrigir? quit=>end: Fim do ciclo de vida ini(right)->dvl(right)->prd(right)->test1 test1(no@Não,bottom)->test2 test1(yes@Sim,top)->prd test2(no@Não,bottom)->quit test2(yes@Sim,left)->dvl ``` <!-- .element: style="fill:#f00; font-color:#0f0" --> Note: Programas são projetados para um determinado fim e podem ser revisados durante longos períodos de tempo. Todavia, cabe destacar que estes não são insubstituíveis ou necessariamente terão de ser suportados por eternamente. Por vezes, os proprietarios encerram ou suporte ou a comunidade não demonstra interesse pela ferramenta e naturalmente atinge o fim. ---- #### Processos de desenvolvimento Diferentes abordagens (modelos) foram propóstas ao longo dos anos para o processo desenvolvimento. Modelos de processos são nomeados de acordo com seus princípios. São exemplos de modelos: - Modelos em cascata - Modelos incrementais - Modelos iterativos - Modelos ágeis - [Modelos V, RAD, espiral e protótipo](https://www.geeksforgeeks.org/top-8-software-development-models-used-in-industry/) <!-- .element: style="font-size: xx-large;" --> ---- ![Waterfall model](https://upload.wikimedia.org/wikipedia/commons/5/51/Waterfall_model.png) Um exemplo de modelo em cascata. (Disponível em WikiMedia.org) <!-- .element: style="font-size:large" --> ---- ![Incremental model](https://upload.wikimedia.org/wikipedia/commons/e/e4/Incremental_Model.jpg) Um exemplo de modelo incremental. (Disponível em WikiMedia.org) <!-- .element: style="font-size:large" --> ---- ![Iterative model](https://upload.wikimedia.org/wikipedia/commons/1/19/Development-iterative.png) RUP, um exemplo de modelo iterativo. (Disponível em WikiMedia.org) <!-- .element: style="font-size:large" --> ---- ![Agile model](https://upload.wikimedia.org/wikipedia/commons/5/50/Agile_Project_Management_by_Planbox.png) Scrum, um exemplo de modelo ágil. (Disponível em WikiMedia.org) <!-- .element: style="font-size:large" --> ---- #### Metodologias - São conjuntos estruturados de processos, técnicas e/ou ferramentas que guiam as equipes na criação de _software_, desde a concepção até a entrega e manutenção. - Elas normalmente fornecem _frameworks_ para organizar as atividades do projeto, definir responsabilidades, e estabelecer práticas recomendadas para garantir que o _software_ seja desenvolvido de maneira eficiente e com alta qualidade. - Scrum e o RUP (_Rational Unified Process_) são exemplos de metodologias. <!-- .element: style="font-size: xx-large;" --> ---- #### Práticas - São as atividades e técnicas específicas utilizadas no dia a dia do desenvolvimento de _software_ dentro das metodologias. - Programação em par, Integração contínua e Testes automatizados, são exemplos de práticas que podem ser adotadas no processo de que garantem que o _software_ funcione corretamente durante todo o processo de desenvolvimento. - Essas práticas ajudam a implementar de forma eficaz os princípios da metodologia. <!-- .element: style="font-size: xx-large;" --> --- <!-- .slide: data-background="https://raw.githubusercontent.com/irvingbadolato/lessons/main/flow.png" --> ### Fundamentos em sistemas ---- "Todo _software_ pode ser entendido ou projetado segundo a teoria de sistemas." - Isto é, _software_ é composto por múltiplos componentes interdependentes que interagem para alcançar objetivos específicos. Assim como em um sistema, o comportamento do _software_ emerge da interação entre seus módulos, bibliotecas, e dados, onde cada parte tem um papel específico, mas só ao trabalhar em conjunto com as demais, o _software_ pode funcionar corretamente. <!-- .element: style="font-size: xx-large;" --> ---- A teoria de sistemas é uma abordagem interdisciplinar que estuda como diferentes partes interagem e se interrelacionam para formar um todo complexo. Ela fornece uma estrutura para entender essas interações, prever como mudanças em um componente podem afetar o sistema como um todo, e projetar solucões de maneira a garantir que o conjunto final seja robusto, eficiente e capaz de se adaptar a novas demandas e ambientes. <!-- .element: style="font-size: xx-large;" --> ---- A teoria de sistemas aplica-se a diversas áreas, como biologia, sociologia, engenharia, e gestão, ajudando a entender, modelar e otimizar a interação entre os componentes em um contexto amplo e dinâmico. Ela enfatiza a importância das relacões entre partes (conexões, feedbacks e outras interações dentro do sistema), reconhecendo que mudanças em uma parte podem afetar o sistema como um todo. <!-- .element: style="font-size: xx-large;" --> --- <!-- .slide: data-background="https://raw.githubusercontent.com/irvingbadolato/lessons/main/flow.png" --> ### Disciplinas da Engenharia de _Software_ ---- Segundo SWEBOK (2004) a engenharia de _software_ é dividida em várias disciplinas que abrangem, entre outras: 1. Requisitos de _Software_ 2. Projeto de _Software_ 3. Construção 4. Testes 5. Manutenção 6. Qualidade 7. Gerenciamento de Configuração 8. Gestão de Projetos <!-- .element: style="font-size: xx-large;" --> ---- #### 1. Estudo dos requisitos - Tipicamente usa de alguma linguagem gráfica ou textual para modelagem descritiva das necessidades dos usuários. - Práticas de entrevista e/ou pesquisa de mercado são exemplos de técnicas para o estudo de requisitos. - Pode ser orientado por processos e dados ou objetos. - Outros paradigmas podem ser adotados. - Os ferramentais variam de acordo com a orientação adotada. <!-- .element: style="font-size: xx-large;" --> ---- ![POP vs OOP](https://sp-ao.shortpixel.ai/client/to_auto,q_glossy,ret_img,w_777/https://simplesnippets.tech/wp-content/uploads/2018/03/java-introduction-to-Object-Oriented-Programming.jpg) Diferentes paradigmas de desenvolvimento. ([Sakpal, 2018](https://simplesnippets.tech/java-introduction-to-object-oriented-programming-oop/)) <!-- .element: style="font-size:large" --> ---- #### Ferramentas focados em dados e processos - Modelo entidade-relacionamento; - Diagramas de fluxo de dados; - Diagramas de estados; - Fluxogramas; - Entre outros. <!-- .element: style="font-size: xx-large;" --> ---- ![MER](https://media.geeksforgeeks.org/wp-content/uploads/20200621171512/company.png) Um exemplo de Modelo Entidade-Relacionamento. (Disponível em Geeksforgeeks.org) <!-- .element: style="font-size:large" --> ---- ![DataFlowDiagram](https://upload.wikimedia.org/wikipedia/commons/3/33/DFD0.png) <!-- .element: style="height:60vh" --> Um exemplo de Diagrama de Fluxo de Dados. (Disponível em WikiMedia.org) <!-- .element: style="font-size:large" --> ---- #### UML (Unified Modeling Language) É um ferramental do paradigma de orientação à objetos e resulta da integração de práticas de diversas metodologias. Tornou-se um padrão aceito pela industria de _software_ após os anos 2000. - Seus diagramas tratam tanto de forma, quanto de função, sendo úteis na comunicação entre as várias disciplinas de engenharia de _software_. - Diagramas de caso de uso, são adequados para as etapas iniciais de estudo dos requisitos. <!-- .element: style="font-size: xx-large;" --> ---- ![UML](https://upload.wikimedia.org/wikipedia/commons/8/81/UML_Diagrams.jpg) Ilustração dos diversos tipos de diagramas da UML. (Disponível em WikiMedia.org) <!-- .element: style="font-size:large" --> ---- #### 2. Modelagem ou projeto de _software_ - Requer delineamento de estruturas de dados e comportamentos do sistema. - Repartir o _software_ em módulos, pacotes e componentes é uma prática importante. Dividir permite simplificar, reutilizar e corrigir problemas focando-se em partes menores do sistema. - Acoplamento e coesão devem ser planejados com cuidado, pois partes distintas devem colaborar para um feito maior evitando dependências que os tornem indistinguíveis. <!-- .element: style="font-size: xx-large;" --> ---- #### $\ge$ 3. Fases da implementação e adiante - Qual linguagem atende melhor o projeto em questão? - Que testes podem ser feitos para asegurar a corretude e qualidade do que foi desenvolvido? - caixa-preta ou caixa-branca - de unidade ou de integração - aleatório, exaustivo ou patológico - O produto é operável, portável, ajustável e está documentado? <!-- .element: style="font-size: xx-large;" --> --- <!-- .slide: data-background="https://raw.githubusercontent.com/irvingbadolato/lessons/main/flow.png" --> ### O que vem depois? ---- Apesar de ser um assunto amplo, não desejamos encerrá-lo aqui. O objetivo é retornar pontualmente em diferentes tópicos (como modelagem e testes) no resto do curso. ---- <!-- .slide: style="color:#2f2" data-background-iframe="https://domenicobrz.github.io/webgl/projects/testportfolio/" --> **Obrigado pela atenção!** <!-- testportfolio; Sidescroller anim; Noisefield;-->
{"title":"C2 - Aula 01","lang":"pt-BR","showTags":"false","description":"Seu foco está na concepção, desenvolvimento, manutenção e melhoria de sistemas de software;","slideOptions":"{\"previewLinks\":false}","contributors":"[{\"id\":\"01d7a31c-0656-41c9-8144-232ea4b2aa49\",\"add\":106825,\"del\":95401}]"}
    157 views