Solução ?
Nos últimos posts eu apresentei argumentos para sustentar a idéia que a engenharia de software atual é insuficiente (e na verdade mal merece o nome). Mas qual seria a solução então ?
A idéia é simples de conceber, embora não de realizar: colocar a atividade de criação de software em sólidas bases científicas, assim como as outras engenharias. Fazer com que um projetista de software não apenas desenhe diagramas bonitos com a última moda em confecção de diagramas, mas que também possa provar propriedades sobre o projeto dele, de forma a garantir que as especificações iniciais são satisfeitas. Especificações, aliás, que devem ser expressas formalmente também. Nesse ponto das especificações aparece uma crítica comum: provar que o programa obedece às especificações é inútil se estas não capturam os requerimentos reais do sistema. E como provar que as especificações capturam os requerimentos ? Esse é um problema complicado que poderia, em primeira análise, ser uma repetição do primeiro (coerência do software com especificações), mas a especificação é bem mais simples e de alto nível, o que ajuda a fazer a verificação.
Encontrar essas bases científicas não é coisa que se faz do dia para a noite: os métodos formais atuais ainda são inadequados para as escalas de sistemas construídos. Mas, ao invés de abandonar a idéia de vez, me parece mais lógico trabalhar para melhorar os métodos até que eles se tornem suficientes. E o interessante é que isso já está acontecendo, como eu exemplifiquei neste post. Minha crença é que essa tendência deve continuar, mas ela aconteceria mais rápido se a indústria, como um todo, se preocupasse mais com a qualidade. E essa falta de preocupação vem principalmente da tolerância dos clientes. A verificação que se faz hoje em dia é através de testes, mas todo mundo sabe que testes não podem provar a ausência de erros, apenas sua presença; você confiaria sua vida num sistema que foi apenas testado ?
Em uma de suas frases famosas, Alan Perlis disse "I think that it's extraordinarily important that we in computer science keep fun in computing", com o que eu concordo plenamente. A formalização não vai tornar a criação de software mais chata; programação como artesanato e atividade técnica vai continuar existindo -- eu mesmo junto umas linhas de código para fazer algo que eu quero (ou por diversão) de vez em quando, sem grande preocupação com corretude, e não pretendo deixar de fazer isso. Mas sempre que for necessário um nível de confiabilidade maior, teremos ferramentas para garantir que os programas se comportarão como esperamos.
E isso, por incrível que pareça para quem está muito acostumado com software, é apenas o mínimo que as pessoas costumam exigir de qualquer artefato... que ele funcione.
A idéia é simples de conceber, embora não de realizar: colocar a atividade de criação de software em sólidas bases científicas, assim como as outras engenharias. Fazer com que um projetista de software não apenas desenhe diagramas bonitos com a última moda em confecção de diagramas, mas que também possa provar propriedades sobre o projeto dele, de forma a garantir que as especificações iniciais são satisfeitas. Especificações, aliás, que devem ser expressas formalmente também. Nesse ponto das especificações aparece uma crítica comum: provar que o programa obedece às especificações é inútil se estas não capturam os requerimentos reais do sistema. E como provar que as especificações capturam os requerimentos ? Esse é um problema complicado que poderia, em primeira análise, ser uma repetição do primeiro (coerência do software com especificações), mas a especificação é bem mais simples e de alto nível, o que ajuda a fazer a verificação.
Encontrar essas bases científicas não é coisa que se faz do dia para a noite: os métodos formais atuais ainda são inadequados para as escalas de sistemas construídos. Mas, ao invés de abandonar a idéia de vez, me parece mais lógico trabalhar para melhorar os métodos até que eles se tornem suficientes. E o interessante é que isso já está acontecendo, como eu exemplifiquei neste post. Minha crença é que essa tendência deve continuar, mas ela aconteceria mais rápido se a indústria, como um todo, se preocupasse mais com a qualidade. E essa falta de preocupação vem principalmente da tolerância dos clientes. A verificação que se faz hoje em dia é através de testes, mas todo mundo sabe que testes não podem provar a ausência de erros, apenas sua presença; você confiaria sua vida num sistema que foi apenas testado ?
Em uma de suas frases famosas, Alan Perlis disse "I think that it's extraordinarily important that we in computer science keep fun in computing", com o que eu concordo plenamente. A formalização não vai tornar a criação de software mais chata; programação como artesanato e atividade técnica vai continuar existindo -- eu mesmo junto umas linhas de código para fazer algo que eu quero (ou por diversão) de vez em quando, sem grande preocupação com corretude, e não pretendo deixar de fazer isso. Mas sempre que for necessário um nível de confiabilidade maior, teremos ferramentas para garantir que os programas se comportarão como esperamos.
E isso, por incrível que pareça para quem está muito acostumado com software, é apenas o mínimo que as pessoas costumam exigir de qualquer artefato... que ele funcione.