Arquivo para agosto 2006

Resumo da Aula 03

agosto 17, 2006

Disciplina, segundo o dicionário Houaiss, é o regulamento sobre a conduta dos diversos membros de uma coletividade, imposto ou aceito democraticamente, que tem por finalidade o bem-estar dos membros e o bom andamento dos trabalhos. Isso é válido para profissionais de qualquer área do conhecimento.

Na área de desenvolvimento de software, a disciplina é essencial para que o produto gerado seja de qualidade. A engenharia de software fornece maneiras de disciplinar o profissional para atingir esse objetivo. Outra forma de interpretação é que a engenharia de software utiliza a disciplina como um dos meios para cumprir seu propósito.

Mas até que ponto é válido impor regras ao engenheiro? Se por um lado a disciplina ajuda no desenvolvimento, por outro limita a criatividade. Esta é a relação do artesanato x arte, onde o artesão é disciplinado e o artista é criativo. É necessário encontrar o balanceamento certo entre as duas virtudes.

Para auxiliar a definição, o desenho e a implantação de artefatos de software, seis regras básicas são sugeridas:

  1. Os documentos devem conter meta-informações (título, autoria, data, versão e indicador de tamanho). A maioria destas informações pode ser gerenciada com sistemas de controle automatizados, como o CVS ou o Subversion (uma comparação entre os dois sistemas pode ser encontrada aqui). Este blog também possui controle automático de autor e data.
  2. Sempre utilizar pré e pós-condições para garantir que o “meio” do documento está correto. No caso de programas, a lógica de Hoare pode ser utilizada, onde queremos expressar quando que {P}C{Q} será correto. Já no caso de processos, é vantajoso conhecer o modelo ETVX (Entry-Tasks-Verification&Validation-Exit), criado pela IBM nos anos 80.
  3. As divisões devem resultar em no mínimo 3 e no máximo 6 partes, assim torna-se mais facil identificar o início, meio e fim do que se deseja dividir, enquanto que não torna muito complexas as interconexões entre as partes. Estes valores são heurísticos, portanto são uma aproximação da solução ideal.
  4. Neologismo não leva a lugar nenhum. Evitar o uso de nomes inventados e possivelmente ambíguos quando já existem nomes consagrados na literatura.
  5. Soluções simples, mas não simplistas. Geralmente estas soluções são as que têm maiores chances de serem bem-sucedidas.
  6. Manter um livro diário com o registro de todas as atividades realizadas no trabalho, possivelmente utilizando o formato PSP (Personal Software Process).

Versão 1.0 – Página 1 de 1

Anúncios

Resumo da aula 02

agosto 17, 2006

Nesta aula foi discutido o triângulo do conhecimento, que se define por:

  • Engenharia de Software
  • Conhecimento da plataforma
  • Conhecimento do problema a ser abordado

Os dois primeiros são conhecimentos considerados estáticos, e o ultimo dinâmico, que varia de acordo com o projeto a ser realizado. Para almejar sucesso no projeto, o engenheiro de software deve não somente ser competente no conhecimento de sua área como também deve entrar no ambiente de seu cliente, aprender sobre este ambiente e trazer para si os problemas do cliente. Desta forma é possível apresentar soluções eficazes.Também foi abordado o assunto de Eficácia X Eficiência. Eficácia é o quanto o projeto atingiu os objetivos esperados e Eficiência é o quanto o projeto utilizou os recursos disponíveis para aumentar a produtividade. A curto prazo pode-se considerar a eficácia prioritária porém a longo prazo a eficiência é imprescindível, tendo em vista que nenhum grande projeto cresce sem uma adequada organização.

Este assunto está intimamente ligado á Verificação & Validação, cujo primeiro consiste em sempre fazer uma reavaliação do projeto e garantir que seu desenvolvimento está correto. E o segundo consiste em avaliar se o projeto esta atendendo as necessidades para o qual foi projetado. Pode-se ver que a Verificação avalia o nível de Eficiência e a Validação avalia o nível de Eficácia do projeto. Discutindo este assunto também foi citada a frase: “Testing can demonstrate the presence of bugs but not their absence.” – Dijkstra.

Resumo da aula 01

agosto 17, 2006

O que é, em si e afinal, a engenharia de software?

A engenharia de software é uma disciplina que busca aumentar a qualidade dos softwares produzidos, bem como diminuir o seu custo. Para isso, procura disponibilidar um conjunto de métodos, técnicas e ferramentas que auxiliem na produção dos artefatos desejados. Não apenas isso, mas essa disciplina se preocupa com a precisa aplicação dos MTFs disponibilizados, também procurando aumentar a produtividade do engenheiro criador de software.

Ressaltamos inicialmente como a engenharia de software pode melhorar a qualidade de um artefato. Contudo, seria imprudência não expor que a ausência da mesma pode acarretar em sérios problemas nos artefatos desenvolvidos (vide o caso das âmbulâncias de Londres).

Contudo, ainda que seja de importância inquestionável, a engenharia de software ainda se apresenta como desafiadora. Escolher os MTFs adequados, usá-los na situação apropriada e ainda orquestrá-los para que funcionem em harmonia é uma tarefa de grande complexidade, que mostra que maiores estudos nessa área se fazem necessários.

Portanto, diante da complexidade de uso adequado das MTFs, três conhecimentos se mostram fundamentais ao se elaborar um artefato:

  • Conhecimento de Engenharia de Software
  • Conhecimento do Contexto
  • Conhecimento da Máquina Computacional

Esses três conhecimentos definem a base onde bons artefatos podem ser fundamentados. O primeiro conhecimento salienta a necessidade de se estar familiarizado com os métodos, técnicas e ferramentas disponíveis, assim como a experiência em utilizá-los. O conhecimento do contexto define o quanto o engenheiro sabe a respeito do problema a ser resolvido, i.e., o quanto ele conhece dos fatores que influenciam a resolução do problema. Por fim, o terceiro conhecimento pretende agregar o entendimento sobre os fatores aos quais o software estará submetido, sejam eles limitações de hardware ou mesmo do ambiente de software que circundará o artefato produzido. Estruturar bem esse conhecimento e torná-lo disponível ao desenvolvedor é um dos grandes desafios da engenharia de software. 

Enfim, diante da complexidade escalonável do conhecimento exigido de engenharia de software, algumas taxonomias pretendem aliviar a abordagem da mesma. Seja sob o viés de produção, qualidade, processo, tenta-se departamentalizar as MTFs para melhor entendê-las e aplicá-las. Isso tem se tornado uma exigência crescente à medida que se buscam nichos de especialização para o desenvolvimento da engenharia de software.