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

Compose Software Like Nature Would

Ahmed Omran
September 15, 2017

Compose Software Like Nature Would

Inspired by biology background I combine some ideas from functional and OO programming into a talk about software design.

Ahmed Omran

September 15, 2017
Tweet

More Decks by Ahmed Omran

Other Decks in Programming

Transcript

  1. Compose software
    like nature would
    @this_ahmed

    View Slide

  2. Feature Request

    View Slide

  3. Big Ball of Mud

    View Slide

  4. software

    View Slide

  5. change

    View Slide

  6. software as a living organism

    View Slide

  7. Earth: 4.5 billion YA

    View Slide

  8. Monads: 3.5 billion YA

    View Slide

  9. stromatolites

    View Slide

  10. The Machinery of Life

    David S. Goodsell

    View Slide

  11. small
    1 μm

    View Slide

  12. cell membrane
    boundaries

    View Slide

  13. View Slide

  14. View Slide

  15. View Slide

  16. easily replaced

    View Slide

  17. messages = colony

    View Slide

  18. Bacterial colony

    View Slide

  19. –Alan Kay
    “I thought of objects being like biological cells and/
    or individual computers on a network, only able to
    communicate with messages…”

    View Slide

  20. Components: modules,
    objects, functions, etc.
    Messages: functions,
    properties, events, etc.
    Components with boundaries
    Compose with messages

    View Slide

  21. • easier to reason about (fits in your head)

    • easier to change (can be re-written)

    • easier to test (confidence when changing)

    View Slide

  22. View Slide

  23. import myModule from ‘file.js';
    // file.js
    export default function() {
    return something;
    }
    Boundaries

    View Slide

  24. Data
    Fetch
    Data
    Filter
    Line
    Graph
    data-fetch.js
    data-filter.js
    line-graph.js

    View Slide

  25. Data
    Fetch
    Data
    Filter
    Bar
    Graph
    change
    data-fetch.js
    data-filter.js
    bar-graph.js

    View Slide

  26. View Slide

  27. Data
    Fetch
    Data
    Filter
    Line
    Graph
    /project
    |-- data-fetch.js
    |-- data-filter.js
    |-- line-graph.js
    … 1000 other files
    What does system do?

    View Slide

  28. Multicellular: 1.5 billion YA

    View Slide

  29. stove-pipe sponge

    View Slide

  30. Mesh
    Data
    Fetch
    Data
    Filter
    Line
    Graph

    View Slide

  31. project
    └── dashboard
    └── sales-widget
    ├── data-fetch.js
    ├── data-filter.js
    ├── index.js
    └── line-graph.js

    View Slide

  32. sales-widget/index.js
    // import or inject components
    // compose our components
    const sales = dataFetch(“/sales");
    const planSales = dataFilter(sales, plan);
    lineGraph(planSales);

    View Slide

  33. side-effects

    View Slide

  34. Nervous System: ~600
    million YA

    View Slide

  35. Nerve Net

    View Slide

  36. push side-effects to the edges of our
    program

    View Slide

  37. Data
    (e.g. fetch api)
    “Nerve Net”
    draw
    (e.g. chart.js)

    View Slide

  38. Functional Core

    View Slide

  39. pure functions
    const increment = (n) => { n + 1; };

    View Slide

  40. mutable data
    const array = [3,1,2];
    array[0] // 3
    array.sort(); // somewhere else
    array[0] // 1

    View Slide

  41. immutable data
    const array = Object.freeze([3,1,2]);
    array[0] // 3
    array.sort(); // TypeError: Cannot assign to
    read only property '1' ...
    array[0] // 3

    View Slide

  42. let newArr = [ ...prevArr ];
    let newObj = { ...prevObj };
    copy data

    View Slide

  43. Data
    Filter
    Data
    Shaper
    Line
    Graph
    Options
    Data
    (e.g. fetch api)
    Functional
    Core
    “Nerve Net”
    draw
    (e.g. chart.js)

    View Slide

  44. Data
    Filter
    Data
    Shaper
    Line
    Graph
    Options
    Data
    (e.g. fetch api)
    Functional
    Core
    “Nerve Net”
    draw
    (e.g. chart.js)
    Date
    Filter
    TrendLine
    Gary Bernhardt, Boundaries

    View Slide

  45. Cambrian Explosion: ~541
    million YA

    View Slide

  46. View Slide

  47. Run and Tumble
    mit.edu

    View Slide

  48. Run and Tumble to Better Design
    small
    components
    compose with
    messages
    push side-effects
    to boundaries
    functional core name things

    View Slide

  49. Resources
    • Gary Bernhardt - Boundaries: https://
    www.destroyallsoftware.com/talks/boundaries

    • Dan North - Software that Fits in Your Head: https://
    www.youtube.com/watch?v=4Y0tOi7QWqM

    • Rich Hickey - Simple Made Easy: https://www.infoq.com/
    presentations/Simple-Made-Easy

    • Jessica Kerr - Functional Principles for OO Development:
    https://www.youtube.com/watch?v=tq5SQ4W3gRI

    View Slide

  50. Compose software
    like nature would
    @this_ahmed

    View Slide