Your First
Legacy Codebase
Coraline Ada Ehmke
@CoralineAda
Slide 2
Slide 2 text
Congratulations!
Slide 3
Slide 3 text
Green fields lay behind you.
Slide 4
Slide 4 text
A twisted legacy awaits.
Slide 5
Slide 5 text
Who am I?
Slide 6
Slide 6 text
Code Witch
Slide 7
Slide 7 text
Long-Time Rubyist
Slide 8
Slide 8 text
where.coraline.codes
Slide 9
Slide 9 text
@CoralineAda
Slide 10
Slide 10 text
Contributor Covenant
Slide 11
Slide 11 text
Senior Engineer
Slide 12
Slide 12 text
Notorious SJW
Slide 13
Slide 13 text
Legacy Codebases
Slide 14
Slide 14 text
A large, unwieldy,
pre-existing code base.
Slide 15
Slide 15 text
A code base so large
that it’s difficult to hold
in your head all at once.
Slide 16
Slide 16 text
Code whose creators have
moved on to other things.
Slide 17
Slide 17 text
Code that represents a
significant investment.
Slide 18
Slide 18 text
Code that is essential to
the company making
money.
Slide 19
Slide 19 text
Code that can’t just be
“burned down”.
Slide 20
Slide 20 text
The Ultimate
Legacy Application
Slide 21
Slide 21 text
World’s Largest Rails App?
Slide 22
Slide 22 text
Canvas LMS
Slide 23
Slide 23 text
$ find . -type f | wc -l
11687
Slide 24
Slide 24 text
No content
Slide 25
Slide 25 text
No content
Slide 26
Slide 26 text
No content
Slide 27
Slide 27 text
Legacy Architecture
Slide 28
Slide 28 text
1990’s: The Age of the Architect
Slide 29
Slide 29 text
Detailed Requirements
Slide 30
Slide 30 text
Architecture Diagrams
Slide 31
Slide 31 text
Object Models
Slide 32
Slide 32 text
Very Thorough
Slide 33
Slide 33 text
Painfully Slow…
Slide 34
Slide 34 text
2010’s: The Age of the Cowboy Coder
Slide 35
Slide 35 text
Evolutionary
Slide 36
Slide 36 text
Fluid
Slide 37
Slide 37 text
Undocumented
Slide 38
Slide 38 text
Easily Influenced
Slide 39
Slide 39 text
Opinionated
Slide 40
Slide 40 text
Major Obstacles
to Understanding
Slide 41
Slide 41 text
Older Frameworks
Slide 42
Slide 42 text
Complexity
Slide 43
Slide 43 text
Lack of Cohesion
Slide 44
Slide 44 text
Inconsistency
Slide 45
Slide 45 text
God Models
Slide 46
Slide 46 text
Custom Gems
Slide 47
Slide 47 text
Monkey Patches
Slide 48
Slide 48 text
A Strategy for
Understanding
Slide 49
Slide 49 text
The OODA Loop
Slide 50
Slide 50 text
Observe
Slide 51
Slide 51 text
Orient
Slide 52
Slide 52 text
Decide
Slide 53
Slide 53 text
Act
Slide 54
Slide 54 text
Observation
Slide 55
Slide 55 text
#{Rails.root}/docs/
Slide 56
Slide 56 text
# comments
Slide 57
Slide 57 text
Wiki
Slide 58
Slide 58 text
Architecture
decision records
Slide 59
Slide 59 text
Pull requests
Slide 60
Slide 60 text
Tests
Slide 61
Slide 61 text
$ rspec spec/ --format documentation
Membership
determines its upgradeability
calculates its expiration in days
detects when it has expired
detects when it is expiring soon
Finished in 0.01401 seconds
12 examples, 0 failures
Slide 62
Slide 62 text
Read the Code
Slide 63
Slide 63 text
Orientation
Slide 64
Slide 64 text
The Problem
Slide 65
Slide 65 text
Terms of Art
Slide 66
Slide 66 text
Patterns
Slide 67
Slide 67 text
People
Slide 68
Slide 68 text
Read Routes In
Slide 69
Slide 69 text
No content
Slide 70
Slide 70 text
Decision
Slide 71
Slide 71 text
Plan a Refactor
Slide 72
Slide 72 text
Explore Inheritance
Slide 73
Slide 73 text
Uncover Modules
Slide 74
Slide 74 text
Untangle Gems
Slide 75
Slide 75 text
Understand Relationships
Slide 76
Slide 76 text
No content
Slide 77
Slide 77 text
No content
Slide 78
Slide 78 text
No content
Slide 79
Slide 79 text
Go Exploring
Slide 80
Slide 80 text
No content
Slide 81
Slide 81 text
Seek the Truth
Slide 82
Slide 82 text
No content
Slide 83
Slide 83 text
def hours_occupied(date)
if availability = get_work_hours(date)
focus = "work"
elsif availability = get_family_hours(date)
focus = "family"
elsif availability = get_friend_hours(date)
focus = "friends"
end
end
Slide 84
Slide 84 text
def hours_occupied(date)
if availability = get_work_hours(date)
focus = "work"
elsif availability = get_family_hours(date)
focus = "family"
elsif availability = get_friend_hours(date)
focus = "friends"
end
end
Slide 85
Slide 85 text
No content
Slide 86
Slide 86 text
def hours_occupied(date)
if availability = get_work_hours(date)
focus = "work"
elsif availability = get_family_hours(date)
focus = "family"
elsif availability = get_friend_hours(date)
focus = "friends"
end
end
Slide 87
Slide 87 text
No content
Slide 88
Slide 88 text
def hours_occupied(date)
if availability = get_work_hours(date)
focus = "work"
elsif availability = get_family_hours(date)
focus = "family"
elsif availability = get_friend_hours(date)
focus = "friends"
end
end