Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sometimes a Controller is Just a Controller

Sometimes a Controller is Just a Controller

Justin Searls

April 23, 2015
Tweet

More Decks by Justin Searls

Other Decks in Programming

Transcript

  1. vs
    Fancy Code

    View full-size slide

  2. boring code
    vs
    Fancy Code

    View full-size slide

  3. Boring code is so
    much easier to read!

    View full-size slide

  4. Turns out, that'd
    be a boring talk

    View full-size slide

  5. I am not an artiste

    View full-size slide

  6. I am not an artiste

    View full-size slide

  7. I am not an artíste

    View full-size slide

  8. I am not an artìste

    View full-size slide

  9. Artists say "I love your slides"

    View full-size slide

  10. Artists say "I love your slides"
    !
    :crying with tears of joy:

    View full-size slide

  11. "Really, I love that you put so
    much time into your slides"

    View full-size slide

  12. "Really, I love that you put so
    much time into your slides"
    "
    :loudly crying face:

    View full-size slide

  13. Horological Study:

    View full-size slide

  14. Horological Study:
    time -slides= 0

    View full-size slide

  15. People Won Over

    View full-size slide

  16. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over

    View full-size slide

  17. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over

    View full-size slide

  18. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over

    View full-size slide

  19. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over

    View full-size slide

  20. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over

    View full-size slide

  21. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over

    View full-size slide

  22. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over
    X

    View full-size slide

  23. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over
    X

    View full-size slide

  24. 80 / 20 Rule

    View full-size slide

  25. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over
    X

    View full-size slide

  26. 0%
    20%
    40%
    60%
    80%
    100%
    1
    hour
    10
    hours
    20
    hours
    40
    hours
    60
    hours
    People Won Over
    X

    View full-size slide

  27. Sometimes a slide
    is just a slide

    View full-size slide

  28. 1. tiny units

    View full-size slide

  29. 1. tiny units
    1a. no, like hilariously tiny

    View full-size slide

  30. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method

    View full-size slide

  31. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction

    View full-size slide

  32. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both

    View full-size slide

  33. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both

    View full-size slide

  34. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both
    4. eliminate local variables to an absurd degree

    View full-size slide

  35. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both
    4. eliminate local variables to an absurd degree
    4a. start with functional chains

    View full-size slide

  36. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both
    4. eliminate local variables to an absurd degree
    4a. start with functional chains
    4b. refactor via functional composition

    View full-size slide

  37. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both
    4. eliminate local variables to an absurd degree
    4a. start with functional chains
    4b. refactor via functional composition
    4c. use tap/each as if to scream "Side Effect!"

    View full-size slide

  38. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both
    4. eliminate local variables to an absurd degree
    4a. start with functional chains
    4b. refactor via functional composition
    4c. use tap/each as if to scream "Side Effect!"
    5. minimize third-party dependencies and write wrappers around them

    View full-size slide

  39. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both
    4. eliminate local variables to an absurd degree
    4a. start with functional chains
    4b. refactor via functional composition
    4c. use tap/each as if to scream "Side Effect!"
    5. minimize third-party dependencies and write wrappers around them
    6. pull side-effects nearer the entry point (imperative shell / functional core)

    View full-size slide

  40. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both
    4. eliminate local variables to an absurd degree
    4a. start with functional chains
    4b. refactor via functional composition
    4c. use tap/each as if to scream "Side Effect!"
    5. minimize third-party dependencies and write wrappers around them
    6. pull side-effects nearer the entry point (imperative shell / functional core)
    7. disagree with whatever my pair does every 10 minutes

    View full-size slide

  41. 1. tiny units
    1a. no, like hilariously tiny
    1b. as in, units with one public method
    1c. extract privates from complex code for the name, not the abstraction
    2. units can hold & describe a value or perform useful behavior, never both
    3. behavior-ey units can contain logic or depend on other units, not both
    4. eliminate local variables to an absurd degree
    4a. start with functional chains
    4b. refactor via functional composition
    4c. use tap/each as if to scream "Side Effect!"
    5. minimize third-party dependencies and write wrappers around them
    6. pull side-effects nearer the entry point (imperative shell / functional core)
    7. disagree with whatever my pair does every 10 minutes
    8. overwhelm people with information so that I get my way

    View full-size slide

  42. My name is Justin Searls
    Please tweet me @searls &
    Say [email protected]

    View full-size slide

  43. ( ͠° ͟ʖ ͡°)

    View full-size slide

  44. ( ͡~ ͜
    ʖ ͡°)

    View full-size slide

  45. My Favorite Way

    View full-size slide

  46. Your Favorite Way

    View full-size slide

  47. Your Team's Favorite Way

    View full-size slide

  48. Your Framework's Favorite Way

    View full-size slide

  49. Your Boss's Favorite Way

    View full-size slide

  50. Your Boss's Favorite Way
    $

    View full-size slide

  51. Your Boss's Favorite Way

    $

    View full-size slide

  52. Your Boss's Favorite Way
    %

    $

    View full-size slide

  53. If you combine everybody's
    favorite way then maybe…

    View full-size slide

  54. There's no such thing
    as Good Code
    Hypothesis:

    View full-size slide

  55. Snake oil still sells out as fast
    as Hacker News can stock it
    Exhibit A:

    View full-size slide

  56. Projects rarely succeed or
    fail because of code quality
    Exhibit B:

    View full-size slide

  57. The industry doesn't seem to
    produce better code over time
    Exhibit C:

    View full-size slide

  58. If natural selection applies to software,
    it isn't selecting for code quality

    View full-size slide

  59. 1. Performs a function

    View full-size slide

  60. 1. Performs a function
    2. Communicates intent

    View full-size slide

  61. Performs a function

    View full-size slide

  62. Performs a function
    &

    View full-size slide

  63. Performs a function
    & ⏳

    View full-size slide

  64. Performs a function
    & ⏳ (

    View full-size slide

  65. Functionality is Objective

    View full-size slide

  66. Functionality is Objective
    )
    :ok hand sign:

    View full-size slide

  67. Communicates intent

    View full-size slide

  68. Communicates intent
    *

    View full-size slide

  69. Communicates intent
    * +

    View full-size slide

  70. Communicates intent
    * + ,

    View full-size slide

  71. Communication is Subjective

    View full-size slide

  72. Communication is Subjective
    -
    :flushed face:

    View full-size slide

  73. Conflating objective & subjective
    goals makes evaluation hard

    View full-size slide

  74. Conflating objective & subjective
    goals makes evaluation hard
    .
    :artist palette:

    View full-size slide

  75. Otherwise, we emphasize function
    because measurement is easier

    View full-size slide

  76. Otherwise, we emphasize function
    because measurement is easier
    /
    :chart with upwards trend:

    View full-size slide

  77. No
    Idea
    Wrong
    Idea

    View full-size slide

  78. Snowball Effect
    0
    0000
    0000000
    00000000
    00000000
    11111
    1111111
    2

    View full-size slide

  79. As individuals
    0

    View full-size slide

  80. If only an app could tell us
    whether our code was good!

    View full-size slide

  81. So I made one for you:

    View full-size slide

  82. So I made one for you:
    is my code good.com

    View full-size slide

  83. (Don't view the source)

    View full-size slide

  84. Version 2 Announcement:

    View full-size slide

  85. Version 2 Announcement:
    10x
    developer
    conversion

    View full-size slide

  86. Version 2 Announcement:
    10x
    developer
    conversion
    4
    4

    View full-size slide

  87. Why do scoring, ranking &
    achievements comfort us?
    Q:

    View full-size slide

  88. Quantified measurement
    can soothe our self-doubt
    Why do scoring, ranking &
    achievements comfort us?
    Q:
    A:

    View full-size slide

  89. Every programmer
    shares a secret fear

    View full-size slide

  90. What if my
    code sucks?
    5

    View full-size slide

  91. Everyone else seems
    to have it figured out…
    5

    View full-size slide

  92. Maybe they know
    something I don't?
    5

    View full-size slide

  93. Maybe I'll fool them if
    I use more big words
    5

    View full-size slide

  94. [coping intensifies]
    5

    View full-size slide

  95. [coping intensifies]
    5

    View full-size slide

  96. Fear, insecurity, & doubt varies
    5

    View full-size slide

  97. Fear, insecurity, & doubt varies
    5
    6

    View full-size slide

  98. Fear, insecurity, & doubt varies
    5
    6 7

    View full-size slide

  99. Fear, insecurity, & doubt varies
    introspective self-assured

    View full-size slide

  100. Fear, insecurity, & doubt varies
    introspective
    empathetic indifferent
    self-assured

    View full-size slide

  101. Fear, insecurity, & doubt varies
    introspective
    persuadable unflinching
    empathetic indifferent
    self-assured

    View full-size slide

  102. Let's practice rating me!

    View full-size slide

  103. FORM APPROVED
    OMB NO. 1651-0009
    Customs Declaration
    19 CFR 122.27, 148.12, 148.13, 148.110,148.111, 1498; 31 CFR 5316
    Each arriving traveler or responsible family member must provide the following
    information (only ONE written declaration per family is required). The term
    “family” is defined as “members of a family residing in the same household who
    are related by blood, marriage, domestic relationship, or adoption.”
    1 Family Name
    First (Given) Middle
    8 Countries visited on this
    trip prior to U.S. arrival
    4 (a) U.S. Street Address (hotel name/destination
    (b) City (c) State
    10 The primary purpose of this trip is business: Yes No
    11 I am (We are) bringing
    (a) fruits, vegetables, plants, seeds, food, insects: Yes No
    (b) meats, animals, animal/wildlife products: Yes No
    (c) disease agents, cell cultures, snails: Yes No
    (d) soil or have been on a farm/ranch/pasture: Yes No
    12 I have (We have) been in close proximity of livestock: Yes No
    3 Number of Family members traveling with you
    5 Passport issued by (country)
    6 Passport number
    7 Country of Residence
    2 Birth date Month Day Year
    9 Airline/Flight No. or Vessel Name
    This Space For Offical Use Only

    View full-size slide

  104. 8 Countries visited on this
    trip prior to U.S. arrival
    10 The primary purpose of this trip is business: Yes No
    11 I am (We are) bringing
    (a) fruits, vegetables, plants, seeds, food, insects: Yes No
    (b) meats, animals, animal/wildlife products: Yes No
    (c) disease agents, cell cultures, snails: Yes No
    (d) soil or have been on a farm/ranch/pasture: Yes No
    12 I have (We have) been in close proximity of livestock: Yes No
    (such as touching or handling)
    13 I am (We are) carrying currency or monetary instruments
    over $10,000 U.S. or foreign equivalent: Yes No
    (see definition of monetary instruments on reverse)
    9 Airline/Flight No. or Vessel Name

    View full-size slide

  105. Fear, insecurity, & doubt varies
    introspective self-assured

    View full-size slide

  106. Fear, insecurity, & doubt varies
    introspective self-assured
    6

    View full-size slide

  107. Held to subjective
    evaluation standards

    View full-size slide

  108. Held to subjective
    evaluation standards
    paralyzed by
    self-doubt

    View full-size slide

  109. Held to subjective
    evaluation standards
    paralyzed by
    self-doubt
    rates self
    favorably

    View full-size slide

  110. Communication competence:

    View full-size slide

  111. Communication competence:
    effective
    communicator

    View full-size slide

  112. Communication competence:
    effective
    communicator
    clear
    communicator

    View full-size slide

  113. Communication competence:
    effective
    communicator
    clear
    communicator
    (to like-minded people)

    View full-size slide

  114. we evaluate
    code poorly

    View full-size slide

  115. we evaluate
    code poorly
    conscientious
    coders doubt
    themselves

    View full-size slide

  116. we evaluate
    code poorly
    conscientious
    coders doubt
    themselves
    callous coders
    outperform others

    View full-size slide

  117. we evaluate
    code poorly
    conscientious
    coders doubt
    themselves
    callous coders
    outperform others
    conscientious
    coders marginalized
    and then quit

    View full-size slide

  118. we evaluate
    code poorly
    conscientious
    coders doubt
    themselves
    callous coders
    outperform others
    conscientious
    coders marginalized
    and then quit
    more
    ^

    View full-size slide

  119. we evaluate
    code poorly
    conscientious
    coders doubt
    themselves
    callous coders
    outperform others
    conscientious
    coders marginalized
    and then quit 5
    7
    5
    5 5
    7
    7
    7
    7
    7
    more
    ^

    View full-size slide

  120. we evaluate
    code poorly
    conscientious
    coders doubt
    themselves
    callous coders
    outperform others
    conscientious
    coders marginalized
    and then quit
    5
    7
    5
    5 5
    7
    7
    7
    7
    7
    more
    ^

    View full-size slide

  121. Guess which group does
    better at whiteboard interviews?

    View full-size slide

  122. Guess which group does
    better at whiteboard interviews?
    NOOOOOOPE

    View full-size slide

  123. Did you groan in realization
    this was a soft talk?

    View full-size slide

  124. Then this talk's for you!
    Did you groan in realization
    this was a soft talk?

    View full-size slide

  125. THE FOLLOWING TALK HAS BEEN APPROVED FOR
    APPROPRIATE AUDIENCES
    BY THE PEOPLE WHO RATE TALKS, I GUESS?
    THE TALK ADVERTISED HAS BEEN RATED
    F FEELS
    SOME STRONG EMOTIONS, EVIDENCE OF
    RELATABLE HUMANITY THROUGHOUT

    View full-size slide

  126. THE FOLLOWING TALK HAS BEEN APPROVED FOR
    APPROPRIATE AUDIENCES
    BY THE PEOPLE WHO RATE TALKS, I GUESS?
    THE TALK ADVERTISED HAS BEEN RATED
    F FEELS
    SOME STRONG EMOTIONS, EVIDENCE OF
    RELATABLE HUMANITY THROUGHOUT

    View full-size slide

  127. Write Code the Right Way

    View full-size slide

  128. Communication can only be
    "correct" for a set of contexts

    View full-size slide

  129. XP System Metaphors

    View full-size slide

  130. Mystery Men Code

    View full-size slide

  131. Know your audience

    View full-size slide

  132. Know your audience
    ,
    :crystal ball:

    View full-size slide

  133. Popular belief in a
    "Right Way"
    causes problems

    View full-size slide

  134. As a programmer, I want to
    convert _____ and send it
    over ______ using _____ so
    that I can ______________.

    View full-size slide

  135. As a programmer, I want to
    convert _____ and send it
    over ______ using _____ so
    that I can ______________.
    to PDF

    View full-size slide

  136. As a programmer, I want to
    convert _____ and send it
    over ______ using _____ so
    that I can ______________.
    Fax
    to PDF

    View full-size slide

  137. As a programmer, I want to
    convert _____ and send it
    over ______ using _____ so
    that I can ______________.
    Fax
    to PDF
    Rails

    View full-size slide

  138. As a programmer, I want to
    convert _____ and send it
    over ______ using _____ so
    that I can ______________.
    Fax
    to PDF
    Rails
    remain employed

    View full-size slide

  139. 8 best pdf gem rails

    View full-size slide

  140. 8 best fax gem rails

    View full-size slide

  141. 9 no results found

    View full-size slide

  142. 9 no results found
    :
    :anguished face:

    View full-size slide

  143. Why would anyone
    prefer JavaScript?

    View full-size slide

  144. What's the right way to ⛄?
    5

    View full-size slide

  145. What's the right way to ⛄?
    5
    Does your code run? If so,
    then that's the right way!
    7

    View full-size slide

  146. A Wild West can be liberating!

    View full-size slide

  147. A Wild West can be liberating!

    View full-size slide

  148. 0
    0000
    0000000
    00000000
    00000000
    11111
    1111111
    2

    View full-size slide

  149. As teams
    00000

    View full-size slide

  150. Ever excitedly try a new approach
    and team members shot you down?

    View full-size slide

  151. Ever excitedly try a new approach
    and team members shot you down?
    <
    :pensive face:

    View full-size slide

  152. Ever had a team member shoehorn
    a weird code style into your project?

    View full-size slide

  153. Ever had a team member shoehorn
    a weird code style into your project?
    =
    :unamused face:

    View full-size slide

  154. 2 sides of the same coin:

    View full-size slide

  155. 2 sides of the same coin:
    Fundamental Attribution Error

    View full-size slide

  156. We expend emotional energy
    compensating for our insecurity

    View full-size slide

  157. Familiar Novel

    View full-size slide

  158. Familiar Novel
    ?

    View full-size slide

  159. Proven Approach Hacker News
    Driven Development
    ?

    View full-size slide

  160. Proven Approach Hacker News
    Driven Development
    @

    View full-size slide

  161. Stubborn
    and outmoded
    Modern
    Development
    @

    View full-size slide

  162. Personal insecurity is a barrier
    to bridging these divides

    View full-size slide

  163. "Culture Fit"

    View full-size slide

  164. "Culture" vs. "Monoculture"

    View full-size slide

  165. Dirty Secret #1:

    View full-size slide

  166. Dirty Secret #1:
    Monocultures work faster!

    View full-size slide

  167. Proven Approach Hacker News
    Driven Development
    ?

    View full-size slide

  168. Proven Approach Hacker News
    Driven Development
    ??
    ?
    ?
    ?
    ?

    View full-size slide

  169. "Meritocracies" incidentally
    reinforce monocultures

    View full-size slide

  170. Dirty Secret #2:

    View full-size slide

  171. Dirty Secret #2:
    faster != better

    View full-size slide

  172. The world teaches us
    that slow == stupid

    View full-size slide

  173. Teams that overcome differing
    perspectives are slower

    View full-size slide

  174. Teams that overcome differing
    perspectives are slower*

    View full-size slide

  175. Teams that overcome differing
    perspectives are slower
    *but write more robust systems
    *

    View full-size slide

  176. Proven Approach
    ??
    ?
    Modern
    Development
    @@
    @

    View full-size slide

  177. B Please! Stop Claiming B

    View full-size slide

  178. "trust us, is
    faster in the long run!"
    B Please! Stop Claiming B

    View full-size slide

  179. Dirty Secret #3

    View full-size slide

  180. Dirty Secret #3
    Most dichotomies are false

    View full-size slide

  181. Culture Fit
    ?
    D
    E

    View full-size slide

  182. Culture Fit
    ?
    D
    E
    +

    View full-size slide

  183. What about code?
    G

    View full-size slide

  184. Functionality

    View full-size slide

  185. Functionality
    Communication

    View full-size slide

  186. Functionality
    Communication

    View full-size slide

  187. Priorities
    functionality communication

    View full-size slide

  188. Priorities
    functionality
    communicate
    to humans

    View full-size slide

  189. Priorities
    communicate
    to computers
    communicate
    to humans

    View full-size slide

  190. Priorities
    communicate
    to computers
    H
    communicate
    to humans

    View full-size slide

  191. I
    Priorities
    communicate
    to computers
    communicate
    to humans

    View full-size slide

  192. Priorities
    J
    communicate
    to computers
    communicate
    to humans

    View full-size slide

  193. K
    Priorities
    communicate
    to computers
    communicate
    to humans

    View full-size slide

  194. $
    Priorities
    communicate
    to computers
    communicate
    to humans

    View full-size slide

  195. Functionality
    Communication

    View full-size slide

  196. Functionality
    Communication

    View full-size slide

  197. How is our code
    communicating?

    View full-size slide

  198. We don't have a good
    vocabulary for this yet

    View full-size slide

  199. Indirection Analysis

    View full-size slide

  200. Each {lib, file, method,
    name} is an indirection

    View full-size slide

  201. Each {macro, reflection, metaprogram}
    is a SUPER indirection

    View full-size slide

  202. Indirection Score
    For a given code path:

    View full-size slide

  203. Indirection Score
    For a given code path:
    1. How many names are encountered?

    View full-size slide

  204. Indirection Score
    For a given code path:
    1. How many names are encountered?
    2. How many source files contribute code?

    View full-size slide

  205. Indirection Score
    For a given code path:
    1. How many names are encountered?
    2. How many source files contribute code?
    3. How many tests redundantly cover it?

    View full-size slide

  206. Indirection Score
    For a given code path:
    1. How many names are encountered?
    2. How many source files contribute code?
    3. How many tests redundantly cover it?
    4. How much is handled by dependencies?

    View full-size slide

  207. WET DRY
    Indirection

    View full-size slide

  208. WET
    Duplicate
    Nothing
    Indirection

    View full-size slide

  209. Couple
    Nothing
    Duplicate
    Nothing
    Indirection

    View full-size slide

  210. Couple
    Nothing
    Duplicate
    Nothing

    View full-size slide

  211. Couple
    Nothing
    Duplicate
    Nothing
    Both extremes are costly

    View full-size slide

  212. Couple
    Nothing
    Duplicate
    Nothing

    View full-size slide

  213. Couple
    Nothing
    Duplicate
    Nothing
    E change one thing

    View full-size slide

  214. Couple
    Nothing
    Duplicate
    Nothing
    E change one thing
    L change many things

    View full-size slide

  215. Couple
    Nothing
    Duplicate
    Nothing

    View full-size slide

  216. Couple
    Nothing
    Duplicate
    Nothing
    E change many things

    View full-size slide

  217. Couple
    Nothing
    Duplicate
    Nothing
    E change many things
    L change one thing

    View full-size slide

  218. Couple
    Nothing
    Duplicate
    Nothing

    View full-size slide

  219. Couple
    Nothing
    Duplicate
    Nothing
    E learn one piece

    View full-size slide

  220. Couple
    Nothing
    Duplicate
    Nothing
    E learn one piece
    L learn entire system

    View full-size slide

  221. Couple
    Nothing
    Duplicate
    Nothing

    View full-size slide

  222. Couple
    Nothing
    Duplicate
    Nothing
    L learn one piece

    View full-size slide

  223. Couple
    Nothing
    Duplicate
    Nothing
    L learn one piece
    E learn entire system

    View full-size slide

  224. Couple
    Nothing
    Duplicate
    Nothing

    View full-size slide

  225. Couple
    Nothing
    Duplicate
    Nothing
    Yay Nuance!

    View full-size slide

  226. Explicit vs. Implicit Indirection

    View full-size slide

  227. Explicit vs. Implicit Indirection

    View full-size slide

  228. Explicit vs. Implicit Indirection
    ❄ N

    View full-size slide

  229. Practice communicating about
    our code's communication

    View full-size slide

  230. #thoughtleadering
    opportunities abound!

    View full-size slide

  231. 0
    0000
    0000000
    00000000
    00000000
    11111
    1111111
    2

    View full-size slide

  232. As a community
    0000000000000000
    0000000000000000
    0000000000000000

    View full-size slide

  233. Your team's 6th person

    View full-size slide

  234. Your team's 6th person
    ?

    View full-size slide

  235. Your team's 6th person
    ?

    View full-size slide

  236. Your team's 6th person
    ?

    View full-size slide

  237. Your team's 6th person
    ?

    View full-size slide

  238. Thought Leaders
    O

    View full-size slide

  239. Thought Leaders
    O PQ

    View full-size slide

  240. Thought Leaders
    O PQ R

    View full-size slide

  241. Who does our code talk to?

    View full-size slide

  242. S
    :face with cold sweat:

    View full-size slide

  243. T
    :disappointed but
    relieved face:

    View full-size slide

  244. Hero Worship

    View full-size slide

  245. Now that I'm a
    Certified Keynote Speaker™

    View full-size slide

  246. Now that I'm a
    Certified Keynote Speaker™
    [shuddering intensifies]

    View full-size slide

  247. Your clever code
    does not impress me

    View full-size slide

  248. Your clever code
    makes me feel stupid

    View full-size slide

  249. Clever code is a symptom
    of poor understanding

    View full-size slide

  250. Obvious is more
    impressive than clever

    View full-size slide

  251. Code design approaches are memes

    View full-size slide

  252. Code design approaches are memes
    MVC

    View full-size slide

  253. Code design approaches are memes
    MVC
    BDD

    View full-size slide

  254. Code design approaches are memes
    MVC
    BDD DSLs

    View full-size slide

  255. Code design approaches are memes
    MVC
    BDD
    View Presenters
    DSLs

    View full-size slide

  256. Code design approaches are memes
    MVC
    BDD
    Fast Specs
    View Presenters
    DSLs

    View full-size slide

  257. Code design approaches are memes
    MVC
    BDD
    Fast Specs
    View Presenters
    Hexagonal Rails
    DSLs

    View full-size slide

  258. Code design approaches are memes
    MVC
    BDD
    Fast Specs
    View Presenters
    Hexagonal Rails
    DSLs
    DCI

    View full-size slide

  259. Code design approaches are memes
    MVC
    BDD
    Fast Specs
    View Presenters
    Hexagonal Rails
    DSLs
    DCI
    Fat models / Skinny controllers

    View full-size slide

  260. Memes are ideas competing for
    attention via natural selection

    View full-size slide

  261. Somebody has idea
    0
    U

    View full-size slide

  262. Somebody has idea
    0
    Experiments with idea
    0
    U

    View full-size slide

  263. Somebody has idea
    0
    Experiments with idea
    0
    Shares idea with others
    00
    U

    View full-size slide

  264. Somebody has idea
    0
    Experiments with idea
    0
    Shares idea with others
    00
    Idea becomes popular
    000
    U

    View full-size slide

  265. Somebody has idea
    0
    Experiments with idea
    0
    Shares idea with others
    00
    Idea becomes popular
    000
    Idea becomes ubiquitous
    0000
    U

    View full-size slide

  266. Somebody has idea
    0
    Experiments with idea
    0
    Shares idea with others
    00
    Idea becomes popular
    000
    Idea becomes ubiquitous
    0000
    Idea is finally worth using
    U

    View full-size slide

  267. Somebody has idea
    0
    Experiments with idea
    0
    Shares idea with others
    00
    Idea becomes popular
    000
    Idea becomes ubiquitous
    0000
    Idea is finally worth using
    V⁉
    U

    View full-size slide

  268. Memes are most valuable
    when our audience knows them

    View full-size slide

  269. How do design memes
    ever become ubiquitous?!
    Q:

    View full-size slide

  270. Symbiotic relationships with
    early adopters who oversell
    any intrinsic benefits!
    How do design memes
    ever become ubiquitous?!
    Q:
    A:

    View full-size slide

  271. Somebody has idea
    U
    0
    Experiments with idea
    0
    Idea becomes popular
    000
    Idea becomes ubiquitous
    0000
    Idea is finally worth using
    V⁉
    Shares idea with others
    00

    View full-size slide

  272. Somebody has idea
    U
    0
    Experiments with idea
    0
    Idea becomes popular
    000
    Idea becomes ubiquitous
    0000
    Idea is finally worth using
    V⁉
    Shares idea with others
    00

    View full-size slide

  273. Somebody has idea
    U
    0
    Experiments with idea
    0
    Idea becomes popular
    000
    Idea becomes ubiquitous
    0000
    Idea is finally worth using
    V⁉
    Shares idea with others
    00
    "Evangelists"

    View full-size slide

  274. Somebody has idea
    U
    0
    Experiments with idea
    0
    Idea becomes popular
    000
    Idea becomes ubiquitous
    0000
    Idea is finally worth using
    V⁉
    Shares idea with others
    00
    Meme Salespeople

    View full-size slide

  275. Shares idea with others
    00
    Somebody has idea
    U
    0
    Experiments with idea
    0
    Idea becomes ubiquitous
    0000
    Idea is finally worth using
    V⁉
    Idea becomes popular
    000

    View full-size slide

  276. Shares idea with others
    00
    Somebody has idea
    U
    0
    Experiments with idea
    0
    Idea becomes ubiquitous
    0000
    Idea is finally worth using
    V⁉
    Idea becomes popular
    000
    Aspirational Adopters

    View full-size slide

  277. Everyone wants their meme to reach
    ubiquity & may pressure you to adopt it

    View full-size slide

  278. Know your audience
    ,
    :crystal ball:

    View full-size slide

  279. 0
    0000
    0000000
    00000000
    00000000
    11111
    1111111
    2

    View full-size slide

  280. 0
    0000
    0000000
    00000000
    00000000
    11111
    1111111
    2

    View full-size slide

  281. As an industry
    111111111111111
    111111111111111
    111111111111111

    View full-size slide

  282. As an industry
    1111111X1111111
    111X11111111111
    1X11111111X1111

    View full-size slide

  283. You think our inability to evaluate
    code makes us uncomfortable?

    View full-size slide

  284. You think our inability to evaluate
    code makes us uncomfortable?
    Try talking to a businessperson!

    View full-size slide

  285. How can a non-technical person be
    sure they're hiring good developers?

    View full-size slide

  286. How can a non-technical person be
    sure they're hiring good developers?
    Y

    View full-size slide

  287. How can a non-technical person be
    sure they're hiring good developers?
    Y Z

    View full-size slide

  288. Request for Proposals

    View full-size slide

  289. 5 @
    - Identifies risk, assumptions

    View full-size slide

  290. 5 @
    - Identifies risk, assumptions - Rationalizes away risk

    View full-size slide

  291. 5 @
    - Identifies risk, assumptions
    - Emphasizes collaboration
    - Rationalizes away risk

    View full-size slide

  292. 5 @
    - Identifies risk, assumptions
    - Emphasizes collaboration
    - Rationalizes away risk
    - Emphasizes competence

    View full-size slide

  293. 5 @
    - Identifies risk, assumptions
    - Emphasizes collaboration
    - Estimates pessimistically
    - Rationalizes away risk
    - Emphasizes competence

    View full-size slide

  294. 5 @
    - Identifies risk, assumptions
    - Emphasizes collaboration
    - Estimates pessimistically
    - Rationalizes away risk
    - Emphasizes competence
    - Estimates optimistically

    View full-size slide

  295. 5 @
    - Identifies risk, assumptions
    - Emphasizes collaboration
    - Estimates pessimistically
    - Higher bid, rarely wins
    - Rationalizes away risk
    - Emphasizes competence
    - Estimates optimistically

    View full-size slide

  296. 5 @
    - Identifies risk, assumptions
    - Emphasizes collaboration
    - Estimates pessimistically
    - Higher bid, rarely wins
    - Rationalizes away risk
    - Emphasizes competence
    - Estimates optimistically
    - Lower bid, often wins

    View full-size slide

  297. 5 @
    - Identifies risk, assumptions
    - Emphasizes collaboration
    - Estimates pessimistically
    - Higher bid, rarely wins
    - Blames failures on self
    - Rationalizes away risk
    - Emphasizes competence
    - Estimates optimistically
    - Lower bid, often wins

    View full-size slide

  298. 5 @
    - Identifies risk, assumptions
    - Emphasizes collaboration
    - Estimates pessimistically
    - Higher bid, rarely wins
    - Blames failures on self
    - Rationalizes away risk
    - Emphasizes competence
    - Estimates optimistically
    - Lower bid, often wins
    - Blames failures on others

    View full-size slide

  299. Businesses don't realize asking for
    proposals biases their decisions

    View full-size slide

  300. Comforting myths that code is
    {tangible,quantifiable,fungible}
    only perpetuate this bias

    View full-size slide

  301. Instead, why not admit & educate
    that software is full of uncertainty?

    View full-size slide

  302. B Construction [

    View full-size slide

  303. B Construction [
    vs

    View full-size slide

  304. B Construction [
    vs
    \ Surgery ✂

    View full-size slide

  305. B Construction [
    vs
    \ Surgery ✂
    (metaphor credit: Dan North)

    View full-size slide

  306. E Estimates! E

    View full-size slide

  307. E Estimates! E
    How much
    time will it take
    to build with
    Good Code™?

    View full-size slide

  308. E Estimates! E
    How much
    time will it take
    to build with
    Good Code™?
    vs

    View full-size slide

  309. E Estimates! E
    How much
    time will it take
    to build with
    Good Code™?
    How much
    uncertainty
    and/or risk
    does it pose?
    vs

    View full-size slide

  310. + Estimates! +

    View full-size slide

  311. + Estimates! +
    How bad of my
    Good Code™
    will you accept?

    View full-size slide

  312. + Estimates! +
    How bad of my
    Good Code™
    will you accept?
    vs

    View full-size slide

  313. + Estimates! +
    How bad of my
    Good Code™
    will you accept?
    vs
    How much
    uncertainty
    will you tolerate?

    View full-size slide

  314. Pick the most
    uncertain feature

    View full-size slide

  315. Pick the most
    uncertain feature
    Identify risks
    & unknowns

    View full-size slide

  316. Pick the most
    uncertain feature
    Identify risks
    & unknowns
    Execute spikes to
    reduce uncertainty

    View full-size slide

  317. Pick the most
    uncertain feature
    Identify risks
    & unknowns
    Execute spikes to
    reduce uncertainty
    Implement with
    boring code

    View full-size slide

  318. Pick the most
    uncertain feature
    Identify risks
    & unknowns
    Execute spikes to
    reduce uncertainty
    Implement with
    boring code

    View full-size slide

  319. Pick the most
    uncertain feature
    Identify risks
    & unknowns
    Execute spikes to
    reduce uncertainty
    Implement with
    boring code
    The Boring Code
    Discovery Model

    View full-size slide

  320. Pick the most
    uncertain feature
    Identify risks
    & unknowns
    Execute spikes to
    reduce uncertainty
    Implement with
    boring code
    The Boring Code
    Discovery Model
    Certification Program Coming Soon!

    View full-size slide

  321. How will we know boring
    code when we see it?

    View full-size slide

  322. What even is boring code?

    View full-size slide

  323. Shared
    Context
    Enough
    What even is boring code?

    View full-size slide

  324. Shared
    Context
    Technical
    Concepts
    Minimal
    Enough
    +
    What even is boring code?

    View full-size slide

  325. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Minimal Clear
    Enough
    +
    +
    What even is boring code?

    View full-size slide

  326. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Empathy
    Minimal Clear
    Lots of
    Enough
    + +
    +
    What even is boring code?

    View full-size slide

  327. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Empathy

    View full-size slide

  328. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Empathy

    View full-size slide

  329. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Empathy
    An Omakase Rails Project

    View full-size slide

  330. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Empathy
    A Prime Rails Project

    View full-size slide

  331. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Empathy
    A Node.js Project

    View full-size slide

  332. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Empathy
    A Java Project

    View full-size slide

  333. Shared
    Context
    Technical
    Concepts
    Domain
    Concepts
    Empathy
    An Ember.js Project

    View full-size slide

  334. ¯\_(π)_/¯

    View full-size slide

  335. #ymmv
    ¯\_(π)_/¯

    View full-size slide

  336. What can we start
    ☀ doing tomorrow? ☀

    View full-size slide

  337. Relax your conception of
    universally Good Code™

    View full-size slide

  338. How we evaluate code
    is subjective and flawed

    View full-size slide

  339. How we evaluate code
    is subjective and flawed
    …so fearing your code sucks
    is both natural and pointless

    View full-size slide

  340. Claiming a Right Way™
    may push others away

    View full-size slide

  341. Seek opportunities to deliberate
    Kindly and Respectfully
    with people who think differently

    View full-size slide

  342. Whenever you see the word 'clever',
    substitute it with 'self-indulgent'.

    View full-size slide

  343. Whenever you see the word 'clever',
    substitute it with 'self-indulgent'.
    ~ Don Norman

    View full-size slide

  344. Metaphors & memes are
    powerful but limit your audience
    to whoever understands them

    View full-size slide

  345. When someone doesn't understand
    your code, assume some responsibility

    View full-size slide

  346. Kip Thorne, The Science of Interstellar:

    View full-size slide

  347. “Some segments of this book may be
    rough going. That’s the nature of real
    science. It requires thought. Sometimes
    deep thought. But thinking can be
    rewarding. You can just skip the rough
    parts, or you can struggle to understand.
    If your struggle is fruitless, then that’s
    my fault, not yours, and I apologize."
    Kip Thorne, The Science of Interstellar:

    View full-size slide

  348. Be Courageous

    View full-size slide

  349. Be Courageous
    Write Boring Code

    View full-size slide

  350. Be Courageous
    Write Boring Code
    _

    View full-size slide

  351. The end. Again.

    View full-size slide

  352. The end. Again.
    The end. Again.

    View full-size slide

  353. My name is Justin Searls
    Please tweet me @searls &
    Say [email protected]

    View full-size slide

  354. Please say hello if your team
    could use our team's help E

    View full-size slide

  355. Like everyone, we're hiring!
    Just [email protected]

    View full-size slide

  356. Please find me, whether to chat
    or to grab a sticker!

    View full-size slide

  357. My name is Justin Searls
    Please tweet me @searls &
    Say [email protected]

    View full-size slide