As Três Leis Fundamentais da Ciência da Computação por Carlos Diego
O escritor russo-americano, Isaac Asimov, foi um prolífico autor de ficção científica, assim como de obras científicas, como “Eu, Robô” e “Manual de Robótica”. Em sua obra, Asimov idealizou as “Três Leis da Robótica”. Tratam-se de regras ou princípios a fim de permitir o controle e limitar os comportamenos dos robôs. As três diretivas descrevem que:
1ª Lei: Um robô não pode ferir um ser humano ou, por inação, permitir que um ser humano sofra algum mal.2ª Lei: Um robô deve obedecer às ordens que lhe sejam dadas por seres humanos, exceto nos casos em que entrem em conflito com a Primeira Lei.
3ª Lei: Um robô deve proteger sua própria existência, desde que tal proteção não entre em conflito com a Primeira ou Segunda Leis.
Isaac Asimov em 1965
Nas aulas que ministro na graduação de Ciência da Computação da CESAR School, procuro sempre correlacionar os conhecimentos práticos e técnicos das disciplinas, com a essência dos seus fundamentos, mostrando o porquê das coisas, ou, como diria Douglas Adams, o “significado da vida, do universo e tudo mais”. Nada daquela história que os alunos adoram chamar de “aula teórica”.
Teoria é descrita no dicionário como um “conjunto de regras ou leis, mais ou menos sistematizadas, aplicadas a uma área específica” ou “conhecimento especulativo, metódico e organizado de caráter hipotético e sintético.” Ou seja, poderíamos dizer que a teoria está no campo do filosófico, da observação a partir de uma experiência empírica, a qual, em absoluto, deve ser desmerecida, pelo contrário. Ela é, exatamente, o primeiro passo do processo científico, como tão bem definiu o Dr. Richard Feynman no documentário “O Fantástico Mr. Feynman” (disponível em https://www.youtube.com/watch?v=BHoPO4qrRGA):
“Em geral, procuramos uma nova lei pelo seguinte processo. Primeiro, fazemos uma suposição, essa que é a verdade. Então, calculamos as consequências da suposição, para ver se isso está certo, se essa lei que supomos está certa, para ver o que isso implicaria. Então, comparamos os resultados computados com a natureza ou com outros experimentos, comparando-o diretamente com essas outras observações para ver se isso funciona.”
Certa vez, em uma palestra sobre Engenharia de Software do ilustríssimo Prof. Silvio Meira, ele fez uma referência a um documentário intitulado “The Great Math Mistery”, sobre as diferenças entre a Engenharia e a Matemática:
… engenheiros não são pagos para FAZER AS COISAS CERTAS. Engenheiros são pagos para FAZER AS COISAS CERTAS… O SUFICIENTE!
… no mundo da ENGENHARIA, a ELEGÂNCIA da MATEMÁTICA encontra o CAOS da REALIDADE… [e] as REGRAS PRÁTICAS do cotidiano.
A MATEMÁTICA lida com o domínio do ABSOLUTO e a ENGENHARIA lida com o domínio do APROXIMADO.
Pensei imediatamente sobre o quão geral — leia-se geral não algo pejorativamente genérico, mas sim, amplo e universal — essa ideia de que a engenharia é uma ciência que lida com o aproximado. Fantástico! Essa é uma daquelas conclusões que se feitas por você mesmo, a vontade que dá é de contar para todo mundo, mesmo para uma pessoa desconhecida na rua.
Isso me levou a pensar se seria possível resumir a Ciência da Computação a três regras fundamentais. Não queria me resumir a definição do dicionário, que define Computação como “qualquer tipo de cálculo aritmético ou não aritmético que segue um modelo bem definido”. Eu queria ir além! Queria regras, premissas, simples o suficiente para que, em qualquer dado cenário, pudessem de alguma forma ter uma ou todas as suas diretivas relacionadas ao que é a computação em sua essência. Até que, entre uma aula e outra… Voilá! Eureka! Encontrei aquelas que viriam a ser o que os meus alunos e alunas passaram a conhecer como “As Três Leis Fundamentais da Ciência da Computação por Carlos Diego”!
P.S.: Esse parágrafo pode parecer pretencioso, mas eu prometo que essa introdução segue um tom irônico e sarcástico em sala de aula, por vezes tirando alguns sorrisos da turma que, até aquele momento, está mais preocupada em como serão as minhas avaliações do que qualquer outra coisa. =)
Estão prontos? Então, vamos lá… As três leis fundamentais da Ciência da Computação são:
- Estruturas condicionais;
- Abstração;
- Trade-off.
Na ciência da computação, estrutura de seleção (ou expressão condicional, ou construção condicional, ou função se-então-senão) é uma estrutura de desvio do fluxo de controle presente em linguagens de programação que realiza diferentes ações/computações dependendo se a condição/seleção é verdadeira ou falsa, em que a expressão é processada e transformada em um valor booleano. Nas linguagens de programação, usamos as palavras em inglês para expressar uma estrutura de seleção, como if, else if e else. (Mark Summerfield (2013). Programação em Python 3. Alta Books)
Não há um só problema de computação em que um algoritmo, uma estrutura lógica, não seja aplicada. E a lógica é, majoritariamente, condicional. Fazemos algo em decorrência de algo. Soa familiar? Ação e reação. Soa familiar? Essa é, exatamente, a base da terceira Lei de Newton, que diz “para todas as forças de ação, surgem forças de reação com intensidades iguais, mas sentidos opostos.” Vamos reescrever a terceira Lei de Newton sob uma perspectiva algorítmica:
“… para todas as forças de ação (IF/SE), surgem forças de reação (ELSE IF/SENÃO SE) com intensidades iguais, mas sentidos opostos (ELSE).”
Estruturas condicionais são tão poderosas que há quem diga que são a base da Inteligência Artificial (tom irônico e sarcástico)!
Lei 2— Abstração
Na Ciência da Computação, abstração refere-se ao “processo de remoção ou generalização de detalhes físicos, espaciais ou temporais ou atributos no estudo de objetos ou sistemas para focar a atenção em detalhes de maior importância; é de natureza semelhante ao processo de generalização” (Timothy Colburn e Gary Shute (2007). Abstração em Ciência da Computação. Mentes e Máquinas).
O processo de abstração também pode ser chamado de modelagem e está intimamente relacionado aos conceitos de teoria e design. Na computação, sempre que um problema torna-se comum ou genérico o suficiente para fazer sentido em múltiplos cenários para o mesmo contexto, ele torna-se passível de ser abstraído.
Voltemos um pouco na história… Desde os tempos mais primórdios — diga se essa frase não remete a uma bateria de escola de samba? — fomos construindo abstrações em cima de abstrações na computação. No início, programávamos diretamente no hardware.
Passamos então a compreender que existiam algumas tarefas que eram recorrentes — como, por exemplo, gerenciar periféricos, persistir dados, controlar a concorrência de tarefas. Neste momento, desenvolvemos os Sistemas Operacionais, uma abstração acima da camada de hardware, que teria como papel gerenciar tudo aquilo que é comum a maior parte das atividades computacionais, tais como gerenciar memória, processamento e disco — ou o que conhecemos por Máquina de von Neumann.
A Arquitetura de von Neumann (de John von Neumann, pronunciado Nóimánn) é uma arquitetura de computador que se caracteriza pela possibilidade de uma máquina digital armazenar seus programas no mesmo espaço de memória que os dados, podendo assim manipular tais programas. Fonte: https://pt.wikipedia.org/wiki/Arquitetura_de_von_Neumann
Ilustração da Máquina de Von Neumann
E essas abstrações foram, passo a passo, sendo implementadas, uma em cima da outra. Hardware, Sistemas Operacionais, Sistemas Gerenciadores de Bancos de Dados, Servidores Virtuais, Conteineres, Conteineres Orquestrados, Infraestrutura como Serviço, Plataforma como Serviço, Software como Serviço… Cada nova camada, encapsula um conjunto de atividades que até então, precisariam ser repetidas a cada nova execução em uma nova instância de contexto.
Lei 3 — Trade-off
O economista americano Thomas Sowell, professor e autor de diversas pérolas da economia, definiu de forma magistral que “não há solução para nada, há apenas compensações”. Toda decisão que tomamos, resolve um problema, porém, cria outro.
“Não há soluções, há apenas compensações e você tenta obter a melhor compensação possível, isso é tudo que você pode esperar. Não podemos alcançar um resultado perfeito. Vários caminhos podem contribuir para nosso objetivo comum de aumentar a resiliência aos riscos. Mas a desejabilidade dessas alternativas deve ser entendida em termos das compensações entre seus benefícios e custos. Devemos considerar essas compensações e escolher o melhor.”
Uma frase geral. Simples, objetiva e profundamente certeira. Poderia, perfeitamente, ser aplicada em outros campos — como a política, por exemplo — mas, a sua objetividade não seria párea para o bom fisiologismo que no fim, muda de cor como mudam as estações, mas produzem os mesmos resultados. Mas, lembremos que estamos falando de uma ciência exata e, para o caso da computação, essa definição é perfeita.
As compensações, as quais se referia Sowell, nada mais são do que as aproximações da engenharia citadas anteriormente. É a sabedoria de que, nenhuma solução criada atenderá a todas as possibilidades, porque, seria simplesmente impossível. É o que na teoria computacional definimos como um problema NP-Complexo.
“Na teoria da complexidade computacional, NP é o acrônimo em inglês para Tempo polinomial não determinístico (Non-Deterministic Polynomial time) que denota o conjunto de problemas que são decidíveis em tempo polinomial por uma máquina de Turing não-determinística. Uma definição equivalente é o conjunto de problemas de decisão que podem ter seu certificado verificado em tempo polinomial por uma máquina de Turing determinística. NP-difícil (ou NP-hard, ou NP-complexo) na teoria da complexidade computacional, é uma classe de problemas que são, informalmente, “Pelo menos tão difíceis quanto os problemas mais difíceis em NP”. (Fonte: https://pt.wikipedia.org/wiki/NP-dif%C3%ADcil)
Na ciência da computação, compensações são vistas como uma ferramenta de troca. Um programa geralmente pode ser executado mais rápido se usar mais memória (uma troca de espaço-tempo). Um exemplo prático seria que ao compactar uma imagem, você pode reduzir o tempo de transmissão em detrimento do tempo computacional para executar a compactação e a descompactação. Porém, dependendo do método de compactação — assim como sua eficiência — isso também pode envolver a compensação de uma perda na qualidade da imagem.
Na área de vendas, é muito comum escutarmos que qualquer negócio é baseado em três princípios: qualidade, preço e tempo, porém, o cliente só pode escolher dois deles. Uma solução que entregue os três seria um unicórnio — ou seja, impossível.
Quando construímos uma solução de computação, especialmente na engenharia de software, é fundamental estabelecermos prelimarmente quais são os direcionadores da nossa solução. A aviação civil, por exemplo, fez uma clara escolha pela segurança. Voar em um avião está longe de ser uma experiência confortável — a menos que você seja 0,001% da população que consegue bancar um vôo na primeira classe da Emirates. Mas, é uma experiência inegavelmente segura. Ou seja, houve uma objetiva escolha na aviação civil para que o seu direcionador principal seja a segurança, ainda que em detrimento do conforto. Igualmente, uma solução de software dificilmente conseguirá atender de forma excelente um aspecto, sem ferir algum outro. É o que o Prof. Silvio Meira — olha ele novamente! — certa vez citou que: “Toda solução ideal de engenharia nasce inegavelmente inviável, porque seria ou muito demorada, muito cara ou impossível de ser construída com as tecnologias atuais.” Como diria minha querida avó: “Esse arrodeio(sic) todo para dizer que é melhor um passarinho na mão do que dois voando”.
Assim encerro a primeira versão das “Três Leis Fundamentais da Ciência da Computação por Carlos Diego”. Depois de inúmeros semestres prometendo aos meus queridos alunos e alunas, que um dia sentaria para escrever o que tão apaixonadamente descrevo em minhas aulas. Encerro não sem antes ovacionar as centenas — talvez, depois de 13 anos, milhares—de pessoas que tive a honra de ensinar e orientar. As quais, semestre a semestre, sempre me incentivaram a escrevê-las (“Escreva mesmo as leis, professor! Faz sentido… Olha o trade-off, professor!”, disseram alguns mais entusiasmados). =)
Encerro, reiterando o quanto me sinto premiado de poder ensinar e meu profundo prazer de descobrir e saber do porquê das coisas. Sobre a diversão que é isso tudo, como diria o ilustre Dr. Richard Feynman:
“Eu não quero prêmios. Eu já recebi o prêmio! O prêmio é o prazer de descobrir o negócio, a diversão da descoberta, ver que outras pessoas usam. Essas são coisas reais! As honrarias não são reais para mim, eu não acredito em honrarias. Honrarias são distintivos, honrarias são uniformes!”.
Referências
[1] D. Adams, O Guia do Mochileiro das Galáxias, 3ª ed. São Paulo: Arqueiro, 2004.
[2] I. Asimov, Eu, Robô. São Paulo: Aleph, 2014.
[3] T. R. Colburn and G. M. Shute, "Abstraction in Computer Science," Minds and Machines, vol. 17, no. 2, pp. 169-184, 2007. DOI: 10.1007/s11023-007-9061-8.
[4] R. P. Feynman, O Fantástico Sr. Feynman. Documentário. Disponível em: https://www.youtube.com/watch?v=BHoPO4qrRGA. Acesso em: 5 maio 2023.
[5] S. Meira, The Great Math Mystery. Documentário. PBS Nova, 2015.
[6] T. Sowell, A Conflict of Visions: Ideological Origins of Political Struggles, 2nd ed. Nova York: Basic Books, 2007.
[7] M. Summerfield, Programação em Python 3: Uma Abordagem Completa para Programadores. Rio de Janeiro: Alta Books, 2013.
[8] "Arquitetura de von Neumann," Wikipédia. Disponível em: https://pt.wikipedia.org/wiki/Arquitetura_de_von_Neumann. Acesso em: 5 maio 2023.
[9] "NP-difícil," Wikipédia. Disponível em: https://pt.wikipedia.org/wiki/NP-dif%C3%ADcil. Acesso em: 5 maio 2023.
O economista americano Thomas Sowell, professor e autor de diversas pérolas da economia, definiu de forma magistral que “não há solução para nada, há apenas compensações”. Toda decisão que tomamos, resolve um problema, porém, cria outro.
“Não há soluções, há apenas compensações e você tenta obter a melhor compensação possível, isso é tudo que você pode esperar. Não podemos alcançar um resultado perfeito. Vários caminhos podem contribuir para nosso objetivo comum de aumentar a resiliência aos riscos. Mas a desejabilidade dessas alternativas deve ser entendida em termos das compensações entre seus benefícios e custos. Devemos considerar essas compensações e escolher o melhor.”
Uma frase geral. Simples, objetiva e profundamente certeira. Poderia, perfeitamente, ser aplicada em outros campos — como a política, por exemplo — mas, a sua objetividade não seria párea para o bom fisiologismo que no fim, muda de cor como mudam as estações, mas produzem os mesmos resultados. Mas, lembremos que estamos falando de uma ciência exata e, para o caso da computação, essa definição é perfeita.
As compensações, as quais se referia Sowell, nada mais são do que as aproximações da engenharia citadas anteriormente. É a sabedoria de que, nenhuma solução criada atenderá a todas as possibilidades, porque, seria simplesmente impossível. É o que na teoria computacional definimos como um problema NP-Complexo.
“Na teoria da complexidade computacional, NP é o acrônimo em inglês para Tempo polinomial não determinístico (Non-Deterministic Polynomial time) que denota o conjunto de problemas que são decidíveis em tempo polinomial por uma máquina de Turing não-determinística. Uma definição equivalente é o conjunto de problemas de decisão que podem ter seu certificado verificado em tempo polinomial por uma máquina de Turing determinística. NP-difícil (ou NP-hard, ou NP-complexo) na teoria da complexidade computacional, é uma classe de problemas que são, informalmente, “Pelo menos tão difíceis quanto os problemas mais difíceis em NP”. (Fonte: https://pt.wikipedia.org/wiki/NP-dif%C3%ADcil)
Na ciência da computação, compensações são vistas como uma ferramenta de troca. Um programa geralmente pode ser executado mais rápido se usar mais memória (uma troca de espaço-tempo). Um exemplo prático seria que ao compactar uma imagem, você pode reduzir o tempo de transmissão em detrimento do tempo computacional para executar a compactação e a descompactação. Porém, dependendo do método de compactação — assim como sua eficiência — isso também pode envolver a compensação de uma perda na qualidade da imagem.
Na área de vendas, é muito comum escutarmos que qualquer negócio é baseado em três princípios: qualidade, preço e tempo, porém, o cliente só pode escolher dois deles. Uma solução que entregue os três seria um unicórnio — ou seja, impossível.
Quando construímos uma solução de computação, especialmente na engenharia de software, é fundamental estabelecermos prelimarmente quais são os direcionadores da nossa solução. A aviação civil, por exemplo, fez uma clara escolha pela segurança. Voar em um avião está longe de ser uma experiência confortável — a menos que você seja 0,001% da população que consegue bancar um vôo na primeira classe da Emirates. Mas, é uma experiência inegavelmente segura. Ou seja, houve uma objetiva escolha na aviação civil para que o seu direcionador principal seja a segurança, ainda que em detrimento do conforto. Igualmente, uma solução de software dificilmente conseguirá atender de forma excelente um aspecto, sem ferir algum outro. É o que o Prof. Silvio Meira — olha ele novamente! — certa vez citou que: “Toda solução ideal de engenharia nasce inegavelmente inviável, porque seria ou muito demorada, muito cara ou impossível de ser construída com as tecnologias atuais.” Como diria minha querida avó: “Esse arrodeio(sic) todo para dizer que é melhor um passarinho na mão do que dois voando”.
Assim encerro a primeira versão das “Três Leis Fundamentais da Ciência da Computação por Carlos Diego”. Depois de inúmeros semestres prometendo aos meus queridos alunos e alunas, que um dia sentaria para escrever o que tão apaixonadamente descrevo em minhas aulas. Encerro não sem antes ovacionar as centenas — talvez, depois de 13 anos, milhares—de pessoas que tive a honra de ensinar e orientar. As quais, semestre a semestre, sempre me incentivaram a escrevê-las (“Escreva mesmo as leis, professor! Faz sentido… Olha o trade-off, professor!”, disseram alguns mais entusiasmados). =)
Encerro, reiterando o quanto me sinto premiado de poder ensinar e meu profundo prazer de descobrir e saber do porquê das coisas. Sobre a diversão que é isso tudo, como diria o ilustre Dr. Richard Feynman:
“Eu não quero prêmios. Eu já recebi o prêmio! O prêmio é o prazer de descobrir o negócio, a diversão da descoberta, ver que outras pessoas usam. Essas são coisas reais! As honrarias não são reais para mim, eu não acredito em honrarias. Honrarias são distintivos, honrarias são uniformes!”.
Referências
[1] D. Adams, O Guia do Mochileiro das Galáxias, 3ª ed. São Paulo: Arqueiro, 2004.
[2] I. Asimov, Eu, Robô. São Paulo: Aleph, 2014.
[3] T. R. Colburn and G. M. Shute, "Abstraction in Computer Science," Minds and Machines, vol. 17, no. 2, pp. 169-184, 2007. DOI: 10.1007/s11023-007-9061-8.
[4] R. P. Feynman, O Fantástico Sr. Feynman. Documentário. Disponível em: https://www.youtube.com/watch?v=BHoPO4qrRGA. Acesso em: 5 maio 2023.
[5] S. Meira, The Great Math Mystery. Documentário. PBS Nova, 2015.
[6] T. Sowell, A Conflict of Visions: Ideological Origins of Political Struggles, 2nd ed. Nova York: Basic Books, 2007.
[7] M. Summerfield, Programação em Python 3: Uma Abordagem Completa para Programadores. Rio de Janeiro: Alta Books, 2013.
[8] "Arquitetura de von Neumann," Wikipédia. Disponível em: https://pt.wikipedia.org/wiki/Arquitetura_de_von_Neumann. Acesso em: 5 maio 2023.
[9] "NP-difícil," Wikipédia. Disponível em: https://pt.wikipedia.org/wiki/NP-dif%C3%ADcil. Acesso em: 5 maio 2023.
Comentários
Postar um comentário