domingo, 26 de setembro de 2010

Agoritmos = mudança de paradigma

Textos de Bernard Chazelle:

Lei de Moore deixará de funcionar por volta de 2050, por limitações físicas. De certa forma, uma boa notícia. Aí seremos obrigados a olhar os algoritmos, a nos preocupar com eficiência, a (re-)descobrir que se pode fazer muito mais com o que temos de potência de computação. Isto ao invés de desperdiçar memória e ciclos de CPU. Conhecido meu, brilhante desenvolvedor de software, fez um ERP que roda em máquinas desktop comuns consumindo no máximo 1 a 2% de CPU...

Computação, segundo Chazelle, é o ponto de encontro de 3 grandes idéias: universalidade, dualidade, auto-referência. Mais os conceitos de tratabilidade e o revolucionário paradigma do algoritmo.

Vamos analisar. Em itálico.

Universalidade: num computador há dados e programa, ambos representados como números (0 e 1). Há o contrôle, que lê o programa e executa suas instruções cegamente. O contrôle não sabe o que faz. Executa instruções. Só.

A idéia de separar programa (software) de contrôle (hardware) foi do Turing.

Fundamental é também a idéia de que programa e dados são a mesma coisa. Levada adiante por Von Neumann em sua máquina, que é o atual computador. Na mesma memória vão programa e dados.

Dualidade: sequências de 0 e 1 podem ser interpretadas de duas maneiras. Como forma, dados, ou como conteúdo, programa.

Isso do ponto de vista do contrôle.

Auto-referência: o programa pode referir a si próprio. Analogia aqui com DNA.

Isto é recursividade.

Tratabilidade (tractability*, fácil de tratar, de manejar, de persuadir): verificar se um teorema é válido é mais fácil do que provar o teorema. Problema P=NP. De verdade não sabemos (2010).

Assim como não sabemos se um problema é "programável", mas em geral achamos que sim, e se sua "programação" será simples ou não. Na prática, em problemas do dia a dia, digamos, administrativos, achamos que sim.

Algoritmo: "programa com cara humana", diz muito bem Chazelle. E diz mais: "Um algoritmo é, em essência, uma obra de literatura". Finaliza: "As ciências quantitativas do século XXI (genomica, neurobiologia por exemplo) completarão o destronar da fórmula cclocando o algoritmo no núcleo (core, coração) do modus operandi. O pensamento algorítmico causará provavelmente a mudança de paradigma mais radical (disruptive) na ciência desde a mecância quântica".

Muito mais que a mudança da mecânica quântica. O algoritmo, a máquina universal, são uma revolução no mínimo tão grande quanto a Renascença, quanto a Revolução Industrial, quanto o surgimento da Ciência Moderna. Rivalizam com o surgimento da Matemática.



Idéias semelhantes, importância do algoritmo na ciência moderna, em versão mais light: All Science is Computer Science no New York Times

* tractable:
1. Capable of being easily led, taught, or managed; docile; manageable; governable.
2. (obsolete) Capable of being handled or touched; palpable; practicable; feasible.
3. (mathematics) Sufficiently operationalizable or useful to allow a mathematical calculation to proceed toward a solution.
4. (computer science) Of a decision problem, algorithmically solvable fast enough to be practically relevant, typically in polynomial time.
(Wiktionnary)

Calculemus

The only way to rectify our reasonings is to make them as tangible as those of the Mathematicians, so that we can find our error at a glance, and when there are disputes among persons, we can simply say: Let us calculate [calculemus], without further ado, to see who is right.
Gottfried Leibniz, The Art of Discovery, 1685, Wiener 51

segunda-feira, 20 de setembro de 2010

Homoicônica?

"Clojure é uma linguagem homoicônica, ou seja, as mesmas estruturas de dados usadas nos programas são usadas para representá-los internamente" em Programação Funcional e Concorrente para JVM com Clojure: boa apresentação de linguagem funcional, Clojure. Onde está a referência a homoicônica?

"Aproveite o poder e expressividade de uma linguagem homoicônica", simpática paródia do clássico "Use filtro solar".

Linguagem sucinta: PicoLisp

Um Lisp minimalista. Funcionando há anos. Usado para aplicações comerciais reais. Com boa performance. E pouquíssimo conhecido.

Perfeito exemplo de linguagem sucinta (ver simplicidade):
. it's tiny
. it's very succinct
. built-in support for web applications
. integrated object-oriented database, with direct bindings between (web) UI widgets and database objects
. actively maintained and improved (around 4 new releases per year, latest release is from Dec 30 2007)
. mostly cross-platform (Linux, Mac OS X, FreeBSD, Cygwin on Windows). Unfortunately it doesn't have native Windows version.
. open-source (GPL)
(picoLisp - Arc before Arc)

Picolisp

Principal artigo, Pico Lisp A Radical Approach to Application Development

PicoLisp in Rosetta Code

Picolisp in Wikipedia

A comparar com OpenLisp

Performance:
   Picolisp and openlisp: new eval speed champions
   PicoLisp takes the performance crown?

domingo, 19 de setembro de 2010

Como formar desenvolvedores

Experiência rica em Unique Software Degree Program Restarted: um programa de graduação em desenvolvimento de software diferente. Tem aprendizado, no sentido dos estudantes serem aprendizes em projetos, escolha de temas para disciplinas dentro de um leque de possibilidades, busca da teoria a partir da prática. O estudante se gradua com projetos realizados em seu currículo, com uma rede de relacionamentos profissionais. Durante o curso, interage com seus pares e com os professores. A avaliação se faz a partir do perfil do estudante, demonstrando domínio de competências e ferramentas práticas e teóricas.

Alguns pontos do programa:
    * People - reminder that our goal is to serve people and that developers must be respected as people
    * Systems - we enhance business and social systems, not simply produce artifacts.
    * Agility - we are interested in results not formalisms
    * Craft - we recognize the development is an art form not a production process
    * Software - the medium in which we practice our art

Observem o penúltimo: desenvolvimento de software como um ofício, eu diria "arte e ofício".

Programar é difícil


Menos conhecidas? Muito importantes e pouco comentadas. Programador tem que trabalhar muito. Programar é difícil. Programador tem que pensar. Há diferenças de produtividade imensas entre bom programador e mau programador.
 
Esta última mostra que programar está mais próximo de criação do que de trabalho sistemático, mais para arquitetura que para engenharia. O que acaba com o mito da engenharia de software.
 
Software é desenvolvido por indivíduos, não por equipes. As várias metodologias que falam em peer programming devem ser reconsideradas.
 
O artigo cita o estudo do Standish Group que mostra melhoras no índice de sucesso de projetos de software. Cuidado, os critérios do Standish Group não são claros, a amostra cobre projetos muito diferentes, e a própria definição de projeto é discutível. Pergunta: a melhora foi na produtividade em software ou no gerenciamento de projeto?
 
Programar é trabalho pesado: as inúmeras formas de "facilitar" a programação, via IDEs, linguagens "fáceis", frameworks prontos, iludem o candidato a programador. Não há caminho suave para um trabalho que exige reflexão.

sexta-feira, 17 de setembro de 2010

Jogos

Muito movimento na área de jogos. Negócios - jogo é business grande - e pesquisa - idéias, pistas, novidades -.

Com sugestões do Gregorio Ivanoff, e material de aula no mestrado da PUC com Alexandre Campos, aqui vão algumas pistas: jogos como forma de cooperação social, jogos educativos (desde animais até qualquer povo, selvagem ou não, crianças aprendem brincando), jogos obras de arte, jogos de pesquisa matemática.

Na cooperação social, explorar a semelhança entre jogos cooperativos e desenvolvimento de software livre. O modelo é o mesmo?

   

  
  
  
Concepção e entrega de um produto feitos socialmente


  
Life game, e aqui e aqui e muitas referências mais

domingo, 12 de setembro de 2010

Simplicidade

Simplicidade. Essencial para obter bom resultado, boa perfomance, boa arquitetura. Próxima de abstração. Difícil de se conseguir.

Exemplo de opinião sobre simplicidade: Google executive frustrated by Java, C++ complexity.


Boris Lublinsky falando de Steve Jones sobre simplicidade, Simple IT: SOA Done Right

Abstração


Tema forte, provavelmente a mais importante de todas as considerações sobre como fazer software: abstração.

É a chave para arquitetar - no sentido de projetar, elaborar, desenhar, design, criar - software.

Historicamente, desde que se programa computadores, houve várias tentativas para formalizar a abstração. Que me parece não ser formalizável.

Do lado programação, tivemos a programação modular, a programação estruturada, a organização de programas e subprogramas em bibliotecas, programação orientada a objetos e correndo em paralelo a todas estas, a programação funcional.

Do lado modelos, tivemos sucessivamente as máquinas abstratas, como Turing ou Von Neuman, precedendo o computador. O computador como o conhecemos até hoje (2010), que é uma máquina de Von Neuman. A linguagem de máquina e linguagem Assembler, passagem essencial do hardware para o software: desaparece a eletronica, surge um modelo de como programar. E depois linguagens de alto nível, procedurais. E de novo, em paralelo, linguagens funcionais.

Muito a dizer e a pensar sobre abstração. Ai vão 2 posts que valem como depoimentos práticos de desenvolvedores de software:

Programming with reason: observem a regra número 1, Abstraction, or "Just Wrap it!". E o tema da simplicidade, outro tema fundamental em programação, "simplicity equals elegance".

So long and farewell to the IDE: não é somente uma crítica, forte e correta, das IDEs. É uma receita de como fazer abstração na prática, no dia a dia do programador.

P ≠ NP by Deolalikar

Pesquisador da HP, publicou (2010) uma prova do famoso desafio matemático-computacional, provar que a classe de problemas P é igual à classe NP.

Muitas referências aí, começando pelo artigo do NYTimes Step 1: Post Elusive Proof. Step 2: Watch Fireworks que denuncia a manobra clássica: publicar uma prova difícil de verificar, aguardar o barulho em torno disso. Até me pergunto se a publicação por um pesquisador da HP não tem também a intenção de desviar atenção do escândalo da demissão do CEO da HP, por pagar despesas de viagem a sua secretária-modelo. Mas mesmo assim, e mesmo que a prova seja demonstrada falha, o que é muito possível, o simples fato de atacar um problema destes já abre caminhos incríveis em matemática e em computação.

Aliás, sem entrar em detalhes, que estão todos nas várias referências, P = NP é claramente problema fundamental em computação e em lógica, tem a ver com definir o que pode ser computado. Nada fácil.

P versus NP

P versus NP problem

A questão "P = NP?"

P vs NP Problem, Clay Institute, que oferece US$1.000.000 a quem resolver este problema, e alguns outros

P vs. NP for dummies, com boas referências e boa discussão

terça-feira, 7 de setembro de 2010

Functional programming = fun.....

Putting the fun in functional programming:  depoimento de um profissional, que trabalhou com OO, foi para programação funcional, gostou, descobriu que pode fazer muito mais com muito menos, que programação funcional é igual a orientação a objetos sem o formalismo pesado. Que em programação funcional os objetos - ou funções - nascem naturalmente, que tendem a ser re-usáveis, que os programas ficam menores e mais expressivos.

Palavra-chave nisso tudo: abstração.  (sobre abstração: vide - e estude - SICP)

"in the OOP world, programming quickly became more about structure and frameworks than about solutions": programação fica burocrática. Acaba a criatividade. Acaba a descoberta de abstrações, o que acontece naturalmente em programação funcional. E não é "fun".