Almoçando design de soluções com o seu Zé

Almoço inspirando uma reflexão de código, design e a exposição das intenções através do pseudo-codigo.

São 8 horas da manhã e me desculpem se já estou pensando no almoço, mas é que tem um pé-sujo do lado do trabalho que faz um bife de fígado acebolado de comer em silêncio e ai já viu né.. o ex-gordinho aqui não pode deixar passar.

Pensando em almoço foi que tive essa ideia que serve para demonstrar que a pratica de design de soluções e para qualquer momento. Ela é importante para ir tomando consciência dos recursos que você tem como arquiteto e das ciladas que você pode se meter ao presumir que algo é trivial.

Vamos ao problema: como podemos modelar o caixa de um restaurante?

O cliente chega e faz o pedido. Normalmente inclui um prato e uma bebida. Come, toma seu cafezinho e pede a conta ou, paga a conta e toma o cafezinho ;).

IMG_1220No modelo padaria do Zé, imaginei um daqueles espetos de pedido, uma caneta e uma porção de blocos de anotação. O garçom rabisca os preços no papel e deixa com o cliente que quando termina seu almoço se dirige ao caixa, apresenta o papel e em 2 minutos j passou o cartão de débito.

$total=14.5+3.5;

echo "total: {$total}";

Se o Zé me pedir para automatizar seu restaurante sem mudar o sistema eu entrego uma calculadora na mão dele e dou problema por resolvido. O que acha dessa abordagem? Certo ou errada?

Outro caso é aquele em que o filho do Zé quer saber as entradas e saídas e poder planilhar a coisa toda. Para isso os pedidos precisam ter seus itens descriminados para poder separar os lançamentos. Aqui a coisa começa a ficar interessante.

IMG_1221Para manter a agilidade vou manter o sistema de blocos que os garçons utilizam para anotar os pedidos, só que agora eles devem descriminar com um A do lado do preço do almoço e usar um B para bebida. Quando o cliente terminar de comer, nada muda. Ele vai até o caixa, o Zé fecha a conta e espeta a nota. Agora ele pode revisar.

setlocale(LC_MONETARY, 'pt_BR.UTF-8');
 $comida  = new money(14.50);
 $bebida  = new money(3.50);
 $total   = new money(0);
 $total->add($comida,$bebida);
 echo "Total da conta {$total}";

Agora é possível saber:
a) quanto o restaurante faz com almoço (valor total faturado – custo total de produção).
b) quanto faz com a bebida(valor total de compra- valor total de venda).
c) dá para saber se um dia foi lucrativo.
d) qual dia foi mais lucrativo.
e) que item é mais lucrativo(comida ou bebida).
f) saber se vale a pena abrir de terca-feira.

Outro benefício é que antes o Zé não podia fazer outra coisa por que ele precisava dessas informações e para tê-las ele passava todo o dia acompanhando o que ocorria e isso requeria total atenção. Agra ele está livre para outras tarefas como melhorar seu relacionamento com os fornecedores, preparar novas receitas, falar com os clientes.

O design da solução captou a essência, ele registra o pedido do cliente baseado em um prato e uma bebida, exatamente como o Cliente(Zé) pediu, mas esse é um domínio de conhecimento onde todos temos um pezinho, frequentamos restaurantes por falta da comida da mãe, de comida caseira, já que ao menos em São Paulo a história aponta que a cidade foi planejada para você precisar de um carro e então você não pode ir para casa comer, ou, você mora sozinho… um lobo solitário acostumado a comer hot pocket e lasanha de micro-ondas com refrigerante de laranja quente. De maneira que o próximo passo é um tanto quanto previsível para todos nós e podemos ir até o cliente questionar se não é melhor tomar essa direção no design, ou seja, se o conceito é válido e ele quer ver funcionando.

Designer: “Oi Zé, que tal se a gente fizer os lançamentos de itens e permitir lançar quantos itens quiser, assim o cliente pode pedir um prato, uma bebida, depois mais outra, pedir um pedaco de pudim para a sobremesa e um café para fechar. Se fizer assim o sistema dá conta de lançar todos esses itens”.

O cliente aceita e vamos para o refactoring, vamos a ele.

$contaberta = true; 
$conta = new ItemCollection();

while($contaAberta){
  if ($clienteFezPedido()){
  $conta->add(new item($description, new Money($value));
  }
}

$valorTotaldaConta = new Money(0);

foreach($conta as $item){
   $descricaoItem = $item->getDescription();
   $valorItem     = $item->getMoeny->getValue();
   echo "{$descricaoItem}: {$valorItem}";
   Total->add(item->getprice());
 }

 echo "O total é {$total->getvalue()}";

Pratica constante, eu me pego modelando problemas do dia a dia quase sempre, então, as vezes as pessoas me falam que cruzaram comigo na rua e eu estou com cara de bobo(algo que tenho o tempo todo, não só na rua) e que pareço estar no mundo da lua(às vezes é algo bem mais trivial como o mundo do restaurante).

Design é pratica e cai na regra das 10 mil horas. Dez mil horas para conseguir ser excepcional em algo. Antes disso você é um padwan sem sabre de luz com poderes da mente incipientes, incapaz de levitar algo maior ou mais pesado que uma maçã.

No final, ficam as seguintes ideias:

  • Pratique design de soluções
  • Ouça seu cliente, mesmo os imaginários
  • Evolua mentalmente os modelos
  • Saiba retroceder um modelo no tempo até a última versão satisfatória e modele novamente
  • Não ignore nenhum tipo de problema, nem os aparentemente triviais
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s