Más contenido relacionado La actualidad más candente (20) Similar a Fatores que influenciam na longevidade de um Software (20) Más de Pablo Dall'Oglio (8) Fatores que influenciam na longevidade de um Software2. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #2
Minha timeline
●
Clipper (1994-1998): comercial, bibliotecas, funções;
●
Delphi (1998-1999): automação, componentes;
●
PHP (2000): SAGU (php+html+sql);
●
PHP-GTK(2001): PHP só com classes;
●
Agata Report (2001-2006);
●
Design Patterns (2004): Aprendizado na Unisinos;
●
PHP-GTK: Criando Aplicações Gráficas com PHP (2004);
●
PHP: Programando com Orientação a Objetos (2007);
●
Criando Relatórios com PHP (2011);
●
Adianti Framework para PHP (2012).
3. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #3
Qualidade
●
O que é ter qualidade?
– Um software feioso mas que atende bem o cliente é
um software de qualidade? E o contrário?
●
Qualidade envolve:
– Questões funcionais (orientadas pelo negócio);
– Questões não-funcionais (arquitetura, padrões);
●
Tá, mas e daí? O que eu tenho a ver com isso?
– O negócio demanda, a técnica responde;
– O código é reflexo de um modelo de negócios;
– Um modelo ruim, quebra com pequenas alterações;
●
Às vezes não há padrões para embelezar a gambi;
– Um modelo bom é mais resiliente e consegue absorver
a energia das modificações sem se romper;
4. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #4
Qualidade
Quando o modelo for ruim, aumentam as chances de demanda por
gambiarra em algum momento posterior à execução.
5. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #5
Longevidade?
●
Longa duração de vida;
●
Que está relacionado à duração da vida;
●
Tempo que duram as espécies nas épocas geológicas;
●
Durabilidade ou resistência das coisas.
Um SW longevo demonstra
resistência, resiliência.
A longevidade é um
Indício de qualidade.
6. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #6
Software longevo?
●
Software precisa ser longevo?
– Enquanto alguns dirão:
●
O novo sempre é melhor;
●
Novas tecnologias, pensamentos...
●
Faça de qualquer jeito, pois logo vai mudar tudo...
– Outros dirão:
●
Fazer frequentemente tudo do zero é caro;
●
Quanto mais tempo durar, maior o ROI;
●
Faça bem feito, para dar menos incomodação.
7. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #7
Software longevo?
●
O que afeta a longevidade em Software?
– Aspectos originais (DNA):
●
Processo/Metodologia de software escolhidos;
●
Análise, projeto, desenvolvimento;
●
Boa arquitetura, modelo, patterns;
– Aspectos evolutivos (crescimento):
●
Novas features bem projetadas, refactoring;
●
Evoluir com segurança (unit tests).
Vou focar
aqui
8. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #8
Processo de software
●
A escolha do Processo de software muda tudo;
●
No início, tentava-se “imitar” a engenharia tradicional;
●
Na Engenharia tradicional, o que é projetado é construído;
●
Modelo Waterfall;
●
Sucumbiu por que:
– Requisitos mudam a todo instante;
– “Analistas” ficavam meses produzindo docs;
– Não consideravam limitações da arquitetura;
– Quando prontos já estavam desatualizados;
– Os developers acabavam refazendo do seu jeito.
9. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #9
Processo de software
●
Aí vieram os métodos ágeis;
●
Dividido em ciclos;
●
Cada ciclo entrega uma parte do sw;
●
Cada ciclo exerce todas áreas de conhecimento;
●
Usa feedback e planejamento constantes.
Joinha, já entendi
10. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #10
Processo de software
●
Como alguns entenderam a metodologia?
●
“Working software over comprehensive documentation”
– Ahhh, não preciso mais documentar NADA;
– Modelar pra quê? Discutir requisitos pra quê?
– Oba, vamos direto ao código e terminar isso logo!
– Se o software funcionar, é a conta.
– Deixamos de perder tempo projetando!
– Vamos direto ao que importa.
●
“Responding to change over following a plan”
– Antecipar problemas para que?
– Não preciso mais daquele Gantt chato!
11. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #11
Oito ou oitenta
●
Essa é uma característica BEM brasileira;
12. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #12
Processo de software
●
Qual problema que isso gera?
– Começa a fazer sem a visão
do todo;
– As entregas são rápidas;
– Mas daria pra fazer melhor...
– O modelo de domínio acaba
ficando confuso;
– O bom design acaba ficando
em segundo plano;
– OO? DDD? Pra quê?
Brasil, o país da
arquitetura de puxadinho.
13. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #13
O negócio
●
A visão do negócio vem sempre em primeiro lugar;
●
Onde começa o processo?
●
Onde termina? quais as fronteiras?
●
Qual é o seu negócio, para que você existe?
●
Pode envolver gestores, proprietários;
●
Ajuda a quebrar o todo em partes para guiar a análise;
●
Permite comparar o antes e o depois (AS IS / TO BE);
●
Sabemos que:
– É inviável definir os requisitos COMPLETAMENTE antes da
construção;
– Mas é necessário ter a compreensão do negócio.
14. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #14
O negócio
BPMN
Com o uso de WS no processo A,
não precisaremos mais dessa
rotina de envio em lote.
15. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #15
O negócio
●
Por que é importante?
– Sugere processos desnecessários (sempre foi desse jeito);
●
Nosso trabalho é gerar o relatório para eles;
●
Nosso trabalho é olhar o relatório enviado por eles.
– Visualizar processos redundantes (duplo check, confiança);
– Será que TUDO que o cliente quer é necessário?
●
O que a visão de negócio permite?
– Questionar: Por que isso é assim? Por que sempre foi...
– Unificação de processos, separação;
– Troca de papeis de usuários (é função dele fazer isso?).
●
Ferramentas:
– Bizagi, Bonita.
16. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #16
O negócio
UML
Usados em filtros
de relatório,
bloqueio de
processos, etc.
17. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #17
O negócio
●
Por que é importante?
●
Focar em um objeto;
– Qual o ciclo de vida de um aluno?
●
Definir seus estados;
– Cancelado é um estado de um título?
●
Agrupar sinônimos:
– Liquidado e Pago são a mesma coisa?
●
Criar um vocabulário:
– Minimiza problemas de comunicação futuros.
●
Quando surgir uma manutenção...
– Ahhh, vamos criar só mais uma flag.
18. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #18
Projeto
●
Tenho uma IDE fera, estou pronto?
●
Vou usar a arquitetura MXMVPC, ouvi falar que é da hora;
●
Baixei aquele frame que todos estão usando, estou pronto?
●
É preciso apropriar-se da filosofia;
●
Isso é do M,V ou C? Entender bem onde se encaixa cada coisa;
●
A equipe deve saber em que classe colocar cada método;
●
E que nome dar às coisas.
O brasileiro vai mundo na onda.
19. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #19
Go horse model
●
Para muitos, projeto = ER;
●
Para eles, projetar é pensar em tabelas;
●
Só pensam em queries dentro dos frameworks!
●
Abrem o Astah e só usam associações!
<?php
$connect = mysql_connect("localhost","root", "root");
if (!$connect) {
die(mysql_error());
}
mysql_select_db("apploymentdevs");
$results = mysql_query("SELECT id, name FROM person
WHERE category_id='{$cat_id}' AND
Gender = 'F'");
while($row = mysql_fetch_array($results)) {
echo $row['Name'] . "</br>";
}
$results = mysql_query("SELECT id, name FROM
Customer WHERE city_id = {$market_city}");
?>
20. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #20
DDD
●
Domain Driven Development;
21. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #21
DDD
●
UML não é ER!
●
São relações entre objetos, não entre tabelas;
●
Pensar primeiro nas entidades e relações;
●
É um modelo com maior semântica (é um tipo de...);
●
Abstrair o Banco de Dados, que pode ser derivado;
●
No lugar de Primary key e Foreign Key, pensar em:
– Herança;
– Associação;
– Composição (relação todo parte exclusiva);
– Agregação (relação todo parte não exclusiva);
22. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #22
A partir do modelo...
<?php
/**
* Customer Active Record
* @author <your-name-here>
*/
class Customer extends TRecord
{
public function get_city()
public function addSkill(Skill $skill)
public function getSkills()
public function load($id)
public function store()
public function delete($id = NULL)
}
?>
XMI
SQL
PHP
23. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #23
Navegação no código
●
Relações tornam-se navegáveis;
●
Sem queries malucas por todos os lados!
<?php
// load customer
$obj = new Customer(5);
print $obj->city->name;
print $obj->category->name;
// percorre contatos
foreach ($obj->getContacts() as $contact)
{
$contact->value = '9'.$contact->value;
$contact->store();
print $contact->type . '-' . $contact->value;
}
foreach ($obj->getSkills() as $skill)
{
print $skill->name;
}
24. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #24
Navegação no código
●
A query é realizada de maneira transparente pelo método;
●
Quando muda, não precisa alterar N lugares;
<?php
$customer = new Customer(5); // load customer
$criteria = new TCriteria;
$criteria->add(new TFilter('date', '=', date('Y-m-d')));
$sales = $customer->getSales($criteria);
// percorre vendas
foreach ($sales as $sale)
{
$total += $sale->total;
print $sale->date;
print $sale->total;
foreach ($sale->items as $item)
{
print $item->product->name;
}
}
?>
Navegabilidade:
tem de ser tão fácil
quanto ler.
25. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #25
Modelos mal definidos
●
Um modelo mal definido leva à problemas;
●
Novos recursos são necessários;
●
O modelo atual se mostra frágil;
●
A solução é criar tabelas e mais tabelas;
●
Arquitetura de puxadinho;
●
One table per ticket.
27. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #27
Go Horse presentation
<?php
public class MinhaAplicacaoWebEmCodeMacaroni {
public function process($request)
{
$pagina = $request["pagina"];
if ($pagina == null) {
$pagina = "inicial";
}
if ($pagina == "inicial") {
print("<html>");
print("<li><a href="?pagina=inicial">Pagina Inicial</a></li>");
print("<h2>Pagina Inicial</h2>");
print("<p>Bem-vindo ao nosso Site!</p>");
print("</html>");
}
}
}
$page = new MinhaAplicacaoWebEmCodeMacaroni;
$page->process($_GET);
?>
28. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #28
Componentes
<?php
class TestView extends TPage
{
private $form;
function __construct()
{
parent::__construct();
$notebook = new TNotebook(530, 160);
$this->form = new TForm;
$table = new TTable;
$this->form->add($table);
$notebook->appendPage('Automatic DBselection elements', $this->form);
$radio = new TDBRadioGroup('radio', 'samples', 'Category', 'id', 'name');
$check = new TDBCheckGroup('check', 'samples', 'Category', 'id', 'name');
$combo = new TDBCombo('combo', 'samples', 'Category', 'id', 'name');
$radio->setLayout('horizontal');
$check->setLayout('horizontal');
$combo->setSize(160);
29. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #29
Templates
app/resources/customer.html
<!--[main]-->
<table class="customform" style="border:1px solid #B7B7B7">
<tr>
<td colspan="2" class="formtitle">Customer data</div></td>
</tr>
<tr>
<td width="50%"><b>Name</b></td>
<td width="50%"><span class="formfield">{$name}</span></td>
</tr>
<tr>
<td><b>Address</b></td>
<td><span class="formfield">{$address}</span></td>
</tr>
<tr>
<td colspan="2" align="center">
<a generator="adianti" href="...">Click here to edit the customer</a>
</td>
</tr>
</table>
<!--[/main]-->
30. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #30
Templates
<?php
// load the styles
TPage::include_css('app/resources/styles.css');
// create the HTML Renderer
$this->html = new THtmlRenderer('app/resources/customer.html');
try
{
// look for customer 1
TTransaction::open('samples');
$customer = new Customer(1);
// define replacements for the main section
$replace = array();
$replace['code'] = $customer->id;
$replace['name'] = $customer->name;
$replace['address'] = $customer->address;
// replace the main section variables
$this->html->enableSection('main', $replace);
parent::add($this->html);
TTransaction::close();
}
...
?>
31. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #31
Evolução
●
As bibliotecas evoluem constantemente;
●
Novas tecnologias surgem;
●
Nosso código não deve referenciar a biblioteca utilizada;
●
Devemos separar nosso código do código de terceiros;
●
Isso tudo, para facilitar o reuso e a evolução.
32. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #32
Desenvolvimento
●
Muitos desenvolvedores integram bibliotecas assim:
Alto acoplamento: Até pode funcionar, mas...
33. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #33
●
O acoplamento é quanto
um módulo (classe,
método) conhece e
depende de outro;
●
O objetivo é criar modelos
com baixo acoplamento;
●
O alto acoplamento
diminui a reusabilidade de
objetos porque objetos
não podem ser usados
sozinhos.
Acoplamento
34. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #34
Acoplamento
●
É impossível criar um sistema com 0% de acoplamento.
●
Uma classe com BAIXO acoplamento:
– Não depende de muitas outras e facilita a manutenção;
– Evita que as modificações produzam efeitos colaterais;
●
Uma classe com ALTO acoplamento:
– É menos inteligível isoladamente e menos reutilizável;
– É mais sensível a mudanças nas classes da qual ela
depende.
35. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #35
Acoplamento
●
Uma forma de diminuir o acoplamento é criando um
facade;
●
Oferece uma interface única para um conjunto de
interfaces de um subsistema.
36. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #36
Facade
<?php
if ($paymenttype_id == 1) // PAGSEGURO
{
$paymentRequest = new PagSeguroPaymentRequest();
$item = new PagSeguroItem;
$item->setDescription( $product->description );
$item->setQuantity( $data->amount );
$item->setAmount( $price );
$paymentRequest->addItem($item);
$address = new PagSeguroAddress;
$address->setPostalCode( $customer->postal );
$address->setStreet( $customer->address );
$address->setCity( $customer->city );
$paymentRequest->setShippingAddress($address);
$sender = new PagSeguroSender;
$sender->setName( $customer->name );
$sender->setEmail( $customer->email );
$paymentRequest->setSender($sender);
}
37. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #37
Facade
<?php
else if ($paymenttype_id == 2) // PAYPAL
{
$total = ($product->price * $data->amount);
// dados para enviar para o paypal
$padata ='&CURRENCYCODE='.urlencode($ini['currency']).
'&PAYMENTACTION=Sale'.
'&ALLOWNOTE=1'.
'&PAYMENTREQUEST_0_AMT='.$total.
'&PAYMENTREQUEST_0_ITEMAMT='.$total.
'&L_PAYMENTREQUEST_0_QTY0='. $data->amount.
'&L_PAYMENTREQUEST_0_AMT0='.$product->price.
'&L_PAYMENTREQUEST_0_NAME0='.$product->description.
'&L_PAYMENTREQUEST_0_NUMBER0='.1.
'&AMT='.$total;
// obtém o token
$paypal= new PayPalFacade;
$httpresult = $paypal->PPHttpPost('SetExpressCheckout', $padata,
$ini['username'], $ini['password']);
}
?>
38. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #38
Facade
<?php
class PaymentFacade
{
public function addItem($desc, $qtde, $preco)
{
//...
}
public function setCustomer($nome, $ender, $cidade)
{
//...
}
public function setPaymentType($type)
{
//...
}
public function process()
{
//...
}
}
?>
39. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #39
Bridge
●
Separa uma abstração de sua implementação;
●
As duas podem variar de maneira independente;
●
Usa encapsulamento, agregação e herança para separar
responsabilidades.
40. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #40
Jeito tosco
●
Proliferação de níveis. Estrutura não-flexível;
●
Alto grau de acoplamento. O cliente especifica a classe;
●
Quantas novas classes para novo tipo de gráfico (gauge)?
Implementação
filha da
abstração
42. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #42
Bridge
<?php
require_once 'app.reports/TChart.class.php';
require_once 'app.reports/TBarChart.class.php';
require_once 'app.reports/TPieChart.class.php';
// ...
$data['maria'] = array( 1, 2, 3, 4, 5, 6, 7);
$data['pedro'] = array(12, 3, 12, 4, 12, 4, 2);
$data['joao'] = array( 9, 8, 7, 6, 5, 4, 3);
$chart = new TBarChart(new TPChartDesigner);
$chart->setTitle('Título do gráfico', NULL, NULL);
$chart->setSize(500, 300);
$chart->setXLabels(array('a', 'b', 'c', 'd', 'e', 'f', 'g'));
$chart->setYLabel('label do eixo Y');
$chart->setOutputPath('tmp/teste.png');
$chart->addData('maria', $data['maria']);
$chart->addData('pedro', $data['pedro']);
$chart->addData('joao', $data['joao']);
$chart->generate();
?>
43. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #43
Bridge
<?php
require_once 'app.reports/TChart.class.php';
require_once 'app.reports/TBarChart.class.php';
require_once 'app.reports/TPieChart.class.php';
// ...
// cria um gráfico de pizza usando a JPGraph
$chart = new TPieChart(new TJPGraphDesigner);
$chart->setTitle('Título do gráfico', NULL, NULL);
$chart->setSize(500, 300);
$chart->setOutputPath('tmp/teste2.png');
$chart->addData('maria', 40);
$chart->addData('pedro', 30);
$chart->addData('joao', 30);
$chart->generate();
?>
Com isso,
Conseguimos
evoluir melhor
44. Adianti Solutions Ltda © Pablo Dall'Oglio Fatores que influenciam na longevidade de um Software #44
Obrigado
●
Relatórios:
– www.adianti.com.br/bkrpt
●
Adianti Studio:
– www.adianti.com.br/studio
●
Adianti Framework:
– www.adianti.com.br/framework
●
Contato:
– www.dalloglio.net
– @pablodalloglio
– fb.com/pablodalloglio
●
Não esquecer de falar do Sorteio!