Um pouco sobre desenvolvimento de produto

Ter uma ideia de software ou serviço que seja util e necessario para as pessoas e que talvez possa ser lucrativo para você ou a organização para qual você trabalha é um grande passo, no entanto foi-se o tempo em que idéia sem implementação valia alguma coisa (se é que isso ja teve valor um dia). Transformar um conceito em software exige uma serie de fatores que podem determinar a viabilidade ou não do produto.

O foco desta conversa são os primeiros passos e como se sai de uma ideia e se chega a algo tangível, seja um protótipo ou o produto final, na verdade são os passos que usamos para gerar nossos produtos, sejam nossos ou de clientes e gostaríamos de compartilhar um pouco dessa “metodologia”. Talvez aqui você encontre muito do Getting Real da 37Signals, nós mesmos nos surpreendemos de quanto temos em comum quando conhecemos o livro. e adaptamos alguns conceitos para a nossa realidade.

Simples

Saber o que você quer/precisa é essencial, ter conhecimento do negócio é indispensável para ser objetivo, então com a ideia em mente pense simples, qual a maneira mais simples de executar um processo, de criar uma interface, de exibir um grupo de informações, pense em como você gostaria que isso fosse disposto se você fosse o usuário (e muitas vezes será). Mantenha-se simples, você vai perceber que a simplicidade é sua maior aliada para desenvolver software rápido, usável e fácil de crescer, num curto período de tempo.

Expresse-se

Tendo o mind map da aplicação em mente é hora de mostrar aos outros, faça protótipos toscos, papel e caneta são suas melhores ferrametas, esqueça a maquina, transmita seus pensamentos e conceito mental de software para o papel, esboçe as telas, formularios e relatórios.

Revise seus esboços, se não gostou refaça, papel aceita tudo e é fácil de mudar, só prossiga quando achar que suas telas em papel refletem exatamente o que quer passar com o software. Estes papéis servem de base para as telas, caso seja uma demonstração interna (para a sua equipe) pode usar os esboços mesmo, caso tenha de apresentar para o cliente pode desenhar um wireframe mais detalhado ou até os protótipos HTML para o cliente ver.

Não invista muito nessa fase pois os requisitos podem mudar e você acaba jogando tempo fora, seja o mais simples possível nessa fase, ser simples não quer dizer incompleto, tenha o minimo de funcionalidades para sua aplicação ser usável e útil.

Escolha certo

Parece óbvio, ninguém quer fazer escolhas erradas, mas o ponto aqui é que de um tempo pra cá a onda é “se preocupe com os problemas quando eles acontecerem”, concordo plenamente e seguimos esta linha, no entanto ao se “startar” o desenvolvimento de uma aplicação já podemos ter uma ideia do quão grande ela será ou não, se exigira processamento pesado ou não, ou seja, do consumo de recursos necessários quando sua aplicação escalar entre ordens de grandeza. Tendo isso em vista é possível se ter ideia de qual tecnologia/ferramenta pode ser “escalável” o suficiente para adiar o problema, mudanças de estrutura e tecnologia não são fáceis e devem ser evitadas, mas se tudo der certo será um ótimo problema a se ter..

Mostre logo

Seja um produto seu ou uma aplicação de clientes, jogue aberto e mostre logo o que tem pronto, seja funcionalidade a funcionalidade ou em pacotes deixe as pessoas ver o que você esta fazendo assim que a app esteja usável e apresentável. Mostre qualidade, só torne publica uma tela ou funcionalidade que esteja pronta, testada e funcionando plenamente, as pessoas ficam frustadas ao verem telas de erro, isso faz com que seu produto fique desacreditado, bugs existem, mas devem ser minimizados ao máximo.

Ver a evolução de uma aplicação gera expectativa e isso é bom para a adoção do produto, as pessoas começarão a promove-lo e quando tiver uma versão final ou completa as pessoas já estarão familiarizadas com ela.

Espalhe

Se você esta construindo um produto é porque voce acredita nele, então deixe isso claro para as pessoas, explique o que tem de diferente no seu produto e porque as pessoas deveriam usa-lo.

Desfrute dos benefícios de blogs e redes sociais, quando pessoas veem alguem falando bem de algo elas querem conferir, se você conseguir que as pessoas usem seu produto e falem dele, então saberá que esta no caminho certo.

Aprenda

Aprenda com os feedback das pessoas, elas vão lhe dizer o que esta bom e o que não esta e principalmente o que elas gostariam, mas cuidado, de um simples to-do list pode sair um CRM ou ERP, defina e limite seu produto, não tente agradar a todos, se uma funcionalidade é importante os pedidos vão ser constantes, ai sim vale a pena pensar se realmente essa funcionalidade agregaria valor ao seu produto.

Não desista

Se seu software não deu certo, se as pessoas não usam ou seu concorrente é melhor, não desanime, pelo menos você usa seu produto e você conseguiu um problema que tinha.

Reveja seu produto e tenha a certeza que foi isso mesmo que você idealizou e que não se desviou no caminho, se for necessário adapte seu produto para suprir as necessidades que julgar importante e lembre-se que software é dinâmico e mutável (com raras exceções), diferentemente de um prédio você não precisa destruí-lo e recriar em outro lugar. Se você acredita no que faz um dia as coisas acontecem.

Alguns fatos sobre empreendimento

Empreendedorismo é a nova velha onda do momento. Vemos uma explosão de startup’s com negocios inovadores mudando o meio onde atuam e recolhendo milhões em investimentos, e todo mundo quer uma fatia desse bolo, porém poucos conseguem.

Já a algum tempo estamos estudando esse assunto e traçando uma logica de fatos que são a base de um pensamento e atitude empreendedora, são como um mantra para “nos manter no caminho” quando temos uma ideia e buscamos viabiliza-la para se tornar um produto real e palpável.

Faça!

Não pense muito, enquanto você pensa na sua ideia alguém pode estar implementando-a, seja um software, um novo lanche ou uma bicicleta ecológica, teve a idéia? trabalhe nela de maneira prática, assim ela se mostrará valorosa ou não.

Erre!

Acha que sua ideia não é boa o bastante para tentar? Pois eu lhe digo TENTE, somente assim terá a prova que sua ideia não era boa, porém não seja pessimista, se assumiu o risco de tentar é porque acredita na ideia e em você, então de tudo de si para sua ideia se tornar realidade, se isso não acontecer parta para outra, não desanime e não cometa os erros que cometeu na primeira tentativa. Empreender também é errar, ganhar experiencia e aprender com isso.

Tenha amor …

Empreenda numa área que você goste, não faça por obrigação ou visando apenas lucro, dinheiro é consequência, o importante é que mesmo que sua ideia não de certo você se divirta no processo, quem faz o que gosta faz com paixão e faz bem feito e seu produto ou serviço deixa isso claro para as pessoas.

Mas já existe …

Tive uma ideia mas já existe algo similar no mercado. Ótimo! Se o que existe não se encaixa a você é provável que não se encaixe também a milhões de pessoas que estão esperando que alguém implemente essa ideia para elas comprarem, então o que está esperando?

Mas …

Sem mas! Todos nós temos esposa, namorada, moramos no interior, temos filhos, cachorros e não temos dinheiro, tempo, disposição e mais qualquer desculpa que você possa pensar, isso são desculpas. Isso esta no meio de você e seu sucesso, quem quer empreender de verdade não se atem a desculpa e viabiliza seu negócio nos momentos oportunos.

Você tem uma hora de almoço por dia? ótimo, significa que você tem 30 minutos para comer e 30 minutos para viabilizar seu negócio. Dorme 8 horas por noite? que maravilha, pode dormir 89% desse tempo(7 horas) e aplicar a hora restante na realização do seu negócio. Novamente, desculpas são a barreira entre você e seu negócio (e por que não sonho).

Continua …

Do PHP ao Rails, e de volta ao PHP (com CakePHP)

PHP é sem dúvida a linguagem mais usada da Web, por diversos motivos, é uma linguagem fácil, roda em qualquer lugar, tem profissionais em abundância (isso não quer dizer bons) e baratos. Eu mesmo sou desenvolvedor PHP e começei com ele, no entanto buscava mais produtividade e algo mais elegante e organizado, Solução? FRAMEWORKS.

Mas não em PHP, conheçi o Rails, começei a brincar com Rails e Ruby e fui evoluindo, na ferramenta e profissionalmente, passei também pelo .Net em um capitulo isolado que não vem ao caso. No Rails tenho tudo que preciso, é legal, adoro a linguagem, é relativamente fácil e flexivel quando se aprende, no entanto, nos meios em que atuo ainda não é a primeira escolha ao se desenvolver um projeto, com o tempo isso mudará, mas ainda não é a hora.

O caso “Problema”

Eis que tenho um novo desafio, um projeto razoavelmente grande onde fiquei incumbido de definir ambiente e arquitetura do sistema, que tera uma API centralizada e diversos meios interagindo com ela, storage separado e um pesado processamento de imagem em um módulo separado, até ai tudo bem, o “problema”? PHP! só isso? claro que não né, temos pouco tempo e carência de mão de obra, alguns dos profissionais da agência serão disponibilizados, no entanto em datas e horários variados, no esquema do “quando der”, e por cima de tudo não há planos de contratação programada para o projeto.

Então como eu posso tentar implantar uma nova metodologia / linguagem sem contratar gente e com uma enorme curva de aprendizado para os recursos “disponíveis”?

A Solução

Rails é produtivo, divertido, tem muitos dos recursos que necessito pra agilizar o projeto, então o quedevo fazer? Ora … ora, um “Rails em PHP“, eis que estudando e pesquisando chego a conclusão que o CakePHP é o que eu preciso, bastante parecido com o Rails, com os mesmos recursos e ao alcance da equipe, com ele poderemos criar nossa API REST respondendo em JSON, podemos usa-lo nos testes (sim o projeto será TDD), ORM e testes integrando tudo isso.

Escolhi o CakePHP porque é parecido com Rails? também, mas é um framework PHP já consagrado e estável (vide Campus Party – Frameworks PHP do Augusto Pascutti), tem excelente desempenho, roda em qualquer lugar como o PHP e tem uma cartela de desenvolvedores bastante interessante, inclusive na equipe que irá trabalhar no projeto. CakePHP é melhor que Rails? tecnicamente prefiro não comentar, mas no meu contexto CakePHP preenche nossos requisitos com louvor respeitando as restrições.

Então que começe a folia.

Começando com Rails 3 – Instalando com Mysql

Estamos começando a atualizar nossas aplicações para Rails 3 e começamos enfrentando alguns problemas e erros ao instala-lo, coisas simples mas que pode acabar atrapalhando a vida dos mais novos em Rails, decidimos instalar um ambiente Rails 3 do zero (usando o Mint Linux – bastante compativel com Ubuntu e Debian em geral) para podermos identificar estes problemas e tentar ajudar a resolve-los, vamos começar instalando o Ruby (1.8.7, versão estavel até o momento).

sudo apt-get install ruby1.8 ruby1.8-dev

Também instalamos o RubyGems com o comando:

sudo apt-get install rubygems

No entanto identificamos que até o presente instante nos repositórios do Mint Linux a versão corrente do RubyGems é a 1.3.5 e o Rails 3 necessita da >= 1.3.6, logo baixamos o fonte da versão 1.3.7 do site oficial (aa) e instalamos na mão rodando o setup.rb.

Na sequencia instalamos o Mysql 5.1 com o comando:

sudo apt-get install mysql-server-5.1

Se quiser pode instalar o client poara poder acessar o banco pelo console com:

sudo apt-get install mysql-client-5.1

Bom, agora o principal, instalar o rails com o RubyGems, ele ja vai instalar tudo o que precisar, fazemos isso com o comando:

sudo gem install rails

Se tudo correu bem já temos o rails instalado e você pode verifica a versão do Ruby e do Rails com os respectivos comandos:

ruby -v
rails -v

Até ai tudo certo, a partir daqui que começaram nossos problemas, após criarmos uma app Rails 3 usando Mysql e configurando o banco ao rodar o comando para criarmos os bancos de dados (rake db:create:all) recebemos a seguinte mensagem:

Could not find gem ‘mysql2 (>= 0, runtime)’ in any of the gem sources.
Try running `bundle install`.

A gem mysql2 citada acima é a nova maneira de interagir com o Mysql adotado pelo Rails 3, tentamos instala-la e recebemos a seguinte mensagem:

sudo gem install mysql2
Building native extensions. This could take a while…
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.

/usr/bin/ruby1.8 extconf.rb
checking for rb_thread_blocking_region()… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lm… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lz… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lsocket… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lnsl… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lmygcc… no
checking for mysql_query() in -lmysqlclient… no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
–with-opt-dir
–without-opt-dir
–with-opt-include
–without-opt-include=${opt-dir}/include
–with-opt-lib
–without-opt-lib=${opt-dir}/lib
–with-make-prog
–without-make-prog
–srcdir=.
–curdir
–ruby=/usr/bin/ruby1.8
–with-mysql-config
–without-mysql-config
–with-mysql-dir
–without-mysql-dir
–with-mysql-include
–without-mysql-include=${mysql-dir}/include
–with-mysql-lib
–without-mysql-lib=${mysql-dir}/lib
–with-mysqlclientlib
–without-mysqlclientlib
–with-mlib
–without-mlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-zlib
–without-zlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-socketlib
–without-socketlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-nsllib
–without-nsllib
–with-mysqlclientlib
–without-mysqlclientlib
–with-mygcclib
–without-mygcclib
–with-mysqlclientlib
–without-mysqlclientlib

Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/mysql2-0.2.3 for inspection.
Results logged to /usr/lib/ruby/gems/1.8/gems/mysql2-0.2.3/ext/mysql2/gem_make.out

Solução

Percebemos que faltavam algumas libs no sistema, o problema foi facilmente corrigico com:

sudo apt-get install libmysql-ruby libmysqlclient-dev

Agora tente instalar novamente a gem mysql2 com:

sudo gem install mysql2

Pronto problema resolvido e tudo funcionando.

Update 1: não se esqueça de adicionar suporte a openssl com o comando:

sudo apt-get install libopenssl-ruby