segunda-feira, 18 de fevereiro de 2013

Codigo Fonte do Photoshop 1.0



Para os nerds de plantão o museu de história da computação conseguiu e disponibilizou o código fonte do Adobe Photoshop 1.0! 

O mais legal é que o programa foi feito basicamente em Pascal, que corresponde a 75% do código sendo o restante escrito em assembler e tudo isso distribuído por 128 Arquivos e eu imaginava que havia sido feito em C!

Agora a má noticia, ele foi escrito para o Macintosh com códigos de otimização em assembly para o processador Motorola 6800, então fica difícil baixar o Free Pascal, compilar e conseguir rodar em outro ambiente (se alguém conhecer um emulador de Mac para Motorola 6800, avisa ai!). Mesmo assim pode ser útil para entender como era feito o processamento das imagens caso alguém tenha interesse ou necessidade.

Link para o código o código fonte (é necessário aceitar os termos da licensa):  http://www.computerhistory.org/adobe-ps-source/license/



Via MeioBit

quinta-feira, 14 de fevereiro de 2013

E o programador virou pedreiro!


Qual é o papel atual do programador no projeto de um sistema na industria de software brasileira? Eu digo que é de pedreiro e explico o motivo!

No inicio da era da informática, a atividade de programação era tudo em um projeto de software. A criação de um sistema era considerada uma arte. Cabia ao programador criar sistemas que controlavam os misteriosos e novos computadores utilizando uma linguagem compartilhada entre eles e as máquinas. Essa atividade era executada por “gente estranha”, normalmente engenheiros que viravam a noite se dedicando a entender a língua das máquinas de modo a poder “conversar” com elas. Os sistemas criados por eles, normalmente, eram muitos específicos e muito ligado ao hardware. Muitas vezes, a programação era considerada uma ação secundária e vinculada ao projeto de hardware.

Com a evolução dos computadores e sua rápida disseminação, surgiram novas linguagens de programação de modo a facilitar criação dos softwares e a permitir que eles fossem compartilhados entre máquinas diferentes e pudessem realizar as mais diversas tarefas. O software, nesse momento, começa a ocupar um papel importante nas organizações, sendo responsável pela automatização de diferentes tarefas. O hardware se torna secundário e o software assume a frente.

quarta-feira, 2 de janeiro de 2013

Otimização e Boas Práticas de Programação!


O Sérgio Taborda escreveu um excelente artigo sobre otimização preventiva de código. Concordo com ele em quase tudo, só não considero alguns casos como otimização que, a meu ver, são boas práticas!

Primeiramente, deve se entender o que é otimização. Conforme o dicionário Aurélio, otimização, vem de otimizar cuja a definição para a informática é:
Aperfeiçoar (um programa, rotina, etc) a fim de que ele realize sua função no menor tempo ou no menor número de passos possível. 
Só que um problema deve utilizar somente o número de passos necessários a sua resolução e nada mais e isso não ocorre nos casos abaixo, similares a exemplos colocados pelo Sérgio:
void fazAlgo(boolean ok){
  if(ok == true){
    //faz alguma coisa
  }
  else {
    //faz outra coisa
  }
...

private Set<Cliente> clientes;

void buscaCliente(cpf CPF){
  Cliente resposta;
  for(Cliente cliente : clientes){
    if (cliente.getCpf.equals(cpf))
      resposta = cliente;
  }
  return resposta;
}
Na função fazAlgo (desconsiderando possáveis otimização do compilador) a verificação é desnecessária, pois são feitas duas operações ao invés de uma). Na função buscaCliente a iteração continua mesmo que tenha encontrado o cliente na primeira iteração! Em ambos os casos temos um problema de desempenho por más praticas de programação na minha opinião!

As soluções de ambas são simples, e explicadas pelo Sérgio (deixa de ser preguiço e vai ler o post dele dele), mas não acredito que sejam "otimizações". Uma otimização possível do exemplo acima, que também foi exemplificado por ele, seria substituir o Set por um Map assim na busca de clientes teríamos um ganho de desempenho pois teríamos apenas uma operação sendo feito ao invés de N conforme exemplo abaixo. Nesse caso, temos realmente uma otimização preventiva.

private Map<CPF, Cliente> clientes;
void buscaCliente(cpf CPF){
  return clientes.get(cpf);
}
Para concluir, a minha intenção ao escrever este texto é ressaltar a importância da diferença entre otimização e a alteração de código para corrigir problemas oriundos de más práticas programação. Más praticas devem ser combatidas e otimização devem ser feitas com moderação pois podem introduzir erros ou tornar o código confuso e de difícil manutenção. Conforme o citação retirado do livro Java Efetivo, de Joshua Bloch (o qual recomendo a leitura veementemente)
Mais erros de computação são cometidos em nome da eficiência (sem necessariamente atingi-la) do que por qualquer outra razão - inclusive a simples ignorância!
 Então evite as más práticas e otimize com moderação!