SlideShare a Scribd company logo
1 of 268
Download to read offline
@sandimetz Jul 2017
Go Ahead
Make a Mess
Sandi Metz
@sandimetz Jul 2017
Project Life Cycle
@sandimetz Jul 2017
Satisfaction
Timeline
Start Beta 1.0 2.0 Today
@sandimetz Jul 2017
Satisfaction
Timeline
Start Beta 1.0 2.0 Today
@sandimetz Jul 2017
Satisfaction
@sandimetz Jul 2017
Satisfaction
Those who cannot remember the past
are condemned to repeat it.
@sandimetz Jul 2017
@sandimetz Jul 2017
Satisfaction
@sandimetz Jul 2017
The Mess
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Knowledge
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Dependencies
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Stability
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Hope
@sandimetz Jul 2017
@sandimetz Jul 2017
Satisfaction
Timeline
Start Beta 1.0 2.0 Today
@sandimetz Jul 2017
Timeline
Start Beta 1.0 2.0 Today
Object-Oriented Design
@sandimetz Jul 2017
Timeline
Start Beta 1.0 2.0 Today
Stop worrying
and
learn to love the mess
Object-Oriented Design
@sandimetz Jul 2017
@sandimetz Jul 2017
Label the Knowledge
@sandimetz Jul 2017
Label the Knowledge
Complicate the Code
@sandimetz Jul 2017
Label the Knowledge
Complicate the Code
Isolate the Instability
@sandimetz Jul 2017
Label the Knowledge
Complicate the Code
Isolate the Instability
Manage the Mess
@sandimetz Jul 2017
Example #1
Label the Knowledge
@sandimetz Jul 2017
Example #1
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
				#	...	
						#	which	eventually	return	
				cost	
		end
@sandimetz Jul 2017
Example #1
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
				#	...	
						#	which	eventually	return	
				cost	
		end
@sandimetz Jul 2017
Example #1
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
				#	...	
						#	which	eventually	return	
				cost	
		end
@sandimetz Jul 2017
Example #1
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
				#	...	
						#	which	eventually	return	
				cost	
		end
@sandimetz Jul 2017
Example #1
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
				#	...	
						#	which	eventually	return	
				cost	
		end
@sandimetz Jul 2017
Example #1
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
				#	...	
						#	which	eventually	return	
				cost	
		end	
			
MESS
@sandimetz Jul 2017
Example #1
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
				#	...	
						#	which	eventually	return	
				cost	
		end	
			
Omega Mess
@sandimetz Jul 2017
@sandimetz Jul 2017
Omega Mess
@sandimetz Jul 2017
Omega Mess
End of the Line
@sandimetz Jul 2017
Omega Mess
End of the Line
No Dependencies
@sandimetz Jul 2017
Omega Mess
End of the Line
No Dependencies
No Dependents
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Knowledge Stability
@sandimetz Jul 2017
External
Knowledge Stability
@sandimetz Jul 2017
Internal
External
Knowledge Stability
@sandimetz Jul 2017
Internal
External
Knowledge Stability
Low
High
@sandimetz Jul 2017
Internal
External
Knowledge Stability
Low
High
@sandimetz Jul 2017
Internal
External
Knowledge Stability
Low
High
@sandimetz Jul 2017
Internal
External
Knowledge Stability
Low
High
@sandimetz Jul 2017
Internal
External
Knowledge Stability
Low
High
@sandimetz Jul 2017
Internal
External
Knowledge Stability
Low
High
@sandimetz Jul 2017
Internal
External
Knowledge Stability
Low
High
@sandimetz Jul 2017
Dependencies
Shock
@sandimetz Jul 2017
Dependencies
Shock
Game
@sandimetz Jul 2017
@sandimetz Jul 2017
Omega
@sandimetz Jul 2017
Omega
@sandimetz Jul 2017
@sandimetz Jul 2017
Omega Mess
@sandimetz Jul 2017
Omega Mess
Hides behind
the message
@sandimetz Jul 2017
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
						#	...	
						#	which	eventually	return	
				cost	
		end	
			
end
Example #1
@sandimetz Jul 2017
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
						#	...	
						#	which	eventually	return	
				cost	
		end	
			
end
It’s not about
the code
Example #1
@sandimetz Jul 2017
It’s
about
the
message
@sandimetz Jul 2017
@sandimetz Jul 2017
Interlude
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Public
API
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Public
API
Expose
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Public
API
Private
Behavior
Expose
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Public
API
Private
Behavior
Expose Hide
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Public
API
Private
Behavior
Dependencies
Expose Hide
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Public
API
Private
Behavior
Dependencies
Expose Hide
Minimize
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Public
API
Private
Behavior
Dependencies
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
1
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method (expose)
2. cost calculation
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method (expose)
2. cost calculation
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method (expose)
2. cost calculation
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge Plot
1
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
1
2
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method (expose)
2. cost calculation (hide)
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method (expose)
2. cost calculation (hide)
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method (expose)
2. cost calculation (hide)
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method (expose)
2. cost calculation (hide)
Game depends on
3. cost message
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
3
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
Game depends on
3. cost message (minimize)
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
Game depends on
3. cost message (minimize)
4. Shock class name
5. cost receiver
@sandimetz Jul 2017
Knowledge Plot
3
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
4 53
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
4 53
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
?
4 53
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
Game depends on
3. cost message (minimize)
4. Shock class name
5. cost receiver ???
@sandimetz Jul 2017
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
						#	...	
						#	which	eventually	return	
				cost	
		end	
			
end
Example #1
@sandimetz Jul 2017
What is the
future cost
of doing
nothing now?
@sandimetz Jul 2017
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
						#	...	
						#	which	eventually	return	
				cost	
		end	
			
end
Example #1
@sandimetz Jul 2017
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
						#	...	
						#	which	eventually	return	
				cost	
		end	
			
end
I would inject this dependency
Example #1
@sandimetz Jul 2017
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
						#	...	
						#	which	eventually	return	
				cost	
		end	
			
end
I would inject this dependency
I would neaten this mess
Example #1
@sandimetz Jul 2017
class	Game	
		def	shock_cost	
				Shock.new.cost	
		end	
end	
class	Shock	
		def	cost	
						#	lines	of	messy	math	
						#	...	
						#	which	eventually	return	
				cost	
		end	
			
end
I would inject this dependency
I would neaten this mess
You might not
Example #1
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Example #2
Complicate the code
@sandimetz Jul 2017
Example #2
Complicate the code
Shocks vary in cost
@sandimetz Jul 2017
Example #2
class	Game	
		def	shock_cost(type)	
				Shock.new(type).cost	
		end	
end
@sandimetz Jul 2017
Example #2
class	Game	
		def	shock_cost(type)	
				Shock.new(type).cost	
		end	
end
@sandimetz Jul 2017
Example #2
class	Game	
		def	shock_cost(type)	
				Shock.new(type).cost	
		end	
end
@sandimetz Jul 2017
Example #2
class	Shock	
		attr_reader	:type	
		def	initialize(type)	#	...	
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
Example #2
class	Shock	
		attr_reader	:type	
		def	initialize(type)	#	...	
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
Example #2
class	Shock	
		attr_reader	:type	
		def	initialize(type)	#	...	
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
Example #2
class	Shock	
		attr_reader	:type	
		def	initialize(type)	#	...	
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
Example #2
class	Shock	
		attr_reader	:type	
		def	initialize(type)	#	...	
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Omega?
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
3.
4.
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. cost calculation
3.
4.
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
Omega
Mess?
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
Omega
Mess?
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
Meta
Knowledge
@sandimetz Jul 2017
@sandimetz Jul 2017
Meta Knowledge
@sandimetz Jul 2017
Meta Knowledge
Knowledge
about
Knowledge
@sandimetz Jul 2017
@sandimetz Jul 2017
Meta Knowledge
@sandimetz Jul 2017
Meta Knowledge
The Domain
of Design
@sandimetz Jul 2017
@sandimetz Jul 2017
Interlude
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge Plot
2
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
2
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations (move)
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations (move)
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
3
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations (move)
3. four shock types (move)
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations (move)
3. four shock types (move)
4. which type gets what calculation
@sandimetz Jul 2017
Knowledge Plot
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge Plot
4
Stable Unstable
Within My Purpose
Outside of My Purpose
Expose Hide
Minimize Move
@sandimetz Jul 2017
Knowledge
Shock knows
1. cost method
2. four shock cost calculations (move)
3. four shock types (move)
4. which type gets what calculation (min)
@sandimetz Jul 2017
Preference
@sandimetz Jul 2017
Preference
Send a message
@sandimetz Jul 2017
Preference
Send a message
rather than
implement behavior
@sandimetz Jul 2017
Move it
@sandimetz Jul 2017
Move it
Find the message
@sandimetz Jul 2017
Move it
Find the message
(Create the object)
@sandimetz Jul 2017
Move it
Find the message
(Create the object)
Send the message
@sandimetz Jul 2017
@sandimetz Jul 2017
Example #3
Composition
@sandimetz Jul 2017
#3 Composition
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
#3 Composition
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
#3 Composition
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
#3 Composition
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
What’s the message?
@sandimetz Jul 2017
#3 Composition
		def	cost	
				case	type	
				when	:front	
						someObligingObj.compute	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
@sandimetz Jul 2017
#3 Composition
		def	cost	
				case	type	
				when	:front	
						someObligingObj.compute	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
???
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
Hide the
Mess
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
Send the
Message
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
@sandimetz Jul 2017
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly	different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
#3 Composition
Hide all
of the
Messes
@sandimetz Jul 2017
#3 Composition
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end	
class	RearShockCost	
		def	compute	
				#	slightly	changed	mess	
		end	
end	
#	etc
@sandimetz Jul 2017
#3 Composition
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end	
class	RearShockCost	
		def	compute	
				#	slightly	changed	mess	
		end	
end	
#	etc
@sandimetz Jul 2017
#3 Composition
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end	
class	RearShockCost	
		def	compute	
				#	slightly	changed	mess	
		end	
end	
#	etc
@sandimetz Jul 2017
#3 Composition
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end
@sandimetz Jul 2017
#3 Composition
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
Send
the
Message
@sandimetz Jul 2017
#3 Composition
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end
@sandimetz Jul 2017
#3 Composition
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
Really?
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four shock cost calculations
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four ShockCostxx classes
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four ShockCostxx classes
3. four shock types
4. which type gets what calculation
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four ShockCostxx classes
3. four shock types
4. which type gets what class
@sandimetz Jul 2017
Good News
Calculations are isolated
@sandimetz Jul 2017
Bad News
Still have dependencies
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
#3 Composition
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
#3 Composition
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
when	:front	
#3 Composition
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
when	:foo	
		FooShockCost.new.compute
#3 Composition
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
when	:foo	
		FooShockCost.new.compute
#3 Composition
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
when	:foo	
		FooShockCost.new.compute
#3 Composition
Conventionoverconfiguration
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
when	:foo	
		FooShockCost.new.compute
class_name	=	type.to_s.capitalize	+	"ShockCost"	
#3 Composition
Conventionoverconfiguration
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
class_name	=	type.to_s.capitalize	+	"ShockCost"	
eval(class_name).new.compute
#3 Composition
Conventionoverconfiguration
when	:foo	
		FooShockCost.new.compute
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
class_name	=	type.to_s.capitalize	+	"ShockCost"	
eval(class_name).new.compute	
Object.const_get(class_name).new.compute
#3 Composition
Conventionoverconfiguration
when	:foo	
		FooShockCost.new.compute
@sandimetz Jul 2017
class	Shock	
		def	cost(type)	
				case	type	
				when	:front	
						FrontShockCost.new.compute	
				when	:rear	
						RearShockCost.new.compute	
				when	:lefty	
						LeftyShockCost.new.compute	
				else	
						ShockCost.new.compute	
				end	
		end	
		#	...	
end	
class_name	=	type.to_s.capitalize	+	"ShockCost"	
eval(class_name).new.compute	
Object.const_get(class_name).new.compute	
class_name.constantize.new.compute	
#3 Composition
Conventionoverconfiguration
when	:foo	
		FooShockCost.new.compute
@sandimetz Jul 2017
Example #3
class	Shock	
		def	cost(type)	
	 		class_name	=	(type.to_s.capitalize	+	"ShockCost")	
	 		Object.const_get(class_name).new.compute	
		end	
end
@sandimetz Jul 2017
Example #3
class	Shock	
		def	cost(type)	
	 		class_name	=	(type.to_s.capitalize	+	"ShockCost")	
	 		Object.const_get(class_name).new.compute	
		end	
end
@sandimetz Jul 2017
Example #3
class	Shock	
		def	cost(type)	
	 		class_name	=	(type.to_s.capitalize	+	"ShockCost")	
	 		Object.const_get(class_name).new.compute	
		end	
end	
Factory
@sandimetz Jul 2017
We
<3
Factories
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four ShockCostxx classes
3. four shock types
4. which type gets what class
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four ShockCostxx classes
3. four shock types
4. which type gets what class
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four ShockCostxx classes
3. four shock types
4. which type gets what class
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. four ShockCostxx classes
3. four shock types
4. which type gets what class
@sandimetz Jul 2017
Meta Knowledge
Shock knows
1. cost method
2. the convention
Before
@sandimetz Jul 2017
#3 Composition
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly		
						#		different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
Before
@sandimetz Jul 2017
#3 Composition
		def	cost	
				case	type	
				when	:front	
						#	the	original	mess	
				when	:rear	
						#	a	slightly		
						#		different	mess	
				when	:lefty	
						#	another	variant	
				else	
						#	and	so	on.	
				end	
		end
Many changes
affect this code
After
@sandimetz Jul 2017
Example #3
class	Shock	
		def	cost(type)	
	 		class_name	=	(type.to_s.capitalize	+	"ShockCost")	
	 		Object.const_get(class_name).new.compute	
		end	
end
After
@sandimetz Jul 2017
Example #3
class	Shock	
		def	cost(type)	
	 		class_name	=	(type.to_s.capitalize	+	"ShockCost")	
	 		Object.const_get(class_name).new.compute	
		end	
end
After
@sandimetz Jul 2017
Example #3
class	Shock	
		def	cost(type)	
	 		class_name	=	(type.to_s.capitalize	+	"ShockCost")	
	 		Object.const_get(class_name).new.compute	
		end	
		def	coster(type)	
				Object.const_get(type.to_s.capitalize	+	“ShockCost").new	
		end	
end
After
@sandimetz Jul 2017
Example #3
class	Shock	
		def	cost(type)	
				coster(type).compute	
		end	
		def	coster(type)	
				Object.const_get(type.to_s.capitalize	+	“ShockCost").new	
		end	
end
After
@sandimetz Jul 2017
Example #3
class	Shock	
		def	cost(type)	
				coster(type).compute	
		end	
		def	coster(type)	
				Object.const_get(type.to_s.capitalize	+	“ShockCost").new	
		end	
end
Few changes
affect this code
After
@sandimetz Jul 2017
Example #3
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
class	Shock	
		def	cost(type)	
				coster(type).compute	
		end	
		def	coster(type)	
				Object.const_get(type.to_s.capitalize	+	“ShockCost").new	
		end	
end
Few changes
affect this code
After
@sandimetz Jul 2017
Example #3
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
class	Shock	
		def	cost(type)	
				coster(type).compute	
		end	
		def	coster(type)	
				Object.const_get(type.to_s.capitalize	+	“ShockCost").new	
		end	
end
class	RearShockCost	
		def	compute	
				#	slightly	changed	mess	
		end	
end
Few changes
affect this code
After
@sandimetz Jul 2017
Example #3
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
class	Shock	
		def	cost(type)	
				coster(type).compute	
		end	
		def	coster(type)	
				Object.const_get(type.to_s.capitalize	+	“ShockCost").new	
		end	
end
class	RearShockCost	
		def	compute	
				#	slightly	changed	mess	
		end	
end
Etc...
Few changes
affect this code
After
@sandimetz Jul 2017
Example #3
class	FrontShockCost	
		def	compute	
				#	the	original	mess	
		end	
end
class	Shock	
		def	cost(type)	
				coster(type).compute	
		end	
		def	coster(type)	
				Object.const_get(type.to_s.capitalize	+	“ShockCost").new	
		end	
end
class	RearShockCost	
		def	compute	
				#	slightly	changed	mess	
		end	
end
Etc...
Few changes
affect this code
Need a new one?
Follow the
convention!
@sandimetz Jul 2017
Composition
@sandimetz Jul 2017
Shock
?
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
Shock
@sandimetz Jul 2017
The Role
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Reprise
Find the message
(Create the object)
Send the message
@sandimetz Jul 2017
Omega Mess
@sandimetz Jul 2017
Omega Mess
Hide It
@sandimetz Jul 2017
Meta Knowledge
@sandimetz Jul 2017
Meta Knowledge
Organize It
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Depend on Stability
@sandimetz Jul 2017
Depend on Stability
Find the Message
@sandimetz Jul 2017
Isolate Uncertainty
@sandimetz Jul 2017
Isolate Uncertainty
Hide the Mess
@sandimetz Jul 2017
We stand
on the shoulders
of giants
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
@sandimetz Jul 2017
Thanks
Sandi Metz
@sandimetz Jul 2017
http://www.flickr.com/photos/slumadridcampus/5736110401/
http://www.flickr.com/photos/jennifermarquez/4441957235/
http://www.flickr.com/photos/58789412@N00/4106497024/
http://www.flickr.com/photos/27927484@N00/264072199/
http://www.flickr.com/photos/alexindigo/2572565946/in/photostream/
http://www.flickr.com/photos/moje_moje/4500967490/
http://www.flickr.com/photos/dr_nixon/4366089630/
http://www.flickr.com/photos/question_everything/4778500858/
http://www.flickr.com/photos/thegforcers/6202236364/in/photostream/
http://www.flickr.com/photos/jeffhester/2785524078/
http://www.flickr.com/photos/thegforcers/6040964794/in/photostream/
http://www.flickr.com/photos/magnus_akselvoll/4741056713/
http://www.flickr.com/photos/chiotsrun/6553699405/
http://www.flickr.com/photos/45682148@N05/7943889710/
http://www.flickr.com/photos/piper/393928412/
http://www.flickr.com/photos/thegforcers/6202237588/in/photostream/
http://www.flickr.com/photos/juju2nantes/5895167252/
Credits
@sandimetz Jul 2017
http://www.flickr.com/photos/harlequeen/3323992902/
http://www.flickr.com/photos/thegforcers/6114852991/in/photostream/
http://www.flickr.com/photos/qatarperegrine/5040119481/
http://www.flickr.com/photos/reneeanddolan/6152499201/
http://www.flickr.com/photos/tchelseat/7628965564/
http://www.flickr.com/photos/clappstar/1064543301/
http://www.flickr.com/photos/nycarthur/2482218423/
http://www.flickr.com/photos/oliverlaumann/5525877007/
http://www.websequencediagrams.com/
Credits
@sandimetz
http://poodr.com
Jul 2017
@sandimetz
http://99bottlesbook.com
Jul 2017
@sandimetz
Sandi Metz
@sandimetz
http://sandimetz.com
Jul 2017

More Related Content

Recently uploaded

Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...OnePlan Solutions
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldRoberto Pérez Alcolea
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...OnePlan Solutions
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxRTS corp
 
Understanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM ArchitectureUnderstanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM Architecturerahul_net
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identityteam-WIBU
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
SoftTeco - Software Development Company Profile
SoftTeco - Software Development Company ProfileSoftTeco - Software Development Company Profile
SoftTeco - Software Development Company Profileakrivarotava
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogueitservices996
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Developmentvyaparkranti
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingShane Coughlan
 
Patterns for automating API delivery. API conference
Patterns for automating API delivery. API conferencePatterns for automating API delivery. API conference
Patterns for automating API delivery. API conferencessuser9e7c64
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slidesvaideheekore1
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 

Recently uploaded (20)

Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
 
Understanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM ArchitectureUnderstanding Flamingo - DeepMind's VLM Architecture
Understanding Flamingo - DeepMind's VLM Architecture
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identity
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
SoftTeco - Software Development Company Profile
SoftTeco - Software Development Company ProfileSoftTeco - Software Development Company Profile
SoftTeco - Software Development Company Profile
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogue
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Development
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
 
Patterns for automating API delivery. API conference
Patterns for automating API delivery. API conferencePatterns for automating API delivery. API conference
Patterns for automating API delivery. API conference
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slides
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 

Featured

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at WorkGetSmarter
 

Featured (20)

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 

hafentalks #7 - Sandi Metz: Go Ahead, Make a Mess