Code is read many more times than written

Code is read many more times than written

"Code is read many more times than written." - this statement changed my view of Software Engineering. From that point on I made it my personal mission to write the best code I could possibly write.
This talk is about my very favorite coding wisdoms that I picked up on my journey so far. All of these will help you to write better code, be more productive and have more fun. And good code pays it's interest rate every day.
Also if you're a clean code junkie looking for a fix - this talk is for you.

8480daec7137f28565bc2d2e666b915a?s=128

Tobias Pfeiffer

September 05, 2013
Tweet

Transcript

  1. We write code

  2. Isn't it more about reading?

  3. Written once – read many times

  4. „(…) when you program, you have to think about how

    someone will read your code, not just how a computer will interpret it.“ Kent Beck
  5. Not about Architecture

  6. Methods & Code

  7. Extra effort

  8. Save time

  9. Your code base?

  10. None
  11. It's about joy!

  12. Code is read many more times than written Tobias Pfeiffer

    @PragTob pragtob.wordpress.com
  13. Sources

  14. Crazy?

  15. Are comments a smell?

  16. Outdated comments are the worst

  17. The why not the what

  18. Comments are an excuse of the code that it could

    not be clearer.
  19. # do one thing … … … # do another

    thing … … … # do something more … …
  20. Extract Methods

  21. do_one_thing do_another_thing do_something_more

  22. # context, outlet, times, time per step, state, data def

    pattern(c, o, t, l, s, d) # … end
  23. Explanatory and meaningful names

  24. def pattern(context, outlet, time, time_per_step, state, data) # … end

  25. Try to keep it to 2 parameters

  26. Argument order dependency

  27. No magic numbers

  28. Explanatory variable

  29. Short Methods (<= 8 LOC)

  30. # allowed to drink? if customer.age > 18 say 'Okay'

    prepare_drink requested_drink say 'here you go' hand_drink_over drink, customer else say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?" end
  31. # allowed to drink? if customer.age > 18 say 'Okay'

    prepare_drink requested_drink say 'here you go' hand_drink_over drink, customer else say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?" end
  32. Query method

  33. Intention revealing method

  34. # … text.color = red # …

  35. def highlight(text) text.color = red end

  36. # … highlight(text) # …

  37. if customer.age > 18 say 'Okay' prepare_drink requested_drink say 'here

    you go' hand_drink_over drink, customer else say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?" end
  38. if customer.age > 18 say 'Okay' prepare_drink requested_drink say 'here

    you go' hand_drink_over drink, customer else say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?" end
  39. if customer.age > 18 say 'Okay' prepare_drink requested_drink say 'here

    you go' hand_drink_over drink, customer else say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?" end
  40. if customer.age > 18 say 'Okay' prepare_drink requested_drink say 'here

    you go' hand_drink_over drink, customer else say 'I am sorry you are not legally allowed rather to drink here' say "Would you rather have a #{NON_ALCOHOLIC_DRINKS.sample}?" end
  41. if allowed_to_drink_alcohol?(customer) serve_drink requested_drink, customer else propose_non_alcoholic_drink end

  42. „The easiest code to understand is the code you don't

    have to read at all.“ Tom Stuart (Berlin)
  43. Same level of abstraction in a method

  44. prepare_drink requested_drink price = requested_drink.price Check = Check.new check.add_price price

    say 'That whill be ' + check.total
  45. prepare_drink requested_drink price = requested_drink.price Check = Check.new check.add_price price

    say 'That whill be ' + check.total
  46. prepare_drink requested_drink price = requested_drink.price Check = Check.new check.add_price price

    say 'That whill be ' + check.total
  47. prepare_drink requested_drink prepare_check requested_drink

  48. DRY

  49. Nice code formatting

  50. @left ||= 0 @top ||= 0 @width ||= 1.0 @height

    ||= 0
  51. double character: 'something weird', stateMask: CTRL | modifier, KeyCode: character.downcase.ord

  52. 80 character Width limit

  53. 80 character Width limit

  54. 80 character Width limit

  55. 80 character Width limit

  56. 80 character Width limit

  57. Don't program by coincedence

  58. Code bases detoriate

  59. No broken windows

  60. None
  61. None
  62. Magical time?

  63. The Boyscout Rule

  64. None
  65. TDD

  66. 80% Code Coverage

  67. 20% is never executed

  68. „Incoming messages should be tested for the state they return.

    Outgoing command messages should be tested to ensure they get sent. Outgoing query messages should not be tested.“ Sandi Metz
  69. Know when to break the rules

  70. If you still like your code from two years ago,

    then you are not learning fast enough.
  71. Enjoy Coding! Tobias Pfeiffer @PragTob pragtob.wordpress.com

  72. Sources • The Pragmatic Programmer • Smalltalk Best Practice Patterns

    • Clean Code • Practical Object Oriented Design in Ruby
  73. Photo Credit • http://officeimg.vo.msecnd.net/en-us/images/MP900439313.jpg • http://officeimg.vo.msecnd.net/en-us/images/MC900021328.wmf • (CC BY-SA 2.0)

    – http://www.flickr.com/photos/83633410@N07/7658272558/in/photostream/ – http://www.flickr.com/photos/83633410@N07/7658165122/ – http://en.wikipedia.org/wiki/File:Kent_Beck_no_Workshop_Mapping_XP.jpg • (CC BY-NC-ND 2.0) – http://www.flickr.com/photos/andih/86577529/ – http://www.flickr.com/photos/12584908@N08/3293117576/ – http://www.flickr.com/photos/jasonlparks/4525188865/ – http://www.flickr.com/photos/20714221@N04/2293045156/ • http://www.flickr.com/photos/47833351@N02/5488791911/(CC BY-ND 2.0) • (CC BY 2.0) – http://www.flickr.com/photos/barry_b/76055201/ – http://www.flickr.com/photos/25165196@N08/7725273678/ – http://www.flickr.com/photos/29254399@N08/3187186308/ • (CC BY-NC-SA 2.0) – http://www.flickr.com/photos/dolescum/7380616658/ – http://www.flickr.com/photos/antonkovalyov/5795281215/ – http://www.flickr.com/photos/doug88888/2792209612/ • (CC BY-NC 2.0) – http://www.flickr.com/photos/37996583811@N01/5757983532/ – http://www.flickr.com/photos/sevendead/5650065458/
  74. Source pictures • http://imagery.pragprog.com/products/59/tpp.jpg • http://www.informit.com/ShowCover.aspx?isbn=9780132852111&type=f • http://coding-in.net/blog/wp-content/uploads/clean_code.jpg • http://www.informit.com/ShowCover.aspx?isbn=9780321721334&type=f

    • http://mendicantuniversity.org/images/logo.png