sábado, maio 04, 2013

APF x Ágil

Texto de Célio Junior

Como quase tudo que envolve métodos ágeis a questão não é técnica e sim conceitual.

O principal objetivo das metodologias ágeis é entregar valor para o cliente. E como isso ocorre? Cliente e Time (ágil) irão colaborar para entregar o máximo de "software" possível que implique ao cliente o maior retorno de investimento (ROI) possível.

O que é PF? É o tamanho funcional de um sistema.
PF mede valor de negócio? Não (só se for indiretamente e olhe lá).
Então por que um time/cliente ágil vai utilizar PF em um projeto ágil? Não faz sentido...

Quero dizer, o cliente pode pagar por 10PF hoje e ter um ROI imenso, e pagar por 10PF amanhã e não ter ROI nenhum. Ou seja, PF não pode ser usado como uma métrica útil para times ágeis a não ser para ser usada como ela é hoje, para "precificar" o software. Ai é que conceitualmente mora o perigo pois da forma como PF é usada estaremos agora observando preço ao invés de valor.

Nessa visão de preço o time e o cliente não mais colaboram e sim concorrem, afinal o cliente quer ter o minimo de PFs com o máximo de software (pagando menos), enquanto o time quer ter o mínimo software com o máximo de PFs (recebendo mais) e o foco da minha negociação deixa de ser vantagem competitiva do cliente para ser preço de PF e detalhamento de requisitos (histórias do usuário...) e isso não tem mais nada a ver com agilidade.

Por isso que métodos ágeis funcionam melhor com contrato de custo fixo (pagando por mês por exemplo) e escopo variável, enquanto que na conjectura atual, PF + escopo variável = preço variável e nesse cenário negociação de contratos é mais importante do que colaborar com o cliente (O contrário disto está na 3ª declaração do manifesto ágil).

E pra variar, PF não tem culpa disso ;)

sexta-feira, janeiro 27, 2012

Resumo do livro Clean Code

Resumo de alguns tópicos do livro Clean Code do Uncle Bob, recomendadíssimo!
programador profissional é aquele que produz código limpo e testado!
 Regra de escoteiro: “você deve sempre deixar o lugar mais limpo do que encontrou” 

Nomes significativos

Nomes de classes, variáveis, métodos, etc, devem ser significativos, indicando claramente o que um método faz ou o que um atributo representa. A intenção deve ser visível através dos nomes. Crie nomes pronunciáveis para facilitar a comunicação, evite acrônimos e siglas.
Evite nomes confusos, os quais podem levar quem lê o código a conclusões erradas.
Use nomes que refletem o domínio do sistema, o contexto e os problemas que devem ser resolvidos.

Funções

Funções devem ser pequenas. Aliás, elas devem ser ainda menores. Deve haver apenas um nível de abstração por função.
Funções devem fazer uma coisa, e apenas uma. Novamente, utilize um nome que descreva bem o que a função faz. Utilize o menor número de argumentos possível, fazendo o máximo para que não passem de três.
Cuidado com “efeitos colaterais”, funções não podem fazer nada “escondido”. Use exceções ao invés de códigos de erro, e considere que tratar exceções é uma coisa.

Comentários

Comentários não salvam um código ruim. Procure explicar o que o código faz COM CÓDIGO.
Crie nomes de métodos e de variáveis informativos, ao invés de explicar com um comentário o que um método com um nome ruim faz. Use comentários para deixar uma expressão complexa mais clara, para avisar sobre as possíveis conseqüências de uma alteração, ou para ressaltar a importância de certo ponto do código.
Comentários ruins também poluem o código. Não escreva comentários redundantes, inúteis, ou pior, com falsas informações. Também não deve ser usado para indicar quando ou por quem foi alterado, para isso temos ferramentas de controle de versão. Não escreva comentários confusos ou grandes demais.
Não comente código que não será mais usado, simplesmente remova-o.

Objetos e estruturas de dados

Siga a Lei de Demeter. Faça boa abstração e encapsulamento. Não crie objetos burros.

Tratamento de erro

Use exceções ao invés de códigos de erro. Use exceções não checadas, e utilize mensagens de erro informativas.
Não retorne e nem passe null.

Testes

Siga as 3 leis do TDD.
Use uma assertiva por teste, e teste um conceito por vez.
Os testes devem ser rápidos, independentes, reprodutíveis em qualquer ambiente, auto-validáveis e escritos no momento certo. Mantenha o código de seus testes limpo.

Classes

Classes devem ser pequenas e seguir o princípio da responsabilidade única. Devem ser coesas,  essa coesão resulta em classes pequenas. Classes devem ser criadas visando a mudança, então programe orientado à interface.
Outros pontos que não posso deixar de citar são: Todos os testes devem estar passando; refatoração deve ser feita constantemente, visando à melhoria contínua; código duplicado deve ser evitado a todo custo; classes e métodos devem ser pequenos; o código deve ser o mais expressivo possível.
Esse resumo é um levantamento de alguns pontos importantes, tanto que aqui é mostrado o que deve ser feito, não o porquê ou o como, isso pode ser encontrado no livro. Esse post é o primeiro passo, espero que todos dêem continuidade lendo esse livro e muitos outros, buscando criar um código melhor. Eu não quero mais código sujo atrapalhando a minha vida. E você?
(Resumo feito  por Juliano Alves)

sexta-feira, agosto 12, 2011

segunda-feira, março 28, 2011

Arquivo XML para emissão de encomendas aos Correios

Não achei nada na net, então ai vai o inicio de um trabalho que estou fazendo para enviar encomendas volumosas aos Correios.
O nome do sistema dos Correios se chama SARA, se você estiver fazendo algum sistema que administra encomendas enviadas aos correios pode criar um arquivo xml nos padrões do SARA e enviar para eles. Isso evita preencher aqueles formulários limitados que são disponibilizados para encomendas.
Sei que muito DBA vai dizer "mas da pra fazer isso com FOR XML EXPLICIT", dá sim, mas da um trabalho escroto se vc estiver trabalhando com vários joins, é union e campo NULL que não acaba mais. Em C# ficou mais claro e fácil.
Fiz um pequeno exemplo que pode ser baixado nos links abaixo:

Layout SARA

Projeto Exemplo

terça-feira, fevereiro 08, 2011

Windows 7 64 bits javascript No such interface supported - FIXED !!!

Finalmente conseguir resolver a porcaria de erro que não deixava rodar um simples window.open!
foi tão foda de achar a solução que resolvi compartilhar.

Download/run the appropriate, newly-updated script(s) by IE MVP Kai Schaetzl:
http://iefaq.info/index.php?action=artikel&cat=42&id=133&artlang=en

Tip: The file named ie8-rereg.all.zip contains all three (3) scripts below.
If you have a Win7 32-bit computer:
• Close all open applications (i.e., anything with an icon on the taskbar) then Run the script named ie8-rereg.cmd & reboot.
If you have a Win7 64-bit computer:
• Close all open applications (i.e., anything with an icon on the taskbar) then Run the script named ie8-rereg.32on64.cmd to correct the problem in IE8 32-bit & reboot.

• Close all open applications (i.e., anything with an icon on the taskbar) then Run the script named ie8-rereg.64on64.cmd to correct the problem in IE8 64-bit & reboot.

NB: If the above is your fix, either a Norton or McAfee application is installed or one had been installed. YMMV.

Fonte: social.answers.microsoft.com

segunda-feira, dezembro 06, 2010

SQL Convertendo Colunas em Linhas

Pelo menos uma vez na vida você que trabalha com dados já passou pro este problema, uma tabela com 3 colunas normalizadas e outras 25 que deveriam se transformar em uma unica coluna.
A mágica se chama UNPIVOT, saboreem:


SELECT
[LOTE],
[PRODUTO],
[CAIXA],
NU_TITULO
FROM
   (
SELECT
[LOTE],
[PRODUTO],
[CAIXA],
TITULO1, TITULO2, TITULO3, TITULO4, TITULO5,
TITULO6, TITULO7, TITULO8, TITULO9, TITULO10,
TITULO11, TITULO12, TITULO13, TITULO14, TITULO15,
TITULO16, TITULO17, TITULO18, TITULO19, TITULO20,
TITULO21, TITULO22, TITULO23, TITULO24, TITULO25

FROM
[TAB_ENTRADA_lotes]
) p
UNPIVOT
   (NU_TITULO FOR Titulo IN
      ( TITULO1, TITULO2, TITULO3, TITULO4, TITULO5,
TITULO6, TITULO7, TITULO8, TITULO9, TITULO10,
TITULO11, TITULO12, TITULO13, TITULO14, TITULO15,
TITULO16, TITULO17, TITULO18, TITULO19, TITULO20,
TITULO21, TITULO22, TITULO23, TITULO24, TITULO25)
)AS unpvt;

sábado, novembro 20, 2010

nopCommerce com módulo PagSeguro e Correios

Módulo de pagamento PagSeguro UOL para nopCommerce e
Módulo Correios para nopCommerce.

Após publicar a primeira loja a WikiCode se deparou com a necessidade de fazer as cobranças através de cartão de crédito e ou boleto bancário e o cálculo do frete utilizando o site dos Correios. Não foi surpresa não encontrar um módulo de cobrança que utilizasse uma empresa brasileira, como o PagSeguro da UOL, pois a ferramenta tem diversos colaboradores e a maioria é dos EUA. 

Uma solução foi desenvolvida e está a venda na Wikicode. 

Quem estiver interessado no módulo enviar e-mail para nopcommerce@wikicode.com.br. O mesmo pode ser acessado no site de exemplo publicado no endereço http://loja.wikicode.com.br.

domingo, outubro 10, 2010

Lean Thinking

O termo lean foi cunhado ao final da década de 80 em um projeto de pesquisa do Massachusetts Institute of Technology (MIT) sobre a indústria automobilística mundial. 

A pesquisa revelou que a Toyota havia desenvolvido um novo e superior paradigma de gestão nas principais dimensões dos negócios (manufatura, desenvolvimento de produtos e relacionamento com os clientes e fornecedores).

Naquela época, a montadora japonesa não estava nem entre as dez maiores do mundo. Em 2009, a Toyota tornou-se a maior em volume de vendas, acumulando vitória após vitória ao longo destas décadas, mostrando as vantagens e benefícios do sistema que desenvolveu. Não se trata de um conceito exclusivo da Toyota, podendo ser aplicado por empresas de qualquer negócio e em qualquer país ou região. Deve ser visto como um sistema de gestão para toda a empresa.

Lean é uma estratégia de negócios para aumentar a satisfação dos clientes através da melhor utilização dos recursos. 
A Gestão Lean procura fornecer consistentemente valor aos clientes com os custos mais baixos (PROPÓSITO) através da identificação de melhoria dos fluxos de valor primários e de suporte (PROCESSOS) por meio do envolvimento das pessoas qualificadas, motivadas e com iniciativa (PESSOAS). 
O foco da implementação deve estar nas reais necessidades dos negócios e não na simples aplicação das ferramentas lean.
As práticas envolvem a criação de fluxos contínuos e sistemas puxados baseados na demanda real dos clientes, a análise e melhoria do fluxo de valor das plantas e da cadeia completa, desde as matérias-primas até os produtos acabados, e o desenvolvimento de produtos que efetivamente sejam soluções do ponto de vista do cliente.

A adoção dessa filosofia tem trazido resultados extraordinários para as empresas que a praticam, ainda que poucas empresas tenham conseguido replicar totalmente o sucesso e a eficiência operacional alcançados pela Toyota. Originalmente concebidas como práticas de manufatura, tem sido gradualmente disseminadas em todas as áreas da empresa e também para empresas dos mais diferentes tipos e setores, tornando-se efetivamente uma filosofia e uma cultura empresarial.
Os resultados obtidos geralmente implicam aumento da capacidade de oferecer os produtos que os clientes querem, na hora que eles precisam, nos preços que estão dispostos a pagar, com custos menores, qualidade superior, "lead times" mais curtos, garantindo assim maior rentabilidade para negócio.

quinta-feira, outubro 07, 2010

SQL Server 2008 - Criando os índices necessários

Você sabia que o SQL Server mantem o controle dos índices que ele acha que você deve criar? A "falta de índice" DMVs  é uma grande novidade no SQL Server 2005, que (na minha opinião) parecem ter sido pouco utilizado até agora. Se você quiser ver se esse recurso e poupá-lo do tédio de uma tarde de identificação baixo desempenho de consultas, tudo que você tem a fazer é :

SELECT
  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle)
  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
  + ' ON ' + mid.statement
  + ' (' + ISNULL (mid.equality_columns,'')
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END
    + ISNULL (mid.inequality_columns, '')
  + ')'
  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
and mid.database_id=33
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

sábado, março 06, 2010

Último acesso a Tabela

SELECT
    
OBJECT_NAME(object_id,database_id) As Tabela, Index_Id,
    last_user_seek, last_user_scan, last_user_lookup, last_user_update
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID() And OBJECTPROPERTYEX(object_id,'IsUserTable') = 1
ORDER BY Tabela, Index_ID

quinta-feira, março 04, 2010

O que foi alterado depois das 18?

Esse script faz parte da serie "30 scripts que não podem faltar no pendrive de um DBA" que terminou em um monte de webcast que somam muito mais de 100 scripts. Esse eu achei particularmente interessante!
Quem tiver interesse pode conseguir mais alguns no blog do Vitor Fava (http://vfava.sqlserverday.com.br/)



------------------------------------------------------------------------------------------------------------
--
-- Script para checar o que foi alterado no database após as 18:00 horas
---
---
USE DB_Mundo_1;
CREATE TABLE Nova_Tabela(cod int, descricao varchar(100));

SELECT name,
 TYPE,
 type_desc,
 create_date,
 modify_date
FROM sys.objects
WHERE TYPE IN ('U','V','PK','F','D','P')
AND modify_date >= Dateadd(HOUR,18,Cast((Cast(Getdate() - 1 AS VARCHAR(12)))AS SMALLDATETIME))
ORDER BY modify_date

--U - Table
--V - View
--PK - Primary Key
--F - Foreign Key
--D - Default Constraint
--P - Procedure

quarta-feira, fevereiro 17, 2010

Linq To SQL - Carregando dados adjacentes e liberando o DataContext

Eu sempre tive problemas quando tentava acessar uma tabela adjacente do objeto retornado pela query do linq depois do dispose, exemplo:
A tabela Documento tem relação com a tabela Tipo de Documento, se eu recupero via Linq uma instancia da tabela Documento, faço o dispose do DataContext e tento acessar a Tipo Documento atravez do relacionamento logo vem a mensagem: Cannot access a disposed object.Object name: ‘DataContext accessed after Dispose.
Descobri uma forma de resolver isso. Se a relação for de 1 pra N e você está com a tabela do lado esquerdo, basta que antes do dispose você acessece Documento.TipoDocumento.Load(). Se estiver do lado do N o jeito é passar configurações de load pro DataContext, exemplo:

DataLoadOptions options = new DataLoadOptions();


options.LoadWith<Documento>(s => s.TipoDocumento);

DataContext.LoadOptions = options;
É isso ai, vivendo e aprendendo Linq!

quarta-feira, fevereiro 03, 2010

SHRINKFILE - TRUNCATE do banco

use db_MeuBanco

 BACKUP LOG db_MeuBanco WITH TRUNCATE_ONLY

 DBCC SHRINKFILE (db_MeuBanco_Log, 1)


**Cuidado, só recomendo rodar isso se você estiver realmente sem espaço na partição do LOG (.mdl) e não tiver outra partição pra onde jogar nem fazer backup.