como ser programador durante o dia e mesmo assim dormir bem à noite

45
Como ser programador durante o dia e mesmo assim dormir bem à noite Bruno Lopes http://netpon to.org 2ª Reunião Porto - 14/04/2012

Upload: comunidade-netponto

Post on 24-May-2015

1.380 views

Category:

Technology


3 download

DESCRIPTION

Apresentação do Bruno Lopes sobre variados temas como instrumentação, profiling, logging e boas práticas de programação e desenvolvimento de software, incluindo lições tiradas do processo de desenvolvimento, manutenção e suporte à produção de várias aplicaçoes e produtos, na 2a Reunião Presencial da Comunidade NetPonto (http://netponto.org) no Porto.

TRANSCRIPT

Page 1: Como ser programador durante o dia e mesmo assim dormir bem à noite

Como ser programador durante o dia e mesmo assim dormir bem à

noiteBruno Lopes

http://netponto.org

2ª Reunião Porto - 14/04/2012

Page 2: Como ser programador durante o dia e mesmo assim dormir bem à noite

Bruno Lopes

• Co-founder de uma startup • Tirei o curso há 6 anos• 80% do que fiz e faço é web e .Net• Éramos uma empresa de custom development• Agora estamos agora a vender, desenvolver,

comercializar e suportar um produto

Page 3: Como ser programador durante o dia e mesmo assim dormir bem à noite

Motivação

2000 2005 2007 2012

Faculdade Mestrado weListen

?

Page 4: Como ser programador durante o dia e mesmo assim dormir bem à noite

3 actos

Não são as ferramentasSão as metodologias

Page 5: Como ser programador durante o dia e mesmo assim dormir bem à noite

Acto 1

Page 6: Como ser programador durante o dia e mesmo assim dormir bem à noite

Logging

• Registo da aplicação de– Acções– Avisos– Erros

• Serve acima de tudo para diagnóstico• Muitas formas de fazer mal• Muitas formas de fazer bem

Page 7: Como ser programador durante o dia e mesmo assim dormir bem à noite

Logging10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/bln/11366 HTTP/1.1" 207 443 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /source/vendors/dbdeploy/1.0 HTTP/1.1" 207 712 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/vcc/default HTTP/1.1" 207 443 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/bc/11366/source/vendors/dbdeploy/1.0 HTTP/1.1" 207 1397 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - - [13/Apr/2012:01:12:24 +0100] "OPTIONS /source/gof/Dependencies/trunk HTTP/1.1" 401 482 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "OPTIONS /source/gof/Dependencies/trunk HTTP/1.1" 200 - "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /source/gof/Dependencies/trunk HTTP/1.1" 207 716 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/vcc/default HTTP/1.1" 207 384 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/bln/11366 HTTP/1.1" 207 443 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /source/gof/Dependencies/trunk HTTP/1.1" 207 716 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/vcc/default HTTP/1.1" 207 443 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/bc/11366/source/gof/Dependencies/trunk HTTP/1.1" 207 1693 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - - [13/Apr/2012:01:12:24 +0100] "OPTIONS /source/projects/build-scripts/trunk HTTP/1.1" 401 482 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "OPTIONS /source/projects/build-scripts/trunk HTTP/1.1" 200 - "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /source/projects/build-scripts/trunk HTTP/1.1" 207 728 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/vcc/default HTTP/1.1" 207 384 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/bln/11366 HTTP/1.1" 207 443 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /source/projects/build-scripts/trunk HTTP/1.1" 207 728 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/vcc/default HTTP/1.1" 207 443 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.10 - read.only [13/Apr/2012:01:12:24 +0100] "PROPFIND /!svn/bc/11366/source/projects/build-scripts/trunk HTTP/1.1" 207 1432 "-" "SVN/1.6.17 SVNKit/1.3.6-v1 (http://svnkit.com/) t20111128_1553"10.0.0.114 - - [13/Apr/2012:01:12:50 +0100] "OPTIONS /documents HTTP/1.1" 401 482 "-" "SVN/1.7.1-SlikSvn-1.7.1-X64 neon/0.29.6"10.0.0.114 - bruno.lopes [13/Apr/2012:01:12:50 +0100] "OPTIONS /documents HTTP/1.1" 200 179 "-" "SVN/1.7.1-SlikSvn-1.7.1-X64 neon/0.29.6"10.0.0.114 - bruno.lopes [13/Apr/2012:01:12:52 +0100] "PROPFIND /documents HTTP/1.1" 207 676 "-" "SVN/1.7.1-SlikSvn-1.7.1-X64 neon/0.29.6"10.0.0.114 - bruno.lopes [13/Apr/2012:01:12:53 +0100] "REPORT /!svn/vcc/default HTTP/1.1" 200 9928054 "-" "SVN/1.7.1-SlikSvn-1.7.1-X64 neon/0.29.6"

Page 8: Como ser programador durante o dia e mesmo assim dormir bem à noite

Logging

Page 9: Como ser programador durante o dia e mesmo assim dormir bem à noite

Logging

Aplicação Infrastrutura Persistência

Event Viewer

Ficheiros

Base de dadosInnovationCast NLog

Page 10: Como ser programador durante o dia e mesmo assim dormir bem à noite

Logging

Mau exemplo de infrastrutura/persistência

Page 11: Como ser programador durante o dia e mesmo assim dormir bem à noite

LoggingMuito mau exemplo de aplicação

private Sprocket DoWork(){ try { var sprocketFactory = new SprocketFactory(); return sprocketFactory.Manufacture(); } catch (Exception e) { Console.Out.Write("An error OCURRED!!!11!!"); return null; }}

Page 12: Como ser programador durante o dia e mesmo assim dormir bem à noite

Melhor exemplo de aplicação

Logging

PM> install-package NLogSuccessfully installed 'NLog 2.0.0.2000'.

private Logger Log = LogManager.GetCurrentClassLogger();private Sprocket DoWorkBetter(){ try { var sprocketFactory = new SprocketFactory(); return sprocketFactory.Manufacture(); } catch (Exception e) { Log.ErrorException("Error while manufacturing a sprocket", e); throw; }}

Page 13: Como ser programador durante o dia e mesmo assim dormir bem à noite

Logging

<?xml version="1.0" encoding="utf-8" ?><nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="console" xsi:type="Console" /> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="console" /> </rules></nlog>

Wiring de configuração

Page 14: Como ser programador durante o dia e mesmo assim dormir bem à noite

Logging

Quando

Nivel

Onde

O quê?

Page 15: Como ser programador durante o dia e mesmo assim dormir bem à noite

Logging

Page 16: Como ser programador durante o dia e mesmo assim dormir bem à noite

Como é que Logging me ajuda a dormir melhor?

• Menos tempo à procura de erros• Mais informação de diagnóstico• Não preciso de ligar à Maya para saber o que

se passou• Boas mensagens de erro ajudam-me a

resolver problemas mais depressa

Page 17: Como ser programador durante o dia e mesmo assim dormir bem à noite

Acto 2

Page 18: Como ser programador durante o dia e mesmo assim dormir bem à noite

Instrumentação

De Negócio

Clientes Volume Negócios Devoluções

Tecnologia

Servidores Bases De Dados Aplicações

Page 19: Como ser programador durante o dia e mesmo assim dormir bem à noite

Instrumentação

Profilers Counters Dashboards

Page 20: Como ser programador durante o dia e mesmo assim dormir bem à noite

Instrumentação

Profilers Counters Dashboards

Page 21: Como ser programador durante o dia e mesmo assim dormir bem à noite

Profilers

Page 22: Como ser programador durante o dia e mesmo assim dormir bem à noite

Profilers

Page 23: Como ser programador durante o dia e mesmo assim dormir bem à noite

Instrumentação

Profilers Counters Dashboards

Page 24: Como ser programador durante o dia e mesmo assim dormir bem à noite

Counters - Windows

Page 25: Como ser programador durante o dia e mesmo assim dormir bem à noite

Counters – RavenDB /stats

Page 26: Como ser programador durante o dia e mesmo assim dormir bem à noite

Counters - etsy

Page 27: Como ser programador durante o dia e mesmo assim dormir bem à noite

Instrumentação

Profilers Counters Dashboards

Page 28: Como ser programador durante o dia e mesmo assim dormir bem à noite

Dashboards

Page 29: Como ser programador durante o dia e mesmo assim dormir bem à noite

Dashboards

Page 30: Como ser programador durante o dia e mesmo assim dormir bem à noite

Como é que Instrumentação me ajuda a dormir melhor?

• Consigo identificar – Quais os problemas– Antes que o cliente note

• Observar o comportamento do sistema enquanto ele corre

• Não tenho que divinar qual o problema– Consigo verificar, corrigir e refactorizar

Page 31: Como ser programador durante o dia e mesmo assim dormir bem à noite

Acto 3

Page 32: Como ser programador durante o dia e mesmo assim dormir bem à noite

Testes unitários

• Quem conhece o conceito?• Quem regularmente usa?• Quem acha que lhes poupa trabalho?• Quem acha que é banha da cobra?

Page 33: Como ser programador durante o dia e mesmo assim dormir bem à noite

Testes unitários[Fact]public void CanImportJustOneItemIntoPythonClassUsingDecorator(){ var pythonCode = @"class StringItemSource: @import_one(IActOnItem) def import_action(self, action): self.action = action";

var engine = Python.CreateEngine(); var script = engine.CreateScriptSourceFromString(pythonCode); var typeExtractor = new ExtractTypesFromScript(engine); var exports = typeExtractor.GetPartsFromScript(script).ToList();

var container = new CompositionContainer(new TypeCatalog(typeof(MockExporter), typeof(MockImportActions))); var batch = new CompositionBatch(exports, new ComposablePart[] {}); container.Compose(batch);

object action = exports.First().Instance.action; Assert.NotNull(action); Assert.IsAssignableFrom<IActOnItem>(action);}

Page 34: Como ser programador durante o dia e mesmo assim dormir bem à noite

Testes unitários[Fact]public void CanImportJustOneItemIntoPythonClassUsingDecorator(){ var pythonCode = @"class StringItemSource: @import_one(IActOnItem) def import_action(self, action): self.action = action";

var engine = Python.CreateEngine(); var script = engine.CreateScriptSourceFromString(pythonCode); var typeExtractor = new ExtractTypesFromScript(engine); var exports = typeExtractor.GetPartsFromScript(script).ToList();

var container = new CompositionContainer(new TypeCatalog(typeof(MockExporter), typeof(MockImportActions))); var batch = new CompositionBatch(exports, new ComposablePart[] {}); container.Compose(batch);

object action = exports.First().Instance.action; Assert.NotNull(action); Assert.IsAssignableFrom<IActOnItem>(action);}

Arrange

Act

Assert

Page 35: Como ser programador durante o dia e mesmo assim dormir bem à noite

Testes unitáriospublic class MakeSureIDoNotScrewUpHashingTests : TestClass{ [Fact] public void DidIScrewUpHashingInNewVersion() { var correctHash = GetSha1("converter", "id", "sourceid"); var newHash = new DocumentId("converter", "id", "sourceid", "learningid").GetId(); Assert.Equal(correctHash, newHash); }

// Previous algorithm: private string GetSha1(string converterId, string Id, string SourceId) { var sha1 = SHA1.Create(); sha1.Initialize();

return BitConverter.ToString( sha1.ComputeHash(Encoding.UTF8.GetBytes(converterId) .Concat(Encoding.UTF8.GetBytes(Id)) .Concat(Encoding.UTF8.GetBytes(SourceId)) .ToArray())) .Replace("-", ""); }}

Page 36: Como ser programador durante o dia e mesmo assim dormir bem à noite

Testes unitários

RedGreen

Refactor

Page 37: Como ser programador durante o dia e mesmo assim dormir bem à noite

Testes unitários

• A correrem sempre em background– (eu falei disto na minha apresentação de integração continua)

• Não servem só para testar código– Também podem testar (supostas invariantes)

• Já me salvaram o couro várias vezes– Novo requisito do cliente num projecto antigo– Especificamos novo comportamento com testes– Implementamos requisito e testes passam– Mas testes antigos falham– Eu não me ia lembrar de verificar isso

• Mas a máquina de integração contínua lembra-se

automáticos

Page 38: Como ser programador durante o dia e mesmo assim dormir bem à noite

Testes unitários

• Se repetimos, vemos se podemos automatizar– Computador não se cansa nem se engana por

estar com sono– Computador não se chateia por fazer a mesma

coisa várias vezes– Bruno pode ir beber descafeinado enquanto

Computador faz coisas sozinho

automáticos

Page 39: Como ser programador durante o dia e mesmo assim dormir bem à noite

Testes unitários

Setup

• Ir buscar dependências

• Configurar BD• Montar

ambiente

Desenvolvimento

• Templates• Sanity checks• Testing

Produção

• Deployment• Updates

automáticos

Page 40: Como ser programador durante o dia e mesmo assim dormir bem à noite

Como é que Automatização me ajuda a dormir melhor?

• Computadores a verificar comportamento enquanto durmo

• Posso actualizar sistemas enquanto durmo• Posso passar tarefas para um colega mais

facilmente– Corre “.\psake.ps1 update-whole-world” e já está

Page 41: Como ser programador durante o dia e mesmo assim dormir bem à noite

Epílogo

Não são as ferramentasNão são as metodologias

São as pessoas

Page 42: Como ser programador durante o dia e mesmo assim dormir bem à noite

Questões?

Page 43: Como ser programador durante o dia e mesmo assim dormir bem à noite

Patrocinadores "GOLD"

Page 44: Como ser programador durante o dia e mesmo assim dormir bem à noite

Próximas reuniões presenciais

• 14/04/2012 – Abril• 21/04/2012 – Abril (Lisboa)• 12/05/2012 – Maio (Coimbra)• 26/05/2012 – Maio (Lisboa)

Reserva estes dias na agenda! :)