Engenharia da SISCOG: conhece esta empresa portuguesa de tecnologia de ponta
Descobre como o Lisp continua a impulsionar a inovação na SISCOG. Entrevista com Rui Patrocínio, Scheduling Team Leader da SISCOG
#1 Como foi o seu primeiro contato com a linguagem de programação Lisp?
Quando entrei para o Técnico em 1999, a linguagem de programação ensinada em Introdução à Programação era Scheme que é da família do Lisp. O currículo seguia de perto a cadeira do MIT 6.001 (cujas aulas dos anos 80 estão no Youtube) e um dos melhores livros de programação de sempre para iniciantes e não só: Structure and Interpretation of Computer Programs. A grande vantagem de aprender a programar com Scheme é que é uma linguagem muito simples, com uma sintaxe muito simples. O esforço é todo canalizado para perceber a lógica do que se está a implementar, não sendo preciso memorizar as nuances sintáticas da linguagem.
Depois dessa experiência, o Lisp voltou a aparecer já como Common Lisp na cadeira de Inteligência Artificial. O Common Lisp digamos que é a versão industrial atual das linguagens da família Lisp e é esta que a SISCOG usa no seu dia a dia. O Common Lisp é uma linguagem multi-paradigma. Programação imperativa, funcional, orientada a objetos com mecanismos bastante sofisticados de meta-programação disponíveis. Como tal, usar a linguagem como um todo implica alguma maturidade e é natural que apareça mais tarde no currículo de um curso de engenharia informática.
Acho que foi o “poder” da linguagem Common Lisp que a tornou particularmente apelativa para mim e, apesar do standard ser de 1994, é uma linguagem bastante moderna. Note-se que Guy Steele, uma das figuras principais por detrás do standard do Common Lisp, também esteve muito envolvido no desenvolvimento do Scheme, do C e do Java, sendo contratado pela Sun a dada altura para melhorar o Java. Deixo uma citação sua numa mailing list muito focada na discussão de linguagens de programação dos anos 90 a falar de Java:
And you're right: we were not out to win over the Lisp programmers; we were after the C++ programmers. We managed to drag a lot of them about halfway to Lisp. Aren't you happy? --Guy Steele
#2 Como utiliza a SISCOG o Lisp nos seus produtos
Utilizamos Common Lisp na grande maioria do nosso software. Tanto aplicações desktop como partes de backend de aplicações web estão implementadas em Common Lisp. Também utilizamos C++ para desenvolver módulos específicos, mas Common Lisp continua a ter o maior número de linhas de código nos nossos repositórios. É uma linguagem muito expressiva que compila para código máquina de forma razoavelmente eficiente sem grande esforço por parte do programador. Portanto, é uma escolha fácil para a maioria dos cenários.
Resta dizer que os nossos produtos estão em operação há mais de 30 anos em diversas empresas nacionais e internacionais, como o metro de Londres e de Lisboa, ou os caminhos e ferro dos Países Baixos ou do Canadá. Trata-se de software de apoio à decisão para o planeamento otimizado dos recursos destes operadores de transporte, nomeadamente o tempo e o espaço, materializados nos horários, os veículos e o pessoal. Estes produtos ajudam a planear e a gerir da forma mais rápida e eficiente possível estes recursos operacionais, proporcionando ganhos e poupanças em diversas áreas, bem como, por exemplo, maior satisfação por parte dos trabalhadores graças a turnos e escalas de trabalho que melhor satisfazem as suas preferências. E tudo isto tendo o Lisp como base!
#3 Quais são as principais vantagens da sintaxe do Lisp em comparação com outras linguagens de programação, como C++?
A grande vantagem da sintaxe é também o que mais se estranha no início, os parêntesis. O facto de tudo usar uma sintaxe prefixa também torna tudo bastante uniforme. Esta combinação de parêntesis e sintaxe prefixa tem o nome de s-expressions em Lisp. As s-expressions são código e dados ao mesmo tempo, e é isto que permite ter macros (funções que recebem código como argumento e devolvem código como valor) que estendem a linguagem de forma transparente, como se pertencessem à linguagem standard.
#4 Consegue explicar o conceito de "expressões-S" e como ele contribui para a clareza do código em LISP?
Basicamente as “expressões-S” são uma de duas coisas:
- expressões atómicas (e.g. o número 2024 ou a string “hello world” ou o símbolo +)
- uma lista, tipicamente no formato (operador arg1 arg2 … argn)
É esta uniformidade, como disse anteriormente, que torna tudo mais simples. Isto também ajuda imenso a conseguir gerar código de forma programática porque é só manipulação de listas para a qual o Common Lisp tem uma API bastante razoável. É daqui que vem o poder das macros Lisp.
Primeiro estranha-se, depois entranha-se
#5 Como é que o Lisp permite a prototipagem rápida através de variáveis não tipificadas?
Atualmente defende-se muito a tipificação estática em bases de código grandes porque permite ter mais ferramentas automáticas a verificar problemas no código. Common Lisp tem tipificação dinâmica, mas permite uma declaração de tipos opcional. É bastante frequente só declarar tipos quando é necessário “espremer” mais performance de algum segmento de código. O compilador via inferência de tipos vai dando alguma informação sobre problemas encontrados quando há declarações de tipos suficientes para extrair informação relevante. Isto permite-nos “lutar com o compilador” apenas em segmentos de código onde isso é muito relevante e não estar a fazer otimizações prematuras no código todo.
#6 Como é que o Lisp facilita a meta-programação?
Há duas “ferramentas” base para meta-programação em Common Lisp: o Meta Object Protocol e as macros faladas anteriormente.
Meta Object Protocol é basicamente o mecanismo por detrás da implementação do sistema de objetos do Common Lisp (chamado CLOS, Common Lisp Object System). Apesar de não pertencer ao standard, está disponível na maioria das implementações de Common Lisp e por vezes é útil, nomeadamente na implementação de utilitários para inspecionar o código ou melhorar o nosso ambiente de desenvolvimento. Por exemplo, é possível implementar algo que nos mostre as relações entre as classes, que métodos existem, etc. Isto não é algo que se faça no dia a dia, mas pode ser feito por nós sem depender das entranhas de um IDE específico.
Outro mecanismo interessante são as macros. Quando o CLOS foi introduzido, foi basicamente um conjunto de macros em cima do Lisp da altura (historicamente houve mais umas iterações – o CLOS não foi o primeiro sistema de objetos desenvolvido). Ou seja, com macros é possível estender a linguagem para introduzir a maioria dos mecanismos e paradigmas existentes noutras linguagens (como programação orientada a objetos) de uma forma que pareça natural para um programador de Lisp.
Este género de mecanismos permite à SISCOG implementar, de uma forma praticamente transparente para o programador, mecanismos de undo e redo no nosso software. Isto é feito através de uma extensão da declaração de classes. O programador anota para que atributos de cada classe é necessário manter um histórico e o utilizador final consegue fazer undo das suas operações e ver estas variações dos dados de forma instantânea (com a implementação típica utilizando o Command Pattern, o undo multi-level não é instantâneo dado ser necessário reexecutar operações, o que pode não ser trivial; o tradeoff é, obviamente, a memória gasta).
#7 Qual é a sua opinião sobre a curva de aprendizagem do Lisp em comparação com outras linguagens de programação?
Qualquer pessoa com experiência em algumas linguagens de paradigmas diferentes programa rapidamente em Common Lisp sem grandes problemas. A maioria dos conceitos são familiares. A nossa experiência na SISCOG, em particular em contratações mais recentes que não tiveram contacto com Lisp na faculdade, é que as pessoas adaptam-se rapidamente e numa semana estão a programar e a fazer pequenas correções.
Obviamente que há partes da linguagem que são menos comuns e é precisa uma maior maturidade para as usar eficazmente. Entre elas o Meta-object protocol e as macros faladas anteriormente.
Neste caso, a necessidade de maior maturidade advém simplesmente do facto de estarmos a estender a linguagem. Desenhar uma linguagem nova não é fácil e há pessoas cuja carreira é fazer isso (como o Guy Steele falado anteriormente). Obviamente que isto também é raro e o mais comum é introduzir macros para pequenas funcionalidades que tornam o programador mais produtivo com Domain Specific Languages.
#8 Porque é que o Lisp é uma escolha popular para áreas especializadas como inteligência artificial e processamento de linguagem natural?
É essencialmente por razões históricas. O Lisp nasceu nesse contexto, houve vários sistemas de inteligência artificial “clássicos” implementados em Lisp e assim continuou a ser usado. O facto de ser muito fácil começar um projeto de forma rápida, ser fácil iterar e melhorar progressivamente o que foi feito, também ajuda num contexto de investigação onde estamos mais preocupados em testar ideias do que tornar o software “à prova de bala”, coisa que se pode fazer progressivamente (tratando erros, adicionando tipificação estática, etc.) em Common Lisp.
#9 Consegue dar alguns exemplos de projetos na SISCOG onde o Lisp se mostrou especialmente vantajoso?
A SISCOG apostou no Lisp desde o início. É uma linguagem muito estável, com bons compiladores e boa performance, compacta e que nos permitiu passar pela história da informática entre várias plataformas (máquinas Lisp, Unix, Windows) e mantendo uma base de código com imenso conhecimento de domínio ao longo dos anos. Uma empresa com software em produção há mais de 30 anos não é muito comum no mundo e Lisp é claramente a nossa arma pouco-secreta.
#10 Como se compara a comunidade de desenvolvimento do Lisp com outras comunidades de linguagens de programação em termos de suporte e recursos?
A comunidade Lisp não é muito numerosa mas, o que nos falta em número de programadores, sobra-nos em entusiasmo. O Paul Graham (da Y Combinators) foi um grande impulsionador da linguagem no fim dos anos 90, início dos anos 2000 e no Hacker News continua-se a falar de Common Lisp (e variantes) com alguma regularidade. Há muitos anos havia uma comunidade forte nos antigos newsgroups, mas isso passou muito para o Reddit e o IRC. Também há algumas conferências anuais (ex. European Lisp Symposium) onde se costumam juntar alguns dos elementos mais importantes da comunidade. Não temos de longe o maior número de bibliotecas disponíveis e, por vezes, temos de implementar coisas ‘in house’. A comunidade tem, no entanto, o suficiente para fazer software de alta qualidade que é vendido para todo o mundo, como a SISCOG tem vindo a demonstrar.
#11 Quais são as suas previsões para o futuro do Lisp na indústria de tecnologia?
Parece-me que o futuro de uma linguagem depende muito de modas e dos investimentos feitos nela. A Google usa Lisp via a compra de uma empresa há uns anos (ITA Software, para procura de voos) e, enquanto estas empresas grandes continuarem a investir, as linguagens prosperam. Neste momento as modas tenderam para outras plataformas, mas vamos ver o que o futuro nos trará. Talvez a nossa arma pouco-secreta fique cada vez menos secreta.