Prévia do material em texto
Aula 1: Introdução 1.1 Do que se trata o curso 6170 De fato, o curso engloba três cursos em um só: · curso de impacto em programação orientada a objetos · projeto de software · curso em laboratório de construção de softwares em equipe. A ênfase é dada em projeto. A programação é incluída por se tratar de um pré-requisito; a execução de um projeto é incluída, pois só se aprende realmente uma idéia quando se experimenta e se utiliza esta idéia Você irá aprender: · como projetar software: poderosos mecanismos de abstração; padrões conhecidos por funcionarem com sucesso na prática; como apresentar projetos de forma que você possa comunicá-los e criticá-los de maneira eficiente · como implementar em Java · como fazer direito: software confiável e flexível. Você também poderá aprender: · como ser um arquiteto, não um simples programador de baixo nível · como evitar perder tempo depurando código. 1.2 Administração e políticas Equipe do curso: · Aulas: Daniel Jackson e Rob Miller · Professores Assistentes (PAs): você irá conhecê-los em breve · Assistentes de Laboratório (ALs): você irá conhecer as equipes em breve · Carga horária: consulte o site. As aulas não possuem carga horária fixa, mas os alunos são bem vindos para conversar: apareça ou envie e-mail. Material: · texto do curso por Liskov, leia de acordo com o planejamento encontrado nas informações gerais do curso · notas de aula: normalmente publicadas no dia da aula · Livro: ‘Gang of Four’ de padrões de projeto (recomendado) · Livro: ‘Effective Java by Bloch’ (recomendado) · Tutorial Java: detalhes nas informações gerais do curso. Os textos recomendados são realmente muito bons; serão boas referências, e irão ajudá-lo a ser um bom programador mais rapidamente. Bons preços podem ser conseguidos na aquisição de todo o pacote. Organização do curso: · Primeira metade do período: aulas, exercícios semanais, revisões, provas · Segunda parte do período: projeto em equipe. Detalhes serão fornecidos mais adiante. Não é necessário se preocupar, por enquanto, com quem será sua equipe de projeto. Revisões: · Sessões semanais com os ALs serão utilizadas para revisão dos trabalhos dos estudantes · Inicialmente, os ALs irão pegar fragmentos do seu trabalho nos quais as aulas de revisão irão focar · A sessão completa irá discutir de forma construtiva e colaborativa · Parte absolutamente essencial do curso: é uma oportunidade de se ver como as idéias das aulas são aplicadas na prática. Aprendendo Java: · Depende de você, mas nós tentaremos ajudar · Utilize o tutorial Java da Sun e faça exercícios · Haverá um ótimo time de Assistentes de Laboratório (AL) para auxiliar você. Colaboração e política de trabalhos: · consulte as informações gerais do curso · resumindo: você pode discutir, mas os trabalhos escritos precisam ser de sua autoria, incluindo especificações, projeto, código, testes, explicações · você pode utilizar código de domínio público · no trabalho de equipe, você pode colaborar em tudo. Provas: · duas provas em sala focando no material das aulas Notas: · 70% trabalho individual = 25% provas e 45% listas de exercícios · 30% projeto final, todos da equipe recebem a mesma nota · 10% pontuação extra por participação · trabalhos atrasados não serão aceitos 1.3 Por que a engenharia de software é importante Contribuições do mercado de software à economia americana (dados de 1996): · maior superávit comercial das exportações · 24 bilhões de dólares em softwares exportados, 4 bilhões importados, totalizando um saldo positivo de 20 bilhões de dólares · comparação de superávits: agricultura 26-14-12, indústria aeroespacial 11-3-8, indústria química 26-19-7, indústria automotiva 21-43-(22), bens manufaturados 200-265-(64) (fonte Software Conspiracy, Mark Minasi, McGraw Hill, 2000). Papel na infraestrutura: · não apenas a Internet · transporte, energia, medicina, finanças. Os softwares estão se tornando cada vez mais presentes em dispositivos embutidos. Novos carros, por exemplo, têm entre 10 e 100 processadores para gerenciar todo tipo de funções, desde música até frenagem. Custo do software: · A razão entre o custo do hardware para o custo de obtenção do software é aproximadamente zero · Custo total de posse: 5 vezes o custo do hardware. O Gartner Group estima que o custo de se manter um PC por 5 anos é de 7 a 14 mil dólares Quão bom é o software norte-americano? · desenvolvimento de software falho · acidentes · software de má qualidade 1.3.1 Falhas no desenvolvimento Pesquisa IBM, 1994 · 55% dos sistemas custam mais do que o esperado · 68% ultrapassam o cronograma do projeto · 88% tiveram que ser substancialmente reprojetados. Advanced Automation System (FAA, 1982-1994) · a média industrial foi de U$100 por linha de código, esperando cerca de U$500 por linha de código · foram pagos, de fato, de U$700 a U$900 por linha de código · 6 bilhões de dólares de trabalho desperdiçado. Bureau of Labor Statistics (1997) · para cada 6 novos sistemas colocados em operação, 2 são cancelados · a probabilidade de cancelamento chega a 50% para os maiores sistemas · na média, os projetos ultrapassam o cronograma em 50% do tempo · os sistemas têm 3/4 de seu todo tidos como ‘falhas operacionais’. 1.3.2 Acidentes “O modo mais provável do mundo ser destruído, como concorda a maioria dos especialistas, é através de um acidente. É aí que nós entramos. Somos profissionais da computação. Nós causamos acidentes”. Nathaniel Borenstein, inventor do MIME, em: Programming as if People Mattered:Friendly Programs, Software Engineering and Other Noble Delusions, Princeton University Press, Princeton, NJ, 1991. Therac-25 (1985-87) · máquina de radioterapia com software controlador · o dispositivo responsável por sincronizar o hardware é removido, mas o software não possui sincronismo · o software falha na tarefa de manter invariantes essenciais: o feixe de elétrons ou o feixe mais forte de radiação e a chapa se interferem na geração de raios X · diversas mortes em decorrência de queimaduras · o programador não tinha experiência em programação concorrente · detalhes: http://sunnyday.mit.edu/therac-25.html. Você pode pensar que nós iríamos aprender com o ocorrido e que tal desastre nunca viria a acontecer novamente. Mas… · A Agência Internacional de Energia Atômica declara ‘emergência radiológica’ no Panamá em 22 de Maio de 2001 · 28 pacientes super expostos; 8 morreram, 3 dos quais em decorrência direta do fato; espera-se que 3/4 dos 20 sobreviventes desenvolvam ‘sérias complicações que em alguns casos podem vir a ser fatais’ · Especialistas encontraram equipamentos radioterápicos ‘em perfeito funcionamento’; os dados coletados pelo sistema não indicavam nenhuma situação de emergência · Se dados são registrados para diversos blocos de blindagem contra radiação em uma única ação, temos uma dose incorreta processada pelo sistema · Finalmente o FDA concluiu que um dos fatores causadores da falha foi a ‘interpretação, por parte do software, dos dados coletados dos blocos dos feixes de radiação’ · detalhes: http://www.fda.gov/cdrh/ocd/panamaradexp.html. Ariane-5 (June 1996) · Agência Espacial Européira · perda total de um dos foguetes, descontrolado logo após a decolagem · causado por exceção gerada pelo código Ada · o código de erro não era nem mesmo necessário após a decolagem · graças a alterações físicas do ambiente: suposições não documentadas causam uma situação de violação · detalhes: http://www.esa.int/htdocs/tidc/Press/Press96/ariane5rep.html. O acidente da Ariane é um desastre de software mais típico do que o acidente das máquinas radioterápicas. Raramente os bugs do código são a causa do acidente, normalmente, o problema retorna à fase de análise de requisitos, neste caso uma falha na articulação e avaliação de suposições ambientais importantes. London Ambulance Service (1992) · perda de chamadas, despachos duplos de chamadas duplicadas ·escolha ruim do desenvolvedor: experiência inadequada · detalhes: http://www.cs.ucl.ac.uk/staff/A.Finkelstein/las.html. O desastre das ambulâncias de Londres foi, realmente, um desastre gerencial. Os gerentes que o produziram eram ingênuos e aceitaram uma oferta de uma companhia desconhecida que era muitas vezes menor que as ofertas de outras companhias renomadas. Cometeram o terrível erro de tentar colocar o sistema on-line abruptamente, sem o cuidado de executar o sistema velho e o novo ao mesmo tempo por um pequeno período tempo. Em um curto prazo, estes problemas se tornarão piores devido à crescente disseminação da utilização de softwares na infra-estrutura civil. O relatório do órgão Norte-Americano denominado PITAC (ver referência logo abaixo) reconhece este fato, e tem, com sucesso, argumentado em favor do aumento dos fundos para a pesquisa em software: “A demanda por software tem crescido muito mais rápido do que nossa capacidade de produzir software. Além disso, a Nação (Norte-Americana) necessita de software que seja mais utilizável, confiável e poderoso do que o que se produz atualmente. Nós nos tornamos perigosamente dependentes de uma grande quantidade de sistemas cujo comportamento não é bem compreendido e que muitas vezes falha em situações não previstas”. Information Technology Research: Investing in Our Future, President’s Information Technology Advisory Committee (PITAC) Report to the President, February 24, 1999 Disponível em http://www.ccic.gov/ac/report/ Fórum RISKS · relatórios comparativos da imprensa a respeito de incidentes relacionados à computação · Acesse: http://catless.ncl.ac.uk. 1.3.3 Qualidade de software Uma medida: bugs/kloc - bugs por cada mil linhas de código (loc = lines of code) · medidos após a entrega do sistema · média industrial em torno de 10 · alta qualidade: 1 ou menos. Praxis CDIS system (1993) · sistema britânico de controle de tráfego aéreo para a área do terminal de pouso e decolagem · utilizou-se de uma precisa linguagem de especificações, muito semelhante aos modelos de objetos que iremos aprender · sem acréscimos no custo da rede de desenvolvimento · taxa de bugs bem menor: por volta de 0.75 defeitos/kloc · ainda sim, oferecia garantias para o cliente! É claro que qualidade não se refere apenas a bugs. Você pode testar um software e eliminar a maioria dos bugs que causam a queda do sistema, mas acaba criando um programa que é impossível de se utilizar e que falha na maioria das vezes que deve realizar o que você espera. Isto acontece devido ao fato de que tal sistema possui um excessivo número de casos especiais. Para descrever este problema, você deve construir o conceito de qualidade a partir do princípio. 1.4 Por que o projeto é importante “Você sabe o que é necessário antes que consigamos um bom software? Os carros deste país (EUA) tiveram uma melhora quando o Japão nos mostrou que carros podiam construídos de uma maneira melhor. Alguém terá que mostrar à indústria que os softwares podem ser construídos de uma maneira melhor”. John Murray, FDA’s guru de qualidade em software, Citado em Software Conspiracy, Mark Minasi, McGraw Hill, 2000 Esse alguém é você! Nosso objetivo no curso 6170 é mostrar que ‘hackear código’* não é tudo que existe para a construção de software. De fato, é apenas uma pequena parte. Não pense em código como parte da solução; muitas vezes é parte do problema. Nós precisamos de maneiras alternativas e melhores para falar a respeito de software, que não seja através de código. Maneiras que sejam menos onerosas, mais diretas, e menos ligadas a tecnologias que rapidamente se tornarão obsoletas. Papel do projeto e dos projetistas · pensar antes sempre ajuda (e é barato!) · não dá para acrescentar qualidade no final: há um contraste com a confiabilidade dos testes; mais efetivo, mais barato · torna o ato de delegar tarefas e o trabalho em equipe possível · falhas de projeto afetam o usuário: softwares incoerentes, inflexíveis e difíceis de usar · falhas de projeto afetam o desenvolvedor: interfaces pobres, bugs que se multiplicam, difícil acrescentar novas funcionalidades. É uma coisa engraçada o fato de que estudantes de ciência da computação são muitas vezes relutantes à idéia de desenvolvimento de software como uma empresa de engenharia. Talvez eles pensem que técnicas de engenharia eliminarão a mística do processo de programação, ou talvez que tais técnicas não se ajustarão às suas ‘habilidades de hacker’. Pelo contrário, as técnicas que você aprende no 6170 irão lhe permitir alavancar o talento que você possui de forma bem mais efetiva. Mesmo programadores profissionais se iludem. Em um experimento realizado, 32 programadores * o termo hackear código, no contexto do curso, diz respeito à utilização de artimanhas não convencionais e engenhosas (ou não) para que o sistema realize operações não previstas pelo projeto da NASA aplicaram 3 diferentes técnicas de testes para alguns pequenos programas. Eles foram questionados para que avaliassem a proporção de bugs que acreditavam que cada método seria capaz de encontrar. Na experiência, a intuição dos programadores mostrou-se errada. Eles pensaram que a técnica de teste da caixa-preta, baseada em especificações, era a mais eficiente. No entanto, a leitura de código foi mais eficiente (mesmo o código estando não comentado). Ao ler o código, eles encontraram erros 50% mais rápido! Victor R. Basili and Richard W. Selby. Comparing the Effectiveness of Software Testing Strategies. IEEE Transactions on Software Engineering. Vol. SE-13, No. 12, December 1987, pp. 1278–1296. Para softwares de infra-estrutura (como controle de tráfego de aeronaves), o projeto é muito importante. Mesmo assim, muitos gerentes industriais não percebem a magnitude do impacto das idéias que nós ensinamos no curso 6170. Veja o artigo que John Chapin (um ex-professor do curso 6170) e eu escrevemos explicando como nós reprojetamos um componente do CTAS, um novo sistema de controle de tráfego de aeronaves, utilizando idéias do 6170: Daniel Jackson and John Chapin. Redesigning Air-Traffic Control: An Exercise in SoftwareDesign. IEEE Software, May/June 2000. Disponível em: http://sdg.lcs.mit.edu/~dnj/publications 1.4.1 A estória da Netscape Para o software de PC, há um mito de que proejto não é importante porque o tempo para que o produto chegue ao mercado (time-to-market) é tudo o que importa. A morte da Netscape é uma estória que merece ser revista a este respeito. A equipe original do NCSA Mosaic, da universidade de Illinois, construiu o primeiro browser amplamente utilizado, no entanto eles fizeram um trabalho rápido e sujo. Eles fundaram a Netscape, e entre Abril e Dezembro de 1994 construíram o Navigator 1.0, compatível com três plataformas e que em pouco tempo se tornou o browser dominante para Windows, Unix e Mac. A Microsoft iniciou a construção do Internet Explorer 1.0 em Outubro de 1994, e o lançou com o Windows 95 em Agosto de 1995. No período do rápido crescimento da Netscape, de 1995 a 1997, os desenvolvedores trabalharam duro para lançar novos produtos com novas funcionalidades, possuindo, portanto, pouco tempo para se dedicarem ao projeto. A maioria das companhias no esmagador mercado de software (ainda) acredita que o projeto pode ser prorrogado: acreditam que uma vez que você possua uma fatia do mercado e um conjunto atraente de funcionalidades, você pode ‘refabricar’ o código e obter os benefícios do projeto puro e limpo. A Netscape não foi uma exceção, e seus engenheiros eram, provavelmente, mais talentosos do que muitos outros. Enquanto isso, a Microsoft percebeu a necessidade de se construir sobre sólidos projetos. Ela construiu a tecnologia NT a partir do zero e reestruturou o pacote do Office para que utilizasse componentes compartilhados. A Microsoft se apressou para o mercado com o IE para competir com a Netscape e depois despendeu tempo para reestruturar o IE 3.0. Esta reestruturaçãodo IE agora é vista pela Microsoft como a decisão chave que os ajudou a cobrir a lacuna que os separava da Netscape. A Netscape apenas cresceu e cresceu. No Netscape 4.0 havia 120 desenvolvedores (dos 10 iniciais) e 3 milhões de linhas de código (sobre um fator de 30). Michael Toy, então gerente de lançamentos, disse: ‘Nós estamos em uma situação realmente ruim… Nós deveríamos ter parado de lançar produtos baseados neste código há um ano atrás. Está morto... É como um grosseiro despertar... Nós estamos pagando o preço de termos corrido’. Interessante, o argumento a respeito do projeto modular da Netscape, em 1997, veio de um desejo de se desenvolver em pequenas equipes. Sem interfaces limpas e simples, é impossível dividir o trabalho em partes independentes uma da outra. A Netscape reservou dois meses para re-arquitetar o browser, mas não foi suficiente. Então decidiram reiniciar tudo de novo com o Communicator 6.0. Mas o 6.0 nunca foi terminado e seus desenvolvedores foram redirecionados para o 4.0. A versão 5.0, Mozila, foi disponibilizada como código livre, o que não ajudou muito: ninguém queria trabalhar com código espaguete. Ao final, a Microsoft venceu a guerra dos browsers, e a AOL comprou a Netscape. Claro que esta não é a estória toda de como o browser da Microsoft conseguiu dominar o browser na Netscape. As práticas de negócios da Microsoft não ajudaram a Netscape. Além do mais, independência de plataforma foi um ponto importante desde o princípio; o Navigator podia ser executado em Windows, Mac e Unix desde a versão 1.0, e a Netscape trabalhou duro para manter o máximo possível da independência de plataforma em seu código. Eles até planejaram migrar para uma versão em Java puro (‘Javagator’), e construíram várias ferramentas Java próprias (as ferramentas da Sun não estavam prontas). Mas em 1998 eles desistiram. Ainda sim, o Communicator 4.0 possui 1,2 milhões de linhas em Java. Eu extrai esta sessão de um excelente livro sobre a Netscape, seus negócios e estratégias de negócios. Você pode ler a estória completa lá: Michael A. Cusumano and David B. Yoffie. Competing on Internet Time: Lessons from Netscape and its Battle with Microsoft, Free Press, 1998. See especially Chapter 4, Design Strategy. Perceba, a propósito, que foram necessários 2 anos para que a Netscape descobrisse a importância do projeto. Não se surpreenda se você não está totalmente convencido depois de apenas um período de curso; algumas coisas vêm apenas com experiência. 1.5 Advertência Estratégia de curso · não fique para trás: o ritmo é rápido! · aproveite as aulas: o material não está todo no livro texto · pense antes: não corra para o código · de-sign, e não de-bug. Eu não posso enfatizar toda a importância de se começar cedo e de se pensar com antecedência. É claro que eu não espero que você resolva suas listas de exercício no mesmo dia em que elas são entregues. Mas, em longo prazo, você irá economizar muito tempo e terá resultados muito melhores se dedicar algum tempo ao seu trabalho logo no início. Primeiro, você terá o benefício do tempo que se passa: você estará refletindo sobre os problemas subconscientemente. Segundo, você saberá quais recursos adicionais você precisa, e será capaz de conseguir tais recursos enquanto ainda é possível conseguí-los com menos esforço e em tempo hábil. Especificamente, aproveite-se da equipe do curso – nós estamos aqui para ajudar! Nós agendamos horários com os ALs e com os PA’s com o tempo disponível que tínhamos em mente, mas vocês podem esperar mais ajuda desde que não se trate da noite anterior à entrega da lista de exercícios, quando todos necessitam de ajuda... Simplifique: ‘Eu dei avisos desesperados contra a incerteza, a complexidade, e a excessiva ambição do novo projeto, mas meus avisos não foram ouvidos. Eu concluo que há duas formas de construir um projeto de software: um jeito é fazê-lo tão simples de forma que, obviamente, não haja deficiências e o outro jeito é fazê-lo tão complicado de forma que não haja deficiências óbvias’. Tony Hoare, Turing Award Lecture, 1980 falando sobre o projeto da linguagem Ada, mas muito relevante para o projeto de programas. Como fazer: ‘Mantenha a simplicidade, estúpido’ (‘Keep it simple, stupid’ – KISS) · evite esquiar onde o gelo é fino: evite artimanhas muito engenhosas, algoritmos e estruturas de dados complexas · não utilize as mais obscuras funções das linguagens de programação · questione a complexidade · não seja muito ambicioso: evite carregar o sistema com feições e características estéticas que não agregam funcionalidade, mas que comprometem a elegância de um bom projeto. · lembre-se que é fácil fazer alguma coisa complicada, mas é difícil fazer alguma coisa verdadeiramente simples. Regra de otimização · Não faça · Apenas para experts: não faça, ainda. (Michael Jackson, Principles of Program Design, Academic Press, 1975). 1.6 Avisos extras Lembretes: · Complete o formulário de registro on-line · Comece a aprender Java agora mesmo! · O exercício 1 deve ser entregue na próxima aula Confira este endereço: · http://www.170systems.com/about/our_name.html