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 ;).
No 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.
Para 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