13 maio 2010

Porque o Twitter é genial?

Estava eu saindo pra capoeira encafifado com uma questão do mestrado. Antes de sair, resolvi desabafar a dúvida, rogando a dúvida pra quem a merecia, via Twitter:


12:01: brunopedroso: @KentBeck , do u think it is possible to grow a quick-sort from TDD?
12:12: KentBeck: .@brunopedroso i think you could tdd quicksort. you'd need assertions about the # of comparisons & ways to incrementally improve the count
12:20: the_chrismo: @KentBeck with the karate chop kata (http://bit.ly/aPh2y6) I started to expose comparisons, but felt it revealed internals too much ...
 12:23: the_chrismo: @KentBeck ... though without doing those, there's no direct assertion of the efficiency of the algorithm.
12:29: KentBeck: .@the_chrismo i think you'd have to introduce a Comparator & be able to plug in one that keeps a count.
13:55: the_chrismo: @KentBeck ah, nice. makes me want to go back and try that.
12:25: brandheintz: .@KentBeck I'd be interested to see that - would be a crack in the "TDD can't guarantee good algorithms" argument.
12:30 KentBeck :.@bradheintz only people can guarantee good algorithms. tdd can certainly be used to assure that they are used, tho.
13:52: brandheintz: .@KentBeck True, but yr notion of pushing toward better algos through smart use of constraints has appeal.
12:18: davenicolette: @KentBeck @brunopedroso That sounds like it could be a good kata.
12:37: asplake: .@KentBeck @bradheintz TDD for algorithm design seems to verge onto "halting problem" territory
12:38 : KentBeck: .@asplake i don't see why. you need an n log n algorithm. give it n inputs. count the operations. assert that < n log n of them took place.
12:40: asplake: .@KentBeck right. And prove that there are no pathological cases?
12:46 : KentBeck.@asplake that's out of scope for tdd. once you find one, you can write a test to demonstrate it.
14:09: the_real_pablosan: @brunopedroso I have tried growing a binary search from TDD: http://salientblue.com/codenotes/index.html?name=kata2Java01

O que tem de fantástico nisso?

A parte do conteúdo da conversa, que pra mim foi um prato cheio, perceba o que o twitter tornou possível: Primeiro de tudo: *o cara* me respondeu!!!! :-) Segundo: outras cinco pessoas se envolveram na conversa e fizeram indicações e comentários interessantíssimos algumas das quais eu nunca tinha ouvido falar (até agora, pois agora eu sigo os 4...)

Em que outro meio de comunicação essas 7 pessoas conseguiriam se encontrar para fazer comentários sobre uma questão tão específica?!

Internet? Não, não foi a internet, apenas... foi o Twitter!


A internet já estava aí há muitos anos (antes do twitter aparecer) e isso ainda não era possível... Nunca teríamos conseguido ter essa conversa por email, nem por chat, nem por nada! Tanto é que não as tínhamos!

7 pessoas, em 7 lugares diferentes do mundo tiveram uma conversa profunda a respeito de um assunto muito específico que os interessa. E o que é mais incrível: em questão de minutos! É quase tão rápido quanto se os 7 tivessem se esbarrado numa sala de conferência entre duas palestras e ficássem jogando conversa fora por 20 minutos! Só que estávamos cada um em sua casa ou em seu escritório.

(Ah, ganhei mais 5 seguidores e passei a seguir + 4)

Sinistro!

02 maio 2010

Pesquisa sobre TDD

Estou bastante envolvido com a pesquisa para minha dissertação de mestrado, que pretendo desenvolver até o fim do ano, se Deus quiser.

Nas útimas semanas tenho passado por uma turbulência forte, mas de um jeito ou de outro vamos chegar no final :-)

A boa nova é que começamos a cooperar mais de perto eu, a Cláudia e o Maurício. Estamos tendo boas disscussões. Espero que saia alguma coisa boa daí!


Pra quem esta interessado em ler um pouco a respeito, eu havia publicado aqui algumas referências no começo da pesquisa, ano passado. Prometo atualizar essa lista em breve!

O mauricio tb compartilhou algumas referências e um paper que ele apresentou no 1st International Workshop on Test-Driven Development (TDD2010). (Parabéns Mauricio \o/).

Outra referência legal é a edição especial que o IEEE lançou em 2007 sobre TDD. (Siga os links '2007 vol.24' e depois 'Issue No. 3 - May/June', não consegui achar um link direto :-/), sobre a qual a InfoQ publicou uma entrevista muito boa com o Erdogmus.

Eu publiquei uma besterinha na XP2010 sobre minha opinião quanto aos estudos que pesquisei (uhuuuu!) Assim que tiver um link eu posto aqui. Pretendo disponibilizar outros textos que escrevi até agora. Vou me organizar e coloco os links por aqui em breve.

Seria legal fortalecermos e unirmos mais os grupos de pesquisa em TDD no Brasil. Se vc tb está nessa (ou se pretende entrar) deixe um comentário ou entre em contato de qq outra forma e vamos unir as forças! Ou pelo menos trocar algumas figurinhas ;-)

o/

05 março 2010

Learn some Javascript!

Fiquei impressionado com a qualidade da revista PragPub.

Em especial, adorei o artigo sobre javascript que aponta na direção de mais uma bela reviravolta no mundo das tecnologias de desenvolvimento para web.

Quem diria? A linguagem de programação que há aguns anos nem era considerada uma linguagem de programação de verdade por muitos, agora começa a mostrar sinais de que vai entrar pra briga do lado do servidor, enfrentando Java, C#, Ruby, Python, PHP, etc. E parece que já vai entrar na vantagem!

Sendo a linguagem padrão no lado dos navegadores, e relativamente bem conhecida pelas tribos de todas as outras tecnologias, acho bem provável que se torne o esperanto das linguagens de programação, pelo menos dentro do contexto da web (que parece estar mesmo engolindo tudo, então dá na mesma...)



E mais: estando a comunidade e todo o eco-sistema de frameworks nascendo agora, durante a hype da programação distribuida de alta performance - Erlang, Scala, Clojure e afins - parece que o pensamento funcional e distribuído, a lá Google e seu MapReduce, já está nascendo nas entranhas dos novos projetos que surgem. (O que é também bastante sincronizado com as reformulações nos paradigmas de dados, noSQL's, e afins).

Com toda a hype do Ajax, Prototype (e agora JQuery), Scriptaculous, e framework de interface rica praticamente WYSIWYG (programadores Delphy adoraram!), e depois que linguagens dinâmicas como Ruby e Python mostraram que a tipagem estática e a velocidade do código compilado não são assim tãããããão importantes, parece que o Javascript vem ganhando ainda mais popularidade.

De minha parte, fico satisfeito em saber que os novos frameworks já estão nascendo também com seu legado metodológico ágil, como uma infra-estrutura decente para TDD/BDD, e espero que herdem muito do modelo de programação ágil embutido no framework, a exemplo de Rails e cia.

Para arrematar, deixo o comentário de que gostei muito também, no tal artigo (e ao que parece em toda a revista), da relevância dada aos aspectos sociais e culturais inerentes à tecnologia. Dêem uma olhada na revista, acho que vão gostar também!

02 novembro 2009

Quem pode te interromper?


Remédio ou veneno? A diferença está na dose. Eis aqui uma breve reflexão sobre como a tecnologia pode acabar com a sua produtividade.

Não sei você, mas eu sempre tive dificuldade em me concentrar em algumas coisas. Leitura é uma delas. Se alguém passa na rua conversando sobre qualquer coisa que dê pra escutar, lá se vai minha leitura. Por isso eu só leio com fone de ouvido. De preferência ouvindo músicas conhecidas e instrumentais, que não vão surpreender minha mente e tirar minha atenção do texto.

Outras pessoas, como meu irmão, afundam a cara no que quer que estejam lendo e entram numa espécie de transe do qual só saem no terceiro grito, depois de já termos esperneado bastante em sua frente.

Alguns tipos de trabalho exigem um tempo relativamente longo de concentração, para que se possa enxergar toda uma linha de raciocínio até que se alcance os pontos de decisão realmente importantes.


Acontece que ultimamente tem se tornado cada vez mais difícil se concentrar no que quer que seja. Celular, SMS, Messenger, Twitter, Email. São todas ferramentas maravilhosas de comunicação, mas que podem acabar com a produtividade de qualquer um.

O celular é ótimo pra ilustrar isso. Seu celular tem autorização pra te interromper quando... você está lendo? quando está escrevendo? quando vc está no cinema? Quando está em reunião? Quando está no banheiro?! Tem gente que sai correndo, todo borrado, pra atender o celular a tempo...


Somos nós quem determinamos quando e como os meios de comunicação podem nos interromper. Pare pra pensar! A decisão está nas pequenas coisas. Quando seu celular vai pro "silencioso"? Quem tem seu telefone de casa? Vc deixa seu email sempre aberto na janela de trás? Twitter? Messenger?

Em tempos de escassa atenção, saber usar os meios de comunicação pode ser tão importante quanto saber gastar ou aplicar seu dinheiro.

25 outubro 2009

O Trabalho no mundo 2.0



Nessa virada de século, o Trabalho (com T maiúsculo) passa por um processo de reformulação comparável ao que aconteceu na revolução industrial. A demanda por trabalhos criativos e a situação global como um todo mostram a necessidade de reformular os antigos processos e métodos à luz de mudanças importantíssimas que vêm ocorrendo em nossa sociedade, em especial o surgimento da Internet e todas suas consequências. O desenvolvimento de software e a cultura hacker possuem papel fundamental nessa mudança, assim como o próprio uso de computadores e programas pela sociedade. Fazem surgir - dentre outras coisas - novas técnicas, métodos, metodologias e processos de trabalho mais afins com a natureza do que estamos realizando (a sociedade como um todo), as quais cito nesse texto, por enquanto, apenas como fonte de pesquisa, motivação e conselho.

Já faz algum tempo que me interesso por metodologias, processos e coisas assim. Não é a toa que são as palavras no cartão de visitas do blog.

Nos últimos meses, tenho percebido varias coisas novas surgindo e se encaixando à minha frente. Já percebo sua correlação não é de hoje - venho filosofando isso com o Alê e com o Willi desde as primeiras conversas que culminaram no manifesto 2.0 - mas até alguns dias atrás essas coisas ainda não tinham se encaixado como um todo em minha cabeça.

Dentre os últimos arrebatamentos que ajudaram a unir as pontas, pra mim, está sem dúvida esse filme do TED, em que Dan Pink ajuda a distinguir claramente dois tipos de trabalhos (repetitivo e criativo), e de que forma isso influencia nas relações de trabalho.

A palestra do Akita na RailsSummit também se encaixou como uma luva nisso tudo. Mas foi a palestra do Roy Singham no Ágiles2009 quem realmente montou o cubo mágico que venho mastigando por pelo menos dois anos.

Talvez o ponto chave pra mim tenha sido me tocar da amplitude da influencia que o modelo de trabalho sequencial, "industrial", teve sobre a maioria dos processos e atividades realizadas durante o século XX. Já usei bastante em minhas apresentações e textos a imagem de processos sequenciais e a herança que esse modelo teve na indústria de software, mas nunca tinha me tocado do quanto essa influência foi além do nosso mundinho geek.


O modelo de fábrica

O modelo de trabalho industrial influenciou de forma muito marcante praticamente todas as formas de trabalho no último século. Basta pensar na forma como estão estruturados até os processos mais "humanos" de nossa sociedade: educação, alimentação, comunicação, saúde. Pense nos processos administrativos e burocráticos... Todos eles são estruturados em formas de trabalho muito semelhantes às das indústrias têxtil e automobilística. Quanta informação uma atendente precisa dar à outra para que ela continue o trabalho de montar o seu sanduiche?


O modelo de trabalho de fábrica é caracterizado por sua natureza sequencial, composta por especialistas que se comunicam por meio de interfaces estreitas, rígidas, e bem definidas. Os trabalhos realizados por eles, sobrepostos, resultam no produto final. É o que, em computação, chamamos de pipeline.

Esses processos primam pela repetição, monitoramento e visibilidade como ferramentas de controle do tempo, dos custos e do escopo do trabalho. Valorizam a rastreabilidade e o comprometimento de culpados, baseados em métricas objetivas, punições e recompensas. São muito eficazes para trabalhos repetitivos e mecânicos, razão pela qual mudaram a vida humana no último século.

Acontece que os avanços tecnológicos das últimas décadas vêm transformando o trabalho novamente. Seres humanos são cada vez menos necessários para realizar as tarefas repetitivas, e os trabalhos criativos têm se tornado cada vez mais importantes. Nesse novo mundo as velhas formas de trabalho não funcionam muito bem. Pipelines são péssimos para trabalhos criativos e colaborativos, assim como políticas de recompensa e punição, horário controlado, comando e controle, etc.

Nesse cenário, novos processos e métodos estão surgindo que se adequam muito melhor à natureza do trabalho criativo, que ao que tudo indica será uma das faces do século que inauguramos. O Alê chamou essas formas de "2.0". Eu uso também termos como "a nova forma", mas é preciso alertar que não pretendo com isso criar julgamento de valor (embora seja quase impossível não fazê-lo). Nenhuma das duas formas - a velha e a nova - é "melhor" ou "pior" em qualquer aspecto (a menos que queiramos ir mais fundo na discussão). Elas representam papéis diferentes em contextos diferentes.


Um novo modelo


Vejo essas novas formas surgirem com bastante evidência na área do desenvolvimento de software. Muitas delas têm suas origens nas comunidades hackers, que encontraram (criaram) enfim o ambiente necessário para restaurar a ligação entre trabalho e diversão que se perdeu com a ética protestante.

Os hackers despertaram da dormência as sementes da colaboração ao criar os mecanismos práticos que os permitiram botar pra funcionar talvez a mais magnífica criação humana desde sei lá quando: a Internet. Sem falar na infinidade de projetos open-source que existem hoje e sua importância no equilíbrio desse ecossistema.

Com o domínio dos meios de comunicação - e com o poder de recriá-los e transformá-los conforme sua necessidade - os hackers fizeram necessárias revisões de conceitos fundamentais, como os de nacionalidade e propriedade (començando pela intelectual). Sua organização meritocrática e suas motivações lúdicas - ao invés de financeiras - inauguraram (ou pelo menos recuperaram) uma ética que está mudando definitivamente as relações humanas.

Não é por acaso que a sociedade vem passando por outros processos de amadurecimento e conscientização, ligados direta ou indiretamente ao fenômeno da Internet. Ousaria relacionar essa salada toda à questão do "desenvolvimento sustentável", mesmo sabendo que terei que passar por pelo menos dois debates ferrenhos: com meu irmão e com o Sérgio. ;-)

Essa mudança de pensamento, ao que parece, está influenciando cada vez mais outras formas de trabalho e criação humana. Eu mesmo - pra não ir muito longe - já participei de dois trabalhos comunitários de tradução incríveis, especialmente se levarmos em conta que foram realizados por pessoas que nem ao menos se conheciam. Livros e discos não são mais vendidos em lojas, nem distribuídos por editoras e gravadoras. Em muitos casos, mal se sabe quem foram os autores. Imagine o que essa revolução fará (está fazendo) pelo design ou no campo da pesquisa científica.


Não estou obviamente reivinidicando nenhuma superioridade intelectual por parte dos programadores ou coisa assim. Esse pioneirismo não se trata de nenhum privilégio que a área da computação tenha, exceto pelo fato de termos tido a sorte de sermos os que mais estamos confortáveis com os novos canais de comunicação.

Também não estou dizendo que as técnicas citadas abaixo tiveram sua origem nas comunidades hackers. Apenas que foram influenciadas de uma forma ou de outra por essa cultura, e pelas formas de colaboração que dela derivaram.

É como se fossemos os matemáticos e "engenheiros mecânicos" da revolução industrial. (Qual terá sido o canal de comunicação que a indústria passou a dominar com sua revolução?) Com a diferença que os meios e conhecimentos necessários para produzir software hoje são públicos, estão disponíveis a qualquer criança curiosa - à distância de alguns cliques - e se transportam para nossa casa praticamente de graça, como num passe de mágica, com um simples download.


Novas técnicas e ferramentas

Nesse novo modelo de trabalho, algumas técnicas, métodos e processos estão aflorando e ganhando popularidade de forma muito rápida. Essas pequenas ferramentas empíricas retiram o foco de preocupação no trabalho que está sendo realizado e o colocam nas pessoas que o realizam.

Não foram novas máquinas, com tecnologia mais avançada que destacaram os japoneses na indústria automobilística nas últimas décadas. (Aqui está um caso clássico em que o método surgiu na indústria, e só depois foram adaptadas ao desenvolvimento de sistemas.)

As armas fundamentais que destacam as empresas de hoje ao meu ver (especialmente as de software) tratam-se de evoluções metodológicas - não tecnológicas. Processos sociais de organização de tarefas, estruturação mental e social, tratamento de fluxos contínuos de demanda e feedback, manutenção de atenção e estado mental criativo, auto organização de equipes. Essa é a natureza das grandes inovações do trabalho na era da informação. (Acho que não precisa nem comentar sobre a relação disso tudo com o manifesto ágil.)


Fiz aqui uma pequena lista de algumas técnicas e métodos que tenho aprendido (e tentado usar). Vou apenas citá-los, deixando o desenvolvimento dos temas específicos para outros artigos. Já entrou em meu GTD também a criação de uma palestra relacionando esses assuntos e criando o contexto para motivar o interesse nessas coisas. Ela deve aparecer em algumas submissões de trabalhos em eventos sobre agilidade nos próximos meses ;-)

Uma forma breve de descrever um possível objetivo em comum entre elas poderia ser o de organizar o fluxo de demandas e o foco de atenção de pessoas e equipes, tornando o trabalho efetivo por meio do equilíbrio entre planejamento, feedback e adaptação.


Vamos à minha lista:

Scrum

Não precisamos nem falar sobre Scrum, pois está bastante na moda. Embora eu não me dê muito bem com a popularidade repentina que ganhou, nem com as razões que a motivaram, cito ele aqui no lugar do XP por ser especificamente focado no processo organizacional da equipe e no planejamento e acompanhamento de atividades - tema que pretendo relacionar com outras técnicas que serão citadas em seguida. XP trata de outras questões além dessa (pra mim Scrum está contido em XP), então uso o nome Scrum pois acho útil poder me referir apenas a "essa parte específica" do XP.

TDD

Embora não tenha incluído o XP na lista, incluo aqui outra parte dele: o desenvolvimento orientado a testes (e seus desdobramentos). Trata-se de meu principal interesse profissional atualmente, que tomei para objeto de pesquisa em meu mestrado, e que incluo nessa lista por seu aspecto de organização de tarefas e focos de atenção mental, bem relevante à linha de raciocínio que ressaltei aqui.

O desenvolvimento orientado a testes leva a designs mais simples não por qualquer passe de mágica presente na técnica, mas pela organização das atividades e do foco de atenção dos programadores, e pela manutenção da confiança e coragem em mudar o design - todos fatores humanos!

GTD

Esse é o processo de organização pessoal que venho usando desde o início desse ano, e que tem sido pra mim - além de fonte de muita reflexão - motivo de grandes realizações pessoais, tranquilidade, motivação e alegria. Foi ele também o fio condutor principal que começou a costurar essas relações todas em minha cabeça.

É a técnica que organiza o fluxo constante de compromissos e responsabilidades pessoais que nos assola dia a dia. Sem um processo coerente de organização, essa enxurrada de pequenos problemas para resolver afoga a maioria das pessoas que, sem paz de espírito, não conseguem se concentrar no que fazem, perdendo tempo com coisas irrelevantes e deixando de lado as coisas importantes.

O GTD é um método indispensável para empreender, no sentido 2.0.


Pomodoro

Dessa lista essa é a técnica que conheço a menos tempo (umas duas semanas), e talvez a que começou a me ajudar mais cedo. (Basta mencionar que sem ela esse artigo não saía.)

Ouvi falar dela pela primeira vez no Ágiles2009 codificando junto com o BrianMarick.


Mal comecei a ler o livro e já estou viciado em contar tomates ;-) Trata-se da técnica com foco mais pontual, localizado e imediato de todas, que pelo menos pra mim representa o elo que faltava para relacionar GTD, TDD e Scrum de uma forma incrível. A técnica cria uma metáfora clara para a unidade de trabalho (e de estimativa) de forma lúdica e confortável, complementando as demais.


OpenSpaces, BirdsOfAFether, e WorldCafé

Esses são processos cuja finalidade não parece corresponder diretamente àquela dos supracitados, pelo menos à primeira vista, pois são métodos de organização de encontros e reuniões, ao invés de projetos - possuem uma natureza muito semelhante no que diz respeito aos princípios e soluções propostas.

Participei pela primeira vez de seções de OpenSpaces no encontro ágil do ano passado. O WorldCafé me foi apresentado pelo meu irmão antropólogo e tive o prazer de facilitar algumas reuniões assim no planejamento estratégico da SEA.


Coding Dojo

Esse talvez seja o mais estranho item dessa lista, mas garanto (e pretendo mostrar) que possui relações íntimas com várias das outras técnicas/métodos. Essa me interessa ainda mais profundamente por me permitir experimentar com algo que me é de grande interesse - o TDD - além de propiciar grande diversão, aprendizado e fortalecer laços de amizade.


Essa lista não pretende ser exaustiva sob nenhum aspecto. Pretende apenas ilustrar o ponto de vista e apresentar as ferramentas que estão se juntando na MINHA caixa. Servirá muito mais para polarizar a discussão e talvez fazer surgirem outras coisas que podem (e talvez devam) fazer parte dessa coleção.

O que mais me fascina nisso tudo é a relação que percebo entre os princípios que estão por trás dessas técnicas. Pelo menos pra mim, parecem ter emergido todas mais ou menos juntas. Foram todas descobertas empiricamente, longe das grandes empresas e centros de pesquisa.

Pretendo escrever sobre essas relações. Já tenho várias anotações sobre isso. Mas o objetivo desse post, que acho que já foi cumprido, era apenas o de compartihar essa visão geral, para poder me preocupar mais com os detalhes nos próximos posts.

26 agosto 2009

Teste e design

Muita gente que conheço estranharia demais o fato de um artigo como esse estar em um blog sobre testes:

GoogleTestingBlog: How to think about OO

Ouço pessoas falando em reuso, em SOA, em arquitetura, bla bla bla..., sem nunca ter nem mesmo se interessado por coisas como essa.

Se você ainda não sabia, fique sabendo: testes tem tudo a ver com design.

Esse casamento é uma das coisas mais importantes que a indústria de software desenvolveu na última década, e a maioria das pessoas ainda está em discussões como "PHP é ruim, Java é que bom!"

O fato é que discussões riquíssimas, como a apresentada nesse artigo, praticamente não têm nenhum valor se você não escreveu testes automáticos desde o início do seu projeto. Não adianta nada você saber reconhecer um design ruim e conseguir propor outro melhor, se na hora H você não tiver coragem de fazer a mudança, com medo do impacto que isso vai ter.


Acredite. Praticamente 100% dos gatos que existem em todos os códigos do mundo são fruto de atitudes medrosas, fracassadas, do tipo "não véi! vamo mexer nessa parada não... Vamo dexá assim mesmo, senão a gente vai ter que mudar um monte de coisas..."

Então se você ainda estava parolando por aí e não tinha visto o bonde passar, acorde! Não dá pra fazer software de forma séria sem automatizar testes. Não dá! Só você (e os que trabalham com você) ainda não percebeu.

Deixa de ser cabeça dura e presta atenção no que está acontecendo!

26 julho 2009

O design está morto?

Outro dia um amigo cobrou o final da tradução que eu vinha fazendo do artigo do MartinFowler.

Não vamos mais precisar esperar, o pessoal da InfoQ.br se organizou mais rapido e traduziu o artigo todo.

Não deixem de ler!