SlideShare une entreprise Scribd logo
1  sur  45
2ª Reunião Porto - 14/04/2012   http://netponto.org




Como ser programador durante o dia e
    mesmo assim dormir bem à noite
                                      Bruno Lopes
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
Motivação


2000        2005       2007      2012

Faculdade    Mestrado         weListen


                   ?
3 actos

Não são as ferramentas
 São as metodologias
Acto 1
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
Logging
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/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"
Logging
Logging

  Aplicação      Infrastrutura   Persistência

                                      Event
                                     Viewer

InnovationCast        NLog          Base de
                                     dados

                                    Ficheiros
Logging
Mau exemplo de infrastrutura/persistência
Logging
Muito 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;
    }
}
Logging
 Melhor exemplo de aplicação
PM> install-package NLog
Successfully 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;
      }
  }
Logging
 Wiring de configuração

<?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>
Logging
                           O quê?
         Nivel




Quando            Onde
Logging
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
Acto 2
Instrumentação


           De Negócio                             Tecnologia
             Volume                                 Bases De
Clientes                Devoluções   Servidores                Aplicações
             Negócios                                Dados
Instrumentação



Profilers      Counters   Dashboards
Instrumentação



Profilers      Counters   Dashboards
Profilers
Profilers
Instrumentação



Profilers      Counters   Dashboards
Counters - Windows
Counters – RavenDB /stats
Counters - etsy
Instrumentação



Profilers      Counters   Dashboards
Dashboards
Dashboards
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
Acto 3
Testes unitários
•   Quem conhece o conceito?
•   Quem regularmente usa?
•   Quem acha que lhes poupa trabalho?
•   Quem acha que é banha da cobra?
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);
}
Testes unitários
[Fact]
public void CanImportJustOneItemIntoPythonClassUsingDecorator()
{
    var pythonCode =                                   Arrange
                @"
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();
                                                                                                      Act
    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
    Assert.NotNull(action);
    Assert.IsAssignableFrom<IActOnItem>(action);
}
Testes unitários
public 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("-", "");
    }
}
Testes unitários

  Red
 Green
Refactor
Testes unitários
                         automáticos
• 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
Testes unitários
                  automáticos
• 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
Testes unitários
                           automáticos

Setup                    Desenvolvimento       Produção

    • Ir buscar              • Templates           • Deployment
      dependências           • Sanity checks       • Updates
    • Configurar BD          • Testing
    • Montar
      ambiente
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á
Epílogo


Não são as ferramentas
Não são as metodologias
    São as pessoas
Questões?
Patrocinadores "GOLD"
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! :)
Obrigado!
Bruno Lopes
brunomlopes@gmail.com
http://www.brunomlopes.com
http://twitter.com/brunomlopes

Contenu connexe

Tendances

Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Rafael Ponte
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015talkitbr
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - BrazilStephen Chin
 
Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidAdriano Rocha
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
TDD - Test Driven Development (em PHP)
TDD - Test Driven Development (em PHP)TDD - Test Driven Development (em PHP)
TDD - Test Driven Development (em PHP)Augusto Pascutti
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidEduardo Carrara de Araujo
 
As modificações na Linguagem: Java 7 e Java 8
As modificações na Linguagem: Java 7 e Java 8As modificações na Linguagem: Java 7 e Java 8
As modificações na Linguagem: Java 7 e Java 8Eder Magalhães
 
Javascript para CSharpers 2 - Functions
Javascript para CSharpers   2 - FunctionsJavascript para CSharpers   2 - Functions
Javascript para CSharpers 2 - FunctionsWesley Lemos
 

Tendances (18)

Testes: Por onde Começar?
Testes: Por onde Começar?Testes: Por onde Começar?
Testes: Por onde Começar?
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento Android
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 
Burlando Waf 2.0
Burlando Waf  2.0Burlando Waf  2.0
Burlando Waf 2.0
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
servlet-requisicoes
servlet-requisicoesservlet-requisicoes
servlet-requisicoes
 
TDD - Test Driven Development (em PHP)
TDD - Test Driven Development (em PHP)TDD - Test Driven Development (em PHP)
TDD - Test Driven Development (em PHP)
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
burlando um WAF
burlando um WAFburlando um WAF
burlando um WAF
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps Android
 
As modificações na Linguagem: Java 7 e Java 8
As modificações na Linguagem: Java 7 e Java 8As modificações na Linguagem: Java 7 e Java 8
As modificações na Linguagem: Java 7 e Java 8
 
Javascript para CSharpers 2 - Functions
Javascript para CSharpers   2 - FunctionsJavascript para CSharpers   2 - Functions
Javascript para CSharpers 2 - Functions
 
Nossa experiência com TDD
Nossa experiência com TDDNossa experiência com TDD
Nossa experiência com TDD
 

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

Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017Gabriel Machado
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Implementando PSR-3 com Monolog
Implementando PSR-3 com MonologImplementando PSR-3 com Monolog
Implementando PSR-3 com MonologGabriel Machado
 
JasperReports Tecnicas de geracao_de_relatorios1
JasperReports  Tecnicas de geracao_de_relatorios1JasperReports  Tecnicas de geracao_de_relatorios1
JasperReports Tecnicas de geracao_de_relatorios1Sliedesharessbarbosa
 
Aumente sua produtividade com Spring Boot
Aumente sua produtividade com Spring BootAumente sua produtividade com Spring Boot
Aumente sua produtividade com Spring BootFernando Boaglio
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Wennder Santos
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04Carlos Santos
 
Apresentacao log
Apresentacao logApresentacao log
Apresentacao logpedrohfsd
 

Similaire à Como ser programador durante o dia e mesmo assim dormir bem à noite (20)

Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
New Relic Insights
New Relic InsightsNew Relic Insights
New Relic Insights
 
Let's log!
Let's log!Let's log!
Let's log!
 
Node JS - Parte 3
Node JS - Parte 3Node JS - Parte 3
Node JS - Parte 3
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direito
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Implementando PSR-3 com Monolog
Implementando PSR-3 com MonologImplementando PSR-3 com Monolog
Implementando PSR-3 com Monolog
 
JasperReports Tecnicas de geracao_de_relatorios1
JasperReports  Tecnicas de geracao_de_relatorios1JasperReports  Tecnicas de geracao_de_relatorios1
JasperReports Tecnicas de geracao_de_relatorios1
 
Aumente sua produtividade com Spring Boot
Aumente sua produtividade com Spring BootAumente sua produtividade com Spring Boot
Aumente sua produtividade com Spring Boot
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)Curso: Desenvolvimento de aplicativos híbridos (dia 2)
Curso: Desenvolvimento de aplicativos híbridos (dia 2)
 
Palestra parse
Palestra parsePalestra parse
Palestra parse
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
 
Apresentacao log
Apresentacao logApresentacao log
Apresentacao log
 
Apache Wicket
Apache WicketApache Wicket
Apache Wicket
 

Plus de Comunidade NetPonto

Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Comunidade NetPonto
 
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Comunidade NetPonto
 
MVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaMVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaComunidade NetPonto
 
Deep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaDeep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaComunidade NetPonto
 
The power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloThe power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloComunidade NetPonto
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoComunidade NetPonto
 
NoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazNoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazComunidade NetPonto
 
De Zero a Produção - João Jesus
De Zero a Produção - João JesusDe Zero a Produção - João Jesus
De Zero a Produção - João JesusComunidade NetPonto
 
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComo deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComunidade NetPonto
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsComunidade NetPonto
 
Aspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpAspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpComunidade NetPonto
 
Utilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosUtilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosComunidade NetPonto
 
Dinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoDinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoComunidade NetPonto
 
KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realComunidade NetPonto
 
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteWindows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteComunidade NetPonto
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Comunidade NetPonto
 

Plus de Comunidade NetPonto (20)

Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
 
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
 
MVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaMVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara Silva
 
Deep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaDeep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo Costa
 
The power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloThe power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno Cancelo
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis Paulino
 
ASP.NET Signal R - Glauco Godoi
ASP.NET Signal R - Glauco GodoiASP.NET Signal R - Glauco Godoi
ASP.NET Signal R - Glauco Godoi
 
NoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazNoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor Tomaz
 
HTML5 - Pedro Rosa
HTML5 - Pedro RosaHTML5 - Pedro Rosa
HTML5 - Pedro Rosa
 
De Zero a Produção - João Jesus
De Zero a Produção - João JesusDe Zero a Produção - João Jesus
De Zero a Produção - João Jesus
 
OData – Super Cola W3
OData – Super Cola W3OData – Super Cola W3
OData – Super Cola W3
 
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComo deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store Apps
 
Aspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpAspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharp
 
Utilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosUtilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes Unitários
 
Dinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoDinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de Projecto
 
KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida real
 
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteWindows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
 

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

  • 1. 2ª Reunião Porto - 14/04/2012 http://netponto.org Como ser programador durante o dia e mesmo assim dormir bem à noite Bruno Lopes
  • 2. 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
  • 3. Motivação 2000 2005 2007 2012 Faculdade Mestrado weListen ?
  • 4. 3 actos Não são as ferramentas São as metodologias
  • 6. 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
  • 7. Logging 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/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"
  • 9. Logging Aplicação Infrastrutura Persistência Event Viewer InnovationCast NLog Base de dados Ficheiros
  • 10. Logging Mau exemplo de infrastrutura/persistência
  • 11. Logging Muito 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; } }
  • 12. Logging Melhor exemplo de aplicação PM> install-package NLog Successfully 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; } }
  • 13. Logging Wiring de configuração <?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>
  • 14. Logging O quê? Nivel Quando Onde
  • 16. 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
  • 18. Instrumentação De Negócio Tecnologia Volume Bases De Clientes Devoluções Servidores Aplicações Negócios Dados
  • 19. Instrumentação Profilers Counters Dashboards
  • 20. Instrumentação Profilers Counters Dashboards
  • 23. Instrumentação Profilers Counters Dashboards
  • 27. Instrumentação Profilers Counters Dashboards
  • 30. 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
  • 32. Testes unitários • Quem conhece o conceito? • Quem regularmente usa? • Quem acha que lhes poupa trabalho? • Quem acha que é banha da cobra?
  • 33. 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); }
  • 34. Testes unitários [Fact] public void CanImportJustOneItemIntoPythonClassUsingDecorator() { var pythonCode = Arrange @" 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(); Act 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 Assert.NotNull(action); Assert.IsAssignableFrom<IActOnItem>(action); }
  • 35. Testes unitários public 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("-", ""); } }
  • 36. Testes unitários Red Green Refactor
  • 37. Testes unitários automáticos • 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
  • 38. Testes unitários automáticos • 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
  • 39. Testes unitários automáticos Setup Desenvolvimento Produção • Ir buscar • Templates • Deployment dependências • Sanity checks • Updates • Configurar BD • Testing • Montar ambiente
  • 40. 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á
  • 41. Epílogo Não são as ferramentas Não são as metodologias São as pessoas
  • 44. 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! :)

Notes de l'éditeur

  1. ** Se o contexto onde estiverem for diferente, as lições podem ser aplicadas de forma diferente** Podem também ter incentivos suficientemente fortes para se tornarem pouco relevantes** Caveat emptor
  2. Que é quegostavaque me tivessemchamadado a atençãonafaculdadeQue me tinhaajudadonaweListen
  3. O foco aqui não é as ferramentas em siÉ as metodologias, pitfals e dicas
  4. E por melhores que sejamos, vai ser sempre preciso fazer diagnóstico, nem que seja durante o desenvolvimento** Ou melhor, feedback correcto do que aconteceu
  5. Quando me falamem logs, é nistoquecostumopensarCasomuitoconhecido, logs de servidor web (apache, nestecaso)
  6. Windows tem o event viewer, queagregaeventos de log de váriossitios e é um serviçofornecidopelosistemaoperativoEstesdoiscasossão a perspectiva “persistida” dos eventos, queapenas é uma 3 partes.É o resultado final de fazer loggingEunãoquerofalardesta parte.
  7. Logging tem 3 componentesAplicação é o quevocesdesenvolvem, e é a origemInfrastrutura e persistencianão é paravocestocarem (em 99% dos casos)Nlog é uma das infrastruturasem.net, outraseria log4net
  8. Info maissensivelfoiremovidaExcepçãoguardadana Base de dadosMas cortamalipelomeio a stacktraceNestecasonãotemosinformaçãonenhuma de ondeestá a darerro, porquetoda a stack tarce é ocupadapor frames de infrastrutura
  9. Quantasrazõesparafuzilar o autordestecódigoencontram?ExcepçãoignoradaRetornar null!!111Console.Out.WriteMesmocorrigindoisso:Printf é um mau exemplo porque em aplicações que são mais do que pequenos spikes, vamos querer:Redirecionarparabd/event viewerFilterbaseado no tipo/origem/nivelNãoincluiinformação de ondefoifeitoNão tem standard para output de excepçõesRseponder
  10. NugetEmvez de irmos á consola, usamos um Logger Este logger podia serinjectadocomodependenciapor DI, mas essa é outraapresentaçãoTambém se calharnaodeviamosapanhar a excepçãoaqui, mas essa é outraapresentação
  11. Configuramos (fazemos o wiring) de ondevaipara o quê.Em runtime devemos poder ligar/desligarPorque nem sempre queremos info de debugNem em todo o ladoQuando houver problemas, não queremos ter que estar a recompilar a aplicação e fazer outro deploy.Idealmente, enquanto se alterarmos o ficheiro enquanto corre, a aplicaçºao apanharia isso
  12. O resultado é melhor, tem maisinformaçãoE se quiserempodemortogonalmenteaocódigoquefaz logging, acrescentarmaisparâmetros(layout renderer emNlog)Uma entrada de log deve ser explicitaWhoWhatWhenWhereTambém podemos incluir o URL e currentuser, mas isso será ortogonal aoLog.Info
  13. E mesmo mesmomesmo fixe é quando as mensagens de erro nos ajudamIdealmente mensagens de erro, excepções devem nos ajudar a corrigirUm bom exemplo de excepção (aparte de algum Engrish):- Indica a causa mais provavel de erro e como corrigir
  14. Mesmo abstrair uma biblioteca de logging é duvidoso, na minha opiniãoExcepto talvez para bibliotecas
  15. Instrumentaçãohttp://photo-dictionary.com/phrase/7984/car-dashboard.htmlhttp://www.plane-pictures.com/Boeing-777/Boeing-777-Cockpit-242-picture.htm
  16. Instrumentação de negócio
  17. Profiler é uma aplicação, módulo ou parecido que ligamos na aplicação e nos mostra “as entranhas”Pode fazer profile a CódigoMemóriaLigações a bases de dados
  18. Eu falo imenso desta ferramenta porque a acho genialÉ um profiler que “se atarracha” a aplicações de Nhibernate que nos permite tudo o que se passa entre a aplicação e a BD, com NhibernateMostra QueriesOnde é que foram executadosTempos de sessãoEstatisticasFerramenta indispensavel paraMonitorizar que não estou a fazer asneiraQuando estou a fazer asneira, perceber exactamente que asneira
  19. Mini ProfilerFerramenta brutal, e mostra não só timings internos no servidor, como no browser webEste funciona em produção
  20. Counters são apenas numeros que são guardados e analisadosTipicamente são dados “em barda”, com grande volume mas cada um é muito pequeno.Emitir este tipo de dados não deve ter impacto na performance da aplicação, e pode servir para análise histórica
  21. Casomais simples: Performance counters de windowsQualquermaquina windows tem istoNestecaso de exemploestamos a olharpara dados de tempo de CPU no total, e dados de memória de umaaplicaçãochamada “ILoveLucene”Se nósestivermos com um problema de memóriaporexemplo, podiamosusarestegráfico e analisarquando é que a memóriasaltacoordenado com acções no software.
  22. Aqui olhamos para “counters” que são emitidos por RavenDB (document database em .net).É informação “raw” que podemos guardar, ou apenas inspecionar momentaneamente para perceber o que se passa cá dentroNeste caso particular temos tambem alguma informação de diagnostico, como extensões activas
  23. http://codeascraft.etsy.com/2011/02/15/measure-anything-measure-everything/Um caso muito interessante, na etsy eles monitorizam milhares de contadores, e aqui consegue-se não só detectar padrões, como permite “empurrar” código com mais confiança. Se algum contador começar a ter comportamentos fora do comum, consegue-se detectar e relacionar com uma actualizaçãoEtsy é um marketplace global para “handmade goods” e falam publicamente de como guardam dados para tudo.
  24. SQLMonitor, uma ferramenta de monitorização de SQL, inclui info sobre top 10 queries, problemas de performance, carga
  25. Esta é um toolkit para construir dashboards, por exemplo.
  26. http://blog.autoworld.com.my/index.php/2009/02/26/swarm-technology-the-biggest-contribution-to-eco-tech/
  27. Este terceiro acto começa com testes unitários.Quem conhece? Usa?Fixe, não fixe? Limitações?
  28. Exemplo de um projecto opensource meuTetes tipicamente teem um padrao
  29. AAAPermiteguiar o design da aplicação
  30. Mas também podem servir para validar que não fazemos asneira (foco no nome do metodo)Capturoestainformaçãonumtestequepossocorrersempre
  31. E se há coisa importante em testes unitários, e não só, é este ciclo
  32. Invariantes como:- Todas as stored procedures na BD têm de estar configuradas para o role public as poder executar - Um teste pode verificar isto em todos os commitsUm determinado método tem que responder a todos os valores de um enum(se bem que neste caso pode fazer mais sentidoabstrair para uma classe em vez de enum)Verificar que todos os textos se encontram traduzidos em todas as linguasPor isso falo em testes automáticosDe unidade, para “comportamentos pequenos”De integração, para verifcar mapeamentos com base de dados, comportamento de componentes inteirosDe performance, para validar De interface, porque é o que o utilizador vê
  33. Antes de terminar.Espero que esta apresentação vos tenha ajudado e mostrado algumas formas de melhorar o processo de desenvolver, manter e suportar software.