segunda-feira, 31 de janeiro de 2011

Ferramentas gratuitas para modelagem de sistemas

Para quem trabalha com desenvolvimento de sistemas, eu listei abaixo algumas ferramentas gratuitas para modelagem, que às vezes ajudam um bocado por um preço bem camarada:
Esta é uma ferramenta escrita em Java, só faz diagramas UML e não faz modelagem de dados.

Esta também só trabalha com UML, mas, eu não tenho maiores informações.

Esta é feita para trabalhar junto com o Eclipse. Também só desenha UML.

Esta é a única que eu já vi que trabalha com análise essencial (eu acho que também faz modelagem de dados). O problema é que ela só roda debaixo de Linux. Para executá-la no Windows é preciso instalar um emulador Linux (tipo CYGWIN).

Este é um programa que apenas desenha os diagramas (tipo o Visio da Microsoft).

Esta ferramenta faz apenas a modelagem de dados e trabalha integrada com o MySQL.

sábado, 25 de dezembro de 2010

Frases espirituosas sobre desenvolvimento de software

  • Há duas formas de construir um projeto de software: Uma maneira de fazer isso deve ser tão simples que, obviamente, não deixe deficiências, e a outra forma é a de torná-lo tão complicado que não percebam as evidentes deficiências. O primeiro método é muito mais difícil. – CAR Hoare
  • Se construtores de edifícios construíssem seus prédios como os programadores escrevem seus programas, o primeiro pica-pau que viesse poderia destruir uma civilização. – Gerald Weinberg
  • Hoje a programação é uma corrida entre os engenheiros de software para tentar construir maiores e melhores programas à prova de idiotas, e o Universo tentando produzir maiores e melhores idiotas. Até agora, o Universo está ganhando. – Rich Cook
  • Java pode ser um bom exemplo do que uma linguagem de programação deve ser. Mas as aplicações escritas em Java são um bom exemplo de como as aplicações não devem ser.
  • Análise de sistemas é como criar uma criança; você pode fazer um estrago imenso, mas não pode garantir sucesso. – Tom DeMarco
  • A maioria dos softwares atuais são como as pirâmides do Egito, com milhões de blocos empilhados uns em cima dos outros, nenhuma integridade estrutural, feita apenas pela força bruta e milhares de escravos. – Alan Kay
  • Andar sobre a água e desenvolver software a partir de uma especificação é fácil. Se ambos estiverem congelados...

quarta-feira, 15 de dezembro de 2010

Avaliação de software de gerenciamento financeiro pessoal

Há muito tempo eu uso um software de gerenciamento financeiro pessoal que é executado no Palm, o Hand Money, este software é excelente e atende todas as minhas necessidades de acompanhamento das finanças, porém, o meu Palm já está muito velho e os Palm's em geral estão praticamente em desuso.

Como o fabricante do Hand Money não desenvolveu outra versão do aplicativo para uma plataforma diferente, eu resolvi pesquisar um novo software de finanças pessoais para adotar. Os meus requisitos para este novo software eram:

  • Permitir a criação de diversas contas (para que eu possa controlar mais de uma conta bancária, cartões, investimentos, etc.);
  • Cadastrar lançamentos previstos para datas futuras com repetições periódicas;
  • Ter uma separação clara entre lançamentos previstos e os efetivamente realizados;
  • Identificar os favorecidos em cada lançamento;
  • Permitir categorizar os lançamentos;
  • Ter consulta aos saldos previstos das contas;
  • Ter consulta de um resumo de lançamentos agrupados por categoria;
  • Importar arquivos de extrato bancário;
  • Além de dar preferência para aplicativos que executem na web, para não me deixar preso a uma plataforma ou hardware específico;
  • E, por último, não ter mensalidade para utilização do software (afinal, eu quero um software de gerenciamento financeiro e não mais um custo fixo no meu orçamento).

Com essas definições, eu testei mais de 20 softwares de gerenciamento financeiro, brasileiros e estrangeiros. Segue abaixo um resumo de cada aplicativo que eu avaliei (começando dos que eu considerei melhor até os piores) e a minha decisão final:

Minhas Economias: http://www.minhaseconomias.com.br

O único requisito que ele não atende é o cadastramento do favorecido, no mais, o aplicativo é excelente. Pode ser cadastrado um orçamento separado e depois compará-lo com o realizado. A importação de arquivos é muito boa, permitindo uma série de ajustes no momento da importação. Os dados também podem ser exportados para planilha ou PDF. As mensagens que eu enviei com dúvidas para o fornecedor foram respondidas prontamente.

O aplicativo é grátis para o usuário final, a proposta do site é obter receita com publicidade, mas até o momento eles não têm nenhum anúncio sendo exibido. Isso me deixa em dúvida com relação à continuidade do serviço em longo prazo.

Contas Online: http://www.contasonline.com.br

Ele atende a todos os requisitos e tem uma interface muito boa. O problema dele, é que a versão gratuita é limitada a 45 lançamentos mensais, acima disso, há cobrança de mensalidade. Os contatos que eu fiz com o fornecedor foram respondidos com presteza. Parece que o fornecedor é uma empresa de pequeno porte do interior.

Debit: http://www.debit.com.br

O único requisito que ele não atende é a importação de arquivos com lançamentos bancários, contudo, ele permite a exportação dos dados para planilhas. O maior problema desse aplicativo, é que ele apresenta alguns pequenos defeitos. Eu mandei um email relatando os problemas que identifiquei e eles responderam prontamente que iriam avaliar os erros, porém, os erros ainda persistem. A usabilidade do aplicativo é um pouco confusa.

O Debit é totalmente gratuito. A empresa possui outros aplicativos pagos que são voltados para empresas.

Minhas Finanças: http://www.bb.com.br

É um aplicativo exclusivo para quem é correntista do Banco do Brasil. Ele é muito bom, mas, os lançamentos futuros não podem ter repetição e as consultas não te deixam ter visão dos saldos futuros das contas. Não permite o cadastramento de favorecido. Tem ainda a desvantagem de te obrigar a permanecer no Banco do Brasil para continuar a utilizá-lo.

Clear Checkbook: http://www.clearcheckbook.com

É uma aplicação em inglês e os relatórios são limitados a 10 meses na versão gratuita, ou seja, você não consegue ter a visão de um ano completo. Só não atende os requisitos de cadastramento do favorecido e de informar o saldo previsto das contas.

Moneytrackin: http://www.moneytrackin.com

Não atende a um requisito importante: a separação do previsto e do realizado. Além disso, não cadastra favorecido e nem informa o saldo previsto das contas.

Spesa: http://spesa.com.br

Só permite o cadastramento de uma conta. O aplicativo é gratuito, mas, passa a impressão de ser amador. A parte de relatórios também é fraca.

Organizze: http://www.organizze.com.br

Muito bom, mas, no plano gratuito só permite o cadastramento de uma conta.

Sr. Dinheiro: http://www.srdinheiro.com.br

Não atende a vários requisitos. Além disso, possui diversas limitações de quantidade de lançamentos na versão gratuita.

gBolso: http://www.gbolso.com.br

Muito citado nos fóruns e avaliações, porém, não atende vários dos requisitos. Possui recursos de controle de contas a pagar, investimentos e lançamentos em lote, porém, só no plano pago.

IExpenseOnline: http://www.iexpenseonline.com

Aplicativo em inglês. Não atende a diversos requisitos. Me pareceu lento.

Meus Gastos: http://www.meusgastos.com.br

Aplicativo totalmente gratuito, porém, muito simples.

Manubia: http://www.manubia.com.br

A versão gratuita é muito limitada, permite a criação de apenas 2 contas.

AltMoney: http://www.altmoney.com.br

Pareceu-me bom, mas, como só tem versão paga, eu nem cheguei a avaliar mais profundamente.

Super Contas: http://www.supercontas.com.br

É um aplicativo muito interessante, voltado para divisão de contas entre um grupo de pessoas, mas, está completamente fora do que eu estou procurando. Totalmente gratuito.

Meu Gerenciamento: http://www.meugerenciamento.com.br

Voltado para empresas. Não existe versão gratuita.

Mônaco Online: http://www.monacoonline.com.br

Não apresenta nenhuma informação sobre a empresa fornecedora ou sobre o produto no site. Ocorre um erro quando se tenta criar um novo usuário, por isso, não foi possível avaliar.

Buxfer: http://www.buxfer.com

Em inglês. No plano básico gratuito podem ser criadas no máximo 5 contas. Há reclamações em fóruns que o serviço está "morto", ou seja, estagnado sem evoluções ou suporte. O saldo das contas e os valores dos lançamentos nas mesmas não conferem.

Mint: http://www.mint.com

Aplicativo em inglês, é o mais popular nos Estados Unidos, porém, para utiliza-lo você tem que vincula-lo à sua conta bancária, passando seus dados de acesso à mesma (login e senha) para que o aplicativo possa recuperar as informações do extrato. Mesmo que você tenha coragem de informar seus dados de login bancário a um aplicativo na internet, o Mint só funciona com bancos americanos.

Finance Desktop: http://www.financedesktop.com.br

Precisa fazer download para ser executado, por isso eu não o avaliei. Pode ser executado a partir de um pendrive.

Grana Forte: http://granaforte.com.br

Precisa de download para ser executado e só tem versão paga, assim sendo, eu não o avaliei.

Depois de todas as avaliações, eu fiquei entre três alternativas:


O “Minhas Economias” acabou sendo a minha escolha final. Eles responderam prontamente os emails que eu mandei. O aplicativo não tem cadastro de favorecido, mas, isso é contornável com o campo "descrição" no lançamento. No mais, ele é excelente: usabilidade muito boa, importação de dados muito bem resolvida e totalmente gratuito. A única dúvida, é sobre a continuidade do serviço a longo prazo.

Com os bugs que o Debit apresenta, é difícil optar por ele. O ponto positivo, é que a empresa por trás do software parece que tem certa solidez.

Eu só não optei pelo “Contas Online” devido ao custo do serviço, já que eu não quero assumir mais um custo fixo.

segunda-feira, 22 de novembro de 2010

Ferramenta gratuita para groupware: Dimdim

Para quem precisa trabalhar em grupo, mas, está fisicamente separado dos seus pares, existe uma excelente ferramenta para ajudar a integrar os parceiros de trabalho. E o melhor, ela é inteiramente grátis: Dimdim.

Você pode compartilhar documentos, a sua tela, conversar com vídeo ou voz e usar muitos outros recursos.

Veja mais em: http://www.dimdim.com/

sexta-feira, 15 de outubro de 2010

Diferença entre iterativo e interativo

Duas palavras muito comuns na área de TI, mas que constantemente são confundidas em seu significado e aplicação: iterativo e interativo.

Iterativo se refere a ciclo, repetição.

Uma Iteração é um ciclo ou uma etapa de uma rotina maior.

Interativo, se refere a relacionamento, comunicação.

Uma interação é uma ação mútua, uma entidade agindo sobre a outra ou vice-versa.

Por exemplo, no desenvolvimento de software o correto é se falar em desenvolvimento iterativo e incremental.

Desenvolvimento incremental é uma estratégia de planejamento estagiado, em que várias partes do sistema são desenvolvidas em paralelo, e integradas quando completas.

Desenvolvimento iterativo é uma estratégia de planejamento de retrabalho em que o tempo de revisão e melhorias de partes do sistema é pré-definido. A saída de uma iteração é examinada para modificação, e especialmente para revisão dos objetivos das iterações sucessivas.

Muitas vezes as pessoas se enganam e falam em desenvolvimento "interativo" e incremental, o que não está correto.

quarta-feira, 29 de setembro de 2010

Como funcionam os projetos de software

Os projetos de software nem sempre atingem os seus objetivos. Para mostrar como estes projetos funcionam, existe um exemplo bem humorado que é usado há muito tempo:

01 - Como o cliente descreveu a sua necessidade:
02 - Como o analista de requisitos entendeu:
03 - O que o gerente de conta vendeu para o cliente:
04 - Como o analista especificou:
05 - O que o programador construiu:
06 - O que a equipe de testes recebeu:
07 - Como o projeto foi documentado:
08 - Qual é o plano de recuperação de desastre:
09 - Como o marketing anunciou:
10 - O que a operação instalou:
11 - Como é suportado:
12 - Quando foi entregue:
13 - Quanto foi cobrado do cliente:
14 - O que o cliente realmente queria:

Veja mais exemplos em: http://www.projectcartoon.com

terça-feira, 14 de setembro de 2010

Como programadores matam dragões e salvam princesas

Vejam um texto divertido sobre programadores e suas características, que circula pela web (eu não sei qual é a origem dele):


Java - Chega, encontra o dragão, desenvolve um framework para aniquilamento de dragões em múltiplas camadas, escreve vários artigos sobre o framework, mas não mata o dragão.

.NET - Chega, olha a ideia do Javanês e a copia. Tenta matar o dragão, mas é comido pelo réptil.

C - Chega, olha para o dragão com olhar de desprezo, puxa seu canivete, degola o dragão, encontra a princesa, mas a ignora para ver os últimos checkins no cvs do kernel do Linux.

C++ - Cria um canivete básico e vai juntando funcionalidades até ter uma espada complexa que apenas ele consegue entender. Mata o dragão, mas trava no meio da ponte por causa dos memory leaks.

COBOL - Chega, olha o dragão, 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 dragão... Chegando lá, descobre que o programa só aceita lagartixas como entrada.

VB - Monta uma arma de destruição de dragões a partir de vários componentes, parte pro pau pra cima do dragão 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 ternária, dados em 3 dimensões, OLAP e demora 15 anos para processar a informação. Enquanto isso a princesa virou lésbica.

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

Smalltalk - Chega, analisa o dragão e a princesa, vira as costas e vai embora, pois eles são muito inferiores.

shell - Cria uma arma poderosa para matar os dragões, mas, na hora H, não se lembra como usá-la.

shell(2) - O cara chega ao dragão com um script de 2 linhas que mata, corta, estripa, empala, pica em pedacinhos e empalha o bicho, mas na hora que ele roda o script, aumenta, engorda, enfurece e coloca álcool 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 código, mata o dragão, vai ao encontro da princesa... Mas esta o chama de tiozinho e sai correndo atrás do programador Java que era elegante e ficou rico.

Fox Pro - Desenvolve um sistema para matar o dragão, por fora é bonitinho e funciona, mas por dentro está tudo remendado, quando ele vai executar o aniquilador de dragões lembra que se esqueceu de indexar os DBFs.

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, pede 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, quando 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 o come com farinha.

Perl - Chega, olha o dragão de cima a baixo, monta um programinha mixuruca com três linhas, mas com uma puta expressão regular (que ninguém entende, nem o cara que fez) que simplesmente oblitera o dragão e as roupas da princesa, deixando-a no jeito pro programador terminar o serviço. Mas aí, ele vai fazer outra coisa e a princesa fica a ver navios...

HTML - Monta um monte de telinha bonitinha, cheia de gifs animadas, música, botõezinhos, applets que mostram uma foto sobre um lago espelhado, applets que colocam cobrinhas atrás do cursor do mouse e flashes lindíssimos que em teoria iriam deixar tanto o dragão quanto a princesa maravilhados e assim poderia escolher quem ele vai matar e quem vai resgatar. Na hora de rodar, a página demora tanto a entrar e o Internet Explorer trava tantas vezes que mata o dragão e a princesa de tédio e velhice. Nesse meio tempo, a princesa já tinha descoberto que o programador HTML (eles gostam de se chamar de "Uebidizzzaiguinersss") era gay e que estava de olho mesmo era no dragão. Nooofffaaa!!!

sexta-feira, 3 de setembro de 2010

Classificação dos testes de software

Na fase de construção dos softwares, os testes podem ter classificações diferentes, dependendo do enfoque que se pretende dar. Eles podem ser classificados quanto ao Nível, o Tipo e a Técnica. Veja abaixo mais detalhes de cada classificação:

Classificação quanto ao Nível do teste

  • Teste Unitário

Testa apenas o componente (ou a menor unidade de software) que o desenvolvedor construiu. Exemplo de ferramenta para auxiliar nos testes: JUnit.

  • Teste de Integração

Testa as integrações entre os diversos componentes construídos.

Normalmente, o Teste Unitário e o Teste de Integração são realizados pela própria equipe de desenvolvimento.

  • Teste de Sistema

Verifica a boa execução dos componentes do aplicativo inteiro, incluindo as interfaces com outras aplicações.

Geralmente é realizado pela equipe de testes funcionais.

  • Teste de Aceitação

Verifica se o sistema atende aos requisitos do usuário, conforme especificado. Exemplo de ferramenta para automação: Selenium.

Normalmente é realizado pela equipe de projeto do sistema. A partir deste teste é gerada a "Versão 1.0" do sistema.

Classificação quanto ao Tipo do teste

  • Teste Funcional

São testes que verificam a operação correta do sistema em relação a sua especificação.

Geralmente é realizado pela equipe de testes.

  • Teste Não Funcional

É realizado por uma equipe de testes mais especializada, porém, com foco em aspectos não funcionais como: desempenho, carga, estresse, usabilidade, segurança, etc. É feito em cima da versão 1.0 do sistema.

O teste de desempenho busca extrair informações sobre o desempenho do sistema em cenários normais de uso; o teste de carga busca extrair informações sobre o volume de usuários, transações, etc. que o sistema suporta; o teste de estresse busca extrair informações sobre quando o sistema não suporta a carga aplicada, sendo muito importante para saber estruturar e dimensionar a arquitetura do sistema e prover informações para escalar o sistema; o de usabilidade procura verificar se a interface de usuário é fácil de aprender e utilizar; o teste de segurança visa verificar se o software é seguro em garantir o sigilo dos dados armazenados e processados.

Exemplo de ferramenta para testes não funcionais: JMeter.

Classificação quanto à Técnica de teste

  • Testes Caixa Preta

Estes testes buscam verificar se as saídas do sistema estão coerentes com as entradas, sem se preocupar como elas são tratadas internamente. As principais técnicas são:

Partição de equivalência;
Análise de Valores Limites;
Derivados de especificação;
Baseado em estado-transição.

  • Testes Caixa Branca

Estes testes, chamados também de Testes Estruturais, se preocupam em avaliar aspectos internos do sistema. Para isso, utilizam técnicas de inspeção de código tais como: teste de condição, teste de fluxo de dados, teste de ciclos, teste de caminhos lógicos, códigos nunca executados.

Existem várias ferramentas para ajudar a aplicar estas técnicas de testes: FindBugs, PMD, Lapse, etc.

quarta-feira, 18 de agosto de 2010

Os tipos de empresas que prestam serviços de TIC

A oferta de serviços de TIC (Tecnologia da Informação e Comunicação) é muito diversificada e existem empresas oferecendo serviços com características bastante peculiares. Contudo, podemos tentar organizar um pouco as ofertas do mercado, agrupando as empresas de TIC nos principais tipos existentes e definindo as principais características de cada uma deles.

Software House

As software houses são empresas que desenvolvem software para comercialização. O software pode ser desenvolvido sob encomenda ou em forma de pacotes que são vendidos para vários clientes.

O produto oferecido por este tipo de empresa pode ser o serviço de desenvolvimento do software ou o licenciamento do software em si.

ASP - Application Service Provider

As ASP's são empresas que prestam serviços baseado em software, ou seja, elas vendem um serviço a partir de um ou mais softwares de propriedade da ASP, consequentemente, elas não vendem o software como produto por si só.

A partir da forma de atuação destas empresas é que surgiu o conceito de Software como um Serviço: SaaS (Software as a Service).

A vantagem para as empresas que prestam este serviço, é que elas fornecem um serviço continuado que lhes garante faturamento em longo prazo, ao invés de faturar apenas no momento da venda do software. Para os clientes, as vantagens são a redução do investimento inicial e a diminuição das despesas com infra-estrutura e gerenciamento do serviço associado ao software.

A principal diferença das ASP's em relação as software houses, é que o serviço prestado pela software house é o desenvolvimento do software em si e não a administração do serviço associado a este software.

BPO - Business Process Outsourcing

As empresas de BPO, ou terceirização de processos de negócio, vendem, além do software como um serviço, toda a estrutura necessária para que o processo de negócio do cliente, baseado naquele software, seja executado.

Este tipo de empresa fornece software, infra-estrutura, mão de obra e o que mais for necessário. Com isso, desobriga o cliente de se preocupar com assuntos que não estejam relacionados à atividade fim do seu negócio.

Terceirização de mão de obra

Este tipo de empresa simplesmente aluga mão de obra. Ou seja, ela identifica a necessidade do cliente e fornece um funcionário com as qualificações requeridas, que irá trabalhar nas instalações do cliente.

Originalmente, este tipo de contrato deveria ser usado apenas para contratações temporárias. Porém, posteriormente, ele passou a ser usado também para contratar funcionários que teriam menos direitos trabalhistas que os exigidos pelo sindicato de trabalhadores do segmento da empresa contratante. Em função disso, a justiça do trabalho passou a dar equivalência de direitos a vários destes trabalhadores terceirizados e, assim, este tipo de contratação tem caído em desuso.

Data Center

As empresas que prestam serviço de data center, fornecem basicamente a infra-estrutura para quem está interessado em hospedar sistemas que serão utilizados em produção.

Como o custo de montar e manter um data center é muito alto, as empresas especializadas neste serviço permitem que este custo seja diluído entre diversos clientes.

Os tipos de serviço de data Center oferecidos no mercado mais comumente são:

Hosting

Neste caso, a empresa de data center fornece, além da estrutura e da administração, também o servidor onde o sistema ficará hospedado. O hosting pode ser dedicado, onde o sistema fica em um servidor exclusivo para ele, ou pode ser compartilhado, onde o cliente compra espaço em um servidor que hospeda outros sistemas simultaneamente.

Colocation

Em português, "compartilhamento de localização", neste caso, o servidor pertence ao cliente e ele aluga apenas a infra-estrutura oferecida pelo data center. A administração do servidor pode ser feita pela empresa de data center ou pelo próprio cliente, dependendo da modalidade de serviço contratado.

segunda-feira, 26 de julho de 2010

Diferenças entre engenharia de software e engenharias tradicionais

Quem trabalha com desenvolvimento de software está quase sempre envolvido com atrasos na entrega e com problemas de qualidade no produto construído. Quando estes problemas se tornam muito frequentes, inevitavelmente as pessoas começam a comparar a Engenharia de Software com as engenharias tradicionais, pois, é perceptível que nas demais engenharias os problemas de atraso e qualidade são muito menos recorrentes.

Por que ao construir um prédio é possível cumprir o planejamento com muito mais precisão e ter muito menos inconformidades no final do que quando estamos construindo um sistema de informação?

A minha intenção neste post é fazer uma comparação entre os principais aspectos das engenharias tradicionais e de software, para nos ajudar cada vez mais nos aproximarmos das boas práticas de engenharia e a explicar a nossos clientes porque não conseguimos cumprir prazos com a mesma constância que o pessoal das outras engenharias.

Os principais aspectos que diferenciam a engenharia de software das demais são:

Maturidade da área

Existem poucos padrões a serem seguidos quando se executa projetos de software. Na maioria das outras áreas de engenharia já existe uma cultura secular ou até mesmo milenar (lembrando que os egípcios já construíam pirâmides complexas há mais de 5.000 anos), fazendo com que muitos métodos e técnicas sejam extremamente testados e de amplo domínio. Na engenharia de software quase tudo ainda é muito mais experiência de alguns do que conhecimento de todos.

Produto intangível

Os gerentes de projetos de outras áreas, normalmente, trabalham com objetos materiais visíveis e tangíveis. Estes objetos podem ser sentidos, observados, tocados, etc., e mediante o uso das informações obtidas através do uso dos sentidos podem ser melhorados, corrigidos ou modificados. Enquanto isso, a natureza abstrata e intangível do projeto de software limita muito a ação do gerente. É muito mais fácil os envolvidos perceberem e avaliarem o desenvolvimento do projeto de um navio, de uma casa ou de uma máquina do que ver o progresso de um projeto de software cuja visibilidade é meramente conceitual, através de um conjunto de documentos.

A mesma dificuldade de perceber o andamento do trabalho se repete ao tratarmos sobre alterações no produto finalizado. É muito mais fácil para um engenheiro explicar a um cliente o esforço necessário para mudar a janela de uma casa de lugar depois dela pronta, do que um engenheiro de software demonstrar para o seu usuário o esforço para mudar um botão de posição na tela de um sistema. “Mas basta apenas mudar o botão de lugar, não pode demorar esse tempo todo...” é a resposta padrão que os profissionais de software ouvem.

Facilidade para modelagem / prototipação

Quando se trata de projetar objetos tangíveis, é muito mais fácil criar um modelo ou protótipo que represente bem para os interessados aquilo que se pretende construir. Pode-se lançar mão de diversos artifícios: plantas, desenhos, maquetes, modelos computacionais em 3D, etc. Permitindo até mesmo que criemos modelos que simulam o funcionamento do produto depois de pronto. Já para um software, que é intangível, a questão da prototipação é mais complexa, normalmente o que fazemos são os layouts das telas e a simulação da navegação, contudo, isso não basta. Por trás das telas pode haver regras de negócios extremamente complexas que não são representadas no protótipo e, consequentemente, não podem ser validadas pelos interessados.

Falta de padronização nos projetos

Grande parte dos projetos de software são projetos únicos, pois, visam informatizar processos que também são únicos. Existe a experiência anterior com outros projetos, mas ela não se aplica integralmente no novo projeto. Isso torna difícil antecipar problemas, pois, a maioria deles serão problemas novos.

Rápida evolução tecnológica

Como há uma rápida evolução tecnológica na área de TI, nem mesmo a tecnologia usada, os métodos e ferramentas já conhecidas e experimentadas em projetos anteriores servirão de parâmetros para o novo projeto. Muitas ferramentas ou técnicas amplamente utilizadas há pouco mais de uma década, hoje são completamente obsoletas.

Na maioria das áreas a opção mais comumente adotada para acompanhar a evolução tecnológica ou o aperfeiçoamento de métodos e técnicas é projetar novos produtos que englobam os avanços tecnológicos. Em projetos de software, não raro, tenta-se adaptar os produtos existentes às novas tecnologias.

Conhecimento da área de atuação

Os projetistas das demais áreas de engenharia, em geral, gerenciam projetos muito específicos de sua área de conhecimento enquanto os projetistas de software são solicitados a desenvolver os seus projetos nas mais variadas áreas do conhecimento humano, áreas estas que eles não dominam. Isto torna as incertezas de seu sucesso ainda maiores, pois, eles dependem essencialmente do conhecimento de pessoas que por sua vez não dominam as técnicas de desenvolvimento de software.

Identificação das falhas

Enquanto os gerentes de projetos de outras áreas podem orgulhar-se de colocar no mercado produtos sem defeitos, os gerentes de produtos de software, geralmente devem contentar-se em oferecer produtos que sejam confiáveis, não necessariamente sem defeitos. Confiáveis são produtos que podem apresentar defeitos, mas estes não devem ocorrer em situações normais de uso, não podem ser frequentes e nem aparecer nos momentos mais críticos de uso do produto.

Outra consideração significativa diz respeito às indicações de possíveis falhas. Nas demais áreas, as falhas são geralmente antecedidas por ocorrências facilmente percebidas, tais como rachaduras em prédios, barulhos estranhos em máquinas, cheiros incomuns em aparelhos elétricos ou produtos químicos, fumaça em motores, por exemplo. Em produtos de software as possíveis falhas muitas vezes só são percebidas na hora do uso.

Várias formas de se implementar o mesmo produto

Na maioria das áreas o número e a variedade de implementações satisfatórias é, em geral pequeno, isto quando não se reduz a uma só. Em engenharia de software pode haver uma enorme variedade de implementações satisfatórias. Desta forma as especificações de um projeto de produto de software devem incluir diretrizes para se escolher adequadamente uma alternativa correta.

Dependência de outros fatores

Outra dificuldade em projetos de software é que a qualidade dos produtos de outras áreas depende, em geral, somente da qualidade construída no produto. Já na área de produtos de software a qualidade do resultado produzido pelo software depende da qualidade da máquina na qual ele vai ser executado, da qualidade dos outros produtos de software com os quais ele interage (sistema operacional, compilador, servidor de aplicação, gerenciador de Banco de Dados, etc.).

Instabilidade dos requisitos

Normalmente, quem pretende construir um prédio ou uma máquina tem previamente uma ideia formada do que quer ou, pelo menos, não começa a execução sem ter essa ideia, porém, na engenharia de software não é raro nos deparamos com um cliente que quer um sistema para resolver um problema que ele não sabe exatamente qual é e nós iniciarmos o projeto antes de conhecer o problema a fundo. Como nestes casos começamos a trabalhar sem saber exatamente onde queremos chegar, é normal que ao longo do tempo os requisitos mudem e parte do trabalho tenha que ser refeita, consequentemente, não conseguimos cumprir o planejamento original.