$30 off During Our Annual Pro Sale. View Details »

Structural Engineering in Ruby

shagemann
January 31, 2020

Structural Engineering in Ruby

Morning keynote at Birmingham on Rails in Birmingham, AL in January 31, 2020

https://birminghamonrails.com/

shagemann

January 31, 2020
Tweet

More Decks by shagemann

Other Decks in Technology

Transcript

  1. View Slide

  2. Village

    View Slide

  3. Open landscape

    View Slide

  4. Street

    View Slide

  5. City

    View Slide

  6. City

    View Slide

  7. Crumbling street

    View Slide

  8. Building maintenance

    View Slide

  9. Big or Small?
    Stand up if in your codebase you…

    • have more than 50 models

    • have a class with more than a 1000 LOC

    • have an ActiveRecord model with more than 30 :has_many

    • can’t run your full test suite on your machine

    • can’t run your test suite on your machine in under 20
    minutes

    View Slide

  10. Street

    View Slide

  11. Structural Engineering
    in Ruby
    Stephan Hagemann

    View Slide

  12. View Slide

  13. The only thing that ultimately
    let’s you reign in complexity
    within one app are components

    View Slide

  14. As a language, Ruby
    does not have
    components

    View Slide

  15. Gems can act as
    components

    View Slide

  16. …they work well

    View Slide

  17. For Rails, the situation
    kinda sucks…

    View Slide

  18. …but works ok

    View Slide

  19. Let’s make it
    better!

    View Slide

  20. View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. View Slide

  25. View Slide

  26. View Slide

  27. View Slide

  28. View Slide

  29. View Slide

  30. View Slide

  31. View Slide

  32. View Slide

  33. View Slide

  34. View Slide

  35. View Slide

  36. View Slide

  37. View Slide

  38. View Slide

  39. Just a normal Rails app

    with some extra structure…

    View Slide

  40. View Slide

  41. View Slide

  42. Structural 

    Costs + Benefits

    View Slide

  43. View Slide

  44. Method
    2 LOC
    Costs
    Hide logic
    Benefits
    Allow

    Reuse

    View Slide

  45. Class
    2 LOC
    Costs
    Bundle logic

    and data
    Benefits
    Allow

    Reuse

    View Slide

  46. Namespace
    2 LOC
    Costs
    Prevent

    naming

    collisions

    in the global

    namespace
    Benefits
    Group 

    classes 

    and methods

    View Slide

  47. Component

    View Slide

  48. WHAT IS A
    COMPONENT?

    View Slide

  49. Labeled Content
    +
    Explicit Dependencies

    View Slide

  50. Labeled, Unique Content
    +
    Explicit, Directed, Acyclic
    Dependencies

    View Slide

  51. @shageman cbra.info
    ?

    View Slide

  52. @shageman cbra.info

    View Slide

  53. @shageman cbra.info
    ?
    ?

    View Slide

  54. Labeled, Unique Content
    +
    Explicit, Directed, Acyclic
    Dependencies

    View Slide

  55. @shageman cbra.info

    View Slide

  56. A depends on B …
    A
    B

    View Slide

  57. thus B can not depend on A
    A
    B
    X

    View Slide

  58. … and you can’t cheat
    A
    B
    X
    C

    View Slide

  59. View Slide

  60. View Slide

  61. Structure Benefit Cost
    Method Allow reuse, 

    hide logic
    2
    Class Bundle logic and data, allow reuse 2
    Namespace Prevent naming collisions, group
    classes and methods
    2

    View Slide

  62. Gem

    View Slide

  63. Gem
    88 LOC
    Costs
    Create

    provably

    independent

    package of 

    code
    Benefits
    bundle gem awesome_lib
    Allow 

    Distribution

    View Slide

  64. Gem + Engine
    528 LOC
    Costs
    Create

    provably

    independent

    package of 

    code with 

    Rails
    Benefits
    rails plugin new components/awesome_engine --full --mountable
    Allow 

    Distribution

    View Slide

  65. Structure Benefit Cost
    Method Allow reuse, 

    hide logic
    2
    Class Bundle logic and data, allow reuse 2
    Namespace Prevent naming collisions, group
    classes and methods
    2
    Component Allow Distribution, Create provably
    independent package of code
    88
    Rails Component
    Allow Distribution, Create provably
    independent package of code with
    Rails
    528

    View Slide

  66. View Slide

  67. View Slide

  68. ML
    predictor
    X

    View Slide

  69. 1 component with 100 elements 1,267,650,600,228,230,000,000,000,000,000
    2 component with 50 elements 2,251,799,813,685,150
    4 component with 25 elements 134,217,624
    5 component with 20 elements 5,242,775
    10 component with 10 elements 10,130
    * assuming a lot of stuff, including complexity growing according to Reed’s law

    View Slide

  70. Structure Benefit Cost
    Method Allow reuse, 

    hide logic
    2
    Class Bundle logic and data, allow reuse 2
    Namespace Prevent naming collisions, group
    classes and methods
    2
    Component Allow Distribution, Create provably
    independent package of code
    88
    Rails Component
    Allow Distribution, Create provably
    independent package of code with
    Rails
    528

    View Slide

  71. View Slide

  72. 2 LOC
    Costs

    View Slide

  73. Structure Benefit Cost
    Method Allow reuse, 

    hide logic
    2
    Class Bundle logic and data, allow reuse 2
    Namespace Prevent naming collisions, group
    classes and methods
    2
    Component Allow Distribution, Create provably
    independent package of code
    88
    Rails Component
    Allow Distribution, Create provably
    independent package of code with
    Rails
    528

    View Slide

  74. Let’s make it
    better!

    View Slide

  75. Share the stories
    of your large app!

    View Slide

  76. Reduce Rails component costs!

    View Slide

  77. Improve CI/CD integrations

    View Slide

  78. Fix cross-component 

    dependency versioning

    View Slide

  79. Can we create 

    component extractors?

    View Slide

  80. Street

    View Slide

  81. Building maintenance

    View Slide

  82. City

    View Slide

  83. Futuristic skyscraper

    View Slide