praticando o desapego         quando ignorar a dívida técnica
sumárioquem somos nós?a histórialiçõesresultados
quem somos nós? Netto  @nettofarah  github.com/nettofarah   ThoughtWorks BR/SF  Vini  @vvgomes  github.com/vvgomes      Th...
nossa missão
objetivogerenciar o catálogo de produtos e categorias de um dos maiores        ecoms do mundo
find . -type f ( -name *.css -o -name *.js -o -name *.java -o -name *.jsp -o -name *.html )-print0 | xargs -0 cat | wc -l
find . -type f ( -name *.css -o -name *.js -o -name *.java -o -name *.jsp -o -name *.html )-print0 | xargs -0 cat | wc -l  ...
grep -R ‘<bean’ . | wc -l
grep -R ‘<bean’ . | wc -l     684      spring beans
grep -R ‘class’ . | wc -l
grep -R ‘class’ . | wc -l  3096      classes java
grep -R ‘@Test’ . | wc -l
grep -R ‘@Test’ . | wc -l   1774   testes com junit4
grep -R ‘public void test’ . | wc -l
grep -R ‘public void test’ . | wc -l        1603        testes com junit3
tecnologias
pontos de integração40 queues     157 fields     20 schemas               8 cores                               ~ 30       ...
104 pontos de integração!
testes
testes• 2777 junit tests
testes• 2777 junit tests• 360 functional tests
testes• 2777 junit tests• 360 functional tests• ruby 1.8.6 (sem bundler!)
testes• 2777 junit tests• 360 functional tests• ruby 1.8.6 (sem bundler!)• windows xp
testes• 2777 junit tests• 360 functional tests• ruby 1.8.6 (sem bundler!)• windows xp• monkeypatches para IE/windows
testes• 2777 junit tests• 360 functional tests• ruby 1.8.6 (sem bundler!)• windows xp• monkeypatches para IE/windows• buil...
times4 times (aprox. 35 devs)8 engineers6 managers
primeira estóriaimportar produtos de um feed
IHateYouForeverImpl• 2272 linhas• 32 dependências• getItemStatus (3 setters)
IHateYouServiceImplTest  78 linhas de test setup
loadAllProducts.xml  26 folhas impressas
ProductDTO.java• 86 atributos• + getters / + setters• equals() => 400 linhas
Vamos jogar tudo fora e começar do zero!
Tá bom!Vamos refatorar tudo!
pague o aluguel!
vamos arrumar a casa• refatoração intensiva• pair programming• reclamação
6 semanas mais tarde
mais de perto
ferrou!• um refactoring inocente (especulativo)• bugs em produção (custou dinheiro)
todos ‘chora’
todos ‘chora’• desconfiança do time onshore
todos ‘chora’• desconfiança do time onshore• quase cancelamento do projeto
todos ‘chora’• desconfiança do time onshore• quase cancelamento do projeto• iteration manager se demitiu
todos ‘chora’• desconfiança do time onshore• quase cancelamento do projeto• iteration manager se demitiu• tech lead se demi...
nova abordagem
faça as pazes consigo       mesmo         http://fc06.deviantart.net/fs71/f/2011/027/a/3/rainbow_farting_unicorn_by_hi_my_...
desapegue-se          http://pottermaniaca1.tumblr.com/post/3687853880
purismo tem limite
right software > software right                 +/-software certo > fazer software certo
vale a pena refatorar?• bloqueia outra estória?• compromete a entrega?• gera danos ao negócio?
não sofra por         antecipação• “isso aqui vai impactar na estória 125 da  próxima iteração”• programe baseado em fatos...
código legado é código que         funciona                      http://favim.com/image/467371/
protótiposmvp em nível de funcionalidade
licença poéticanão fui eu. foi meu eu-lírico.                       http://weheartit.com/entry/36480124/via/ilaria_tatti
jogue a sujeira pra baixo do tapetehierarquias e classes paralelasempacote em façades
coragem x imprudência           http://tobemtogordo.files.wordpress.com/2011/06/coragem-esse-c3a9-o-significado.jpg
reduza o ciclo de    feedback tem gente usando?
refatoração é viciante
conheça suas ferramentas
debuggers
IDEs
refactorings
refactorings• extract [class, method, variable]• rename [class, method, variable]• move [class, method, variable]
quem é mesmo que chama aquele método?             vai encarar?
controle de versão• git / svn [blame, diff, log]• grep / awk / find / cut / xargs / sort
testes e tdd
design evolutivo?
black box vs white box   redução dos testes funcionais
flappy tests
flappy tests• refatorar
flappy tests• refatorar• reduzir o grau de integração
flappy tests• refatorar• reduzir o grau de integração• somente ui? teste unitário em javascript
flappy tests• refatorar• reduzir o grau de integração• somente ui? teste unitário em javascript• ui burra? teste em nível d...
flappy tests• refatorar• reduzir o grau de integração• somente ui? teste unitário em javascript• ui burra? teste em nível d...
divide and conquer
divide and conquerfuncionalidades grandes como pequenos serviços
fábricas de dívida      técnica
como vender a       refatoração?• não dá pra medir com precisão• reclamar não ajuda
conclusões
produção 2 meses antes do        planejado
será que este sucesso  é consequencia do    esforço inicial?
simmas não
perguntas
Praticando o Desapego: quando ignorar a dívida técnica
Praticando o Desapego: quando ignorar a dívida técnica
Praticando o Desapego: quando ignorar a dívida técnica
Próximos SlideShares
Carregando em…5
×

Praticando o Desapego: quando ignorar a dívida técnica

1.803 visualizações

Publicada em

Apresentação para o agile brazil 2012.

Publicada em: Tecnologia
0 comentários
5 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.803
No SlideShare
0
A partir de incorporações
0
Número de incorporações
34
Ações
Compartilhamentos
0
Downloads
34
Comentários
0
Gostaram
5
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • - 113 arquivos (aprox. 5 consultas cada -&gt; 565)\n+ Falta de cobertura de testes;\n+ Excesso de complexidade acidental;\n+ Duplica&amp;#xE7;&amp;#xE3;o de c&amp;#xF3;digo;\n+ Excesso de responsabilidade em um objeto\n+ - cita o isStringEmpty(&quot;&quot;) == false\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • - find . -name &apos;*.java&apos; | grep -v &apos;generated&apos; | xargs wc -l | sort\n
  • - find . -name &apos;*Test.java&apos; | grep -v &apos;generated&apos; | xargs wc -l | sort\n
  • \n
  • \n
  • \n
  • - o sistema &amp;#xE9; gigante.\n- ultra complexo\n- reescrever significa fazer engenharia reversa\n- caso do netscape\n
  • \n
  • - seguir a ideia do seu barriga\n - cobrar a d&amp;#xED;vida (no matter what)\n - atitude extrema\n
  • - refactoring como se n&amp;#xE3;o houvesse amanh&amp;#xE3;\n- pareamento o tempo todo, v&amp;#xE1;rias ideias e brainstorms sobre como melhorar o design\n- reclama&amp;#xE7;&amp;#xE3;o sobre o c&amp;#xF3;digo o tempo todo\n
  • \n
  • - ainda estou dando uma pr&amp;#xE9;via ali do futuro\n
  • - $5000,00 / min na black friday\n- um dia inteiro sem vender produtos no canad&amp;#xE1;\n- a tradu&amp;#xE7;&amp;#xE3;o pra franc&amp;#xEA;s n&amp;#xE3;o ocorreu\n
  • - o tech lead ja trabalhava na empresa ha 8 anos\n - a iteration manager pirou, foi pra uma startup porque a press&amp;#xE3;o era menor :S\n
  • - o tech lead ja trabalhava na empresa ha 8 anos\n - a iteration manager pirou, foi pra uma startup porque a press&amp;#xE3;o era menor :S\n
  • - o tech lead ja trabalhava na empresa ha 8 anos\n - a iteration manager pirou, foi pra uma startup porque a press&amp;#xE3;o era menor :S\n
  • - o tech lead ja trabalhava na empresa ha 8 anos\n - a iteration manager pirou, foi pra uma startup porque a press&amp;#xE3;o era menor :S\n
  • - atitude do seu madruga\n- alguma frase do seu madruga\n- passou 14 meses sem pagar o aluguel\n- se d&amp;#xE1; mal as vezes, mas &amp;#xE9; feliz no geral\n- devemos perdoar as afrontas, devemos perdoar as ofensas, devemos perdoar as afrontas.. devemos perdoar os alugu&amp;#xE9;is atrasados\n
  • - chega de choradeira\n- chega de reclama&amp;#xE7;&amp;#xE3;o\n- &amp;#xE9; a hora de aceitar a situa&amp;#xE7;&amp;#xE3;o\n
  • - c&amp;#xF3;digo n&amp;#xE3;o &amp;#xE9; seu\n- se quiser escrever c&amp;#xF3;digo bonito, fa&amp;#xE7;a open source\n- foi a parte mais dif&amp;#xED;cil pra mim. (&amp;#xE9; triste ver seus colegas fazendo coisas legais, e voc&amp;#xEA; ali fazendo aquilo)\n
  • - nem sempre o c&amp;#xF3;digo perfeito &amp;#xE9; o melhor c&amp;#xF3;digo.\n- e da&amp;#xED; se existe uma diferen&amp;#xE7;a sem&amp;#xE2;ntica entre PUT e POST.\n- a briga sobre uso de forms x ajax pra fazer um DELETE\n- e da&amp;#xED; se a classe &amp;#xE9; gigante\n
  • - n&amp;#xE3;o adianta escrever o c&amp;#xF3;digo perfeito que ningu&amp;#xE9;m usa\n- feedback dos usu&amp;#xE1;rios &amp;#xE9; importante\n- muito capricho as vezes &amp;#xE9; perda de tempo\n- good enough!\n
  • - refatorar gerava satisfa&amp;#xE7;&amp;#xE3;o para o time, mas n&amp;#xE3;o para o neg&amp;#xF3;cio\n - esfor&amp;#xE7;o x dano\n
  • - a gente refatorava tudo, sem crit&amp;#xE9;rio\n- aprendemos a selecionar os maiores pain points\n- so refatorar o que for necess&amp;#xE1;rio\n
  • - a gente olhava os commit logs pra comparar\n
  • - avlaliar tech debt conscientemente\n- catalog update remote... refatorar nao traria business value\nadicional, somente satisfa&amp;#xE7;&amp;#xE3;o do time de dev.\n
  • - n&amp;#xE3;o vale a pena sofrer antes da hora.\n- n&amp;#xE3;o adianta querer otimizar pra algo que vc n&amp;#xE3;o tem certeza se vai acontecer\n
  • - o stalone &amp;#xE9; o &amp;#xFA;nico cara que com 60 anos derruba um helic&amp;#xF3;ptero usando uma moto\n- assistam e vejam a piada do chuck norris\n- esque&amp;#xE7;am os caras da esquerda.. os legados s&amp;#xE3;o os velhos aqui do lado direito\n
  • - quando for escrever funcionalidades novas, tente fazer em forma de prot&amp;#xF3;tipo.\n- trabalhar no c&amp;#xF3;digo legado &amp;#xE9; mais dif&amp;#xED;cil. Ent&amp;#xE3;o tente validar a feature longe do tech debt. Depois tente enfiar o c&amp;#xF3;digo l&amp;#xE1; no meio.\n
  • \n
  • - lembra da licen&amp;#xE7;a po&amp;#xE9;tica da literatura? (tire um momento em que tudo &amp;#xE9; liberado).\n- n&amp;#xE3;o &amp;#xE9; voc&amp;#xEA; que est&amp;#xE1; escrevendo o c&amp;#xF3;digo de cowboy..\n- n&amp;#xE3;o fui eu. foi meu eu-l&amp;#xED;rico\n- n&amp;#xE3;o tem problema tomar um atalho\n- cowboy consciente\n
  • - n&amp;#xE3;o &amp;#xE9; pq todo o c&amp;#xF3;digo relacionado a produtos est&amp;#xE1; numa classe que voc&amp;#xEA; precisa continuar aumento o que acontece por l&amp;#xE1;.\n- tente criar uma classe paralela e resolver o problema por l&amp;#xE1;.\n- empacota tudo numa fa&amp;#xE7;ade e toca o pau\n
  • - n&amp;#xE3;o precisa ter medo, v&amp;#xE1; navegando no c&amp;#xF3;digo.\n- nem sempre voc&amp;#xEA; precisa entender tudo por ali.\n- utilize suas ferramentas pra ajudar (intellij e eclipse t&amp;#xEA;m comandos pra avan&amp;#xE7;ar e voltar no c&amp;#xF3;digo)\n\n- ao mesmo tempo n&amp;#xE3;o seja imprudente.\n- evite mudan&amp;#xE7;as desncess&amp;#xE1;rios (refatorar por refatorar)\n
  • - n&amp;#xF3;s fomos mordidos por refactorings antigos.\n- ter&amp;#xE7;a feira eu corrigi um bug criado em fevereiro, por causa de um refactoring desnecess&amp;#xE1;rio.\n- todo mundo odiou a category tree (testes super flappy rodando por 1 ano)\n
  • seja corajoso e mude o c&amp;#xF3;digo\nmas n&amp;#xE3;o seja imprudente ao ponto de especular refactorings\n\n- n&amp;#xE3;o refatore mais de 2 classes por vez\n
  • - ouviu algum guru falando que debugging &amp;#xE9; pra quem n&amp;#xE3;o sabe programar? (bullshit!)\n- conhe&amp;#xE7;a bem uma ou mais IDEs, elas v&amp;#xE3;o fazer sua vida muito mais simples (visual studio com resharper)\n- os refactorings automatizados simplificam a vida e d&amp;#xE3;o seguran&amp;#xE7;a.\n
  • \n
  • \n
  • \n
  • - extraia unidades de forma segura e r&amp;#xE1;pida\n- o compilador e a ide s&amp;#xE3;o grandes amigos seus nessas horas\n- muitos outros (depende da IDE)\n
  • - esse m&amp;#xE9;todo &amp;#xE9; chamado em v&amp;#xE1;rios lugares. uma mudan&amp;#xE7;a pode quebrar N features.\n- vale mesmo a pena mexer nele?\n- sempre use o show call hierarchy quando come&amp;#xE7;ar a modificar uma classe.\n- alternativa em ruby/python? o bom e velho grep (mas n&amp;#xE3;o vai te dar os n&amp;#xED;veis mais baixos)\n(se tiver metaprograma&amp;#xE7;&amp;#xE3;o ferrou tudo)\n
  • - de um blame e descubra quem &amp;#xE9; o pai da crian&amp;#xE7;a\n- deixe pra xingar depois, o dono da caca pode ser voce.\n- sempre fa&amp;#xE7;a um diff antes de commitar\n- use o log pra entender o que as outras pessoas pensaram quando escreveram aquele c&amp;#xF3;digo\n\n- grep e awk podem te ajudar a achar o conte&amp;#xFA;do que voc&amp;#xEA; procura\n- find pra navegar nos arquivos\n- cut pra extrair partes espec&amp;#xED;ficas do conte&amp;#xFA;do\n- xargs pra passar argumentos de forma mais inteligente\n
  • - tdd &amp;#xE9; ferramenta de design, n&amp;#xE3;o de teste.\n- (levantar a polemica) qual &amp;#xE9; o ponto de fazer tdd pra design pronto?\n
  • \n
  • - n&amp;#xF3;s come&amp;#xE7;amos a matar os testes funcionais\n- geralmente se come&amp;#xE7;a com testes funcionais, mas n&amp;#xF3;s fizemos o contr&amp;#xE1;rio\n
  • - o que &amp;#xE9; um flappy tests? (n&amp;#xE3;o determin&amp;#xED;stico. pode falhar em um dos n pontos)\n
  • - o que &amp;#xE9; um flappy tests? (n&amp;#xE3;o determin&amp;#xED;stico. pode falhar em um dos n pontos)\n
  • - o que &amp;#xE9; um flappy tests? (n&amp;#xE3;o determin&amp;#xED;stico. pode falhar em um dos n pontos)\n
  • - o que &amp;#xE9; um flappy tests? (n&amp;#xE3;o determin&amp;#xED;stico. pode falhar em um dos n pontos)\n
  • - o que &amp;#xE9; um flappy tests? (n&amp;#xE3;o determin&amp;#xED;stico. pode falhar em um dos n pontos)\n
  • contudo, os testes ainda s&amp;#xE3;o lentos e inst&amp;#xE1;veis\n
  • - teoria dos sistemas (self organization)\n- integra&amp;#xE7;&amp;#xE3;o via http/rest..\n
  • - reclamar de um dev vai fazer com que ele seja melhor?\n- a velocidade de produ&amp;#xE7;&amp;#xE3;o de lixo &amp;#xE9; muito superior a velocidade de limpeza\n- enxugar gelo\n
  • - reclamar s&amp;#xF3; vai gerar desgaste\n
  • \n
  • - os retangulos amarelos sao os buffers\n- separa&amp;#xE7;&amp;#xE3;o por slices\n
  • \n
  • \n
  • - nao sei. (sim, mas n&amp;#xE3;o)\n- n&amp;#xE3;o podemos afirmar que sim, nem que n&amp;#xE3;o. Mas uma coisa &amp;#xE9; certa: se mantiv&amp;#xE9;ssemos o mesmo ritmo, o burnup seria uma r&amp;#xE9;plica das primeiras semanas. __/ ___/ __/\n- a mudan&amp;#xE7;a de atitude garantiu um ritmo sustent&amp;#xE1;vel que considera tech x biz\n
  • \n
  • Praticando o Desapego: quando ignorar a dívida técnica

    1. 1. praticando o desapego quando ignorar a dívida técnica
    2. 2. sumárioquem somos nós?a histórialiçõesresultados
    3. 3. quem somos nós? Netto @nettofarah github.com/nettofarah ThoughtWorks BR/SF Vini @vvgomes github.com/vvgomes ThoughtWorks BR/NYC
    4. 4. nossa missão
    5. 5. objetivogerenciar o catálogo de produtos e categorias de um dos maiores ecoms do mundo
    6. 6. find . -type f ( -name *.css -o -name *.js -o -name *.java -o -name *.jsp -o -name *.html )-print0 | xargs -0 cat | wc -l
    7. 7. find . -type f ( -name *.css -o -name *.js -o -name *.java -o -name *.jsp -o -name *.html )-print0 | xargs -0 cat | wc -l 558982 linhas de código
    8. 8. grep -R ‘<bean’ . | wc -l
    9. 9. grep -R ‘<bean’ . | wc -l 684 spring beans
    10. 10. grep -R ‘class’ . | wc -l
    11. 11. grep -R ‘class’ . | wc -l 3096 classes java
    12. 12. grep -R ‘@Test’ . | wc -l
    13. 13. grep -R ‘@Test’ . | wc -l 1774 testes com junit4
    14. 14. grep -R ‘public void test’ . | wc -l
    15. 15. grep -R ‘public void test’ . | wc -l 1603 testes com junit3
    16. 16. tecnologias
    17. 17. pontos de integração40 queues 157 fields 20 schemas 8 cores ~ 30 offline jobs 5 webservices
    18. 18. 104 pontos de integração!
    19. 19. testes
    20. 20. testes• 2777 junit tests
    21. 21. testes• 2777 junit tests• 360 functional tests
    22. 22. testes• 2777 junit tests• 360 functional tests• ruby 1.8.6 (sem bundler!)
    23. 23. testes• 2777 junit tests• 360 functional tests• ruby 1.8.6 (sem bundler!)• windows xp
    24. 24. testes• 2777 junit tests• 360 functional tests• ruby 1.8.6 (sem bundler!)• windows xp• monkeypatches para IE/windows
    25. 25. testes• 2777 junit tests• 360 functional tests• ruby 1.8.6 (sem bundler!)• windows xp• monkeypatches para IE/windows• build de 7 horas
    26. 26. times4 times (aprox. 35 devs)8 engineers6 managers
    27. 27. primeira estóriaimportar produtos de um feed
    28. 28. IHateYouForeverImpl• 2272 linhas• 32 dependências• getItemStatus (3 setters)
    29. 29. IHateYouServiceImplTest 78 linhas de test setup
    30. 30. loadAllProducts.xml 26 folhas impressas
    31. 31. ProductDTO.java• 86 atributos• + getters / + setters• equals() => 400 linhas
    32. 32. Vamos jogar tudo fora e começar do zero!
    33. 33. Tá bom!Vamos refatorar tudo!
    34. 34. pague o aluguel!
    35. 35. vamos arrumar a casa• refatoração intensiva• pair programming• reclamação
    36. 36. 6 semanas mais tarde
    37. 37. mais de perto
    38. 38. ferrou!• um refactoring inocente (especulativo)• bugs em produção (custou dinheiro)
    39. 39. todos ‘chora’
    40. 40. todos ‘chora’• desconfiança do time onshore
    41. 41. todos ‘chora’• desconfiança do time onshore• quase cancelamento do projeto
    42. 42. todos ‘chora’• desconfiança do time onshore• quase cancelamento do projeto• iteration manager se demitiu
    43. 43. todos ‘chora’• desconfiança do time onshore• quase cancelamento do projeto• iteration manager se demitiu• tech lead se demitiu (foi pra europa)
    44. 44. nova abordagem
    45. 45. faça as pazes consigo mesmo http://fc06.deviantart.net/fs71/f/2011/027/a/3/rainbow_farting_unicorn_by_hi_my_name_is_light-d3875xd.jpg
    46. 46. desapegue-se http://pottermaniaca1.tumblr.com/post/3687853880
    47. 47. purismo tem limite
    48. 48. right software > software right +/-software certo > fazer software certo
    49. 49. vale a pena refatorar?• bloqueia outra estória?• compromete a entrega?• gera danos ao negócio?
    50. 50. não sofra por antecipação• “isso aqui vai impactar na estória 125 da próxima iteração”• programe baseado em fatos, não em especulação• software é incerto por natureza
    51. 51. código legado é código que funciona http://favim.com/image/467371/
    52. 52. protótiposmvp em nível de funcionalidade
    53. 53. licença poéticanão fui eu. foi meu eu-lírico. http://weheartit.com/entry/36480124/via/ilaria_tatti
    54. 54. jogue a sujeira pra baixo do tapetehierarquias e classes paralelasempacote em façades
    55. 55. coragem x imprudência http://tobemtogordo.files.wordpress.com/2011/06/coragem-esse-c3a9-o-significado.jpg
    56. 56. reduza o ciclo de feedback tem gente usando?
    57. 57. refatoração é viciante
    58. 58. conheça suas ferramentas
    59. 59. debuggers
    60. 60. IDEs
    61. 61. refactorings
    62. 62. refactorings• extract [class, method, variable]• rename [class, method, variable]• move [class, method, variable]
    63. 63. quem é mesmo que chama aquele método? vai encarar?
    64. 64. controle de versão• git / svn [blame, diff, log]• grep / awk / find / cut / xargs / sort
    65. 65. testes e tdd
    66. 66. design evolutivo?
    67. 67. black box vs white box redução dos testes funcionais
    68. 68. flappy tests
    69. 69. flappy tests• refatorar
    70. 70. flappy tests• refatorar• reduzir o grau de integração
    71. 71. flappy tests• refatorar• reduzir o grau de integração• somente ui? teste unitário em javascript
    72. 72. flappy tests• refatorar• reduzir o grau de integração• somente ui? teste unitário em javascript• ui burra? teste em nível de integração
    73. 73. flappy tests• refatorar• reduzir o grau de integração• somente ui? teste unitário em javascript• ui burra? teste em nível de integração• nenhum dos anteriores? VALA!
    74. 74. divide and conquer
    75. 75. divide and conquerfuncionalidades grandes como pequenos serviços
    76. 76. fábricas de dívida técnica
    77. 77. como vender a refatoração?• não dá pra medir com precisão• reclamar não ajuda
    78. 78. conclusões
    79. 79. produção 2 meses antes do planejado
    80. 80. será que este sucesso é consequencia do esforço inicial?
    81. 81. simmas não
    82. 82. perguntas

    ×