Anzeige
Anzeige

Más contenido relacionado

Anzeige
Anzeige

Por qué Cervantes programaba mejor que tú

  1. Por qué Cervantes programaba mejor que tú Javier Acero @jacegu http://javieracero.com
  2. 1999
  3. Code Quality!!
  4. Code Business Quality!! Value!!
  5. 2000
  6. 2001
  7. 2011
  8. The Land That Scrum Forgot Robert C. Martin NDC 2011
  9. Por qué Cervantes Cervantes programaba mejor que tú
  10. Por qué Cervantes Cervantes programaba mejor que tú
  11. @author
  12. escritura
  13. “Comunicar a alguien por escrito algo”
  14. lenguaje
  15. “Conjunto de reglas y signos que permiten la comunicación con un ordenador”
  16. 011000100110010101110011 011000010010000001101101 011010010010000001100010 011100100110100101101100 011011000110000101101110 011101000110010100100000 011000110111010101101100 011011110010000001101101 011001010111010011000011 101000010110110001101001 0110001101101111
  17. 011000100110010101110011 011000010010000001101101 011010010010000001100010 011100100110100101101100 011011000110000101101110 011101000110010100100000 011000110111010101101100 011011110010000001101101 011001010111010011000011 101000010110110001101001 0110001101101111 besa mi brillante culo metálico
  18. evolución de los lenguajes
  19. evolución de los lenguajes
  20. evolución de los lenguajes potencia
  21. evolución de los lenguajes potencia legibilidad
  22. segment .text global two_complement two_complement: enter 0,0 pusha mov eax, [ebp+12] neg eax mov [ebp+8], eax popa leave ret
  23. private void updateComputer(Node n, Map<String,Computer> byNameMap, Set<Computer> used) { Computer c; c = byNameMap.get(n.getNodeName());     if (c!=null) { c.setNode(n);     } else { if(n.getNumExecutors()>0) { computers.put(n,c=n.createComputer()); if (!n.holdOffLaunchUntilSave && AUTOMATIC_SLAVE_LAUNCH) { RetentionStrategy retentionStrategy = c.getRetentionStrategy(); if (retentionStrategy != null) { retentionStrategy.start(c);         } else { c.connect(true);         } } } } used.add(c); }
  24. 100% humanos
  25. ¿realmente programamos para las máquinas?
  26. W.T.F.
  27. “aquel que agrada a la persona que lo lee”
  28. wehrwirtschaftsführer
  29. rindfleischetikettierun gsüberwachungsaufgab enübertragungsgesetz
  30. subjetiva
  31. principios
  32. Information hiding Open Closed Principle Uniform Access Duplication KISS Single Responsibility Principle Simple Design GRASP Expresiveness Law of Demeter Auto-documentation Interface Segregation Principle Design Patterns YAGNI Liskov Substitution Principle Naming Dependencies DRY Simmetry Least Surprise Dependency Inversion Principle Cohesion
  33. “aquel que cumple todos los principios”
  34. W.T.F.
  35. private void updateComputer(Node n, Map<String,Computer> byNameMap, Set<Computer> used) { Computer c; c = byNameMap.get(n.getNodeName());     if (c!=null) { c.setNode(n);     } else { if(n.getNumExecutors()>0) { computers.put(n,c=n.createComputer()); if (!n.holdOffLaunchUntilSave && AUTOMATIC_SLAVE_LAUNCH) { RetentionStrategy retentionStrategy = c.getRetentionStrategy(); if (retentionStrategy != null) { retentionStrategy.start(c);         } else { c.connect(true);         } } } } used.add(c); }
  36. good code
  37. You know you are working on good code when each routine you read turns out to be pretty much what you expected. You can call it beautiful when the code also makes it look like the language was made for the problem.
  38. Good code is simple and direct. Good code reads like well-written prose. Good code never obscures the designer’s intent but rather is full of crisp abstractions and straightforward lines of control.
  39. legibilidad
  40. la mejor forma de escribir buen código es centrarse en la legibilidad* *creencia personal
  41. defectos
  42. defectos
  43. defectos 1. Acoplamiento
  44. defectos 1. Acoplamiento 2. Duplicación
  45. defectos 1. Acoplamiento 2. Duplicación 3. Ausencia de encapsulación
  46. defectos 1. Acoplamiento 2. Duplicación 3. Ausencia de encapsulación 4. Complejidad innecesaria
  47. for (final ConfiguracionCanal c : mensaje. getSolicitud(). getServicio(). getConfiguracionesCanal()) { if (mensaje.getCanal().equals(c. getCanal())) { configuracion = c; } }
  48. mensaje.configuracionDeCanal()
  49. correspondiente a Solicitud Mensaje de a través de Servicio Canal ConfiguracionCanal
  50. subliminal slide getters & setters are evil
  51. las 4 cualidades del diseño simple
  52. las 4 cualidades del diseño simple 1. Pasa todos los tests 2. Minimiza la duplicación 3. Maximiza la claridad 4. Tiene los mínimos elementos
  53. oh wait... ¿y los tests?
  54. def d(b)eval"def #{b} end"end;d't(m,&a)puts"e[0;3#{a.call ? "2":"1"}m#{m} e[0m"';d'a(e)e';d'ae(e,d)e==d';d'ai( e,a)a.include? e'
  55. def d(b) eval"def #{b} end" end d 't(m,&a)puts"e[0;3#{a.call ? "2":"1"}m#{m}e[0m"' d 'a(e)e' d 'ae(e,d)e==d' d 'ai(e,a)a.include? e'
  56. t '(red): testing that assert equals fails' do ae(1,2) end t '(green): testing that assert equals works' do ae(2,2) end
  57. twittest the ruby test framework that fits in a tweet!!
  58. las 4 cualidades del diseño simple
  59. las 4 cualidades del diseño simple 1. Pasa todos los tests
  60. las 4 cualidades del diseño simple 1. Pasa todos los tests 2. Minimiza la duplicación
  61. las 4 cualidades del diseño simple 1. Pasa todos los tests 2. Minimiza la duplicación 3. Maximiza la claridad
  62. las 4 cualidades del diseño simple 1. Pasa todos los tests 2. Minimiza la duplicación 3. Maximiza la claridad 4. Tiene los mínimos elementos
  63. todo repercute en la legibilidad
  64. def d(b) eval"def #{b} end" end d 't(m,&a)puts"e[0;3#{a.call ? "2":"1"}m#{m}e[0m"' d 'a(e)e' d 'ae(e,d)e==d' d 'ai(e,a)a.include? e'
  65. def d(b) eval"def #{b} end" end d 't(m,&a)puts"e[0;3#{a.call ? "2":"1"}m#{m}e[0m"' d 'a(e)e' d 'ae(e,d)e==d' d 'ai(e,a)a.include? e'
  66. def d(b) eval"def #{b} end" end d 't(m,&a)puts"e[0;3#{a.call ? "2":"1"}m#{m}e[0m"' d 'a(e)e' d 'ae(e,d)e==d' d 'ai(e,a)a.include? e'
  67. d 'a(e)e' d 'ae(e,d)e==d' d 'ai(e,a)a.include? e'
  68. def assert(value) return value == true end def assert_equal(value, expected) return value == expected end def assert_includes(value, container) return container.include? value end
  69. def d(b) eval"def #{b} end" end d 't(m,&a)puts"e[0;3#{a.call ? "2":"1"}m#{m}e[0m"' d 'a(e)e' d 'ae(e,d)e==d' d 'ai(e,a)a.include? e'
  70. d 't(m,&a)puts"e[0;3#{a.call ? "2":"1"}m#{m}e[0m"'
  71. def test(message, &assert) puts "e[0;3#{assert.call ? "2":"1"}m#{message}e[0m" end
  72. ¿legible?
  73. legibilidad sí, pero... ¿cuánta?
  74. si el test pasa imprimir en verde el nombre del test sino imprimir en rojo el nombre del test
  75. def test(test_name, &test) if test.passes? print_in GREEN, test_name else print_in RED, test_name end end
  76. el buen código es...
  77. “aquel que hace obvio lo que está pasando”
  78. Good code always looks like it was written by someone who cares. Good code is code left by someone who cares deeply about the craft.
  79. muchas gracias
  80. credits Kent Beck: http://www.flickr.com/photos/26420411@N02/3062930943/ Opposing Armies: http://www.flickr.com/photos/ahounslea/4873239128 Ward Cunningham: http://www.flickr.com/photos/joshb/2247556208/ Uncle Bob: http://www.flickr.com/photos/koss/3250213001/ Balance: http://www.flickr.com/photos/classblog/5136926303/ Futurama pictures and WTFs/minute draws were found on google searches. Hand drawings of Grady Booch, Ward Cunningham and Michael Feathers were taken from the Clean Code ebook.
Anzeige