Como ser programador durante o dia e mesmo assim dormir bem à noite
-
Upload
comunidade-netponto -
Category
Technology
-
view
1.379 -
download
3
description
Transcript of Como ser programador durante o dia e mesmo assim dormir bem à noite
![Page 1: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/1.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/2.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/3.jpg)
Motivação
2000 2005 2007 2012
Faculdade Mestrado weListen
?
![Page 4: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/4.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/5.jpg)
Acto 1
![Page 6: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/6.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/7.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/8.jpg)
Logging
![Page 9: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/9.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/10.jpg)
Logging
Mau exemplo de infrastrutura/persistência
![Page 11: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/11.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/12.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/13.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/14.jpg)
Logging
Quando
Nivel
Onde
O quê?
![Page 15: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/15.jpg)
Logging
![Page 16: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/16.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/17.jpg)
Acto 2
![Page 18: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/18.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/19.jpg)
Instrumentação
Profilers Counters Dashboards
![Page 20: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/20.jpg)
Instrumentação
Profilers Counters Dashboards
![Page 21: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/21.jpg)
Profilers
![Page 22: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/22.jpg)
Profilers
![Page 23: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/23.jpg)
Instrumentação
Profilers Counters Dashboards
![Page 24: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/24.jpg)
Counters - Windows
![Page 25: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/25.jpg)
Counters – RavenDB /stats
![Page 26: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/26.jpg)
Counters - etsy
![Page 27: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/27.jpg)
Instrumentação
Profilers Counters Dashboards
![Page 28: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/28.jpg)
Dashboards
![Page 29: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/29.jpg)
Dashboards
![Page 30: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/30.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/31.jpg)
Acto 3
![Page 32: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/32.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/33.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/34.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/35.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/36.jpg)
Testes unitários
RedGreen
Refactor
![Page 37: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/37.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/38.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/39.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/40.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/41.jpg)
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](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/42.jpg)
Questões?
![Page 44: Como ser programador durante o dia e mesmo assim dormir bem à noite](https://reader035.fdocumentos.com/reader035/viewer/2022062220/5560b2f5d8b42af93b8b480a/html5/thumbnails/44.jpg)
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! :)