Effortless Software Development

Effortless Software Development

Software development can be an eternal struggle, or it can be code that pretty much writes itself. In this talk, we’ll look at how simple acceptance tests and a few diagrams help us dive right into the code, which we in turn outline using DDD, This allows us to have a clean and testable design without worrying about implementation details. Code can be then implemented without developers worrying about stepping on each others’ toes, while still be confident that everything will work once put together. Discover how my team can build features faster than the client can sign them off.

B3b2139e4f2c0eca4efe2379fcebc1c5?s=128

Anna Filina

May 13, 2020
Tweet

Transcript

  1. <animés par la passion> Effortless Software Development PHP RUSSIA |

    MAY 13, 2020 @afilina
  2. Waiting for user tests Merge conflicts Adding missing requirements Waiting

    on someone else Someone you never heard of
 disagrees with requirements Redesign Despair Writing code Figuring out requirements 50-page document Approving the document Figuring out... 20 levels of inheritance 800-line methods 6 levels of nested IFs What does $array2 contain? How to unit- test this thing? Is this var null right now?
  3. Anna Filina ‣ Coding since 1997. ‣ PHP since 2003.

    ‣ Legacy archaeology. ‣ Test automation. ‣ Talks and workshops. ‣ YouTube videos.
  4. 1/3
 Better Specifications

  5. Getting an answer Dev Requirements User testing 50-page
 document

  6. Question 2 Missing use cases / redesign More testing er

    User testing
  7. Solution ‣ Get a product owner (not a committee). ‣

    Direct & quick access to product owner. ‣ Should not have other roles in the org. ‣ Should not delegate questions. ‣ Communicate requirements using acceptance tests.
  8. Scenario: User can subscribe with a credit card Given I

    selected a membership option When I enter valid credit card details Then I should see a payment receipt
  9. Scenario: Discounts are matched based on current date Given A

    5% discount "FIVE" active on 2019-01-01 through 2019-01-31 And A 10% discount "TEN" active on 2019-02-01 through 2019-02-28 And The current date is 2019-01-15 When I check for discounts Then The "FIVE" discount should be found
  10. Requirements:
 collection of use cases
 that need to be accounted

    for.
  11. I select a membership option I enter valid credit card

    details I should see a payment receipt Requirements Use cases (scenarios)
  12. Scenario Dev Requirements User testing Use cases (scenarios)

  13. 2/3 Iterative Design

  14. Design Dev Approval Mistake in 
 design

  15. The map is not the territory.
 — Alfred Korzybski

  16. Solution ‣ Sequence or activity diagram. ‣ Minimal code to

    validate design.
  17. API UI User Select membership Order Create order {product_code} Payment

    screen Enter payment details Receipt {confirmation_num} Finalize order {card} Receipt
  18. 3/3 More Cooks
 in the Kitchen

  19. Solution ‣ Mob programming: validate the design. ‣ Split the

    work: implementation + tests.
  20. API UI User Select membership Order Create order {product_code} Payment

    screen Enter payment details Receipt {confirmation_num} Finalize order {card} Receipt
  21. final class CreateOrderHandler { public function handle(Request $request) : Response

    { $productCode = new ProductCode( $request->getAttribute('product_code') ); $product = $this->products->getByCode($productCode); $order = $this->orders->create($product); return new JsonResponse([ 'order' => $order->toArray(), ]); } }
  22. public function __construct( ProductStorage $products, OrderStorage $orders )

  23. interface ProductStorage { public function getByCode(ProductCode $code) : Product; }

    interface OrderStorage { public function create(Product $product) : Order }
  24. final class ProductCode { private $code; public function __construct(string $code)

    { Assert::that($code) ->notBlank() ->maxLength(15); $this->code = $code; } public function getCode() : string { return $this->code; } }
  25. Mob Programming ‣ Handler: 13 lines. ‣ Interfaces: 8 lines.

    ‣ Value objects: 46 lines. ‣ = 67 ‣ Shared vision.
  26. Split the Work ‣ Test handler. ‣ Implement interfaces +

    tests. ‣ Implement validation of value object + tests. ‣ Implement steps of acceptance tests.
  27. interface OrderStorage { public function create(Product $product, Country $country) :

    Order }
  28. Acceptance Tests ‣ Both for backend and frontend. ‣ Just

    for the backend.
  29. @wip Scenario: User can subscribe with a credit card Given

    I selected a membership option When I enter valid credit card details Then I should see a payment receipt Call 1 Call 2 Assertion
  30. Mission accomplished

  31. Lessons Learned ‣ Code is living documentation. ‣ Don't try

    to figure everything out upfront (unknowns). ‣ Mistakes are normal (fail fast). ‣ Work together more often.
  32. Further Topics ‣ Domain-driven design. ‣ Test-driven development. ‣ Behavior-driven

    development. ‣ SOLID principles. ‣ Clean code. ‣ Extreme programming. ‣ Scrum.
  33. <animés par la passion> THANKS! @afilina @afilina