Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Turning Development Outside-In

1,494 views

Published on

Presented at SwanseaCon (2017-09-26)

We default to considering systems from an insider's perspective; the view from outside can be quite different. Can we apply this inversion to more than just requirements?

We may say we want testing, but what do we want from testing? We may say we want logging, but what do we want from logging? We may say we want clean code, but what do we want from clean code? We may say we want an agile process, but what do we want from an agile process? These are harder questions, but their answers can make for better solutions.

Published in: Software
  • Be the first to comment

Turning Development Outside-In

  1. 1. Turning Development Outside–In @KevlinHenney
  2. 2. What We Talk About When We Talk About Development @KevlinHenney
  3. 3. What We Talk About When We Talk About Requirements @KevlinHenney
  4. 4. Too often we push the problem into the background because we are in a hurry to proceed to a solution.
  5. 5. If you read most software development texts thoughtfully, you will see that almost everything is about the solution; almost nothing is about the problem.
  6. 6. Analysis Design Code Test
  7. 7. Analysis Design Code Test
  8. 8. Analysis Design Code Test
  9. 9. It's expensive to know everything up front. Kolton Andrus
  10. 10. You have to finish things — that's what you learn from, you learn by finishing things. Neil Gaiman
  11. 11. SCRUM: A Pattern Language for Hyperproductive Software Development Teams Mike Beedle, Martine Devos, Yonat Sharon,Ken Schwaber, and Jeff Sutherland
  12. 12. SCRUM Master Sprint Backlog SCRUM Meetings Demo After Sprint SCRUM Master Sprint Backlog SCRUM Meetings Demo After Sprint
  13. 13. Problem You want to balance the needs of developers to work undisturbed and the needs of management and the customer to see real progress, as well as control the direction of that progress throughout the project. Solution Divide the project in Sprints. A Sprint is a period of approximately 30 days in which an agreed amount of work will be performed to create a deliverable. Each Sprint takes a pre-allocated amount of work from the Backlog. Sprint
  14. 14. Analysis Sprint Design Sprint Code Sprint Test Sprint
  15. 15. Analysis Design Code Test Analysis Design Code Test Analysis Design Code Test Analysis Design Code Test
  16. 16. Develop Develop Develop Develop
  17. 17. Develop
  18. 18. If a plot works out exactly as you first planned, you're not working loosely enough to give room to your imagination and instincts.
  19. 19. / WordFriday
  20. 20. pantser, noun ▪ Writer who writes by the seat of their pants. ▪ In contrast to a plotter, a pantser doesn't work to (or have) an outline.
  21. 21. Your Customers Do Not Mean What They Say Nate Jackson
  22. 22. I’ve never met a customer yet that wasn’t all too happy to tell me what they wanted—usually in great detail. The problem is that customers don’t always tell you the whole truth. Nate Jackson
  23. 23. They generally don't lie. They use their terms and their contexts. They leave out significant details. They make assumptions. Nate Jackson
  24. 24. This is compounded by the fact that many customers don’t actually know what they want in the first place! Nate Jackson
  25. 25. Systems have properties — capabilities, features, characteristics, etc. — inside and out.
  26. 26. Development should discover the specific properties desired and make them so.
  27. 27. ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪
  28. 28. ▪ ▪ ▪ ▪ ▪ ▪
  29. 29. ▪ ▪ ▪ ▪ ▪ ▪
  30. 30. ▪ ▪ ▪ ▪ ▪ ▪
  31. 31. ▪ ▪ ▪ ▪ ▪ ▪ Try to leave out the part that readers tend to skip. Elmore Leonard
  32. 32. ▪ ▪ ▪
  33. 33. ▪ ▪ ▪
  34. 34. Stack {new, push, pop, depth, top}
  35. 35. Given When Then an empty stack an item is pushed it should not be empty
  36. 36. Given When Then an empty stack an item is pushed if it's OK with you, I think that, perhaps, it should probably not be empty, don't you think?
  37. 37. Omit needless words. William Strunk and E B White The Elements of Style
  38. 38. Make definite assertions. Avoid tame, colourless, hesitating, noncommittal language. When a sentence is made stronger, it usually becomes shorter. Thus brevity is a by-product of vigour. William Strunk and E B White The Elements of Style
  39. 39. Given When Then an empty stack an item is pushed it is not empty
  40. 40. Given When Then And an empty stack an item is pushed it has a depth of 1 the top item is the item that was pushed
  41. 41. Given_an_empty_stack_Wh en_an_item_is_pushed_Th en_it_has_a_depth_of_1_ And_the_top_item_is_the _item_that_was_pushed
  42. 42. Non-EmptyEmpty depth depth top push pop [depth > 1] push pop [depth = 1] new
  43. 43. public class Stack_spec { public static class A_new_stack { @Test public void is_empty()  } public static class An_empty_stack { @Test() public void throws_when_queried_for_its_top_item()  @Test() public void throws_when_popped()  @Test public void acquires_depth_by_retaining_a_pushed_item_as_its_top()  } public static class A_non_empty_stack { @Test public void becomes_deeper_by_retaining_a_pushed_item_as_its_top()  @Test public void on_popping_reveals_tops_in_reverse_order_of_pushing()  } }
  44. 44. public class Stack_spec { public static class A_new_stack { @Test public void is_empty()  } public static class An_empty_stack { @Test() public void throws_when_queried_for_its_top_item()  @Test() public void throws_when_popped()  @Test public void acquires_depth_by_retaining_a_pushed_item_as_its_top()  } public static class A_non_empty_stack { @Test public void becomes_deeper_by_retaining_a_pushed_item_as_its_top()  @Test public void on_popping_reveals_tops_in_reverse_order_of_pushing()  } }
  45. 45. public class Stack_spec { public static class A_new_stack { @Test public void is_empty()  } public static class An_empty_stack { @Test() public void throws_when_queried_for_its_top_item()  @Test() public void throws_when_popped()  @Test public void acquires_depth_by_retaining_a_pushed_item_as_its_top()  } public static class A_non_empty_stack { @Test public void becomes_deeper_by_retaining_a_pushed_item_as_its_top()  @Test public void on_popping_reveals_tops_in_reverse_order_of_pushing()  } }
  46. 46. Systems have properties — capabilities, features, characteristics, etc. — inside and out.
  47. 47. Functional Operational Developmental
  48. 48. We want our code to be unit testable. What is a unit test?
  49. 49. A test is not a unit test if: ▪ It talks to the database ▪ It communicates across the network ▪ It touches the file system ▪ It can't run at the same time as any of your other unit tests ▪ You have to do special things to your environment (such as editing config files) to run it. Michael Feathers http://www.artima.com/weblogs/viewpost.jsp?thread=126923
  50. 50. A unit test is a test of behaviour whose success or failure is wholly determined by the correctness of the test and the correctness of the unit under test. Kevlin Henney http://www.theregister.co.uk/2007/07/28/what_are_your_units/
  51. 51. What do we want from unit tests?
  52. 52. When a unit test passes, it shows the code is correct.
  53. 53. When a unit test fails, it shows the code is incorrect.
  54. 54. As a I want So that $Role $Feature $Benefit
  55. 55. As a I want So that developer of the software $Feature $Benefit
  56. 56. As a I want So that developer of the software clean code $Benefit
  57. 57. As a I want So that customer of the software $Feature $Benefit
  58. 58. As a I want So that user of the software $Feature $Benefit
  59. 59. As a I want So that $Role logging $Benefit
  60. 60. As a I want So that developer of the software logging $Benefit
  61. 61. As a I want So that customer of the software logging $Benefit
  62. 62. As a I want So that $Role documentation $Benefit
  63. 63. As a I want So that $Role an agile process $Benefit
  64. 64. As a I want So that As shown by $Role $Feature $Benefit $Evidence
  65. 65. Design an architectural space to accommodate a specific program, experience, or intent.

×