October 23, 2008

Concerto de idéias

A Softex, que da apoio à indústria de software brasileira, esta promovendo um evento original: o "concerto de idéias".

Segundo o site: "processo interativo [..] que permitirá a interação virtual da comunidade brasileira de software e serviços de TI na busca de idéias que possam enriquecer o Planejamento Estratégico 2009/2010 sendo elaborado pela SOFTEX [.. que] permanecerá no ar por 72 horas, entre os dias 04, 05 e 06 de novembro de 2008"

Ou seja, pelo que entendo, um "brainstorming" gigante. Vou participar, e não faltarei em voltar a falar dos resultados.

As inscrições são abertas a partir de 27 de outubro.

October 09, 2008

Contra o Preço Fixo

Como já defendi num post precedente, engenharia de software é um processo de criação. O desenvolvimento do código faz parte desta criação e não é o processo de construção.

Os riscos

Por natureza, este processo de criação é incerto e comporta três tipos de riscos: risco funcional, técnico e de gerenciamento.

O risco funcional é que em geral, as funcionalidade a serem desenvolvidas não são totalmente conhecidas na hora de começar a escrever o código. Por mais detalhado que seja, um documento de especificações (ou um conjunto de documentos) não diz tudo. Software e funcionalidades são coisas muito abstratas e o usuário nunca pensa em todas as possibilidades na hora da análise. Isso se aplica também para as regras de negócio(quem pode fazer o que, dentro de quais limites, em que casos, ...). Em geral, é só usando o sistema que o usuario vai se dar conta que faltam coisas, ou que certas regras imaginadas são inaplicaveis.

O risco técnico ocorre porque um sistema de software é feito de inumeros componentes, desde o hardware em que vai rodar até os frameworks usados pela aplicação. E todos estes componentes evoluem no tempo. Plataformas mudam, sistemas operacionais mudam, etc. A consequencia disso é que, na maioria dos casos, a solução técnica que será implementada não é perfeitamente conhecida antes de começar o desenvolvimento. Bugs existem, incompatibilidades aparecem e podem causar sérios atrasos.

O risco de gerenciamento acontece porque, mesmo sabendo o que vai ser feito e como vai ser feito, a estimativa do esforço total é difícil. E o erro é no minimo proporcional à duração do projeto - quanto mais longo o projeto, maior o erro. Pior ainda: existe uma forte tendência para a subestimação do esforço. É natural e vi isso em quase todos os projetos dos quais participei.

Caricaturando: no inicio do desenvolvimento, não sabemos (exatamente) qual vai ser o esforço necessário para desenvolver não sabemos o que.


O ponto de vista do cliente

O cliente, por sua parte, quer saber e é perfeitamente legítimo QUANDO o sistema estará funcionando e QUANTO ele vai custar. Pra ele, o importante é o objetivo economico. Pouco importa a técnica.

Para isso, é comum fechar contratos "com preço fixo" que determinam exatamente o que vai ser desenvolvido (na base de uma especificação), até quando e a que preço. Isso significa que o cliente transfere os riscos do projeto para o desenvolvedor. O desenvolvedor, por sua vez, vai se cobrir contra os riscos incluindo um prêmio no preço.


Consequências

No papel preço fixo da segurança. Só no papel.

Primeiro porque o fornecedor não é uma seguradora. O contrato com preço fixo pode ser decomposto em dois contratos. O primeiro para o desenvolvimento do sistema. O segundo é um contrato de seguro, o fornecedor assumindo o risco do projeto em troca do pagamento de um prémio incluso no preço total. Mas software houses não têm competência nem porte para avaliar e mutualisar os riscos. No melhor dos casos incluem um premio de risco muito alto (de 50% a 100%), no pior dos casos quebram se tiverem que indenizar o cliente se o risco se produzir.

Segundo porque o risco de não ter o sistema funcionando (ou, até pior, funcionando imperfeitamente) vai muito além do custo do desenvolvimento: é o custo operacional e comercial. Um caso extraordinário disso é a Ariane 5 que explodiu por causa de um bug (custo: varios milhões de dólares). O "seguro" contratado não cobre (ou muito parcialmente) este risco.

A terceira razão é que o preço fixo é propicio a conflitos para determinar se os objetivos do projeto (de acordo com as especificações) foram atingidos ou não. O fornecedor tem interesse em ter as especificações as mais exatas e completas possíveis (minimizando o risco "funcional"). Por sua vez, o cliente vai ter interesse em deixar as especificações imprecisas para ter mais liberdade de interpretação. E acaba necessariamente em tensões se não conflitos para definir quem vai suportar o custo das correções dos bugs.

Enfim, o respeito das especificações (que são a base do preço fixo) não quer dizer respeito da necessidade funcional real. Como dito acima, a especificação como imaginada no inicio pode ser incorreta - e acontece bastante.


Conclusão

Por todas estas razões sou convencido de que preço fixo da apenas uma ilusão de segurança para o cliente. Na hora de assinar o contrato, é mais confortavel. Os problemas aparecem na hora da entrega do sistema.

Na Sofshore propomos uma alternativa da qual falarei no meu próximo post.

October 06, 2008

As joias do recrutamento

Já vi muitas coisas engraçadas - e trágicas - no decorrer do recrutamento da nossa equipe.

Se dão muitos conselhos na net sobre como se dar bem num processo seletivo. Mas o que se acha pouco na net são conselhos sobre como ter certeza absoluta que você não será contratado. Gostaria de preencher este vazio com dois conselhos vindos de fatos reais:


Diz que prefere tirar férias do que trabalhar

Um candidato saiu do processo seletivo para um cargo numa tecnologia promissora e começando com um treinamento intensivo de três meses pago pela empresa.

"Infelizmente não vou prosseguir no processo seletivo desta oportunidade. Atualmente estou em período de aquisição de férias."

Devo dizer, este jeito é legal. Educado, tranquilo, fim para sempre da sua carreira na empresa em duas linhas e sem atritos.


Insulte o recrutador

O segundo jeito pode ser usado quando sua candidatura já foi recusada pela empresa. É muito mais agressivo e, por isso, mais radical do que o primeiro. Garante uma vaga de honra na lista negra dos candidatos com quais toda forma de colaboração esta fora de questão.

Aconteceu assim com um candidato cuja qualificação era superior ao que procurávamos.
Enviamos o email:

"Recebemos seu curriculo e agradecemos seu interesse. Infelizmente suas competências não se enquadram nas atuais necessidades da empresa.
Caso haja uma nova vaga com o seu perfil não hesitaremos a entrar em contato.
Desejamos sucesso em seu futuro profissional, [..]
"

Resposta do candidato:

"Eu trabalho na [..], uma das lideres de mercado mundial de TI [..].
Meu cargo aqui é Arquiteto de Sistemas Senior.
Tenho 15 anos de experiência em TI.
9 Anos com JAVA/J2EE
[..]
Realmente minhas competências, meu perfil e meu valor hora [..] são muito superiores as atuais necessidades de sua empresa.
"

E como se esta afirmção não bastasse, num email posterior ainda insistiu:

"E o seu email, me fez ver que que eu errei muito em enviar meu CV para uma "emprezinha de pequeno porte do interior do país"....
Foi um erro, favor desconsiderar o email e envio do CV.
Vocês ai do interior do país não conseguem pagar nem metade do meu salario...
"

Ou como demonstrar em pouco tempo falta de profissionalismo, ego inchado, pouca educação, agressividade e outros. Radical. Pra este tipo, não pagamos nem um centavo.

October 02, 2008

Engenharia ? Pode até ser

A minha palestra sobre uma desmistificação da engenharia de software foi feita ontem. Não me sai tão bem como eu gostaria, mas não tão mal como eu temia.

Gostaria agora de consagrar uns posts aos assuntos tratados. Em primeiro lugar a questão do termo "engenharia" de software, que foi no final das contas o tema central da palestra.

Na profissão, esse assunto não é novo, longe disso. Um debate existe há décadas sobre o fato do desenvolvimento ser "arte" ou "engenharia". Paralelamente, existe muito debate sobre as qualificações necessárias para poder atuar como "engenheiro" de software. Há quem defende que desenvolvimento de software é criação, outros que dizem que uma formação en ciência da computação é imprescindível e que o problema hoje na profissão é a mediocridade (falta de formação formal).


Os slides da presentação estão disponíveis online
Meu ponto é um pouco diferente. Esta discussão de especialistas é bastante interessante e na verdade fundamental para a profissão. Mas quando quero desmistificar o termo "engenharia" de software, não é para dizer que desenvolvimento não é engenharia. Meu objetivo é de desmentir certas idéias ligadas a este termo e que levam a estratégias erradas.

Principalmente, a idéia segundo a qual a construção do software se faz na programação, na base de uma planta baixa que são os diagramas UML feitos durante a análise e o desenho. Chama arte, chama engenharia, chama como quiser. O código É a planta baixa.

Portanto, o processo de desenvolvimento não deve ser considerado um processo industrializado de construção, mas sim um processo de criação do plano que servirá à construção. Com toda a incerteza ligada a esta descoberta de um espaço desconhecido.

E o processo de desenvolvimento (que define quem faz o que e quando) deve gerenciar esta incerteza da melhor forma. E o melhor jeito que temos hoje é usar um processo iterativo e adaptativo, que vai permitir acompanhar o trabalho de perto e responder rapidamente às dificuldades encontradas no caminho.

Uma opinião defende que, se este processo de criação é tão incerto, é por falta de maturidade dos nossos conhecimentos na área (o que chamam de "body of knowledge"). A engenharia de software seria hoje na mesma situação do que era a da engenharia elétrica uns dois seculos atrás. Seria bom se a ciência da computação pudesse trazer mais métodos formais de verificação da correção (correctness) de um sistema.

De novo, a questão é interessante para o profissional mas este não é o problema do cliente. No estado atual dos nossos conhecimentos as idéias que denfendi na palestra são as que melhor permitem atingir o nosso objetivo: traduzir uma necessidade funcional em software.


Referências

Jim Waldo, "Software Engineering and the Art of Design"
http://www.artima.com/weblogs/viewpost.jsp?thread=7600
(os comentários são particularmente interessantes)

Steve McConnell, "Software Engineering is not Computer Science"
http://www.stevemcconnell.com/psd/04-senotcs.htm

Jack W. Reeves, "What is Software Design"
http://www.bleading-edge.com/Publications/C++Journal/Cpjour2.htm

Richard P. Gabriel, "The Road not Taken"
http://dreamsongs.com/NewFiles/RoadNotTaken.pdf

Cees de Groot, "Art, Science, Engineering, Craft - Approaches to Building Software"
http://www.cdegroot.com/articles/2000-art-science-engineering-craft/