SlideShare a Scribd company logo
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
The
technical Debt
Trap
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Doc Norton, CEO
doc@wearecto2.com
@DocOnDev
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
what is technical debt?
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
– Ward Cunningham
OOPSLA ‘92
Shipping first time code is like
going into debt.
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Shipping first time code is like
going into debt. A little debt
speeds development so long as
it is paid back promptly with a
rewrite.
– Ward Cunningham
OOPSLA ‘92
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Shipping first time code is like
going into debt. A little debt
speeds development so long as
it is paid back promptly with a
rewrite.
The danger occurs when the
debt is not repaid. Every minute
spent on not-quite-right code
counts as interest on that debt.
– Ward Cunningham
OOPSLA ‘92
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
The danger occurs
when the debt is not
repaid. Every minute
spent on not-quite-
right code counts as
interest on that debt.
– Ward Cunningham
OOPSLA ‘92
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
The danger occurs
when the debt is not
repaid. Every minute
spent on not-quite-
right code counts as
interest on that debt.
– Ward Cunningham
OOPSLA ‘92
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Technical debt is
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Technical debt is
good
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Technical debt is good
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Technical debt is
good
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Technical debt is
a strategic decision
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Technical debt is
a strategic decision
• Allow for Rapid Delivery
• To Elicit Quick Feedback
• And Correct Design
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt is
an indication of learning
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt is
an indication of learning
• Now know what you need
• Implementation doesn’t match
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt is a metaphor
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
metaphors rock
we reason by analogy
Building on a
weak foundation
Puts pressure on our design
Can’t keep running at this pace
It’s raining men
(hallelujah)
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
metaphorphosis
when metaphors go wrong
Credit CardSHORT-TERM
Long-Term
Return on
Investment
OPERATIONALHOME LOAN
Loan Shark
PRAGMATIC
LEVERAGE
Intentional AUTO LOAN
FRAUDULENT
VOLUNTARY
PYRAMID SCHEME
Prudent
Student Loan
HIGH INTEREST
INADVERTENT
RECKLESS DEBT IN
THE THIRD
QUADRANT
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
metaphorphosis
when metaphors go wrong
“quick and dirty”
- Martin Fowler
“sloppy”
- David Laribee
“just hack it in”
- Steve McConnell
“CUT A LOT OF CORNERS”
- James Shore
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt quadrant
Reckless
Inadvertent
Prudent
Deliberate
“We don’t have time
for design”
“We must ship now and
deal with
consequences”
“Now we know how we
should have done it”
“What’s Layering?”
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
– Ward Cunningham
Youtube ‘09
[Many] have explained
the debt metaphor and
confused it with the
idea that you could
write code poorly with
the intention of doing a
good job later.
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
– Ward Cunningham
Youtube ‘09
confused the
debt metaphor
with the idea that
you could write
code poorly
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
– Ward Cunningham
Youtube ‘09
The ability to pay back
debt [...] depends upon
you writing code that is
clean enough to be
able to refactor as you
come to understand
your problem.
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
– Ward Cunningham
Youtube ‘09
The ability to pay back
debt [...] depends upon
you writing code that is
clean enough to be
able to refactor as you
come to understand
your problem.
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
– Ward Cunningham
twitter ‘09
Dirty code is to
technical debt as the
pawn broker is to
financial debt.
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
– Ward Cunningham
twitter ‘09
Dirty code is to
technical debt as the
pawn broker is to
financial debt.
Don’t think you are
ever going to get your
code back.
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt?
Ask yourself…
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt?
Ask yourself…
• Is the code clean?
• Is the code tested?
• Is there a learning objective or event?
• Is there a plan for payback?
• Is the business truly informed?
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt?
If you say no to even one…
• Is the code clean?
• Is the code tested?
• Is there a learning objective or event?
• Is there a plan for payback?
• Is the business truly informed?
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt?
If you say no to even one…
• Is the code clean?
• Is the code tested?
• Is there a learning objective or event?
• Is there a plan for payback?
• Is the business truly informed?
... then you don’t have Technical Debt
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
mess (noun)
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
mess (noun)
• Disorderly accumulation, heap, or jumble
• A state of embarrassing confusion
• An unpleasant or difficult situation
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
cruft (noun)
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
cruft (noun)
• An unpleasant substance
• The result of shoddy construction
• Redundant, old or improperly written code
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
But, It’s Just
semantics
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
It’s not Just
semantics
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
It’s not Just
semantics
Technical Debt is Good
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
It’s not Just
semantics
Technical Debt is GoodQuick and Dirty is Technical Debt
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
It’s not Just
semantics
Quick and Dirty is Good
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
It’s not Just
semantics
Quick and Dirty is Good
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt quadrant
Reckless
Inadvertent
Prudent
Deliberate
“We don’t have time
for design”
“We must ship now and
deal with
consequences”
“Now we know how we
should have done it”
“What’s Layering?”
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt quadrant
Reckless
Inadvertent
Prudent
Deliberate
“We don’t have time
for design”
“Let’s deploy and
gather more
information”
“Now we know how we
should have done it”
“What’s Layering?”
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt in other fields
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt in other fields
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Technical Debt in other fields
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Technical Debt in other fields
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt in other fields
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
RECKLESS AND DELIBERATE
technical debt in other fields
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
RECKLESS AND DELIBERATE
RECKLESS AND DELIBERATE
technical debt in other fields
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
RECKLESS AND DELIBERATE
RECKLESS AND DELIBERATE
RECKLESS AND INADVERTENT
technical debt in other fields
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt quadrant
Reckless
Inadvertent
Prudent
Deliberate
“We don’t have time
for design”
“Let’s deploy and
gather more
information”
“Now we know how we
should have done it”
“What’s Layering?”
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt quadrant
Reckless
Inadvertent
Prudent
Deliberate
“We don’t have time
for design”
“Let’s deploy and
gather more
information”
“Now we know how we
should have done it”
“What’s Layering?”
IRRESPONSIBLE
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt quadrant
Reckless
Inadvertent
Prudent
Deliberate
“We don’t have time
for design”
“Let’s deploy and
gather more
information”
“Now we know how we
should have done it”
“What’s Layering?”
IRRESPONSIBLE
INCOMPETENT
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
technical debt quadrant
Reckless
Inadvertent
Prudent
Deliberate
“We don’t have time
for design”
“Let’s deploy and
gather more
information”
“Now we know how we
should have done it”
“What’s Layering?”
IRRESPONSIBLE
INCOMPETENT
TECHNICAL
DEBT
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
cruft or debt?
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
DataSet aDs, qDs;
aDs = _dbConnector.UpdateAgentList();
qDs = _dbConnector.GetQueueList();
foreach (DataTable aTable in aDs.Tables) {
foreach (DataRow aRow in aTable.Rows) {
foreach (DataColumn aColumn in aTable.Columns) {
DataSet asDs = _dbConnector.GetAgentSkills(aRow[aColumn].ToString());//AgentId
foreach (DataTable asTable in asDs.Tables) {
foreach (DataRow asRow in asTable.Rows) {
foreach (DataColumn asColumn in asTable.Columns) {
foreach (DataTable qTable in qDs.Tables) {
foreach (DataRow qRow in qTable.Rows) {
foreach (DataColumn qColumn in qTable.Columns) {
DataSet sqDs = _dbConnector.GetSkillsForQueue(qRow[qColumn].ToString());
foreach (DataTable sqTable in sqDs.Tables) {
foreach (DataRow sqRow in sqTable.Rows) {
foreach (DataColumn sqColumn in sqTable.Columns) {
foreach (string skill in sqRow[sqColumn].ToString().Split(paramDelimStr)) {
if (skill == asRow[asColumn].ToString()) {
try {
_dbConnector.SetAgentQueueSkill(aRow[aColumn].ToString(),
qRow[qColumn].ToString(),
skill);
}
catch { continue; }
}
}
}
}
}
}
}
}
}
}
}
}
}
}
cruft or debt?
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
DataSet aDs, qDs;
aDs = _dbConnector.UpdateAgentList();
qDs = _dbConnector.GetQueueList();
foreach (DataTable aTable in aDs.Tables) {
foreach (DataRow aRow in aTable.Rows) {
foreach (DataColumn aColumn in aTable.Columns) {
DataSet asDs = _dbConnector.GetAgentSkills(aRow[aColumn].ToString());//AgentId
foreach (DataTable asTable in asDs.Tables) {
foreach (DataRow asRow in asTable.Rows) {
foreach (DataColumn asColumn in asTable.Columns) {
foreach (DataTable qTable in qDs.Tables) {
foreach (DataRow qRow in qTable.Rows) {
foreach (DataColumn qColumn in qTable.Columns) {
DataSet sqDs = _dbConnector.GetSkillsForQueue(qRow[qColumn].ToString());
foreach (DataTable sqTable in sqDs.Tables) {
foreach (DataRow sqRow in sqTable.Rows) {
foreach (DataColumn sqColumn in sqTable.Columns) {
foreach (string skill in sqRow[sqColumn].ToString().Split(paramDelimStr)) {
if (skill == asRow[asColumn].ToString()) {
try {
_dbConnector.SetAgentQueueSkill(aRow[aColumn].ToString(),
qRow[qColumn].ToString(),
skill);
}
catch { continue; }
}
}
}
}
}
}
}
}
}
}
}
}
}
}
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
DataSet aDs, qDs;
aDs = _dbConnector.UpdateAgentList();
qDs = _dbConnector.GetQueueList();
foreach (DataTable aTable in aDs.Tables) {
foreach (DataRow aRow in aTable.Rows) {
foreach (DataColumn aColumn in aTable.Columns) {
DataSet asDs = _dbConnector.GetAgentSkills(aRow[aColumn].ToString());//AgentId
foreach (DataTable asTable in asDs.Tables) {
foreach (DataRow asRow in asTable.Rows) {
foreach (DataColumn asColumn in asTable.Columns) {
foreach (DataTable qTable in qDs.Tables) {
foreach (DataRow qRow in qTable.Rows) {
foreach (DataColumn qColumn in qTable.Columns) {
DataSet sqDs = _dbConnector.GetSkillsForQueue(qRow[qColumn].ToString());
foreach (DataTable sqTable in sqDs.Tables) {
foreach (DataRow sqRow in sqTable.Rows) {
foreach (DataColumn sqColumn in sqTable.Columns) {
foreach (string skill in sqRow[sqColumn].ToString().Split(paramDelimStr)) {
if (skill == asRow[asColumn].ToString()) {
try {
_dbConnector.SetAgentQueueSkill(aRow[aColumn].ToString(),
qRow[qColumn].ToString(),
skill);
}
catch { continue; }
}
} } } } } } } } } } } } }
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
DataSet aDs, qDs, asDs, sqDs;
aDs = _dbConnector.UpdateAgentList();
qDs = _dbConnector.GetQueueList();
foreach (DataRow aRow in aDS.Tables[0].Rows) {
String agentID = aRow[“AgentId”].ToString();
asDs = _dbConnector.GetAgentSkills(agentID);
foreach (DataRow asRow in asDs.Tables[0].Rows) {
String agentSkill = asRow[“Skill”].ToString();
foreach (DataRow qRow in qDs.Tables[0].Rows) {
queueName = qRow[“QueueName”].ToString();
sqDs = _dbConnector.GetSkillsForQueue(queueName);
foreach (DataRow sqRow in sqDs.Tables[0].Rows) {
foreach (string skill in sqRow[“Skills”].ToString().Split(paramDelimStr)) {
if (skill == agentSkill) {
try { _dbConnector.SetAgentQueueSkill(agentID, queueName, skill); }
catch { continue; }
} } } } } }
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
AgentList agents = new AgentList(_dbConnector.UpdateAgentList());
QueueList queues = new QueueList(_dbConnector.GetQueueList());
foreach (Agent agent in agents) {
foreach (Skill agentSkill in agent.skills) {
foreach (Queue queue in queues) {
foreach (Skill queueSkill in queue.skills.Where(x => x == agentSkill)) {
try {_dbConnector.SetAgentQueueSkill(agent.agentID, queue.name, agentSkill); }
catch { continue; }
}
}
}
}
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
if ((customer.state == “AL” && customer.type ==
CustomerType.GENERAL_AGENT && customer.revenue > 100000)
|| (customer.type == CustomerType.RETRO_AGENT &&
(customer.state == “WI” || customer.state == “IL”))
|| (customer.type == CustomerType.FED_MANAGEMENT &&
customer.revenue > 150000)) { ... }
cruft or debt?
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
// If customer is Federally Regulated
if ((customer.state == “AL” && customer.type ==
CustomerType.GENERAL_AGENT && customer.revenue > 100000)
|| (customer.type == CustomerType.RETRO_AGENT &&
(customer.state == “WI” || customer.state == “IL”))
|| (customer.type == CustomerType.FED_MANAGEMENT &&
customer.revenue > 150000)) { ... }
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
if (customer.isFederallyRegulated()) { ... }
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
double getSpeed() {
switch (_type) {
case EUROPEAN:
return getBaseSpeed();
case AFRICAN:
return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts;
case NORWEGIAN_BLUE:
return (_isNailed) ? 0 : getBaseSpeed(_voltage);
}
throw new RuntimeException ("Should be unreachable");
}
http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html
cruft or debt?
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
class Swallow ...
double getSpeed() { return getBaseSpeed(); }
end class
class EuropeanSwallow ...
end class
class AfricanSwallow ...
double getSpeed() { return super.getSpeed - coconutLoad(); }
double coconutLoad() { return getLoadFactor() * _numberOfCoconuts; }
end class
class NorwegianSwallow ...
double getSpeed() { return (_isNailed) ? 0 : getBaseSpeed(_voltage); }
end class
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
cruft is a bad decision
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
cruft is a bad decision
• You are a professional developer
• You’re going to create unintentional cruft
• You have to clean up the existing cruft
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
The Trap
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
The Trap
• Precedent for speed over quality
• Expectation of increased velocity
• Cruft slows you down
• Must write more cruft to keep up
• Ask permission to do your job correctly
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
failing strategies
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
failing strategies
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
winning strategy
Clean Constantly
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
winning strategy
Clean Constantly
• Never make an intentional mess
• Monitor your “Technical Debt”
• Follow the Boy Scout Rule
• Remember quality is your responsibility
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
winning strategy
Clean Constantly
• Never make an intentional mess
• Monitor your “Technical Debt”
• Follow the Boy Scout Rule
• Remember quality is your responsibility
• NEVER ask permission to do your job correctly
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Monitor your cruft
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Monitor your cruft
• Code Coverage
• Code Complexity
• Coupling
• Maintainability
• Monitor Trends, Not Points
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
review
Technical Debt
Cruft
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
review
Technical Debt
• A strategic design decision
• Requires business to be informed
• Includes a pay-back plan
Cruft
• Happens
• Needs to be monitored and cleaned
• Is NOT Technical Debt
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
review
Technical Debt
• A strategic design decision
• Requires business to be informed
• Includes a pay-back plan
Cruft
• Happens
• Needs to be monitored and cleaned
• Is NOT Technical Debt
NEVER
ask
perm
issio
n
to
do
yo
ur
jo
b
co
rrectly
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
comments
or
questions?
Doc Norton, CEO
doc@wearecto2.com
@DocOnDev
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
Thank You!
Doc Norton, CEO
doc@wearecto2.com
@DocOnDev
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
The
technical Debt
Trap
#DevBootcamp / #TechnicalDebtTrap / @DocOnDev
• OOPSLA 92 Paper - http://dl.acm.org/citation.cfm?
id=157715, http://c2.com/doc/oopsla92.html
• Ward Cunningham Technical Debt Video - http://
www.youtube.com/watch?
v=pqeJFYwnkjE&feature=player_embedded
• Ward Cunningham Twitter - http://twitter.com/
WardCunningham/status/3742903303
• Technical Debt Quadrant - http://martinfowler.com/
bliki/TechnicalDebtQuadrant.html
• James Shore - http://jamesshore.com/Blog/
CardMeeting/Voluntary-Technical-Debt.html
• Martin Fowler - http://www.martinfowler.com/bliki/
TechnicalDebt.html
• David Larabee - http://msdn.microsoft.com/en-us/
magazine/ee819135.aspx
• Steve McConnell - http://blogs.construx.com/blogs/
stevemcc/archive/2007/11/01/technical-debt-2.aspx
• Jon Stewart - http://big.assets.huffingtonpost.com/
JonConfused.gif
• Cruft Example 1 - http://thedailywtf.com/Series/
2010/3/CodeSOD.aspx
• Debt Threshold - http://blog.castsoftware.com/wp-
content/uploads/2011/04/Technical-Debt-Software-
Quality1.jpg
• Hardening Sprints - http://blog.castsoftware.com/wp-
content/uploads/2011/04/Technical-Debt-Software-
Quality1.jpg

More Related Content

What's hot

Facebook Messages & HBase
Facebook Messages & HBaseFacebook Messages & HBase
Facebook Messages & HBase
强 王
 
Demystifying flink memory allocation and tuning - Roshan Naik, Uber
Demystifying flink memory allocation and tuning - Roshan Naik, UberDemystifying flink memory allocation and tuning - Roshan Naik, Uber
Demystifying flink memory allocation and tuning - Roshan Naik, Uber
Flink Forward
 
Scylla Summit 2022: IO Scheduling & NVMe Disk Modelling
 Scylla Summit 2022: IO Scheduling & NVMe Disk Modelling Scylla Summit 2022: IO Scheduling & NVMe Disk Modelling
Scylla Summit 2022: IO Scheduling & NVMe Disk Modelling
ScyllaDB
 
Kafka on ZFS: Better Living Through Filesystems
Kafka on ZFS: Better Living Through Filesystems Kafka on ZFS: Better Living Through Filesystems
Kafka on ZFS: Better Living Through Filesystems
confluent
 
The Dark Side Of Go -- Go runtime related problems in TiDB in production
The Dark Side Of Go -- Go runtime related problems in TiDB  in productionThe Dark Side Of Go -- Go runtime related problems in TiDB  in production
The Dark Side Of Go -- Go runtime related problems in TiDB in production
PingCAP
 
Pinot: Near Realtime Analytics @ Uber
Pinot: Near Realtime Analytics @ UberPinot: Near Realtime Analytics @ Uber
Pinot: Near Realtime Analytics @ Uber
Xiang Fu
 
Streaming 101 Revisited: A Fresh Hot Take With Tyler Akidau and Dan Sotolongo...
Streaming 101 Revisited: A Fresh Hot Take With Tyler Akidau and Dan Sotolongo...Streaming 101 Revisited: A Fresh Hot Take With Tyler Akidau and Dan Sotolongo...
Streaming 101 Revisited: A Fresh Hot Take With Tyler Akidau and Dan Sotolongo...
HostedbyConfluent
 
Putting Kafka Into Overdrive
Putting Kafka Into OverdrivePutting Kafka Into Overdrive
Putting Kafka Into Overdrive
Todd Palino
 
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander ZaitsevClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
Altinity Ltd
 
Extending Flink SQL for stream processing use cases
Extending Flink SQL for stream processing use casesExtending Flink SQL for stream processing use cases
Extending Flink SQL for stream processing use cases
Flink Forward
 
ACID ORC, Iceberg, and Delta Lake—An Overview of Table Formats for Large Scal...
ACID ORC, Iceberg, and Delta Lake—An Overview of Table Formats for Large Scal...ACID ORC, Iceberg, and Delta Lake—An Overview of Table Formats for Large Scal...
ACID ORC, Iceberg, and Delta Lake—An Overview of Table Formats for Large Scal...
Databricks
 
From cache to in-memory data grid. Introduction to Hazelcast.
From cache to in-memory data grid. Introduction to Hazelcast.From cache to in-memory data grid. Introduction to Hazelcast.
From cache to in-memory data grid. Introduction to Hazelcast.
Taras Matyashovsky
 
Building robust CDC pipeline with Apache Hudi and Debezium
Building robust CDC pipeline with Apache Hudi and DebeziumBuilding robust CDC pipeline with Apache Hudi and Debezium
Building robust CDC pipeline with Apache Hudi and Debezium
Tathastu.ai
 
RocksDB Performance and Reliability Practices
RocksDB Performance and Reliability PracticesRocksDB Performance and Reliability Practices
RocksDB Performance and Reliability Practices
Yoshinori Matsunobu
 
VictoriaLogs: Open Source Log Management System - Preview
VictoriaLogs: Open Source Log Management System - PreviewVictoriaLogs: Open Source Log Management System - Preview
VictoriaLogs: Open Source Log Management System - Preview
VictoriaMetrics
 
Survey of High Performance NoSQL Systems
Survey of High Performance NoSQL SystemsSurvey of High Performance NoSQL Systems
Survey of High Performance NoSQL Systems
ScyllaDB
 
Using LLVM to accelerate processing of data in Apache Arrow
Using LLVM to accelerate processing of data in Apache ArrowUsing LLVM to accelerate processing of data in Apache Arrow
Using LLVM to accelerate processing of data in Apache Arrow
DataWorks Summit
 
Cosco: An Efficient Facebook-Scale Shuffle Service
Cosco: An Efficient Facebook-Scale Shuffle ServiceCosco: An Efficient Facebook-Scale Shuffle Service
Cosco: An Efficient Facebook-Scale Shuffle Service
Databricks
 
Accelerating Spark SQL Workloads to 50X Performance with Apache Arrow-Based F...
Accelerating Spark SQL Workloads to 50X Performance with Apache Arrow-Based F...Accelerating Spark SQL Workloads to 50X Performance with Apache Arrow-Based F...
Accelerating Spark SQL Workloads to 50X Performance with Apache Arrow-Based F...
Databricks
 
kafka
kafkakafka

What's hot (20)

Facebook Messages & HBase
Facebook Messages & HBaseFacebook Messages & HBase
Facebook Messages & HBase
 
Demystifying flink memory allocation and tuning - Roshan Naik, Uber
Demystifying flink memory allocation and tuning - Roshan Naik, UberDemystifying flink memory allocation and tuning - Roshan Naik, Uber
Demystifying flink memory allocation and tuning - Roshan Naik, Uber
 
Scylla Summit 2022: IO Scheduling & NVMe Disk Modelling
 Scylla Summit 2022: IO Scheduling & NVMe Disk Modelling Scylla Summit 2022: IO Scheduling & NVMe Disk Modelling
Scylla Summit 2022: IO Scheduling & NVMe Disk Modelling
 
Kafka on ZFS: Better Living Through Filesystems
Kafka on ZFS: Better Living Through Filesystems Kafka on ZFS: Better Living Through Filesystems
Kafka on ZFS: Better Living Through Filesystems
 
The Dark Side Of Go -- Go runtime related problems in TiDB in production
The Dark Side Of Go -- Go runtime related problems in TiDB  in productionThe Dark Side Of Go -- Go runtime related problems in TiDB  in production
The Dark Side Of Go -- Go runtime related problems in TiDB in production
 
Pinot: Near Realtime Analytics @ Uber
Pinot: Near Realtime Analytics @ UberPinot: Near Realtime Analytics @ Uber
Pinot: Near Realtime Analytics @ Uber
 
Streaming 101 Revisited: A Fresh Hot Take With Tyler Akidau and Dan Sotolongo...
Streaming 101 Revisited: A Fresh Hot Take With Tyler Akidau and Dan Sotolongo...Streaming 101 Revisited: A Fresh Hot Take With Tyler Akidau and Dan Sotolongo...
Streaming 101 Revisited: A Fresh Hot Take With Tyler Akidau and Dan Sotolongo...
 
Putting Kafka Into Overdrive
Putting Kafka Into OverdrivePutting Kafka Into Overdrive
Putting Kafka Into Overdrive
 
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander ZaitsevClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
ClickHouse in Real Life. Case Studies and Best Practices, by Alexander Zaitsev
 
Extending Flink SQL for stream processing use cases
Extending Flink SQL for stream processing use casesExtending Flink SQL for stream processing use cases
Extending Flink SQL for stream processing use cases
 
ACID ORC, Iceberg, and Delta Lake—An Overview of Table Formats for Large Scal...
ACID ORC, Iceberg, and Delta Lake—An Overview of Table Formats for Large Scal...ACID ORC, Iceberg, and Delta Lake—An Overview of Table Formats for Large Scal...
ACID ORC, Iceberg, and Delta Lake—An Overview of Table Formats for Large Scal...
 
From cache to in-memory data grid. Introduction to Hazelcast.
From cache to in-memory data grid. Introduction to Hazelcast.From cache to in-memory data grid. Introduction to Hazelcast.
From cache to in-memory data grid. Introduction to Hazelcast.
 
Building robust CDC pipeline with Apache Hudi and Debezium
Building robust CDC pipeline with Apache Hudi and DebeziumBuilding robust CDC pipeline with Apache Hudi and Debezium
Building robust CDC pipeline with Apache Hudi and Debezium
 
RocksDB Performance and Reliability Practices
RocksDB Performance and Reliability PracticesRocksDB Performance and Reliability Practices
RocksDB Performance and Reliability Practices
 
VictoriaLogs: Open Source Log Management System - Preview
VictoriaLogs: Open Source Log Management System - PreviewVictoriaLogs: Open Source Log Management System - Preview
VictoriaLogs: Open Source Log Management System - Preview
 
Survey of High Performance NoSQL Systems
Survey of High Performance NoSQL SystemsSurvey of High Performance NoSQL Systems
Survey of High Performance NoSQL Systems
 
Using LLVM to accelerate processing of data in Apache Arrow
Using LLVM to accelerate processing of data in Apache ArrowUsing LLVM to accelerate processing of data in Apache Arrow
Using LLVM to accelerate processing of data in Apache Arrow
 
Cosco: An Efficient Facebook-Scale Shuffle Service
Cosco: An Efficient Facebook-Scale Shuffle ServiceCosco: An Efficient Facebook-Scale Shuffle Service
Cosco: An Efficient Facebook-Scale Shuffle Service
 
Accelerating Spark SQL Workloads to 50X Performance with Apache Arrow-Based F...
Accelerating Spark SQL Workloads to 50X Performance with Apache Arrow-Based F...Accelerating Spark SQL Workloads to 50X Performance with Apache Arrow-Based F...
Accelerating Spark SQL Workloads to 50X Performance with Apache Arrow-Based F...
 
kafka
kafkakafka
kafka
 

Viewers also liked

Selenium conference, 2016
Selenium conference, 2016Selenium conference, 2016
Selenium conference, 2016
Pooja Shah
 
Agile India 2017 Conference
Agile India 2017 ConferenceAgile India 2017 Conference
Agile India 2017 Conference
Naresh Jain
 
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Doc Norton
 
Diffy : Automatic Testing of Microservices @ Twitter
Diffy : Automatic Testing of Microservices @ TwitterDiffy : Automatic Testing of Microservices @ Twitter
Diffy : Automatic Testing of Microservices @ Twitter
Puneet Khanduri
 
A Practical Guide to Cynefin
A Practical Guide to CynefinA Practical Guide to Cynefin
A Practical Guide to Cynefin
Doc Norton
 
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps CultureAutonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Doc Norton
 
Continuous Delivery Sounds Great but it Won't Work Here
Continuous Delivery Sounds Great but it Won't Work HereContinuous Delivery Sounds Great but it Won't Work Here
Continuous Delivery Sounds Great but it Won't Work Here
Jez Humble
 
The Technical Debt Trap
The Technical Debt TrapThe Technical Debt Trap
The Technical Debt Trap
Doc Norton
 
What's Measured Improves: Metrics that matter
What's Measured Improves: Metrics that matterWhat's Measured Improves: Metrics that matter
What's Measured Improves: Metrics that matter
Raj Indugula
 
Building Blocks of a Knowledge Work Culture - NDC London 2016
Building Blocks of a Knowledge Work Culture - NDC London 2016Building Blocks of a Knowledge Work Culture - NDC London 2016
Building Blocks of a Knowledge Work Culture - NDC London 2016
Doc Norton
 
The Technical Debt Trap - NDC Oslo 2014
The Technical Debt Trap - NDC Oslo 2014The Technical Debt Trap - NDC Oslo 2014
The Technical Debt Trap - NDC Oslo 2014
Doc Norton
 
Java Puzzlers NG S02: Down the Rabbit Hole as presented at DevNexus 2017
Java Puzzlers NG S02: Down the Rabbit Hole as presented at DevNexus 2017Java Puzzlers NG S02: Down the Rabbit Hole as presented at DevNexus 2017
Java Puzzlers NG S02: Down the Rabbit Hole as presented at DevNexus 2017
Baruch Sadogursky
 
Experimentation Mindset
Experimentation MindsetExperimentation Mindset
Experimentation Mindset
Doc Norton
 
Experimentation mindset
Experimentation mindsetExperimentation mindset
Experimentation mindset
Doc Norton
 
Switching horses midstream - From Waterfall to Agile
Switching horses midstream - From Waterfall to AgileSwitching horses midstream - From Waterfall to Agile
Switching horses midstream - From Waterfall to Agile
Doc Norton
 
Codemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingCodemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision Making
Doc Norton
 
Building a private CI/CD pipeline with Java and Docker in the Cloud as presen...
Building a private CI/CD pipeline with Java and Docker in the Cloud as presen...Building a private CI/CD pipeline with Java and Docker in the Cloud as presen...
Building a private CI/CD pipeline with Java and Docker in the Cloud as presen...
Baruch Sadogursky
 
8 Things That Make Continuous Delivery Go Nuts
8 Things That Make Continuous Delivery Go Nuts8 Things That Make Continuous Delivery Go Nuts
8 Things That Make Continuous Delivery Go Nuts
Eduards Sizovs
 
Generics and Lambda survival guide - DevNexus 2017
Generics and Lambda survival guide - DevNexus 2017Generics and Lambda survival guide - DevNexus 2017
Generics and Lambda survival guide - DevNexus 2017
Henri Tremblay
 
Doc That Conference Keynote
Doc That Conference KeynoteDoc That Conference Keynote
Doc That Conference Keynote
Doc Norton
 

Viewers also liked (20)

Selenium conference, 2016
Selenium conference, 2016Selenium conference, 2016
Selenium conference, 2016
 
Agile India 2017 Conference
Agile India 2017 ConferenceAgile India 2017 Conference
Agile India 2017 Conference
 
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
 
Diffy : Automatic Testing of Microservices @ Twitter
Diffy : Automatic Testing of Microservices @ TwitterDiffy : Automatic Testing of Microservices @ Twitter
Diffy : Automatic Testing of Microservices @ Twitter
 
A Practical Guide to Cynefin
A Practical Guide to CynefinA Practical Guide to Cynefin
A Practical Guide to Cynefin
 
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps CultureAutonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
 
Continuous Delivery Sounds Great but it Won't Work Here
Continuous Delivery Sounds Great but it Won't Work HereContinuous Delivery Sounds Great but it Won't Work Here
Continuous Delivery Sounds Great but it Won't Work Here
 
The Technical Debt Trap
The Technical Debt TrapThe Technical Debt Trap
The Technical Debt Trap
 
What's Measured Improves: Metrics that matter
What's Measured Improves: Metrics that matterWhat's Measured Improves: Metrics that matter
What's Measured Improves: Metrics that matter
 
Building Blocks of a Knowledge Work Culture - NDC London 2016
Building Blocks of a Knowledge Work Culture - NDC London 2016Building Blocks of a Knowledge Work Culture - NDC London 2016
Building Blocks of a Knowledge Work Culture - NDC London 2016
 
The Technical Debt Trap - NDC Oslo 2014
The Technical Debt Trap - NDC Oslo 2014The Technical Debt Trap - NDC Oslo 2014
The Technical Debt Trap - NDC Oslo 2014
 
Java Puzzlers NG S02: Down the Rabbit Hole as presented at DevNexus 2017
Java Puzzlers NG S02: Down the Rabbit Hole as presented at DevNexus 2017Java Puzzlers NG S02: Down the Rabbit Hole as presented at DevNexus 2017
Java Puzzlers NG S02: Down the Rabbit Hole as presented at DevNexus 2017
 
Experimentation Mindset
Experimentation MindsetExperimentation Mindset
Experimentation Mindset
 
Experimentation mindset
Experimentation mindsetExperimentation mindset
Experimentation mindset
 
Switching horses midstream - From Waterfall to Agile
Switching horses midstream - From Waterfall to AgileSwitching horses midstream - From Waterfall to Agile
Switching horses midstream - From Waterfall to Agile
 
Codemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingCodemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision Making
 
Building a private CI/CD pipeline with Java and Docker in the Cloud as presen...
Building a private CI/CD pipeline with Java and Docker in the Cloud as presen...Building a private CI/CD pipeline with Java and Docker in the Cloud as presen...
Building a private CI/CD pipeline with Java and Docker in the Cloud as presen...
 
8 Things That Make Continuous Delivery Go Nuts
8 Things That Make Continuous Delivery Go Nuts8 Things That Make Continuous Delivery Go Nuts
8 Things That Make Continuous Delivery Go Nuts
 
Generics and Lambda survival guide - DevNexus 2017
Generics and Lambda survival guide - DevNexus 2017Generics and Lambda survival guide - DevNexus 2017
Generics and Lambda survival guide - DevNexus 2017
 
Doc That Conference Keynote
Doc That Conference KeynoteDoc That Conference Keynote
Doc That Conference Keynote
 

Similar to The Technical Debt Trap

Technical Debt - osbridge
Technical Debt - osbridgeTechnical Debt - osbridge
Technical Debt - osbridge
enaramore
 
Agile and Beyond :: The Technical Debt Trap
Agile and Beyond :: The Technical Debt TrapAgile and Beyond :: The Technical Debt Trap
Agile and Beyond :: The Technical Debt Trap
Doc Norton
 
Codemotion Milan 2018 - AI with a devops mindset: experimentation, sharing an...
Codemotion Milan 2018 - AI with a devops mindset: experimentation, sharing an...Codemotion Milan 2018 - AI with a devops mindset: experimentation, sharing an...
Codemotion Milan 2018 - AI with a devops mindset: experimentation, sharing an...
Thiago de Faria
 
Thiago de Faria - AI with a devops mindset - experimentation, sharing and eas...
Thiago de Faria - AI with a devops mindset - experimentation, sharing and eas...Thiago de Faria - AI with a devops mindset - experimentation, sharing and eas...
Thiago de Faria - AI with a devops mindset - experimentation, sharing and eas...
Codemotion
 
Delivering Technical Debt
Delivering Technical DebtDelivering Technical Debt
Delivering Technical Debt
brendonpage
 
From dev to ops and beyond - getting it done
From dev to ops and beyond - getting it doneFrom dev to ops and beyond - getting it done
From dev to ops and beyond - getting it done
Edorian
 
Higher Ed Web Conference - Web Project Management
Higher Ed Web Conference - Web Project ManagementHigher Ed Web Conference - Web Project Management
Higher Ed Web Conference - Web Project Management
Jesse Rodgers
 
The Technical Debt Trap - Michael "Doc" Norton
The Technical Debt Trap - Michael "Doc" NortonThe Technical Debt Trap - Michael "Doc" Norton
The Technical Debt Trap - Michael "Doc" Norton
LeanDog
 
Reasons to be cheerful - Fronteers 2010
Reasons to be cheerful - Fronteers 2010Reasons to be cheerful - Fronteers 2010
Reasons to be cheerful - Fronteers 2010
Christian Heilmann
 
Devopsdays State of the Union Amsterdam 2014
Devopsdays State of the Union Amsterdam 2014 Devopsdays State of the Union Amsterdam 2014
Devopsdays State of the Union Amsterdam 2014 John Willis
 
Mark Tortorici "The Technology Stack"
Mark Tortorici "The Technology Stack"Mark Tortorici "The Technology Stack"
Mark Tortorici "The Technology Stack"Talent42
 
DevDay 2013 - Building Startups and Minimum Viable Products
DevDay 2013 - Building Startups and Minimum Viable ProductsDevDay 2013 - Building Startups and Minimum Viable Products
DevDay 2013 - Building Startups and Minimum Viable Products
Ben Hall
 
Beyond Technical Debt: Unconventional techniques to uncover technical and soc...
Beyond Technical Debt: Unconventional techniques to uncover technical and soc...Beyond Technical Debt: Unconventional techniques to uncover technical and soc...
Beyond Technical Debt: Unconventional techniques to uncover technical and soc...
Juraj Martinka
 
OSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
OSDC 2019 | Feature Branching considered Evil by Thierry de PauwOSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
OSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
NETWAYS
 
git commit -m "carreira"
git commit -m "carreira"git commit -m "carreira"
git commit -m "carreira"
Lucas Andrey
 
To Make Your Chatbot Smart, You Need to Feed It Right: How to Write for Chatb...
To Make Your Chatbot Smart, You Need to Feed It Right: How to Write for Chatb...To Make Your Chatbot Smart, You Need to Feed It Right: How to Write for Chatb...
To Make Your Chatbot Smart, You Need to Feed It Right: How to Write for Chatb...
LavaConConference
 
DevOps culture
DevOps cultureDevOps culture
DevOps culture
PappKrisztin2
 
Architecture & Engineering : Doing the non-obvious!
Architecture & Engineering :  Doing the non-obvious!Architecture & Engineering :  Doing the non-obvious!
Architecture & Engineering : Doing the non-obvious!
Diego Pacheco
 
Achieving Technical Excellence in Your Software Teams - from Devternity
Achieving Technical Excellence in Your Software Teams - from Devternity Achieving Technical Excellence in Your Software Teams - from Devternity
Achieving Technical Excellence in Your Software Teams - from Devternity
Peter Gfader
 
Braintree SDK v.zero or "A payment gateway walks into a bar..." - Devfest Nan...
Braintree SDK v.zero or "A payment gateway walks into a bar..." - Devfest Nan...Braintree SDK v.zero or "A payment gateway walks into a bar..." - Devfest Nan...
Braintree SDK v.zero or "A payment gateway walks into a bar..." - Devfest Nan...
Alberto López Martín
 

Similar to The Technical Debt Trap (20)

Technical Debt - osbridge
Technical Debt - osbridgeTechnical Debt - osbridge
Technical Debt - osbridge
 
Agile and Beyond :: The Technical Debt Trap
Agile and Beyond :: The Technical Debt TrapAgile and Beyond :: The Technical Debt Trap
Agile and Beyond :: The Technical Debt Trap
 
Codemotion Milan 2018 - AI with a devops mindset: experimentation, sharing an...
Codemotion Milan 2018 - AI with a devops mindset: experimentation, sharing an...Codemotion Milan 2018 - AI with a devops mindset: experimentation, sharing an...
Codemotion Milan 2018 - AI with a devops mindset: experimentation, sharing an...
 
Thiago de Faria - AI with a devops mindset - experimentation, sharing and eas...
Thiago de Faria - AI with a devops mindset - experimentation, sharing and eas...Thiago de Faria - AI with a devops mindset - experimentation, sharing and eas...
Thiago de Faria - AI with a devops mindset - experimentation, sharing and eas...
 
Delivering Technical Debt
Delivering Technical DebtDelivering Technical Debt
Delivering Technical Debt
 
From dev to ops and beyond - getting it done
From dev to ops and beyond - getting it doneFrom dev to ops and beyond - getting it done
From dev to ops and beyond - getting it done
 
Higher Ed Web Conference - Web Project Management
Higher Ed Web Conference - Web Project ManagementHigher Ed Web Conference - Web Project Management
Higher Ed Web Conference - Web Project Management
 
The Technical Debt Trap - Michael "Doc" Norton
The Technical Debt Trap - Michael "Doc" NortonThe Technical Debt Trap - Michael "Doc" Norton
The Technical Debt Trap - Michael "Doc" Norton
 
Reasons to be cheerful - Fronteers 2010
Reasons to be cheerful - Fronteers 2010Reasons to be cheerful - Fronteers 2010
Reasons to be cheerful - Fronteers 2010
 
Devopsdays State of the Union Amsterdam 2014
Devopsdays State of the Union Amsterdam 2014 Devopsdays State of the Union Amsterdam 2014
Devopsdays State of the Union Amsterdam 2014
 
Mark Tortorici "The Technology Stack"
Mark Tortorici "The Technology Stack"Mark Tortorici "The Technology Stack"
Mark Tortorici "The Technology Stack"
 
DevDay 2013 - Building Startups and Minimum Viable Products
DevDay 2013 - Building Startups and Minimum Viable ProductsDevDay 2013 - Building Startups and Minimum Viable Products
DevDay 2013 - Building Startups and Minimum Viable Products
 
Beyond Technical Debt: Unconventional techniques to uncover technical and soc...
Beyond Technical Debt: Unconventional techniques to uncover technical and soc...Beyond Technical Debt: Unconventional techniques to uncover technical and soc...
Beyond Technical Debt: Unconventional techniques to uncover technical and soc...
 
OSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
OSDC 2019 | Feature Branching considered Evil by Thierry de PauwOSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
OSDC 2019 | Feature Branching considered Evil by Thierry de Pauw
 
git commit -m "carreira"
git commit -m "carreira"git commit -m "carreira"
git commit -m "carreira"
 
To Make Your Chatbot Smart, You Need to Feed It Right: How to Write for Chatb...
To Make Your Chatbot Smart, You Need to Feed It Right: How to Write for Chatb...To Make Your Chatbot Smart, You Need to Feed It Right: How to Write for Chatb...
To Make Your Chatbot Smart, You Need to Feed It Right: How to Write for Chatb...
 
DevOps culture
DevOps cultureDevOps culture
DevOps culture
 
Architecture & Engineering : Doing the non-obvious!
Architecture & Engineering :  Doing the non-obvious!Architecture & Engineering :  Doing the non-obvious!
Architecture & Engineering : Doing the non-obvious!
 
Achieving Technical Excellence in Your Software Teams - from Devternity
Achieving Technical Excellence in Your Software Teams - from Devternity Achieving Technical Excellence in Your Software Teams - from Devternity
Achieving Technical Excellence in Your Software Teams - from Devternity
 
Braintree SDK v.zero or "A payment gateway walks into a bar..." - Devfest Nan...
Braintree SDK v.zero or "A payment gateway walks into a bar..." - Devfest Nan...Braintree SDK v.zero or "A payment gateway walks into a bar..." - Devfest Nan...
Braintree SDK v.zero or "A payment gateway walks into a bar..." - Devfest Nan...
 

More from Doc Norton

Tuckman Was Wrong
Tuckman Was WrongTuckman Was Wrong
Tuckman Was Wrong
Doc Norton
 
Creative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsCreative Collaboration: Tools for Teams
Creative Collaboration: Tools for Teams
Doc Norton
 
Let's Start An Epidemic
Let's Start An EpidemicLet's Start An Epidemic
Let's Start An Epidemic
Doc Norton
 
Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014
Doc Norton
 
Creating a Global Engineering Culture - Agile india 2014
Creating a Global Engineering Culture - Agile india 2014Creating a Global Engineering Culture - Agile india 2014
Creating a Global Engineering Culture - Agile india 2014
Doc Norton
 
Agile Metrics: Velocity is NOT the Goal - Agile 2013 version
Agile Metrics: Velocity is NOT the Goal - Agile 2013 versionAgile Metrics: Velocity is NOT the Goal - Agile 2013 version
Agile Metrics: Velocity is NOT the Goal - Agile 2013 version
Doc Norton
 
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013Doc Norton
 
Velocity is not the goal code palo-usa
Velocity is not the goal   code palo-usaVelocity is not the goal   code palo-usa
Velocity is not the goal code palo-usa
Doc Norton
 
Teamwork Ain't Easy
Teamwork Ain't EasyTeamwork Ain't Easy
Teamwork Ain't Easy
Doc Norton
 
The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013
Doc Norton
 
Velocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQCVelocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQC
Doc Norton
 
Growing into Excellence - PNSQC
Growing into Excellence - PNSQCGrowing into Excellence - PNSQC
Growing into Excellence - PNSQC
Doc Norton
 
Velocity is not the Goal
Velocity is not the GoalVelocity is not the Goal
Velocity is not the Goal
Doc Norton
 
Do I have a role?
Do I have a role?Do I have a role?
Do I have a role?Doc Norton
 
Velocity is not the Goal
Velocity is not the GoalVelocity is not the Goal
Velocity is not the Goal
Doc Norton
 
CodeStock :: Introduction To MacRuby and HotCocoa
CodeStock :: Introduction To MacRuby and HotCocoaCodeStock :: Introduction To MacRuby and HotCocoa
CodeStock :: Introduction To MacRuby and HotCocoa
Doc Norton
 
Oredev :: The Technical Debt Trap
Oredev :: The Technical Debt TrapOredev :: The Technical Debt Trap
Oredev :: The Technical Debt Trap
Doc Norton
 
Oredev :: Take Control of Your Development Career
Oredev :: Take Control of Your Development CareerOredev :: Take Control of Your Development Career
Oredev :: Take Control of Your Development Career
Doc Norton
 
Introduction To Functional Programming with Scheme - LeanDog Edition
Introduction To Functional Programming with Scheme - LeanDog EditionIntroduction To Functional Programming with Scheme - LeanDog Edition
Introduction To Functional Programming with Scheme - LeanDog Edition
Doc Norton
 

More from Doc Norton (19)

Tuckman Was Wrong
Tuckman Was WrongTuckman Was Wrong
Tuckman Was Wrong
 
Creative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsCreative Collaboration: Tools for Teams
Creative Collaboration: Tools for Teams
 
Let's Start An Epidemic
Let's Start An EpidemicLet's Start An Epidemic
Let's Start An Epidemic
 
Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014
 
Creating a Global Engineering Culture - Agile india 2014
Creating a Global Engineering Culture - Agile india 2014Creating a Global Engineering Culture - Agile india 2014
Creating a Global Engineering Culture - Agile india 2014
 
Agile Metrics: Velocity is NOT the Goal - Agile 2013 version
Agile Metrics: Velocity is NOT the Goal - Agile 2013 versionAgile Metrics: Velocity is NOT the Goal - Agile 2013 version
Agile Metrics: Velocity is NOT the Goal - Agile 2013 version
 
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
 
Velocity is not the goal code palo-usa
Velocity is not the goal   code palo-usaVelocity is not the goal   code palo-usa
Velocity is not the goal code palo-usa
 
Teamwork Ain't Easy
Teamwork Ain't EasyTeamwork Ain't Easy
Teamwork Ain't Easy
 
The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013
 
Velocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQCVelocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQC
 
Growing into Excellence - PNSQC
Growing into Excellence - PNSQCGrowing into Excellence - PNSQC
Growing into Excellence - PNSQC
 
Velocity is not the Goal
Velocity is not the GoalVelocity is not the Goal
Velocity is not the Goal
 
Do I have a role?
Do I have a role?Do I have a role?
Do I have a role?
 
Velocity is not the Goal
Velocity is not the GoalVelocity is not the Goal
Velocity is not the Goal
 
CodeStock :: Introduction To MacRuby and HotCocoa
CodeStock :: Introduction To MacRuby and HotCocoaCodeStock :: Introduction To MacRuby and HotCocoa
CodeStock :: Introduction To MacRuby and HotCocoa
 
Oredev :: The Technical Debt Trap
Oredev :: The Technical Debt TrapOredev :: The Technical Debt Trap
Oredev :: The Technical Debt Trap
 
Oredev :: Take Control of Your Development Career
Oredev :: Take Control of Your Development CareerOredev :: Take Control of Your Development Career
Oredev :: Take Control of Your Development Career
 
Introduction To Functional Programming with Scheme - LeanDog Edition
Introduction To Functional Programming with Scheme - LeanDog EditionIntroduction To Functional Programming with Scheme - LeanDog Edition
Introduction To Functional Programming with Scheme - LeanDog Edition
 

Recently uploaded

Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
Ortus Solutions, Corp
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
Globus
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Globus
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Software Testing Exam imp Ques Notes.pdf
Software Testing Exam imp Ques Notes.pdfSoftware Testing Exam imp Ques Notes.pdf
Software Testing Exam imp Ques Notes.pdf
MayankTawar1
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
Visitor Management System in India- Vizman.app
Visitor Management System in India- Vizman.appVisitor Management System in India- Vizman.app
Visitor Management System in India- Vizman.app
NaapbooksPrivateLimi
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
Max Andersen
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should Know
Peter Caitens
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
Globus
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
informapgpstrackings
 
Explore Modern SharePoint Templates for 2024
Explore Modern SharePoint Templates for 2024Explore Modern SharePoint Templates for 2024
Explore Modern SharePoint Templates for 2024
Sharepoint Designs
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
XfilesPro
 
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERRORTROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
Tier1 app
 

Recently uploaded (20)

Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Software Testing Exam imp Ques Notes.pdf
Software Testing Exam imp Ques Notes.pdfSoftware Testing Exam imp Ques Notes.pdf
Software Testing Exam imp Ques Notes.pdf
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Visitor Management System in India- Vizman.app
Visitor Management System in India- Vizman.appVisitor Management System in India- Vizman.app
Visitor Management System in India- Vizman.app
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should Know
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
 
Explore Modern SharePoint Templates for 2024
Explore Modern SharePoint Templates for 2024Explore Modern SharePoint Templates for 2024
Explore Modern SharePoint Templates for 2024
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
 
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERRORTROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
 

The Technical Debt Trap

  • 1. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev The technical Debt Trap
  • 2. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Doc Norton, CEO doc@wearecto2.com @DocOnDev
  • 3. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev what is technical debt?
  • 4. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev – Ward Cunningham OOPSLA ‘92 Shipping first time code is like going into debt.
  • 5. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. – Ward Cunningham OOPSLA ‘92
  • 6. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. – Ward Cunningham OOPSLA ‘92
  • 7. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev The danger occurs when the debt is not repaid. Every minute spent on not-quite- right code counts as interest on that debt. – Ward Cunningham OOPSLA ‘92
  • 8. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev The danger occurs when the debt is not repaid. Every minute spent on not-quite- right code counts as interest on that debt. – Ward Cunningham OOPSLA ‘92
  • 9. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Technical debt is
  • 10. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Technical debt is good
  • 11. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Technical debt is good
  • 12. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Technical debt is good
  • 13. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Technical debt is a strategic decision
  • 14. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Technical debt is a strategic decision • Allow for Rapid Delivery • To Elicit Quick Feedback • And Correct Design
  • 15. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt is an indication of learning
  • 16. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt is an indication of learning • Now know what you need • Implementation doesn’t match
  • 17. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt is a metaphor
  • 18. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev metaphors rock we reason by analogy Building on a weak foundation Puts pressure on our design Can’t keep running at this pace It’s raining men (hallelujah)
  • 19. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev metaphorphosis when metaphors go wrong Credit CardSHORT-TERM Long-Term Return on Investment OPERATIONALHOME LOAN Loan Shark PRAGMATIC LEVERAGE Intentional AUTO LOAN FRAUDULENT VOLUNTARY PYRAMID SCHEME Prudent Student Loan HIGH INTEREST INADVERTENT RECKLESS DEBT IN THE THIRD QUADRANT
  • 20. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev metaphorphosis when metaphors go wrong “quick and dirty” - Martin Fowler “sloppy” - David Laribee “just hack it in” - Steve McConnell “CUT A LOT OF CORNERS” - James Shore
  • 21. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt quadrant Reckless Inadvertent Prudent Deliberate “We don’t have time for design” “We must ship now and deal with consequences” “Now we know how we should have done it” “What’s Layering?”
  • 22. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev – Ward Cunningham Youtube ‘09 [Many] have explained the debt metaphor and confused it with the idea that you could write code poorly with the intention of doing a good job later.
  • 23. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev – Ward Cunningham Youtube ‘09 confused the debt metaphor with the idea that you could write code poorly
  • 24. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev – Ward Cunningham Youtube ‘09 The ability to pay back debt [...] depends upon you writing code that is clean enough to be able to refactor as you come to understand your problem.
  • 25. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev – Ward Cunningham Youtube ‘09 The ability to pay back debt [...] depends upon you writing code that is clean enough to be able to refactor as you come to understand your problem.
  • 26. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev – Ward Cunningham twitter ‘09 Dirty code is to technical debt as the pawn broker is to financial debt.
  • 27. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev – Ward Cunningham twitter ‘09 Dirty code is to technical debt as the pawn broker is to financial debt. Don’t think you are ever going to get your code back.
  • 28. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt? Ask yourself…
  • 29. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt? Ask yourself… • Is the code clean? • Is the code tested? • Is there a learning objective or event? • Is there a plan for payback? • Is the business truly informed?
  • 30. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt? If you say no to even one… • Is the code clean? • Is the code tested? • Is there a learning objective or event? • Is there a plan for payback? • Is the business truly informed?
  • 31. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt? If you say no to even one… • Is the code clean? • Is the code tested? • Is there a learning objective or event? • Is there a plan for payback? • Is the business truly informed? ... then you don’t have Technical Debt
  • 32. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev mess (noun)
  • 33. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev mess (noun) • Disorderly accumulation, heap, or jumble • A state of embarrassing confusion • An unpleasant or difficult situation
  • 34. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev cruft (noun)
  • 35. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev cruft (noun) • An unpleasant substance • The result of shoddy construction • Redundant, old or improperly written code
  • 36. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev But, It’s Just semantics
  • 37. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev It’s not Just semantics
  • 38. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev It’s not Just semantics Technical Debt is Good
  • 39. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev It’s not Just semantics Technical Debt is GoodQuick and Dirty is Technical Debt
  • 40. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev It’s not Just semantics Quick and Dirty is Good
  • 41. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev It’s not Just semantics Quick and Dirty is Good
  • 42. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt quadrant Reckless Inadvertent Prudent Deliberate “We don’t have time for design” “We must ship now and deal with consequences” “Now we know how we should have done it” “What’s Layering?”
  • 43. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt quadrant Reckless Inadvertent Prudent Deliberate “We don’t have time for design” “Let’s deploy and gather more information” “Now we know how we should have done it” “What’s Layering?”
  • 44. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt in other fields
  • 45. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt in other fields
  • 46. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Technical Debt in other fields
  • 47. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Technical Debt in other fields
  • 48. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt in other fields
  • 49. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev RECKLESS AND DELIBERATE technical debt in other fields
  • 50. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev RECKLESS AND DELIBERATE RECKLESS AND DELIBERATE technical debt in other fields
  • 51. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev RECKLESS AND DELIBERATE RECKLESS AND DELIBERATE RECKLESS AND INADVERTENT technical debt in other fields
  • 52. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt quadrant Reckless Inadvertent Prudent Deliberate “We don’t have time for design” “Let’s deploy and gather more information” “Now we know how we should have done it” “What’s Layering?”
  • 53. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt quadrant Reckless Inadvertent Prudent Deliberate “We don’t have time for design” “Let’s deploy and gather more information” “Now we know how we should have done it” “What’s Layering?” IRRESPONSIBLE
  • 54. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt quadrant Reckless Inadvertent Prudent Deliberate “We don’t have time for design” “Let’s deploy and gather more information” “Now we know how we should have done it” “What’s Layering?” IRRESPONSIBLE INCOMPETENT
  • 55. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev technical debt quadrant Reckless Inadvertent Prudent Deliberate “We don’t have time for design” “Let’s deploy and gather more information” “Now we know how we should have done it” “What’s Layering?” IRRESPONSIBLE INCOMPETENT TECHNICAL DEBT
  • 56. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev cruft or debt?
  • 57. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev DataSet aDs, qDs; aDs = _dbConnector.UpdateAgentList(); qDs = _dbConnector.GetQueueList(); foreach (DataTable aTable in aDs.Tables) { foreach (DataRow aRow in aTable.Rows) { foreach (DataColumn aColumn in aTable.Columns) { DataSet asDs = _dbConnector.GetAgentSkills(aRow[aColumn].ToString());//AgentId foreach (DataTable asTable in asDs.Tables) { foreach (DataRow asRow in asTable.Rows) { foreach (DataColumn asColumn in asTable.Columns) { foreach (DataTable qTable in qDs.Tables) { foreach (DataRow qRow in qTable.Rows) { foreach (DataColumn qColumn in qTable.Columns) { DataSet sqDs = _dbConnector.GetSkillsForQueue(qRow[qColumn].ToString()); foreach (DataTable sqTable in sqDs.Tables) { foreach (DataRow sqRow in sqTable.Rows) { foreach (DataColumn sqColumn in sqTable.Columns) { foreach (string skill in sqRow[sqColumn].ToString().Split(paramDelimStr)) { if (skill == asRow[asColumn].ToString()) { try { _dbConnector.SetAgentQueueSkill(aRow[aColumn].ToString(), qRow[qColumn].ToString(), skill); } catch { continue; } } } } } } } } } } } } } } } cruft or debt?
  • 58. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev DataSet aDs, qDs; aDs = _dbConnector.UpdateAgentList(); qDs = _dbConnector.GetQueueList(); foreach (DataTable aTable in aDs.Tables) { foreach (DataRow aRow in aTable.Rows) { foreach (DataColumn aColumn in aTable.Columns) { DataSet asDs = _dbConnector.GetAgentSkills(aRow[aColumn].ToString());//AgentId foreach (DataTable asTable in asDs.Tables) { foreach (DataRow asRow in asTable.Rows) { foreach (DataColumn asColumn in asTable.Columns) { foreach (DataTable qTable in qDs.Tables) { foreach (DataRow qRow in qTable.Rows) { foreach (DataColumn qColumn in qTable.Columns) { DataSet sqDs = _dbConnector.GetSkillsForQueue(qRow[qColumn].ToString()); foreach (DataTable sqTable in sqDs.Tables) { foreach (DataRow sqRow in sqTable.Rows) { foreach (DataColumn sqColumn in sqTable.Columns) { foreach (string skill in sqRow[sqColumn].ToString().Split(paramDelimStr)) { if (skill == asRow[asColumn].ToString()) { try { _dbConnector.SetAgentQueueSkill(aRow[aColumn].ToString(), qRow[qColumn].ToString(), skill); } catch { continue; } } } } } } } } } } } } } } }
  • 59. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev DataSet aDs, qDs; aDs = _dbConnector.UpdateAgentList(); qDs = _dbConnector.GetQueueList(); foreach (DataTable aTable in aDs.Tables) { foreach (DataRow aRow in aTable.Rows) { foreach (DataColumn aColumn in aTable.Columns) { DataSet asDs = _dbConnector.GetAgentSkills(aRow[aColumn].ToString());//AgentId foreach (DataTable asTable in asDs.Tables) { foreach (DataRow asRow in asTable.Rows) { foreach (DataColumn asColumn in asTable.Columns) { foreach (DataTable qTable in qDs.Tables) { foreach (DataRow qRow in qTable.Rows) { foreach (DataColumn qColumn in qTable.Columns) { DataSet sqDs = _dbConnector.GetSkillsForQueue(qRow[qColumn].ToString()); foreach (DataTable sqTable in sqDs.Tables) { foreach (DataRow sqRow in sqTable.Rows) { foreach (DataColumn sqColumn in sqTable.Columns) { foreach (string skill in sqRow[sqColumn].ToString().Split(paramDelimStr)) { if (skill == asRow[asColumn].ToString()) { try { _dbConnector.SetAgentQueueSkill(aRow[aColumn].ToString(), qRow[qColumn].ToString(), skill); } catch { continue; } } } } } } } } } } } } } } }
  • 60. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev DataSet aDs, qDs, asDs, sqDs; aDs = _dbConnector.UpdateAgentList(); qDs = _dbConnector.GetQueueList(); foreach (DataRow aRow in aDS.Tables[0].Rows) { String agentID = aRow[“AgentId”].ToString(); asDs = _dbConnector.GetAgentSkills(agentID); foreach (DataRow asRow in asDs.Tables[0].Rows) { String agentSkill = asRow[“Skill”].ToString(); foreach (DataRow qRow in qDs.Tables[0].Rows) { queueName = qRow[“QueueName”].ToString(); sqDs = _dbConnector.GetSkillsForQueue(queueName); foreach (DataRow sqRow in sqDs.Tables[0].Rows) { foreach (string skill in sqRow[“Skills”].ToString().Split(paramDelimStr)) { if (skill == agentSkill) { try { _dbConnector.SetAgentQueueSkill(agentID, queueName, skill); } catch { continue; } } } } } } }
  • 61. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev AgentList agents = new AgentList(_dbConnector.UpdateAgentList()); QueueList queues = new QueueList(_dbConnector.GetQueueList()); foreach (Agent agent in agents) { foreach (Skill agentSkill in agent.skills) { foreach (Queue queue in queues) { foreach (Skill queueSkill in queue.skills.Where(x => x == agentSkill)) { try {_dbConnector.SetAgentQueueSkill(agent.agentID, queue.name, agentSkill); } catch { continue; } } } } }
  • 63. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev if ((customer.state == “AL” && customer.type == CustomerType.GENERAL_AGENT && customer.revenue > 100000) || (customer.type == CustomerType.RETRO_AGENT && (customer.state == “WI” || customer.state == “IL”)) || (customer.type == CustomerType.FED_MANAGEMENT && customer.revenue > 150000)) { ... } cruft or debt?
  • 64. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev // If customer is Federally Regulated if ((customer.state == “AL” && customer.type == CustomerType.GENERAL_AGENT && customer.revenue > 100000) || (customer.type == CustomerType.RETRO_AGENT && (customer.state == “WI” || customer.state == “IL”)) || (customer.type == CustomerType.FED_MANAGEMENT && customer.revenue > 150000)) { ... }
  • 65. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev if (customer.isFederallyRegulated()) { ... }
  • 66. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev double getSpeed() { switch (_type) { case EUROPEAN: return getBaseSpeed(); case AFRICAN: return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts; case NORWEGIAN_BLUE: return (_isNailed) ? 0 : getBaseSpeed(_voltage); } throw new RuntimeException ("Should be unreachable"); } http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html cruft or debt?
  • 67. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev class Swallow ... double getSpeed() { return getBaseSpeed(); } end class class EuropeanSwallow ... end class class AfricanSwallow ... double getSpeed() { return super.getSpeed - coconutLoad(); } double coconutLoad() { return getLoadFactor() * _numberOfCoconuts; } end class class NorwegianSwallow ... double getSpeed() { return (_isNailed) ? 0 : getBaseSpeed(_voltage); } end class
  • 68. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev cruft is a bad decision
  • 69. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev cruft is a bad decision • You are a professional developer • You’re going to create unintentional cruft • You have to clean up the existing cruft
  • 70. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev The Trap
  • 71. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev The Trap • Precedent for speed over quality • Expectation of increased velocity • Cruft slows you down • Must write more cruft to keep up • Ask permission to do your job correctly
  • 72. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev failing strategies
  • 73. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev failing strategies
  • 74.
  • 75. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev winning strategy Clean Constantly
  • 76. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev winning strategy Clean Constantly • Never make an intentional mess • Monitor your “Technical Debt” • Follow the Boy Scout Rule • Remember quality is your responsibility
  • 77. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev winning strategy Clean Constantly • Never make an intentional mess • Monitor your “Technical Debt” • Follow the Boy Scout Rule • Remember quality is your responsibility • NEVER ask permission to do your job correctly
  • 78. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Monitor your cruft
  • 79. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Monitor your cruft • Code Coverage • Code Complexity • Coupling • Maintainability • Monitor Trends, Not Points
  • 80. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev review Technical Debt Cruft
  • 81. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev review Technical Debt • A strategic design decision • Requires business to be informed • Includes a pay-back plan Cruft • Happens • Needs to be monitored and cleaned • Is NOT Technical Debt
  • 82. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev review Technical Debt • A strategic design decision • Requires business to be informed • Includes a pay-back plan Cruft • Happens • Needs to be monitored and cleaned • Is NOT Technical Debt NEVER ask perm issio n to do yo ur jo b co rrectly
  • 83. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev comments or questions? Doc Norton, CEO doc@wearecto2.com @DocOnDev
  • 84. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev Thank You! Doc Norton, CEO doc@wearecto2.com @DocOnDev
  • 85. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev The technical Debt Trap
  • 86. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev • OOPSLA 92 Paper - http://dl.acm.org/citation.cfm? id=157715, http://c2.com/doc/oopsla92.html • Ward Cunningham Technical Debt Video - http:// www.youtube.com/watch? v=pqeJFYwnkjE&feature=player_embedded • Ward Cunningham Twitter - http://twitter.com/ WardCunningham/status/3742903303 • Technical Debt Quadrant - http://martinfowler.com/ bliki/TechnicalDebtQuadrant.html • James Shore - http://jamesshore.com/Blog/ CardMeeting/Voluntary-Technical-Debt.html • Martin Fowler - http://www.martinfowler.com/bliki/ TechnicalDebt.html • David Larabee - http://msdn.microsoft.com/en-us/ magazine/ee819135.aspx • Steve McConnell - http://blogs.construx.com/blogs/ stevemcc/archive/2007/11/01/technical-debt-2.aspx • Jon Stewart - http://big.assets.huffingtonpost.com/ JonConfused.gif • Cruft Example 1 - http://thedailywtf.com/Series/ 2010/3/CodeSOD.aspx • Debt Threshold - http://blog.castsoftware.com/wp- content/uploads/2011/04/Technical-Debt-Software- Quality1.jpg • Hardening Sprints - http://blog.castsoftware.com/wp- content/uploads/2011/04/Technical-Debt-Software- Quality1.jpg