Mostrando postagens com marcador programming. Mostrar todas as postagens
Mostrando postagens com marcador programming. Mostrar todas as postagens

sexta-feira, setembro 21, 2007

Ciência da Computação ?!

"Ciência da Computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas."

sexta-feira, março 16, 2007

Aprenda a programar em dez anos

Peter Norvig
Tradução por Augusto Radtke
Porque todo mundo tem tanta pressa?

Entre em qualquer livraria, você vai ver Aprenda Java em 7 dias assim como diversas variações oferecendo lições de Visual Basic, Windows, Internet e por ai vai, em dias ou horas. Eu fiz a seguinte pesquisa na Amazon.com:

pubdate: after 1992 and title: days and

(title: learn or title: teach yourself)

e encontrei 248 entradas. As primeiras 78 eram livros sobre computadores (número 79 era Learn Bengali in 30 days). Troquei “dias” por “horas” e encontrei resultados incrivelmente similares: 253 livros, 77 de computadores, seguidos de Teach Yourself Grammar and Style in 24 Hours no número 78. Do total de 200, 96% eram livros de computadores.

A conclusão é que ou as pessoas estão com muita pressa de aprender sobre computadores, ou computadores são extremamente fáceis de aprender do que qualquer outra coisa. Não há livros de como aprender Beethoven, ou Física Quântica ou até adestramento de cães em alguns dias.

Vamos analisar o que um título como Learn Pascal in Three Days
pode significar:

  • Aprenda: Em três dias você não terá tempo de escrever programas significantes, e aprender com seu sucesso ou fracasso. Você não terá tempo para trabalhar com um programador experiente e entender o que é conviver neste ambiente. Em resumo, você não terá tempo para aprender muito. Logo eles só podem estar falando a respeito de entendimento supercial, como disse Alexander Pope, aprender pouco é uma coisa perigosa.
  • Pascal: Em três dias você deve ser capaz de aprender a sintaxe do Pascal (isso se você já conhece uma linguagem similar), mas não vai aprender muito sobre como utilizar essa sintaxe. Em resumo, se você era, vamos dizer, um programador Basic, você pode aprender a escrever programas no estilo Basic usando a sintaxe do Pascal mas não aprender em que o Pascal é bom (ou ruim). Então, qual o ponto? Alan Perlis disse certa vez: “Uma linguagem não afeta a maneira que você pensa sobre programação”. Um ponto é se você precisar aprender um pouco de Pascal (ou algo como Visual Basic ou Javascript) porque você precisa interagir com alguma ferramenta existente para uma tarefa específica. Mas nesse caso você não esta aprendendo a programar, você está aprendendo a como resolver essa tarefa.
  • em três dias: Infelizmente, não é suficiente, como veremos a seguir.

Aprenda a Programar em Dez Anos.


Pesquisadores (Hayes, Bloom) tem demonstrado que leva em torno de dez anos para desenvolver perícia em qualquer de uma variedade de áreas, includindo jogar xadrez, compor músicas, pintar, tocar piano, nadar, jogar tênis e pesquisar neuropsicologia ou topologia. Aparentemente não há atalhos: até Mozart, que foi um prodígio musical aos 4 anos levou mais 13 antes de compor música de primeira classe. De outra forma, ou Beatles parecem ter disparado nas paradas em primeiro lugar com a aparição no show do Ed Sullivan em 1964. Mas eles estavam tocando em pequenos clubes em Liverpool e Hamburgo desde 1957, e mesmo que eles conseguiram uma aparição em masa, o primeiro grande sucesso mesmo, Sgt. Peppers, foi lançado em 1967. Samuel Johnson pensa que pode levar mais do que dez anos: “Excelência em qualquer departamento pode ser alcançada apenas com o trabalho de uma vida toda; não é possível compra-lá por menos.” E Chaucer reclamou: “vida tão curta, leva tantu pra aprender.” Sim, é “tantu”, e não “tanto”, um dia você entende.

Então aqui vai minha receita para sucesso na programação:

  • Aprenda inglês. Leia o original deste texto. Essa tradução só está aqui para exercitar o meu inglês, não o seu. (Nota do tradutor)
  • Se interesse por programação, e faça porque é legal. Tenha certeza que isso continue a ser legal para você dedicar dez anos nisso.
  • Converse com outros programadores; leia outros programas. Isso é mais importante do que qualquer livro ou curso de treinamento.
  • Programe. O melhor tipo de aprendizado é aprender fazendo.
    Colocando de uma forma mais técnica, “o nível máximo de performace individual em um domínio é não é alcançado automaticamente em função de uma experiência extendida, mas sim aumentado mesmo por indivíduos extramente experientes por um esforço deliberativo de melhorar.” (p. 366) e “o aprendizado mais efetivo requer uma tarefa bem definida com uma dificuldade apropriada para o indivíduo em particular, dado que exista um retorno sobre a experiência e oportunidades de repetição e correções de erros.” (p. 20-21) do livro
    Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life
    , que é uma referência interessante deste ponto de vista.
  • Se você quiser, gaste quatro anos em uma universidade (ou mais em uma pós-graduação). Isso lhe dará acesso a alguns empregos que requerem alguma formação e um grande entendimento do campo de trabalho, mas se você não gosta muito de ir para escolha, você pode (com alguma dedicação) conseguir alguma experiência similiar sobre esse tipo de trabalho. Em qualquer caso, apenas ler livros não será suficiente.
    “Educação em ciências da computação não faz de ninguém um gênio em programação tanto quanto estudar pincéis e pigmentos não fazem um bom pintor.” diz Eric Raymond, autor de The New Hacker’s Dictionary. Um dos melhores programadores que eu já contratei tinha apenas o segundo grau, e ele produziu vários softwares incríveis, tem seu próprio grupo de discussão,
    e fez dinheiro suficiente em ações para comprar seu próprio clube nortuno.
  • Trabalhe em projetos com outros programadores. Seja o melhor programador em alguns projetos, seja o pior em outros. Quando você é o melhor você testa suas habilidades para liderar um projeto, e para inspirar outros com a sua visão. Quando você é o pior aprende o que os mestres ensinam e o que não gostam de fazer (porque eles fazem você fazer por eles).
  • Trabalhe em projetos após outros programadores. Esteja envolvido em entender um programa
    escrito por outro. Veja o que é preciso para entender e consertar quando o programador original não esta por perto. Pense em como desenvolver seus programas para que seja fácil para quem for mante-lós após você.
  • Aprenda pelo menos meia dúzia de linguagens de programação. Includa na lista uma linguagem orientada a objetos (como Java ou C++), uma que seja de abstração funcional (como Lisp ou ML), uma que suporte abstração sintática (como Lisp), uma que suporte especificação declarativa (como Prolog ou C++ com templates), uma que suporte co-rotinas (como Icon ou Scheme), e uma que suporte paralelismo (como Sisal).
  • Lembre-se que há um “computador” em “ciência da computação”. Saiba quanto tempo leva para o seu computador computar uma instrução, carregar uma palavra ad memória (com e sem cache), ler palavras consecutivas do disco rígido, procurar por uma nova posição no disco.(As respostas estão aqui.)
  • Se envolva no esforço de padronização de uma linguagem. Pode ser o comite ANSI C++, ou na padronização de programação na sua empresa, se utilizaram identação com 2 ou 4 espaços. Em qualquer caso, você aprende o que outras pessoas gostam em uma linguagem, o quanto eles gostam e talvez um pouco do porque eles gostam.
  • Tenha o bom senso de cair fora desse processo de padronização tão rápido quanto possível.

Com tudo isso em mente, é questionável o quão longe você pode ir apenas lendo livros. Antes que do meu primeiro filho nascer eu li todos os livros de Como Fazer e ainda me sentia como um novato. Trinta meses depois, quando nasceu meu segundo filho, voltei aos livros para relembra? Não, ao invés disso resolvi utilizar minha experiência pessoal do primeiro filho, que se tornou muito mais útil do que milhares de páginas escritas por especialistas.

Fred Brooks, em seu trabalho No Silver Bullets identificou um plano em três partes para encontrar grandes projetistas de software:

  1. Sistematicamente identifique os melhores projetistas o quanto antes.
  2. Atribua um orientador de carreira responsável pelo desenvolvimento cuidadosamente de um plano de carreira
  3. Promova oportunidades para desenvolvedores em aprendizado interagir e estimular uns aos outros.

Isto assumo que algumas pessoas já possuem as qualidades necessárias para ser um grande desenvolvedor de software; o grande trabalho é apenas coloca-los no caminho correto. AlanPerlis coloca de forma mais sucinta: “Qualquer um pode ser ensinado a esculpir: Michelangelo precisaria ser ensinado a não esculpir. É o mesmo com grandes programadores”.

Então vá em frente e compre aquele livro de Java; provavelmente você terá algum uso dele. Mas isso não vai mudar a sua vida, ou o seu conhecimento como um programador em 24 horas, dias, ou meses.

Referências

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.

Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

Respostas

O tempo aproximado de execução de várias operações num PC típico de 1Ghz no verão de 2001:

executar uma instrução simples 1 nseg = (1/1,000,000,000) seg
extrair uma palavra da memória L1 2 nseg
extrair uma palavra da memória RAM 10 nsec
extrair uma palavra consecutivamente do disco rígido 200 nseg
extrair uma palavra de uma nova posição o disco (busca) 8,000,000nseg = 8mseg

Apêndice: Escolha de Linguagem

Muitas pessoas tem me perguntado sobre qual linguagem devem aprender primeiro.

Não há resposta, mas considere estes pontos:

  • Use os seus amigos. Quando me perguntam “que sistema operacioal devo usar, Windows, Unix ou Mac?” minha resposta geralmenet é: “use o que seus amigos usarem”. A vantagem é que você poder aprender com os seus amigos vence qualquer diferença entre sistemas operacionais ou linguagens. Considere também seus futuros amigos: a comunidade de programadores que você fará parte se continuar. A sua escolha possuia uma grande comunidade de usuários ou apenas uma comunidade morta? Existem livros, sites e fórums para encontrar respostas? Você gosta das pessoas desses fórums?
  • Mantenha-se simples. Linguagens como C++ ou Java são desenvolvidas para utilização profissional por um grande time de desenvolvedores experientes que estão preocupados com a eficiência de execução de seus códigos. Como resultado, essas linguagens possuem partes complicadas desenvolvidas para essas circunstâncias. Você esta focado em aprender a programar, não precisa dessa preocupação. Você precisa de uma linguagem que foi desenvolvida para ser fácil de aprender e lembrar.
  • Interaja. Como normalmente você aprenderia piano: de modo interativo, no qual você escuta uma nota logo que pressiona uma tecla ou de um modo automizado em que você escuta cada nota quando a música termina de tocar? Claramente, aprender interativamente é muito mais fácil, e assim é com a programação. Insista em uma linguagem com um modo interativo e use-o.

Baseado nesses critérios, minhas recomendações para uma primeira linguagem seria Python ou Scheme. Mas as suas circunstâncias podem variar, e existem
outras boas opções. Se a sua idade ainda tiver apenas um dígito, é melhor escolher Alice ou Squeak (aprendizes mais velhos podem gostar também). O importante é você escolher e começar.

Apêndice: Livros e outros recursos

Muitas pessoas me perguntam em quais livros e páginas elas devem aprender. Eu repito que “apenas ler livros não é suficiente” mas eu posso recomendar o seguinte:

Notas

T. Capey informa que a página de Complete Problem Solver na Amazon agora possui “Teach Yourself Bengali in 21 days” e “Teach Yourself Grammar and Style” na lista de livros que “Consumidores que compram esse item também costuma comprar estes”.

Eu imagino que um grande parte das pessoas que visualizam esse livro vem dessa página.




segunda-feira, julho 10, 2006

Linguagem de programação anima festas britânicas

Um novo tipo de DJ está transformando programação em performance. Adeptos do "Livecoding" improvisam usando Perl, C++ ou arquiteturas de programação próprias para criar composições a partir do zero, substituindo instrumentos e samples pela autoria de código em tempo real diante de uma platéia.

Alex Maclean, um "livecoder" britânico e estudante de arte, afirma ter desistido de sua guitarra quando descobriu que poderia ser mais criativo usando linguagem de programação de computadores no lugar de cordas. Ele toca digitando código Perl em raves e boates, criando uma experiência musical e visual única.

As sessões com bateristas, MCs e outros "livecoders" podem ser comparadas à improvisação característica do free-jazz, afirma um artigo na Wired News.

Maclean escreveu seu próprio editor de texto, chamado Feedback.pl, que recompila seus programas continuamente através de um computador dedicado. Cada toque em uma tecla constrói uma melodia enquanto o cursor adiciona e substitui funções e variáveis de tempo. O processo de composição é projetado em telões.

Os "livecoders" formaram um grupo internacional chamado TOPLAP, que já conta com 200 membros. Para eles, as performances são um "desafio filosófico". Enquanto alguns preferem linguagens populares como Perl, outros preferem criar sua própria linguagem. Plataformas de código aberto como SuperCollider e Chuck, escrita no Laboratório de Sons da Universidade de Princeton, ganham o status de uma guitarra Fender entre os entusiastas do teclado.

No festival LiveCoda em Melbourne, na Austrália, uma multidão se reuniu em maio para ver times de graduandos em ciência da computação competir para debugar algoritmos de compressão de imagens em uma tela gigante, acompanhados por DJs.

Nos últimos meses o movimento tem ganhado cada vez mais adeptos ao redor do globo, especialmente entre os fãs de música eletrônica.

sexta-feira, setembro 02, 2005

Como programadores matam dragões

A SITUAÇÃO:
“No alto do castelo, há uma linda princesa - muito carente - que foi ali trancada, e é guardada por um grande e terrível dragão”

Art by Rowena

OS DESFECHOS NA ABORDAGEM DE CADA ESTILO:


Java
- Chega, encontra o dragão, desenvolve um
framework para aniquilamento de dragoes em multiplas
camadas, escreve varios artigos sobre o framework mas
nao mata o dragao

.NET - Chega, olha a ideia do Javanes e a copia, tenta
matar o dragao, mas é comido pelo reptil

C - Chega, olha para o dragao com olhar de desprezo,
puxa seu canivete, degola o dragao, encontra a
princesa, mas a ignora para ver os ultimos checkins no
cvs do kernel do linux

C++ - cria um canivete basico e vai juntando
funcionalidades até ter uma espada complexa que apenas
ele consegue entender ... mata o dragao mas trava no
meio da ponte por causa dos memory leaks

COBOL - Chega, olha o dragao, pensa que ta velho
demais para conseguir matar um bicho daquele tamanho e
pegar a princesa e, então, vai embora

Pascal - Se prepara durante 10 anos para criar um
sistema de aniquilamento de dragao ... chegando lá
descobre q o programa só aceita lagartixas como
entrada

VB - monta uma arma de destruição de dragoes a partir
de varios componentes, parte pro pau pra cima do
dragao e, na hora H, descobre que a espada só funciona
durante noites chuvosas...

PL/SQL - Coleta dados de outros matadores de dragão,
cria tabelas com N relacionamentos complexidade
ternaria, dados em 3 dimensões, OLAP, demora 15 anos
para processar a informação. Enquanto isso a princesa
virou lésbica

Ruby - chega com uma p*t* fama, falando que é o melhor
faz tudo, quando vai enfrentar o dragão mostra um
videozinho dele matando um dragao ... o dragão come
ele de tédio

Smalltalk - chega, analisa o dragao e a princesa, vira
as costas e vai embora, pois eles sao muito
inferiores.

shell - cria uma arma poderosa para matar os dragoes,
mas, na hora H, nao se lembra como usá-la

shell(2) - o cara chega no dragão com um script de 2
linhas que mata, corta, stripa, empala, pica em
pedacinhos e impalha o bicho, mas na hora q ele roda o
script aumenta, engorda, enfurece, e coloca alcool no
fogo do dragão

ASSEMBLY - acha que ta fazendo o mais certo e enxuto,
porém troca um A por D, mata a princesa e transa com o
dragão

Fortran - Chega desenvolve uma solução com 45000
linhas de codigo, mata o dragão vai ao encontro da
princesa ... mas esta o chama de tiuzinho e sai
correndo atras do programador java que era elegante e
ficou rico

FOX PRO - Desenvolve um sistema para matar o dragão,
por fora é bunitinho e funciona, mas por dentro está
tudo remendado, quando ele vai executar o aniquilador
de dragoes lembra que esqueceu de indexar os DBF

ANALISTA DE PROCESSOS - Chega ao dragão com duas
toneladas de documentação desenvolvida sobre o
processo de se matar um dragão genérico, desenvolve um
fluxograma super complexo para libertar a princesa e
se casar com ela, convence o dragão que aquilo vai ser
bom pra ele, e que não será doloroso. Ao executar o
processo ele estima o esforço e o tamanho do estrago
que isso vai causar, a assinatura do papa, do buda e
do Raul Seixas para o plano, e então compra 2 bombas
nucleares, 45 canhões, 1 porta aviões, contrata 300
homens armados até os dentes, qdo na verdade
necessitaria apenas da espada que estava na sua mão o
tempo todo.

CLIPPER: Monta uma rotina que carrega um array de codeblocks para
insultar o dragão, cantar a princesa, carregar a espada para memória, moer
o dragão, limpar a sujeira, lascar leite condensado com morangos na
princesa gostosa, transar com a princesa, tomar banho, ligar o carro,
colocar gasolina e voltar pra casa. Na hora de rodar recebe um "Bound
Error: Array Access" e o dragão come ele com farinha.


original: http://www.tipos.com.br/item/27829
chupinhado:
http://www.javafree.org/javabb/viewtopic.jbb?t=850780

segunda-feira, julho 25, 2005

Star Wars - JDK 5.0-compliant story behind "Revenge of the Sith"


public class Princess implements ExecutorService {
public static final Princess PADME = new Princess();

// private member
private StarShip ship;


private Princess() {
this.setDefaultLocale(Locale.EN);
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
Princess.this.changeHairStyle();
Princess.this.changeClothes();
}
};
timer.scheduleAtFixedRate(task, new Date(), 1000);
}
}

public class JediKnight implements ExecutorService {
public static final JediKnight ANAKIN = new JediKnight(false);
public static final JediKnight OBI_WAN = new JediKnight(false);
public static final JediKnight YODA = new JediKnight(true);

private JediKnight(boolean isYoda) {
if (!isYoda) {
this.setDefaultLocale(Locale.EN);
}
else {
Locale yodaLocale = Locale.EN;
this.setDefaultLocale(Utils.shuffle(yodaLocale));
}
this.setLightSabre(LightSabreFactory.getInstance());
this.setGoodLooking(!isYoda);
}
}

public class Sith {
public static final Sith LORD = new Sith();

private Sith() {
this.setDefaultLocale(Locale.EN);
this.setClothes(DarkRobeFactory.getInstance());
this.setLightSabre(LightSabreFactory.getInstance());
}
}

public static main() {
// The following line has been commented out so as not
// to confuse fans who never did it

// Utils.initChildren(JediKnight.ANAKIN, Princess.PADME);

// Use JDK 5.0 concurrency package
Future> padmeFuture = Princess.PADME.submit(
new Callable>() {
public Set call() {
try {
int weeks = (int)(36+4.0*Math.random());
wait(weeks*7*24*60*60*1000);
this = null;
System.gc();
}
finally() {
Child boy = new Child("Luke");
Child girl = new Child("Leia");
Set result = new HashSet();
result.add(boy);
result.add(girl);
return result;
}
}
}
);

if (JediKnight.ANAKIN.poll(padmeFuture) instanceof ThreadDeath) {
JediKnight.ANAKIN.alarm();

// use some marketing ideas
Sith.LORD.promise(JediKnight.ANAKIN, new RuntimePermission("object.restore.afterGC"));
Sith.LORD.promise(JediKnight.ANAKIN, new RuntimePermission("force.power.dark.*"));
Sith.LORD.promise(JediKnight.ANAKIN, new RuntimePermission("force.power.*"));
Sith.LORD.promise(JediKnight.ANAKIN, new RuntimePermission("force.*"));

JediKnight.ANAKIN.setInternalName("Darth Vader");

JediKnight.ANAKIN.promise(Princess.PADME, new RuntimePermission("*"));

Princess.PADME.alarm();
Princess.PADME.boardShip();

// Use JDK 5.0 concurrency package
Future anakinFuture =
JediKnight.OBI_WAN.submit(
new Callable() {
public RuntimePermission call() {
try {
Class princessClass = Princess.getClass();
Field shipField = princessClass.getDeclaredField("ship");
// will never throw SecurityException on Jedi Knight
shipField.setAccessible(true);
JediKnight.this.add(new RuntimePermission("object.ship.board.*"));
return (StarShip)shipField.get(Princess.PADME);
}
catch (SecurityException se) {
// never supposed to happen to Jedi Knight
System.out.println("Internal error. Contact George Lucas.");
System.reboot();
}
}
}
);

StarShip padmeShip = anakinFuture.call();
padmeShip.put(JediKnight.OBI_WAN);

JediKnight.ANAKIN.see(Princess.PADME);
Princess.PADME.removeLove(JediKnight.ANAKIN);

JediKnight.ANAKIN.see(JediKnight.OBI_WAN);
JediKnight.ANAKIN.removeLove(Princess.PADME);

JediKnight.OBI_WAN.removeLimbs(JediKnight.ANAKIN);
// note - absolutely no need for GC, Anakin will be collected automatically.

ReferenceQueue sithWatchList = new ReferenceQueue();
PhantomReference anakinRef = sithWatchList.remove();
JediKnight anakinPhantom = anakinRef.get();

Sith DARTH_VADER = Sith.LORD.assemble(anakinPhantom, LimbFactory.getSpareInstances());
MouthPiece newMouthPiece = MouthPieceFactory.getInstance();
// no need to check that it works - guaranteed to work with no noise
DARTH_VADER.add(newMouthPiece);
DARTH_VADER.rise();
}
else {
// TODO - create alternative scenario for Sith revenge
}
}