Escolar Documentos
Profissional Documentos
Cultura Documentos
2021
Minha história - 1
1. Introdução
2. Preâmbulo
Desde pequeno sempre quis ser engenheiro mecânico. Em 1961, com 18 anos, iniciei
meus estudos de Engenharia Mecânica na PUC-Rio. Neste ano e no início de 1962 eu
não tinha oportunidade para realizar estágios devido ao serviço militar obrigatório
que estava prestando. Em 1962 negociei um estágio, a ocorrer no início de 1963, em
uma fábrica de ferramentas industriais situada em Nova Friburgo. Tinha, também, a
intenção de procurar estágios em engenharia mecânica no Rio de Janeiro a partir de
março de 1963. Consequentemente, no segundo semestre de 1962 passei a ter muito
tempo livre.
Naquela época o curso de Engenharia da PUC (EPUC – Escola Politécnica da
Universidade Católica) funcionava como um colégio. As disciplinas de cada semestre
eram preestabelecidas e o horário das aulas era das 7 às 12. No início do segundo
semestre, o Pe. Amaral (uma espécie de Decano de Ciência e Tecnologia, obs. não
existia o CTC – Centro Técnico Científico) me encontrou sem fazer nada no corredor e
me convidou a participar em um curso de programação que iria ser oferecido às tardes.
O curso visava o computador B-205 instalado no CPD – Centro de Processamento de
Dados - da PUC-Rio. Este foi o primeiro computador instalado em uma universidade
na América Latina e visando a ser usado exclusivamente por engenheiros e
pesquisadores. Fui fazer esse curso, menos por querer ser programador, e mais por
interesse no que fazia aquela máquina enorme cheia de lampadinhas, que produzia
umas fitas perfuradas de papel cinza, e que se via na vitrine do ITUC – Instituto de
Tecnologia da Universidade Católica. Naquela época o ITUC era um enorme espaço
vazio que foi lentamente sendo “loteado” para diversos laboratórios de ensino e
1
Arndt von Staa Minha história
pesquisa em engenharia*. Um dos primeiros desses “lotes” foi o CPD. Mais tarde esse
“lote” virou a Capela da PUC e, atualmente, 2016, é ocupado pela Empresa Júnior.
A eletrônica do B205 era valvulada, aquelas lampadinhas que emitiam uma
luz vermelha (procure na Wikipedia uma explicação do que são válvulas eletrônicas).
Outro conjunto de pequenas lâmpadas representava o conteúdo dos registradores
utilizados pelo computador (adicionador e sua extensão, dado corrente indo ou vindo
da memória, endereço da instrução corrente e indexador). A memória era um tambor
magnético (imagine um cilindro com 20 trilhas magnéticas, cada uma contendo 200
números) capaz de armazenar 4000 números de 10 dígitos decimais. Havia mais 4
trilhas, cada uma com 10 cópias repetidas de blocos contendo 20 números cada uma.
Essas trilhas ofereciam um acesso 10 vezes mais rápido aos dados e instruções, porém
limitavam código e dados em cada trilha a 20 elementos. O processamento de uma
adição levava em torno de 2,5 milésimos de segundo (hoje requerem em torno de nano
segundos). O computador era BCD (binary coded decimal), ou seja, para o usuário
parecia ser uma máquina decimal, enquanto que a eletrônica era binária. Cada dígito
decimal requer 4 bits, portanto os hexadecimais A, B, C, D, E e F eram combinações
proibidas e faziam a máquina parar caso fossem observados ao realizar algum
processamento. Mais detalhes sobre a história da aquisição podem ser encontrados em
Neves, Byington e Staa; “El B-205 em la PUC-Rio”, Núcleo de Memória da PUC-Rio.
De 1954 (primeiro computador comercial no mundo) até hoje ocorreu uma
evolução vertiginosa e absolutamente imprevisível de como criar circuitos eletrônicos
de alta confiabilidade, alta velocidade, e altamente compactados (integrados). Hoje em
dia toda a eletrônica dos potentíssimos computadores está contida em um ou mais
chips de circuito fortemente integrado medindo cerca de 1 cm por 1 cm e contendo
milhões de transistores. O B-205 pesava mais de uma tonelada. Um celular com muito
mais poder computacional (1.000.000 vezes mais?) e memória contendo vários Gbytes
pesa quanto? Além disso, celulares cabem num bolso e não requerem refrigeração. Já
o B-205 ocupava uma sala de bom tamanho e precisava-se mantê-la refrigerada a 20
graus Celsius. Contribuíram para esse desenvolvimento vertiginoso a pesquisa em
física, química, projeto e produção de circuitos integrados e, também em software,
entre outros em bancos de dados, redes, infraestrutura, linguagens de programação, e
processos de desenvolvimento de sistemas.
3. Programando o B-205
* Cabe mencionar que uma parcela significativa dos laboratórios que cursávamos eram os do IME _ Instituto
Militar de Engenharia.
2
Arndt von Staa Minha história
não havia sistema operacional. Cabia ao programador dizer onde, endereço físico, as
instruções e os dados iriam residir na memória. Por exemplo, a sequência de operações
a partir do endereço 1000:
1000 641000 buscar conteúdo do endereço 1000
1001 741001 somar conteúdo do endereço 1001
1002 121000 armazenar resultado da soma no endereço 1000 resultaria em
endereço 1000 contendo 1382001, obviamente destruindo o programa devido à
alteração do conteúdo no endereço 1000.
Como instruções, dados e endereços são números (como ainda são em todos
os computadores digitais modernos ou não), pode-se usá-los como valores aritméticos.
Em Fortran, C, etc. o código acima seria escrito A = A + B e o programador deixou de
saber onde ficavam os dados (A e B) e A jamais estaria no espaço do código, impedindo
assim utilizar instruções como se fossem números (mentira, sabendo como Fortran ou
outras linguagens geram código, pode-se perfeitamente alterar o código em execução).
Muitos não sabem que computadores armazenam somente números em um vetor de
números e acham que endereços são algo do tipo A, idAluno etc., quando na realidade
são formas simbólicas de batizar locais físicos onde ficam as instruções e os dados
desejados. Da mesma forma não sabem que a operação “+” é um número seguido de
números indicando onde estão os dados a serem usados e para onde vai o resultado
da soma. Letras e outros símbolos também são números que o equipamento de
visualização converte para a representação visual. Muitos também não sabem que
memória nada mais é que um enorme vetor (array) de bytes, possivelmente
particionado em blocos de memória virtual que delimitam o que pode ser acessado
por determinado programa residente em memória (i.e. processo - o termo usado
atualmente).
Em resumo, antes de programar tinha-se que fazer uma espécie de mapa de
memória. Era necessário saber o endereço real de cada instrução e de cada dado.
Acessos e ramificações referenciavam endereços reais. Devido à escassez de memória,
muitos endereços eram reutilizados, o que costumava dar uma enorme dor de cabeça
ao manter e ao diagnosticar a causa dos erros de processamento. Caso fosse necessário
inserir ou retirar uma instrução ou dado, era necessário redefinir quase todos os
endereços usados, além de precisar-se verificar se havia células reutilizadas.
Para programar uma coisa dessas, era necessário fazer primeiro uma espécie
de programação simbólica em papel a ser traduzida à mão para a linguagem de
máquina totalmente numérica. Cabe salientar que hoje em dia memória continua
sendo um baita vetor de bytes, sendo que a alocação das instruções e dos dados é
realizada pela linguagem de programação simbólica utilizada (ex. assembler, C,
python etc.) e pelo sistema operacional. Evidentemente, para reduzir o retrabalho
inútil, o texto pseudo simbólico, escrito em um formulário de papel, precisava estar
correto antes da tradução à mão para código executável acessando corretamente os
dados. Isso, por sua vez, implicava a necessidade de uma revisão muito cuidadosa do
código pseudo simbólico antes de fazer a tradução. Essa revisão deveria assegurar que
o programa pseudo simbólico estivesse (quase) correto. A revisão era feita aos pares,
ou por trincas, usando uma forma primitiva de walkthrough acompanhado por um
arremedo de “prova da corretude”. Pois é, muitas das técnicas de programação
3
Arndt von Staa Minha história
* Resistências, quando queimam, produzem uma fumacinha azul com um cheiro acre intenso. É possível
proteger o circuito envolvendo uma válvula com uma resistência dessas. Logo, quando uma válvula
queimava podia-se “cheirar” onde se encontrava o defeito.
4
Arndt von Staa Minha história
5
Arndt von Staa Minha história
4. Programando o B-200
Em 1964 foi instalado um B-200 no CPD. Visava aplicações administrativas. Era uma
máquina transistorizada provida de 4096 bytes de memória (mais tarde ampliado para
8192 bytes) em núcleo de ferrite (a Wikipedia explica o que é memória de núcleos de
ferrite). Núcleo de ferrite era (ainda é) uma coisa muito cara além de ocupar muito
espaço e requerer bastante energia. As primeiras memórias custavam cerca de 0,50
dólares o byte, no final da era de memória de núcleo de ferrite o custo havia caído para
cerca de 0,25 dólares. Considerando uma inflação americana de 800% de 1950 até 2020
tem-se uma ideia de como atualizar o custo. Um mega byte 1.000.000 * 0,25 dá, em
preços aproximados de hoje, cerca de 250.000 dólares! A título de estimar a evolução,
quantos mega bytes tem o teu celular? Quanto custam os celulares?
O B-200 era bem menor e um pouco mais rápido do que o B-205 e processava
cartões ao invés de fita perfurada. Já vinha com um assembler, ou seja, era bem mais
simples de programar. O grande problema era que cada instrução usava 12 bytes (A +
B → C era programado em uma única instrução). A consequência disso é que era
necessário controlar com muito cuidado e rigor o espaço de memória ocupado pelos
programas e dados, o que levava ao reuso de endereços para variadas finalidades. Na
realidade eu não gostava desse computador.
Eu, ainda estudante, já era o chefe do setor de programação e tinha uma
pequena equipe de programadores (estudantes de engenharia ou de economia). Nós
desenvolvemos uma folha de pagamentos para uma grande empresa japonesa. Neste
trabalho aprendi que é muito difícil fazer clientes contarem a história completa do que
querem que seja feito, bem como contarem as restrições que deveriam ser respeitadas.
Quando, depois de semanas de suor, entregávamos uma versão do programa, o cliente
testava e vinha com o comentário, o cálculo do INSS (ou o que era na época) não está
correto. Qual o problema, a fórmula usada está correta segundo a lei. É que falta
considerar os casos de empregados que pagam alimentos (sustentam os filhos tidos com as
mulheres de quem se separou). Muda-se o cadastro, muda-se o cálculo de descontos,
arruma-se tudo para caber na memória e apresenta-se o programa modificado ao
cliente. Feito novo teste, vem a resposta: Não está correto, um empregado pode pagar mais
de um alimento (havia um com mais de 3). Repete-se tudo e recebe-se o veredicto: Não
está correto. Brasileiro usa uma fórmula, japonês contratado no Brasil outra, finalmente japonês
contratado no Japão usa uma terceira. A nossa paciência e a memória do computador
esgotaram. Protestamos, mudamos a especificação para: “é obrigação do cliente
informar, a cada mês, o percentual de desconto INSS de cada empregado”. Ou seja,
desde que se desenvolve sistemas de software, por mais primitivos que fossem, é
6
Arndt von Staa Minha história
5. Intermezzo
Como havia dito, eu queria ser e atuar como engenheiro mecânico. Além disso, para
mim programação de aplicações administrativas não tinha graça alguma.
Provavelmente eu teria dificuldade em encontrar algum emprego aceitável visando
programação para engenharia. Engenheiros típicos usavam réguas de cálculo
(Wikipedia) e nem sabiam o que um computador poderia fazer. Então, voltei a querer
aprofundar-me em engenharia. Consegui uma bolsa do DAAD (Alemanha, Deutscher
Akademischer Austausch Dienst) e outra do Itamaraty para fazer um curso de
extensão em Stuttgart, na área de automação do processo fabril e de manejo do
estoque. Embarquei no navio (avião era proibitivamente caro em 1966) e fui para lá em
março de 1966. Matriculei-me em um curso de automação da operação de estoque,
outro de máquinas ferramenta dirigidas por controle numérico, outro de
transformação plástica de materiais e, finalmente, um divertido curso de ferramentas
e processos de produção usando estamparia não convencional. Estamparia usando
grossas chapas de aço inoxidável (talheres, vasilhames e apetrechos hospitalares) é
muito mais complicado do que estampar a lataria de um carro.
Naquela época, na Alemanha era proibido estudante estrangeiro fazer provas
na universidade. De maneira geral, provas e as aulas não tinham relação alguma.
Durante alguns anos o estudante assistia aulas e estudava a correspondente matéria
por conta própria e usando livros. Ao fim de alguns anos o estudante marcava os
vários exames que precisava fazer para conseguir um diploma. Depois de muito brigar
com a burocracia da universidade, recebi uma autorização especial permitindo que
fizesse exames, desde que não aplicasse para obter qualquer tipo de diploma. Fiz os
exames e fui bem-sucedido. Descobri, também, que era o único estudante naquela
universidade que já havia trabalhado intensivamente com computadores em
aplicações de engenharia. Na época, a universidade de lá usava computadores
somente para processamento administrativo, evidentemente, nesses CPDs alunos não
entram.
7
Arndt von Staa Minha história
8
Arndt von Staa Minha história
6. Programando o IBM-1130
Quando voltei da Alemanha já havia sido instalado um IBM 1130 na PUC-Rio. Vários
desses computadores foram instalados em diversas universidades sob os auspícios do
BNDE (o S foi inventado mais tarde).
O IBM 1130 era uma máquina muito simpática. Possuía teclado, uma
impressora tipo máquina de escrever elétrica, disco (de muito baixa capacidade), um
sistema operacional primitivo, Fortran e Assembler. Além disso, possuía uma leitora
a perfuradora de cartões, impressora de linha razoavelmente rápida e uma plotadora.
Essa máquina foi instalada em 1966. O circuito era de baixa integração, ou seja, não se
viam mais transistores, pois estavam encapsulados em chips contendo alguns poucos
transistores. Uma placa de circuito continha vários chips. Nunca mais foi possível
adicionar instruções…
O IBM 1130 podia ser entendido como uma estação de trabalho em que, ao
invés de um display, havia uma máquina de escrever. Apesar de primitivo, isso
permitia desenvolver programas interativos.
Desenvolvi o programa que aprende a jogar o jogo da velha. Obviamente em
assembler, Fortran é para quem não tem coragem de programar coisas complexas... Só
Assembler permite o controle total da máquina. O programa funcionou a contento. Foi
distribuído para diversas universidades e parece que agradou. Muitos achavam
divertido que o programa xingava de “Burro!” os que cometiam erros grosseiros.
9
Arndt von Staa Minha história
10
Arndt von Staa Minha história
11
Arndt von Staa Minha história
12
Arndt von Staa Minha história
13
Arndt von Staa Minha história
14
Arndt von Staa Minha história
Praticamente não usei esses computadores. Só usava o 370 para gerar textos
formatados com meu formatador.
Nos anos 1980 ocorreu uma grande mudança na computação. Aparecerem as estações
de trabalho e os computadores pessoais. Isso teve um enorme impacto na forma de
programar e de ensinar programação. Óbvio que software para computadores de
15
Arndt von Staa Minha história
grande porte continuava sendo desenvolvido, mas as condições para fazer isso
tornaram-se bastante diferentes.
Em 1982 surgiram os PC IBM. Antes haviam surgido os Apple I e II e o
MacIntosh, mas esses eram muito caros, difíceis de usar em ensino de programação, e
difíceis comprar no Brasil por causa da reserva de mercado. No caso dos PCs existiam
muitas “fábricas”, o contrabando era significativo e a pirataria de software também.
Cabe lembrar que estávamos na era da Lei de Informática, que proibia a importação
de computadores médios e pequenos, além de dificultar a aquisição de software.
O CNPq doou estações SUN para algumas universidades, entre elas a PUC.
Agora tínhamos correio eletrônico, embora lento e um tanto complicado de usar. Toda
a minha correspondência internacional começou a ser feita com elas. A rede que
interligava essas estações nas universidades brasileiras (ainda não internet) era
coordenada pela USP.
Conexões entre computadores internacionais eram feitas através do LNCC
usando uma rede IBM. Essa conexão permitia transferir arquivos de um PC para
algum outro lugar espalhado pelo mundo desde que ligado à rede IBM, mais tarde
Bitnet, uma rede que interligava instituições de ensino e/ou pesquisa. O protocolo da
Internet ainda não existia. Ligações ponto a ponto usando linhas telefônicas privadas
eram comuns. Na PUC havia um (note: um) PC ligado através de uma linha privada a
um computador do LNCC. Passando um endereço Bitnet, informava-se para onde a
mensagem deveria ser passada. Dessa forma, conseguia-se enviar mensagens para
computadores em várias universidades no mundo, desde que estivessem ligados à
essa rede. Com isso passou a ser possível transmitir, de forma precária, arquivos da
PUC para a UCLA. No início dos anos 80 fui membro da Comissão de Programa do
ICSE. Um dia apareceu pelo correio (funcionava muito bem naquela época) um
envelopão contendo vários artigos a serem examinados. Depois de examinar,
precisava-se escrever um parecer para cada um deles. Gravei os pareceres escritos em
WordStar (editor de texto para PCs) em um arquivo contido num disquete, levei para
o PC ligado ao LNCC, dei o endereço do destinatário e despachei. Depois de alguns
minutos a transmissão foi concluída, aparentemente sem erro.
Existiam diversos processadores de linguagens para os PCs: entre eles Fortran,
C (novidade!), Pascal e Modula (outra novidade). Existiam diversos aplicativos, ex.
WordStar, VisiCalc, compositores de texto tipo Ventura da XEROX. Este era o melhor
compositor de textos existente na época e já trabalhava com janelas, mouse e outras
“modernidades”, (pena que a XEROX vendeu o Ventura para a Corel que o
pessimizou). Em resumo, PCs eram ótimos para ensino e o uso cotidiano simples.
10.1. Mosaico
16
Arndt von Staa Minha história
Para reduzir esse problema desenvolvi, em Pascal, um editor semi gráfico que
permitia editar estruturas de programas (projeto estruturado). Observei que se fossem
adicionados fragmentos de código aos blocos da estrutura, podia-se gerar o programa
final através da linearização dessas estruturas. Manutenção da coerência passou a ser
subproduto da alteração. O efeito era como se o programa final fosse construído a
partir de uma coleção de pequenos fragmentos de código coerentes com o projeto. Essa
ferramenta, Mosaico, servia para projetar a estrutura do código das funções, sendo que
um programa passou a ser uma coletânea de funções interdependentes. Cada função
tinha um objetivo simples e bem definido. Também permitia o empacotamento de
estruturas de código em módulos (semelhantes à programação orientada a objetos) o
que facilitava a modularização. A linearização transformava isso em um programa,
possivelmente extenso, corretamente endentado, com comentários úteis escritos pelo
programador e que estavam no lugar certo. Podia-se também adicionar assertivas –
código composto por expressões lógicas que permitem verificar se os dados e
estruturas de dados satisfaziam a sua especificação lógica. Isso permitia verificar ao
executar se o processamento estava correto. Ao linearizar era possível gerar código
com ou sem essas assertivas. Ótimo instrumento para teste, pois o programa com
assertivas executáveis, embora mais lento, acusa um erro pouco depois de cometê-lo,
facilitando significativamente o debugging.
Essa ferramenta, Mosaico, foi apresentada a uma empresa que resolveu
comercializá-la. Infelizmente, o modelo de negócio escolhido não era bom. Esse tipo
de ferramenta requer que se pense antes de escrever. Porém poucos programadores
sabiam (sabem?), ou queriam (querem?), fazer isso. A maioria gostava (ainda gosta?)
de sair escrevendo código sem pensar na sua organização (arquitetura e interfaces) e
no que cada fragmento deveria fazer. Ou seja, o foco não deveria ser a ferramenta, e
sim, ensinar a pensar para poder usá-la de forma proveitosa. A excessivamente baixa
rentabilidade da venda desse software levou a empresa a fechar o setor que
desenvolvia o Mosaico.
10.2. Talisman
17
Arndt von Staa Minha história
18
Arndt von Staa Minha história
precisava identificar e reduzir os erros existentes de modo que passasse a ser possível
fazer manutenção “top down”. Porém sempre foi grande o trabalho de correção
estrutural ao produzir o código reengenheirado. Isso mostra que corrigir erros
estruturais depois de desenvolver e testar tende a ser muito caro e demorado.
Muitas das linguagens usadas em Engenharia de Software são gráficas. É
necessário, então, implementar um editor gráfico genérico e poder especializá-lo
usando a linguagem de especificação do Talisman. Definem-se os elementos gráficos,
caixa, bola, etc. Define-se o conjunto de todos os tipos de objeto permitidos,
considerando a totalidade de linguagens de representação manipuláveis. Para cada
linguagem, definem-se os tipos de objeto permitidos para cada um dos tipos de
elementos gráficos. Um mesmo objeto pode ser compartilhado em diferentes
linguagens e podem-se estabelecer relacionamentos, gráficos e/ou lógicos, com
objetos de outras linguagens.
Talisman é todo dirigido pelo tipo dos dados, consequentemente ao navegar
por uma ligação de uma linguagem para outra, é automaticamente trocada a
linguagem de representação em uso (os editores estão vinculados à linguagem em
uso). Por exemplo, um registro contido em um depósito de dados referenciado em um
fluxo de dados pode corresponder a uma instância de uma entidade em um diagrama
entidade e relacionamentos, ou, dependendo do nível de abstração corresponder a
uma tabela em um banco de dados. Também os elementos são tratados com respeito
ao seu tipo. Quando se quer escrever uma string, usa-se um formatador, quando se
deseja escrever um texto, usa-se outro, embora exista uma única implementação para
as duas formas. As relações sabem o tipo do objeto destino, permitindo disparar os
geradores de código apropriados.
Diagramas servem para pouco, a menos que exista uma sucessão deles que
culmine em código. Como são usados para especificar, e/ou projetar, é desejável poder
associar comentários, e código quando desejável e possível. Portanto, necessita-se de
um meta-editor que possa ser especializado para a cada linguagem de representação e
suas necessidades específicas. O conteúdo de um objeto pode consistir por diversos
fragmentos de texto, referências gráficas, e constantes textuais. Por exemplo, em um
while, tem se a expressão condicional, o código do corpo e o código final. Porém, o
corpo pode ser complexo, então este precisa ser linearizado antes de colocar o fecho
do corpo do while. Baseado nesse exemplo e outros, conclui-se que os editores devem
ser genéricos e poder ser especializados através de uma linguagem que configure
como editar, linearizar, verificar, etc. Finalmente, podem existir relacionamentos entre
objetos de diferentes linguagens. A solução foi, através de diferentes relacionamentos,
qualquer objeto pode relacionar-se com uma variedade de outros objetos cada qual
pertencente a uma ou mais linguagens de design. Como os objetos têm um tipo, cada
relação estabelece o tipo de origem e o tipo de destino permitido e a respectiva contra-
relação. Isso faz com que, por construção, as estruturas de referências estão válidas do
ponto de vista dos tipos utilizados.
Talisman permite, de forma atabalhoada, começar com uma arquitetura,
refiná-la para um conjunto de classes, essas para conjuntos de métodos etc. No fim
lineariza-se tudo e obtém-se um programa pronto para ser compilado. Infelizmente, a
integração com compiladores é fraca, portanto identificar onde, no projeto em
19
Arndt von Staa Minha história
20
Arndt von Staa Minha história
modo que cada atributo tivesse a sua chave identificando o seu tipo. Dessa forma passa
a ser possível determinar como processar um atributo de objeto fornecendo
simplesmente a sua chave. Caso fosse adicionada uma nova relação ao conjunto de
relações disponíveis, é necessário somente informar as identificações das relações e
contra relações.
A base de dados foi desenvolvida inicialmente na forma clássica, ou seja, com
especificação e projeto mínimos. Foram usados mais de 3 meses para isso. Vivia dando
erro de execução. Refiz a base de dados usando uma estrutura formalmente
especificada. Cada elemento da estrutura possui uma definição formal. Cada função
possuía assertivas de entrada, as funções são pequenas. Desenvolvi junto um gerador
de teste estrutural, capaz de gerar dados e operações aleatórias e verificar a integridade
estrutural. Em menos de um mês ficou pronta, zero falhas desde 1993 (uso Talisman
até hoje).
Eu poderia falar muito ainda sobre o projeto Talisman, mas fico por aqui. A
maior parte do meu livro Programação Modular foi experimentalmente verificada
tendo o projeto Talisman sido usado como cobaia.
Por volta de 1992 surgiu Windows 3. Para usá-lo era necessário ter um PC 386.
Carésimo. Comprei um e pude desfrutar de uma memória real bem maior e discos
com capacidade maior além de um controle de acesso a aplicativos dirigido pelos
hieróglifos modernos, conhecidos por ícones. Também foi possível interligar os
computadores que tinha em casa por uma rede local.
Em 1994 já era possível usar um e-mail mais genérico. Era possível baixar e
transmitir arquivos, mas tudo laborioso e lento. Também surgiu o WWW. Ainda
vagaroso, mas pelo menos facilitava várias coisas em especial baixar e transferir
artigos.
Em 1995 surgiu a Internet comercial no Brasil. Começou o desenvolvimento
de aplicativos que se aproveitavam da Internet. Não participei disso, pois estava com
a ideia fixa de desenvolver Talisman versão 5. Além disso era diretor do DI o que
tomava bastante tempo. Infelizmente, o projeto Talisman é grande demais para uma
pessoa só e os alunos têm hoje (justificavelmente?) outros interesses,
consequentemente o projeto acabou sendo suspenso.
Os computadores foram evoluindo cada vez mais. Surgiram redes de PCs e
similares em substituição a computadores de grande porte. No início de 2019 tornou-
se possível transformar a PUC em cerca de uma semana em uma universidade que
funcionava online, mesmo que de forma ainda incipiente. Do ponto de vista hardware
e software parece que está tudo bem. Do ponto de vista criação de disciplinas online e
satisfação dos alunos, ainda temos um bocado a aprender.
21
Arndt von Staa Minha história
Em março 1995 fui eleito Diretor do DI, cargo que ocupei, por dois mandatos, até
março de 1999. O período de 1995 a 1999 foi marcado por cinco eventos
transformadores e relevantes para o DI. A seguir relato esses eventos sem obedecer a
qualquer critério de ordenação.
Vários professores estavam envolvidos com projetos de pesquisa e
desenvolvimento contratados por empresas e que requeriam especializados recursos
computacionais além de software. Surgiu a ideia de criar laboratórios temáticos
envolvendo os grupos especializados e, dessa forma, ajudar no financiamento do DI.
Os laboratórios temáticos seriam utilizados para pesquisa e desenvolvimento
voltados para assuntos específicos a uma (ou poucas) área de pesquisa. Os laboratórios
deveriam ser autossustentados. Eles seriam custeados pelos projetos, ou instituições
de apoio à pesquisa. Em resumo, os laboratórios temáticos não deveriam utilizar
equipamentos de uso genérico, nem recursos financeiros da PUC ou do DI. Pelo
contrário, 4% do valor total (bruto, incluindo equipamentos) de cada contrato deveria
ser repassado para uma conta do DI (e 10% para a FPLF – Fundação Padre Leonel
Franca/PUC). Os recursos advindos do “imposto DI” e mais a participação nos lucros
dos cursos oferecidos pelo DI na CCE (Coordenação Central de Extensão), eram
utilizados para financiar a infraestrutura computacional dos professores, funcionários,
laboratórios de ensino e pesquisa genéricos e, ainda, financiar a assinatura de
periódicos e aquisição de livros para a biblioteca do DI. Observação, o DI tinha uma
das melhores bibliotecas do país voltadas para Informática. Também foram usados
para custear coisas mais prosaicas tais como giz, papel, XEROX e outros itens que a
PUC, devido a sérios problemas financeiros, não fornecia em volume suficiente. Nada
dos recursos recebidos dos laboratórios temáticos ou da CCE deveria ser direcionado
para professores, alunos ou funcionários do DI, exceto os explicitamente vinculados
aos projetos contratados. Esta política capacitou a criação de uma infraestrutura
essencial para um departamento de pesquisa bem qualificado, sem depender de
recursos PUC além dos necessários para manter a graduação. Outro efeito colateral foi
o de possibilitar que os projetos desenvolvidos nos laboratórios temáticos
financiassem alunos, corpo técnico e complementação salarial de professores, além da
aquisição e manutenção dos equipamentos especializados de que necessitassem.
Além das vantagens para professores e alunos, como esses projetos eram
usualmente de interesse de empresas, portanto deveriam gerar resultados úteis para o
contratante. Dessa forma assegurava-se que as pesquisas realizadas nos laboratórios
tivessem um forte viés aplicado. Dentre os mais de dez laboratórios existentes no DI,
menciono o TecGraf, atualmente um instituto da PUC, o LES – Laboratório de
Engenharia de Software e o LabLua – laboratório que mantém e evolui os
processadores da linguagem Lua reconhecida mundialmente. Observando os
resultados alcançados pode-se concluir que o conceito Laboratório Temático foi muito
bem-sucedido e extremamente útil ao DI. O conceito de laboratório temático acabou
influenciando vários outros departamentos do CTC a criarem estruturas similares.
Evidentemente, uma mudança dessas esbarra em muita resistência e inveja pelos que
não têm, não querem, ou não trabalham num laboratório temático.
22
Arndt von Staa Minha história
23
Arndt von Staa Minha história
24
Arndt von Staa Minha história
persegui nesse segundo mandato foi consolidar mais ainda o viés acadêmico do DI. O
número de laboratórios temáticos cresceu e diversificou.
Há alguns anos a CAPES avaliava de forma pouco rigorosa os programas de
pós-graduação. Emitia conceitos de A a E. Desde o início até a alteração da forma de
avaliar o DI sempre recebeu o conceito A. Depois a CAPES passou a avaliar os
programas de pós-graduação de forma mais rigorosa e passou a dar conceitos
numéricos de 1 a 7. Exceto a primeira avaliação, em que ficamos com um 6, todas as
demais resultaram em 7.
Além de uma avaliação mais rigorosa, CNPq e CAPES passaram a exigir a
existência de Coordenadores de Pós-Graduação. Estes passaram a administrar
recursos, bolsas e programas de ensino, retirando, dessa forma, muitas das tarefas que
antes cabiam ao diretor do departamento.
Em virtude da saída, aposentadoria, falecimento e demissão de diversos
colegas, foi iniciada a renovação do quadro. Ao invés de reorientar e/ou fortalecer
grupos de pesquisa, a Congregação dos professores do DI preferiu assegurar a
manutenção do 7 da CAPES. Consequentemente, a busca de novos professores passou
a voltar-se para “publicadores”, isto é, para pessoas com um número grande de
publicações em periódicos e conferências de alto índice de impacto e com potencial de
continuar publicando.
Nas seções anteriores identifiquei em linhas gerais os computadores nos quais escrevi
programas. A ênfase foi mostrar através de exemplos alguns dos problemas
encontrados ao desenvolver softwares de boa qualidade nestas máquinas. Nesta seção
falarei sobre a evolução das técnicas de garantia da qualidade dos programas, em
especial a qualidade por construção. Falarei também resumidamente alguns aspectos
de garantia da qualidade considerando a gestão do desenvolvimento.
Algumas preocupações que sempre tive são: o que é corretude? Como
desenvolver sistemas manuteníveis e corretos do ponto de vista dos seus usuários?
Como reduzir o custo de desenvolvimento e o de controle da qualidade de sistemas
corretos? Como reduzir os custos da evolução de sistemas, mantendo ou melhorando
a corretude?
Como já mencionei, no início era o caos, ou melhor programava-se em
linguagem de máquina. Especificação cuidadosa em geral não existia*, o que
evidentemente levava a alterações no que já havia sido feito. Para conseguir um
programa que fizesse o que se queria, e desenvolvê-lo com rapidez, era necessário, tal
como ainda o é hoje, procurar escrever programas corretos por construção. Há muito
tempo já se observava que os minutos a mais que se gastava demostrando que o
programa está correto antes de digitar a primeira linha, reduziam horas de teste,
depuração, reescrita e manutenção. Também possibilita estabelecer um processo de
programação que permitia desenvolver às cegas programas corretos.
25
Arndt von Staa Minha história
26
Arndt von Staa Minha história
programa sob teste passa a se auto controlar durante a execução dos testes.
Evidentemente, assertivas incompletas deixam de identificar as falhas associadas à
incompletude delas. Em linguagens que permitem redigir-se código condicionalmente
compilável, pode-se deixar as assertivas no código final marcadas como código a ser
incluído somente quando se deseja testar o programa. Feito direito, isso permite testar
sem utilizar o debugger.
Assertivas de entrada e saída correspondem a uma especificação,
possivelmente parcial, do que o fragmento de código entre elas precisa receber e
produzir para que possa ser considerado estar correto. Se os fragmentos de código
controlado forem curtos, fica “fácil” demonstrar, antes de partir para digitação, que
esse código tem grande chance de estar correto. Isso reduz significativamente o custo
de teste e correção do programa. Medições informais mostraram que o custo do
desenvolvimento de um programa correto por construção, cai no entorno de 30%.
Nunca fiz uma medição rigorosa, por ser muito difícil fazer isso no contexto de
ambientes de produção.
Um problema correlato é como realizar os testes. Usualmente teste é realizado
submetendo-se o programa a dados artificias criados pelo testador. Evidentemente,
esses dados devem estar em concordância com a especificação. Além disso, é
necessário dizer quais os resultados esperados ao término de cada teste. O conjunto de
testes deve cobrir o código como um todo, além de cobrir condições de uso correto ou
incorreto do (fragmento de) programa sob teste. Porém deve-se testar também para
dados errados na expectativa de ver mensagens feitas pela instrumentação. Realizar
manualmente testes que satisfaçam esses requisitos é difícil, ou mesmo impossível,
considerando os custos. Mais uma vez surgem as técnicas formais. Que tal, ao invés
de digitar casos de teste inventados na hora, escrever um programa gerador de testes?
Para isso usam-se dados e resultados esperados a partir da especificação, levando em
conta dados válidos e não válidos. Para uma grande gama de programas isso é possível
ser feito. Mais uma vez temos redução de custos junto com o aumento da qualidade,
apesar do custo de desenvolver e depurar o gerador. Boa parte do Talisman foi
desenvolvida assim.
Isso explica a minha obsessão com relação ao uso de assertivas e técnicas de
geração de casos de teste. A literatura chama isso de “Técnicas formais leves”. No
papel, essa abordagem pode ser usada mesmo ao desenvolver programas escritos em
código de máquina. Era essencialmente isso que passei a fazer já desde os anos 1960.
Em 1973, durante o meu doutorado na U. Waterloo, dei parte de uma disciplina de
graduação gravitando em torno do desenvolvimento de software correto por
construção, em que eu mostrava o que são e como usar técnicas formais. Foi a primeira
vez que esse assunto foi abordado naquela universidade. Parece que pelo menos
alguns dos alunos entenderam…
Um segundo problema a infernizar a vida de quem desenvolve software são
especificações incompletas, incorretas ou evolutíveis. Infelizmente é quase impossível
evitar que especificações mudem no decorrer de ou após o desenvolvimento. Algumas
soluções usam técnicas formais ao especificar. No entanto, caso o software passe
frequentemente por novas versões, esta solução é excessivamente cara. Como são
utilizadas várias linguagens de representação, a complexidade e o grau de detalhe das
27
Arndt von Staa Minha história
* Não interessa o que Maria ou João desejam, mas interessa o que o gerente e o caixa necessitam.
28
Arndt von Staa Minha história
15. Fim
29
Arndt von Staa Minha história
30
Arndt von Staa Minha história
31