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

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.

Anna Filina
PRO

May 13, 2020
Tweet

More Decks by Anna Filina

Other Decks in Technology

Transcript


  1. Effortless
    Software
    Development
    PHP RUSSIA | MAY 13, 2020
    @afilina

    View Slide

  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?

    View Slide

  3. Anna Filina
    ‣ Coding since 1997.
    ‣ PHP since 2003.
    ‣ Legacy archaeology.
    ‣ Test automation.
    ‣ Talks and workshops.
    ‣ YouTube videos.

    View Slide

  4. 1/3

    Better
    Specifications

    View Slide

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

    document

    View Slide

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

    View Slide

  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.

    View Slide

  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

    View Slide

  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

    View Slide

  10. Requirements:

    collection of use cases

    that need to be accounted for.

    View Slide

  11. I select a
    membership option
    I enter valid credit
    card details
    I should see a
    payment receipt
    Requirements
    Use cases
    (scenarios)

    View Slide

  12. Scenario
    Dev
    Requirements User testing
    Use cases
    (scenarios)

    View Slide

  13. 2/3
    Iterative Design

    View Slide

  14. Design Dev
    Approval
    Mistake in 

    design

    View Slide

  15. The map is not the territory.

    — Alfred Korzybski

    View Slide

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

    View Slide

  17. API
    UI
    User
    Select membership
    Order
    Create order {product_code}
    Payment screen
    Enter payment details
    Receipt {confirmation_num}
    Finalize order {card}
    Receipt

    View Slide

  18. 3/3
    More Cooks

    in the Kitchen

    View Slide

  19. Solution
    ‣ Mob programming: validate the design.
    ‣ Split the work: implementation + tests.

    View Slide

  20. API
    UI
    User
    Select membership
    Order
    Create order {product_code}
    Payment screen
    Enter payment details
    Receipt {confirmation_num}
    Finalize order {card}
    Receipt

    View Slide

  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(),
    ]);
    }
    }

    View Slide

  22. public function __construct(
    ProductStorage $products,
    OrderStorage $orders
    )

    View Slide

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

    View Slide

  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;
    }
    }

    View Slide

  25. Mob Programming
    ‣ Handler: 13 lines.
    ‣ Interfaces: 8 lines.
    ‣ Value objects: 46 lines.
    ‣ = 67
    ‣ Shared vision.

    View Slide

  26. Split the Work
    ‣ Test handler.
    ‣ Implement interfaces + tests.
    ‣ Implement validation of value object + tests.
    ‣ Implement steps of acceptance tests.

    View Slide

  27. interface OrderStorage
    {
    public function create(Product $product, Country $country) : Order
    }

    View Slide

  28. Acceptance Tests
    ‣ Both for backend and frontend.
    ‣ Just for the backend.

    View Slide

  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

    View Slide

  30. Mission
    accomplished

    View Slide

  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.

    View Slide

  32. Further Topics
    ‣ Domain-driven design.
    ‣ Test-driven development.
    ‣ Behavior-driven development.
    ‣ SOLID principles.
    ‣ Clean code.
    ‣ Extreme programming.
    ‣ Scrum.

    View Slide


  33. THANKS!
    @afilina
    @afilina

    View Slide