SlideShare a Scribd company logo
1 of 46
Declare Bankruptcy on
Technical Debt!
How to win friends and influence people
A talk by Kacey Coughlin
In this talk:
• What is Technical Debt?
• Where does it come from?
• Why should you care?
• How do we (try) to stop lessen it?
• Documentation?
1. A metaphor created to help explain issues with
non-technical people
2. Refers to the eventual consequences of any
system/program.
3. Cleanup work that arises
from using a less optimal
design in the short term,
because a schedule or budget
does not allow for long-
term/better design; delaying
the second release of a
product in favor of expediting
the first release.
When there is a change in the codebase, it often
necessitates other coordinated changes elsewhere in the
codebase, as well as documentation.
As a system or program is modified, its complexity
increases, as well as its entropy.
Unaddressed tech debt leads to software entropy.
Entropy is the measure of a system’s disorder.
Software Entropy refers to a system’s increasing
disorder or complexity.
Spoiler alert: A system’s disorder cannot be
reduced, only remain the same or increased.
"A little debt speeds up development, and can be
beneficial as long as the debt is paid back
promptly with a rewrite that reduces complexity
and streamlines future enhancements.”
- Ipek Ozkaya
When the WSJ’s website is offline for about an
hour due to a technical issue – we are annoyed
When planes are grounded across the country
due to a network issue at United Airlines – we are
baffled.
When the NYSE is unable to trade for about 4
hours due to a computer glitch – we start to see a
trend.
<form id=“contactForm1” class=“form contact”>
<fieldset>
<legend>Contact Me</legend>
<label for=“contactName”>Name:</label>
<input type=“text” id=“contactName” class=“contactInput” placeholder=“Joe” />
<label for=“contactEmail”>Email:</label>
<input type=“text” id=“contactEmail” class=“contactInput” placeholder=joe@me.com
/>
<label for=“contactMessage”>Message:</label>
<textarea id=“contactMessage” class=“contactMessage”></textarea>
</fieldset>
<input type=“button” id=“cancelBtn” class=“cancelBtn” value=“Cancel” />
<input type=“submit” id=“submitBtn” class=“submitBtn” value=“Submit” />
</form>
<form id=“contactForm1” class=“form contact newTheme”>
<fieldset class=“newThemeFieldset”>
<legend>Contact Me</legend>
<label for=“contactName”>Name:</label>
<input type=“text” id=“contactName” class=“contactInput newTheme”
placeholder=“Joe” />
<label for=“contactEmail”>Email:</label>
<input type=“text” id=“contactEmail” class=“contactInput newTheme”
placeholder=joe@me.com />
<label for=“contactMessage”>Message:</label>
<textarea id=“contactMessage” class=“contactMessage newTheme”></textarea>
</fieldset>
<input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn” value=“Cancel”
/>
<input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn” value=“Submit”
style=“background-color: blue; border: 1px solid #333;” />
</form>
<form id=“contactForm1” class=“form contact newTheme”>
<fieldset class=“newThemeFieldset”>
<legend>Contact Me</legend>
<label for=“contactName”>Name:</label>
<input type=“text” id=“contactName” class=“contactInput newTheme” placeholder=“Joe” required />
<label for=“contactEmail”>Email:</label>
<input type=“text” id=“contactEmail” class=“contactInput newTheme” placeholder=joe@me.com required />
<label for=“contactMessage”>Message:</label>
<textarea id=“contactMessage” class=“contactMessage newTheme”></textarea>
</fieldset>
<input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn” value=“Cancel” />
<input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn” value=“Submit” style=“background-
color: blue; border: 1px solid #333;” />
</form>
<script>
$(document).ready(function() {
$("#submitBtn").click(function() {
var name = $("#contactName").val();
var email = $("#contactEmail").val();
if (name == '' || email == '') {
alert("Please Fill Required Fields");
} else {
// send the form
}
});
});
</script>
{{form id=“contactForm1” class=“form contact newTheme”}}
<fieldset class=“newThemeFieldset”>
<legend>Contact Me</legend>
{{label “name” “Name”}}
{{input type=“text” id=“contactName” class=“contactInput newTheme” placeholder=“Joe” value=nameValue
required }}
{{label “contactEmail” “Email” }}
{{input type=“text” id=“contactEmail” class=“contactInput newTheme” placeholder=“joe@me.com”
value=emailValue required }}
{{<label “contactMessage” “Message” }}
{{textarea id=“contactMesage” class=“contactMessage newTheme” }}
</fieldset>
{{input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn” value=“Cancel” action=clearForm }}
{{input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn” value=“Submit” style=“background-
color: blue; border: 1px solid #333;” action=submitForm }}
</form>
<script>
$(document).ready(function() {
$("#submitBtn").click(function() {
var name = $("#contactName").val();
var email = $("#contactEmail").val();
if (name == '' || email == '') {
alert("Please Fill Required Fields");
} else {
// send the form
}
});
});
</script>
{{form id=“contactForm1” class=“form contact newTheme”}}
<fieldset class=“newThemeFieldset”>
<legend>Contact Me</legend>
{{label “name” “Name”}}
{{input type=“text” id=“contactName” class=“contactInput newTheme” placeholder=“Joe” value=nameValue
required }}
{{label “contactEmail” “Email” }}
{{input type=“text” id=“contactEmail” class=“contactInput newTheme” placeholder=“joe@me.com”
value=emailValue required }}
{{<label “contactMessage” “Message” }}
{{textarea id=“contactMesage” class=“contactMessage newTheme” }}
</fieldset>
{{input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn” value=“Cancel” action=clearForm
role=“button” }}
{{input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn” value=“Submit” style=“background-
color: blue; border: 1px solid #333;” action=submitForm role=“button” }}
{{/form>}}
<script>
$(document).ready(function() {
$("#submitBtn").click(function() {
var name = $("#contactName").val();
var email = $("#contactEmail").val();
if (name == '' || email == '') {
alert("Please Fill Required Fields");
} else {
// send the form
}
});
});
</script>
<div class=“form-wrapper”>
{{form id=“contactForm1” class=“form contact newTheme”}}
<fieldset class=“newThemeFieldset nostyle”>
<legend class=“hidden-element”>Contact Me</legend>
<div class=“another-wrapper-for-no-reason”>
<div class=“label-input-inline-wrapper”>
{{label “name” “Name”}}
{{input type=“text” id=“contactName” class=“contactInput newTheme input” placeholder=“Joe”
value=nameValue required }}
<div class=“error”><span class=“error-icon”></span><p>Error: This field is required!</p></div>
</div><div class=“label-input-inline-wrapper”>
{{label “contactEmail” “Email” }}
{{input type=“text” id=“contactEmail” class=“contactInput newTheme input” placeholder=“joe@me.com”
value=emailValue required }}
<div class=“error”><span class=“error-icon”></span><p>Error: This field is required!</p></div>
</div><div class=“label-message-inline-wrapper”>
{{<label “contactMessage” “Message” }}
{{textarea id=“contactMesage” class=“contactMessage newTheme textarea” }}
</div> </div>
</fieldset>
<div class=“button-wrapper”>
{{input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn btn primary-btn large-btn cancel-icon”
value=“Cancel” action=clearForm role=“button” }}
{{input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn btn primary-btn large-btn submit-icon”
value=“Submit” style=“background-color: blue; border: 1px solid #333;” action=submitForm role=“button” }}
</div>
<div class=“error”><span class=“error-icon”></span><p>Hey you didn’t fill some stuff out!</p></div>
<div class=“success”><span class=“success-icon”></span><p>Success! Form sent!</p></div>
{{/form}}
</div>
<script>
1. Lack of knowledge
2. Lack of process
3. Lack of testing
4. Lack of standards
5. Delaying Code Refactoring
Is this code still necessary?
<div class=“form-wrapper”>
{{form id=“contactForm1” class=“form contact newTheme”}}
{{input class=“input” placeholder=“Joe” value=nameValue required }}
<div class=“error”><span class=“error-icon”></span><p>Error: This field is required!</p></div>
</div><div class=“label-input-inline-wrapper”>
{{label “contactEmail” “Email” }}
{{input type=“text” id=“contactEmail” class=“contactInput newTheme input” placeholder=“joe@me.com”
value=emailValue required }}
<div class=“error”><span class=“error-icon”></span><p>Error: This field is required!</p></div>
</div><div class=“label-message-inline-wrapper”>
{{<label “contactMessage” “Message” }}
{{textarea id=“contactMesage” class=“contactMessage newTheme textarea” }}
</div> </div>
</fieldset>
<div class=“button-wrapper”>
{{input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn btn primary-btn large-btn cancel-icon”
value=“Cancel” action=clearForm role=“button” }}
{{input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn btn primary-btn large-btn submit-icon”
value=“Submit” style=“background-color: blue; border: 1px solid #333;” action=submitForm role=“button” }}
</div>
<div class=“error”><span class=“error-icon”></span><p>Hey you didn’t fill some stuff out!</p></div>
<div class=“success”><span class=“success-icon”></span><p>Success! Form sent!</p></div>
{{/form}}
</div>
<script>
$(document).ready(function() {
$("#submitBtn").click(function() {
var name = $("#contactName").val();
var email = $("#contactEmail").val();
if (name == '' || email == '') {
alert("Please Fill Required Fields");
{{form class=“contact”}}
{{input class=“contactName” placeholder=“Name” value=nameValue required }}
{{input class=“contactEmail” placeholder=“email@me.com” value=emailValue required
}}
{{textarea}}
{{button class=“cancelBtn” value=“Cancel” action=clearForm}}
{{input class=“submitBtn” value=“Submit” action=submitForm }}
{{/form}}
<script>
{{form class=“contact”}}
{{input class=“contactName” placeholder=“Name” value=nameValue required }}
{{input class=“contactEmail” placeholder=“email@me.com” value=emailValue required
}}
{{textarea}}
{{button class=“cancelBtn” value=“Cancel” action=clearForm}}
{{input class=“submitBtn” value=“Submit” action=submitForm }}
{{/form}}
<script>
$(”form .submitBtn").click(function() {
var name = $(”.contactName").val();
var email = $(“.contactEmail").val();
if (name == '' || email == '') {
alert("Please Fill Required Fields");
} else {
// send the form
}
});
functionsAndStuff.js
1.) Planning, duh
2.) Scope creep
*actual creep
3.) Define ownership
Knowing the code better == fixing bugs faster
Explain the fix, but let them do it
Kacey Coughlin
Web Developer / Designer
@kaceykaso

More Related Content

Viewers also liked

Everydays
EverydaysEverydays
EverydaysFITC
 
Upgrading the Web with Douglas Crockford @ FITC's Web Unleashed 2015
Upgrading the Web with Douglas Crockford @ FITC's Web Unleashed 2015Upgrading the Web with Douglas Crockford @ FITC's Web Unleashed 2015
Upgrading the Web with Douglas Crockford @ FITC's Web Unleashed 2015FITC
 
The Power of Play in Experimental Design with Claudia Chagüi De León
The Power of Play in Experimental Design with Claudia Chagüi De LeónThe Power of Play in Experimental Design with Claudia Chagüi De León
The Power of Play in Experimental Design with Claudia Chagüi De LeónFITC
 
DownTheRabbitHole.js – How to Stay Sane in an Insane Ecosystem
DownTheRabbitHole.js – How to Stay Sane in an Insane EcosystemDownTheRabbitHole.js – How to Stay Sane in an Insane Ecosystem
DownTheRabbitHole.js – How to Stay Sane in an Insane EcosystemFITC
 
Pocket web gl sk
Pocket web gl skPocket web gl sk
Pocket web gl skFITC
 
Why Everyone Should Own a Giant Robot Arm
Why Everyone Should Own a Giant Robot ArmWhy Everyone Should Own a Giant Robot Arm
Why Everyone Should Own a Giant Robot ArmFITC
 
“It’s all a matter of Perspective.” Incorporating Play to Help Solve Problems
“It’s all a matter of Perspective.” Incorporating Play to Help Solve Problems“It’s all a matter of Perspective.” Incorporating Play to Help Solve Problems
“It’s all a matter of Perspective.” Incorporating Play to Help Solve ProblemsFITC
 
Getting to Know Grunt By Writing Your Own Plugin
Getting to Know Grunt By Writing Your Own PluginGetting to Know Grunt By Writing Your Own Plugin
Getting to Know Grunt By Writing Your Own PluginFITC
 
Creating Content that Captivates
Creating Content that CaptivatesCreating Content that Captivates
Creating Content that CaptivatesFITC
 
Design that’s easy on the brain
Design that’s easy on the brainDesign that’s easy on the brain
Design that’s easy on the brainFITC
 
Cats, Dinosaurs and A Lot of Pizza with Reed + Rader
Cats, Dinosaurs and A Lot of Pizza with Reed + RaderCats, Dinosaurs and A Lot of Pizza with Reed + Rader
Cats, Dinosaurs and A Lot of Pizza with Reed + RaderFITC
 
A Journey with React
A Journey with ReactA Journey with React
A Journey with ReactFITC
 
Open Sourcing the Secret Sauce
Open Sourcing the Secret SauceOpen Sourcing the Secret Sauce
Open Sourcing the Secret SauceFITC
 
The Future of Motion/Gesture Technology
The Future of Motion/Gesture TechnologyThe Future of Motion/Gesture Technology
The Future of Motion/Gesture TechnologyFITC
 
Designing Interactive Experiences for Kids of All Ages with Mark Argo
Designing Interactive Experiences for Kids of All Ages with Mark ArgoDesigning Interactive Experiences for Kids of All Ages with Mark Argo
Designing Interactive Experiences for Kids of All Ages with Mark ArgoFITC
 
Jedi Mind Trick: Networking, Selling and Pitching
Jedi Mind Trick: Networking, Selling and PitchingJedi Mind Trick: Networking, Selling and Pitching
Jedi Mind Trick: Networking, Selling and PitchingFITC
 
Web unleashed 2015-tammyeverts
Web unleashed 2015-tammyevertsWeb unleashed 2015-tammyeverts
Web unleashed 2015-tammyevertsFITC
 
Putting your Passion into the Details
Putting your Passion into the DetailsPutting your Passion into the Details
Putting your Passion into the DetailsFITC
 

Viewers also liked (18)

Everydays
EverydaysEverydays
Everydays
 
Upgrading the Web with Douglas Crockford @ FITC's Web Unleashed 2015
Upgrading the Web with Douglas Crockford @ FITC's Web Unleashed 2015Upgrading the Web with Douglas Crockford @ FITC's Web Unleashed 2015
Upgrading the Web with Douglas Crockford @ FITC's Web Unleashed 2015
 
The Power of Play in Experimental Design with Claudia Chagüi De León
The Power of Play in Experimental Design with Claudia Chagüi De LeónThe Power of Play in Experimental Design with Claudia Chagüi De León
The Power of Play in Experimental Design with Claudia Chagüi De León
 
DownTheRabbitHole.js – How to Stay Sane in an Insane Ecosystem
DownTheRabbitHole.js – How to Stay Sane in an Insane EcosystemDownTheRabbitHole.js – How to Stay Sane in an Insane Ecosystem
DownTheRabbitHole.js – How to Stay Sane in an Insane Ecosystem
 
Pocket web gl sk
Pocket web gl skPocket web gl sk
Pocket web gl sk
 
Why Everyone Should Own a Giant Robot Arm
Why Everyone Should Own a Giant Robot ArmWhy Everyone Should Own a Giant Robot Arm
Why Everyone Should Own a Giant Robot Arm
 
“It’s all a matter of Perspective.” Incorporating Play to Help Solve Problems
“It’s all a matter of Perspective.” Incorporating Play to Help Solve Problems“It’s all a matter of Perspective.” Incorporating Play to Help Solve Problems
“It’s all a matter of Perspective.” Incorporating Play to Help Solve Problems
 
Getting to Know Grunt By Writing Your Own Plugin
Getting to Know Grunt By Writing Your Own PluginGetting to Know Grunt By Writing Your Own Plugin
Getting to Know Grunt By Writing Your Own Plugin
 
Creating Content that Captivates
Creating Content that CaptivatesCreating Content that Captivates
Creating Content that Captivates
 
Design that’s easy on the brain
Design that’s easy on the brainDesign that’s easy on the brain
Design that’s easy on the brain
 
Cats, Dinosaurs and A Lot of Pizza with Reed + Rader
Cats, Dinosaurs and A Lot of Pizza with Reed + RaderCats, Dinosaurs and A Lot of Pizza with Reed + Rader
Cats, Dinosaurs and A Lot of Pizza with Reed + Rader
 
A Journey with React
A Journey with ReactA Journey with React
A Journey with React
 
Open Sourcing the Secret Sauce
Open Sourcing the Secret SauceOpen Sourcing the Secret Sauce
Open Sourcing the Secret Sauce
 
The Future of Motion/Gesture Technology
The Future of Motion/Gesture TechnologyThe Future of Motion/Gesture Technology
The Future of Motion/Gesture Technology
 
Designing Interactive Experiences for Kids of All Ages with Mark Argo
Designing Interactive Experiences for Kids of All Ages with Mark ArgoDesigning Interactive Experiences for Kids of All Ages with Mark Argo
Designing Interactive Experiences for Kids of All Ages with Mark Argo
 
Jedi Mind Trick: Networking, Selling and Pitching
Jedi Mind Trick: Networking, Selling and PitchingJedi Mind Trick: Networking, Selling and Pitching
Jedi Mind Trick: Networking, Selling and Pitching
 
Web unleashed 2015-tammyeverts
Web unleashed 2015-tammyevertsWeb unleashed 2015-tammyeverts
Web unleashed 2015-tammyeverts
 
Putting your Passion into the Details
Putting your Passion into the DetailsPutting your Passion into the Details
Putting your Passion into the Details
 

More from FITC

Cut it up
Cut it upCut it up
Cut it upFITC
 
Designing for Digital Health
Designing for Digital HealthDesigning for Digital Health
Designing for Digital HealthFITC
 
Profiling JavaScript Performance
Profiling JavaScript PerformanceProfiling JavaScript Performance
Profiling JavaScript PerformanceFITC
 
Surviving Your Tech Stack
Surviving Your Tech StackSurviving Your Tech Stack
Surviving Your Tech StackFITC
 
How to Pitch Your First AR Project
How to Pitch Your First AR ProjectHow to Pitch Your First AR Project
How to Pitch Your First AR ProjectFITC
 
Start by Understanding the Problem, Not by Delivering the Answer
Start by Understanding the Problem, Not by Delivering the AnswerStart by Understanding the Problem, Not by Delivering the Answer
Start by Understanding the Problem, Not by Delivering the AnswerFITC
 
Cocaine to Carrots: The Art of Telling Someone Else’s Story
Cocaine to Carrots: The Art of Telling Someone Else’s StoryCocaine to Carrots: The Art of Telling Someone Else’s Story
Cocaine to Carrots: The Art of Telling Someone Else’s StoryFITC
 
Everyday Innovation
Everyday InnovationEveryday Innovation
Everyday InnovationFITC
 
HyperLight Websites
HyperLight WebsitesHyperLight Websites
HyperLight WebsitesFITC
 
Everything is Terrifying
Everything is TerrifyingEverything is Terrifying
Everything is TerrifyingFITC
 
Post-Earth Visions: Designing for Space and the Future Human
Post-Earth Visions: Designing for Space and the Future HumanPost-Earth Visions: Designing for Space and the Future Human
Post-Earth Visions: Designing for Space and the Future HumanFITC
 
The Rise of the Creative Social Influencer (and How to Become One)
The Rise of the Creative Social Influencer (and How to Become One)The Rise of the Creative Social Influencer (and How to Become One)
The Rise of the Creative Social Influencer (and How to Become One)FITC
 
East of the Rockies: Developing an AR Game
East of the Rockies: Developing an AR GameEast of the Rockies: Developing an AR Game
East of the Rockies: Developing an AR GameFITC
 
Creating a Proactive Healthcare System
Creating a Proactive Healthcare SystemCreating a Proactive Healthcare System
Creating a Proactive Healthcare SystemFITC
 
World Transformation: The Secret Agenda of Product Design
World Transformation: The Secret Agenda of Product DesignWorld Transformation: The Secret Agenda of Product Design
World Transformation: The Secret Agenda of Product DesignFITC
 
The Power of Now
The Power of NowThe Power of Now
The Power of NowFITC
 
High Performance PWAs
High Performance PWAsHigh Performance PWAs
High Performance PWAsFITC
 
Rise of the JAMstack
Rise of the JAMstackRise of the JAMstack
Rise of the JAMstackFITC
 
From Closed to Open: A Journey of Self Discovery
From Closed to Open: A Journey of Self DiscoveryFrom Closed to Open: A Journey of Self Discovery
From Closed to Open: A Journey of Self DiscoveryFITC
 
Projects Ain’t Nobody Got Time For
Projects Ain’t Nobody Got Time ForProjects Ain’t Nobody Got Time For
Projects Ain’t Nobody Got Time ForFITC
 

More from FITC (20)

Cut it up
Cut it upCut it up
Cut it up
 
Designing for Digital Health
Designing for Digital HealthDesigning for Digital Health
Designing for Digital Health
 
Profiling JavaScript Performance
Profiling JavaScript PerformanceProfiling JavaScript Performance
Profiling JavaScript Performance
 
Surviving Your Tech Stack
Surviving Your Tech StackSurviving Your Tech Stack
Surviving Your Tech Stack
 
How to Pitch Your First AR Project
How to Pitch Your First AR ProjectHow to Pitch Your First AR Project
How to Pitch Your First AR Project
 
Start by Understanding the Problem, Not by Delivering the Answer
Start by Understanding the Problem, Not by Delivering the AnswerStart by Understanding the Problem, Not by Delivering the Answer
Start by Understanding the Problem, Not by Delivering the Answer
 
Cocaine to Carrots: The Art of Telling Someone Else’s Story
Cocaine to Carrots: The Art of Telling Someone Else’s StoryCocaine to Carrots: The Art of Telling Someone Else’s Story
Cocaine to Carrots: The Art of Telling Someone Else’s Story
 
Everyday Innovation
Everyday InnovationEveryday Innovation
Everyday Innovation
 
HyperLight Websites
HyperLight WebsitesHyperLight Websites
HyperLight Websites
 
Everything is Terrifying
Everything is TerrifyingEverything is Terrifying
Everything is Terrifying
 
Post-Earth Visions: Designing for Space and the Future Human
Post-Earth Visions: Designing for Space and the Future HumanPost-Earth Visions: Designing for Space and the Future Human
Post-Earth Visions: Designing for Space and the Future Human
 
The Rise of the Creative Social Influencer (and How to Become One)
The Rise of the Creative Social Influencer (and How to Become One)The Rise of the Creative Social Influencer (and How to Become One)
The Rise of the Creative Social Influencer (and How to Become One)
 
East of the Rockies: Developing an AR Game
East of the Rockies: Developing an AR GameEast of the Rockies: Developing an AR Game
East of the Rockies: Developing an AR Game
 
Creating a Proactive Healthcare System
Creating a Proactive Healthcare SystemCreating a Proactive Healthcare System
Creating a Proactive Healthcare System
 
World Transformation: The Secret Agenda of Product Design
World Transformation: The Secret Agenda of Product DesignWorld Transformation: The Secret Agenda of Product Design
World Transformation: The Secret Agenda of Product Design
 
The Power of Now
The Power of NowThe Power of Now
The Power of Now
 
High Performance PWAs
High Performance PWAsHigh Performance PWAs
High Performance PWAs
 
Rise of the JAMstack
Rise of the JAMstackRise of the JAMstack
Rise of the JAMstack
 
From Closed to Open: A Journey of Self Discovery
From Closed to Open: A Journey of Self DiscoveryFrom Closed to Open: A Journey of Self Discovery
From Closed to Open: A Journey of Self Discovery
 
Projects Ain’t Nobody Got Time For
Projects Ain’t Nobody Got Time ForProjects Ain’t Nobody Got Time For
Projects Ain’t Nobody Got Time For
 

Recently uploaded

VIP Kolkata Call Girl Salt Lake 👉 8250192130 Available With Room
VIP Kolkata Call Girl Salt Lake 👉 8250192130  Available With RoomVIP Kolkata Call Girl Salt Lake 👉 8250192130  Available With Room
VIP Kolkata Call Girl Salt Lake 👉 8250192130 Available With Roomishabajaj13
 
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call GirlVIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girladitipandeya
 
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607dollysharma2066
 
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...APNIC
 
Radiant Call girls in Dubai O56338O268 Dubai Call girls
Radiant Call girls in Dubai O56338O268 Dubai Call girlsRadiant Call girls in Dubai O56338O268 Dubai Call girls
Radiant Call girls in Dubai O56338O268 Dubai Call girlsstephieert
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxellan12
 
Russian Call Girls in Kolkata Samaira 🤌 8250192130 🚀 Vip Call Girls Kolkata
Russian Call Girls in Kolkata Samaira 🤌  8250192130 🚀 Vip Call Girls KolkataRussian Call Girls in Kolkata Samaira 🤌  8250192130 🚀 Vip Call Girls Kolkata
Russian Call Girls in Kolkata Samaira 🤌 8250192130 🚀 Vip Call Girls Kolkataanamikaraghav4
 
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls KolkataVIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkataanamikaraghav4
 
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...Diya Sharma
 
On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024APNIC
 
Call Girls Service Chandigarh Lucky ❤️ 7710465962 Independent Call Girls In C...
Call Girls Service Chandigarh Lucky ❤️ 7710465962 Independent Call Girls In C...Call Girls Service Chandigarh Lucky ❤️ 7710465962 Independent Call Girls In C...
Call Girls Service Chandigarh Lucky ❤️ 7710465962 Independent Call Girls In C...Sheetaleventcompany
 
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Delhi Call girls
 
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort ServiceEnjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort ServiceDelhi Call girls
 
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebGDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebJames Anderson
 
DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024
DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024
DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024APNIC
 

Recently uploaded (20)

VIP Kolkata Call Girl Salt Lake 👉 8250192130 Available With Room
VIP Kolkata Call Girl Salt Lake 👉 8250192130  Available With RoomVIP Kolkata Call Girl Salt Lake 👉 8250192130  Available With Room
VIP Kolkata Call Girl Salt Lake 👉 8250192130 Available With Room
 
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Model Towh Delhi 💯Call Us 🔝8264348440🔝
 
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call GirlVIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
 
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
FULL ENJOY Call Girls In Mayur Vihar Delhi Contact Us 8377087607
 
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
'Future Evolution of the Internet' delivered by Geoff Huston at Everything Op...
 
Radiant Call girls in Dubai O56338O268 Dubai Call girls
Radiant Call girls in Dubai O56338O268 Dubai Call girlsRadiant Call girls in Dubai O56338O268 Dubai Call girls
Radiant Call girls in Dubai O56338O268 Dubai Call girls
 
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptxAWS Community DAY Albertini-Ellan Cloud Security (1).pptx
AWS Community DAY Albertini-Ellan Cloud Security (1).pptx
 
Russian Call Girls in Kolkata Samaira 🤌 8250192130 🚀 Vip Call Girls Kolkata
Russian Call Girls in Kolkata Samaira 🤌  8250192130 🚀 Vip Call Girls KolkataRussian Call Girls in Kolkata Samaira 🤌  8250192130 🚀 Vip Call Girls Kolkata
Russian Call Girls in Kolkata Samaira 🤌 8250192130 🚀 Vip Call Girls Kolkata
 
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls KolkataVIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
 
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
₹5.5k {Cash Payment}New Friends Colony Call Girls In [Delhi NIHARIKA] 🔝|97111...
 
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
 
On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024On Starlink, presented by Geoff Huston at NZNOG 2024
On Starlink, presented by Geoff Huston at NZNOG 2024
 
Dwarka Sector 26 Call Girls | Delhi | 9999965857 🫦 Vanshika Verma More Our Se...
Dwarka Sector 26 Call Girls | Delhi | 9999965857 🫦 Vanshika Verma More Our Se...Dwarka Sector 26 Call Girls | Delhi | 9999965857 🫦 Vanshika Verma More Our Se...
Dwarka Sector 26 Call Girls | Delhi | 9999965857 🫦 Vanshika Verma More Our Se...
 
Call Girls Service Chandigarh Lucky ❤️ 7710465962 Independent Call Girls In C...
Call Girls Service Chandigarh Lucky ❤️ 7710465962 Independent Call Girls In C...Call Girls Service Chandigarh Lucky ❤️ 7710465962 Independent Call Girls In C...
Call Girls Service Chandigarh Lucky ❤️ 7710465962 Independent Call Girls In C...
 
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
Best VIP Call Girls Noida Sector 75 Call Me: 8448380779
 
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
Call Girls In Saket Delhi 💯Call Us 🔝8264348440🔝
 
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort ServiceEnjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
Enjoy Night⚡Call Girls Dlf City Phase 3 Gurgaon >༒8448380779 Escort Service
 
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark WebGDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
GDG Cloud Southlake 32: Kyle Hettinger: Demystifying the Dark Web
 
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
 
DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024
DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024
DDoS In Oceania and the Pacific, presented by Dave Phelan at NZNOG 2024
 

Declare Bankruptcy on Technical Debt!

  • 1. Declare Bankruptcy on Technical Debt! How to win friends and influence people A talk by Kacey Coughlin
  • 2.
  • 3. In this talk: • What is Technical Debt? • Where does it come from? • Why should you care? • How do we (try) to stop lessen it? • Documentation?
  • 4.
  • 5. 1. A metaphor created to help explain issues with non-technical people
  • 6. 2. Refers to the eventual consequences of any system/program.
  • 7. 3. Cleanup work that arises from using a less optimal design in the short term, because a schedule or budget does not allow for long- term/better design; delaying the second release of a product in favor of expediting the first release.
  • 8. When there is a change in the codebase, it often necessitates other coordinated changes elsewhere in the codebase, as well as documentation.
  • 9. As a system or program is modified, its complexity increases, as well as its entropy. Unaddressed tech debt leads to software entropy.
  • 10. Entropy is the measure of a system’s disorder. Software Entropy refers to a system’s increasing disorder or complexity. Spoiler alert: A system’s disorder cannot be reduced, only remain the same or increased.
  • 11. "A little debt speeds up development, and can be beneficial as long as the debt is paid back promptly with a rewrite that reduces complexity and streamlines future enhancements.” - Ipek Ozkaya
  • 12.
  • 13.
  • 14. When the WSJ’s website is offline for about an hour due to a technical issue – we are annoyed When planes are grounded across the country due to a network issue at United Airlines – we are baffled. When the NYSE is unable to trade for about 4 hours due to a computer glitch – we start to see a trend.
  • 15. <form id=“contactForm1” class=“form contact”> <fieldset> <legend>Contact Me</legend> <label for=“contactName”>Name:</label> <input type=“text” id=“contactName” class=“contactInput” placeholder=“Joe” /> <label for=“contactEmail”>Email:</label> <input type=“text” id=“contactEmail” class=“contactInput” placeholder=joe@me.com /> <label for=“contactMessage”>Message:</label> <textarea id=“contactMessage” class=“contactMessage”></textarea> </fieldset> <input type=“button” id=“cancelBtn” class=“cancelBtn” value=“Cancel” /> <input type=“submit” id=“submitBtn” class=“submitBtn” value=“Submit” /> </form>
  • 16. <form id=“contactForm1” class=“form contact newTheme”> <fieldset class=“newThemeFieldset”> <legend>Contact Me</legend> <label for=“contactName”>Name:</label> <input type=“text” id=“contactName” class=“contactInput newTheme” placeholder=“Joe” /> <label for=“contactEmail”>Email:</label> <input type=“text” id=“contactEmail” class=“contactInput newTheme” placeholder=joe@me.com /> <label for=“contactMessage”>Message:</label> <textarea id=“contactMessage” class=“contactMessage newTheme”></textarea> </fieldset> <input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn” value=“Cancel” /> <input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn” value=“Submit” style=“background-color: blue; border: 1px solid #333;” /> </form>
  • 17. <form id=“contactForm1” class=“form contact newTheme”> <fieldset class=“newThemeFieldset”> <legend>Contact Me</legend> <label for=“contactName”>Name:</label> <input type=“text” id=“contactName” class=“contactInput newTheme” placeholder=“Joe” required /> <label for=“contactEmail”>Email:</label> <input type=“text” id=“contactEmail” class=“contactInput newTheme” placeholder=joe@me.com required /> <label for=“contactMessage”>Message:</label> <textarea id=“contactMessage” class=“contactMessage newTheme”></textarea> </fieldset> <input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn” value=“Cancel” /> <input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn” value=“Submit” style=“background- color: blue; border: 1px solid #333;” /> </form> <script> $(document).ready(function() { $("#submitBtn").click(function() { var name = $("#contactName").val(); var email = $("#contactEmail").val(); if (name == '' || email == '') { alert("Please Fill Required Fields"); } else { // send the form } }); }); </script>
  • 18. {{form id=“contactForm1” class=“form contact newTheme”}} <fieldset class=“newThemeFieldset”> <legend>Contact Me</legend> {{label “name” “Name”}} {{input type=“text” id=“contactName” class=“contactInput newTheme” placeholder=“Joe” value=nameValue required }} {{label “contactEmail” “Email” }} {{input type=“text” id=“contactEmail” class=“contactInput newTheme” placeholder=“joe@me.com” value=emailValue required }} {{<label “contactMessage” “Message” }} {{textarea id=“contactMesage” class=“contactMessage newTheme” }} </fieldset> {{input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn” value=“Cancel” action=clearForm }} {{input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn” value=“Submit” style=“background- color: blue; border: 1px solid #333;” action=submitForm }} </form> <script> $(document).ready(function() { $("#submitBtn").click(function() { var name = $("#contactName").val(); var email = $("#contactEmail").val(); if (name == '' || email == '') { alert("Please Fill Required Fields"); } else { // send the form } }); }); </script>
  • 19. {{form id=“contactForm1” class=“form contact newTheme”}} <fieldset class=“newThemeFieldset”> <legend>Contact Me</legend> {{label “name” “Name”}} {{input type=“text” id=“contactName” class=“contactInput newTheme” placeholder=“Joe” value=nameValue required }} {{label “contactEmail” “Email” }} {{input type=“text” id=“contactEmail” class=“contactInput newTheme” placeholder=“joe@me.com” value=emailValue required }} {{<label “contactMessage” “Message” }} {{textarea id=“contactMesage” class=“contactMessage newTheme” }} </fieldset> {{input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn” value=“Cancel” action=clearForm role=“button” }} {{input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn” value=“Submit” style=“background- color: blue; border: 1px solid #333;” action=submitForm role=“button” }} {{/form>}} <script> $(document).ready(function() { $("#submitBtn").click(function() { var name = $("#contactName").val(); var email = $("#contactEmail").val(); if (name == '' || email == '') { alert("Please Fill Required Fields"); } else { // send the form } }); }); </script>
  • 20. <div class=“form-wrapper”> {{form id=“contactForm1” class=“form contact newTheme”}} <fieldset class=“newThemeFieldset nostyle”> <legend class=“hidden-element”>Contact Me</legend> <div class=“another-wrapper-for-no-reason”> <div class=“label-input-inline-wrapper”> {{label “name” “Name”}} {{input type=“text” id=“contactName” class=“contactInput newTheme input” placeholder=“Joe” value=nameValue required }} <div class=“error”><span class=“error-icon”></span><p>Error: This field is required!</p></div> </div><div class=“label-input-inline-wrapper”> {{label “contactEmail” “Email” }} {{input type=“text” id=“contactEmail” class=“contactInput newTheme input” placeholder=“joe@me.com” value=emailValue required }} <div class=“error”><span class=“error-icon”></span><p>Error: This field is required!</p></div> </div><div class=“label-message-inline-wrapper”> {{<label “contactMessage” “Message” }} {{textarea id=“contactMesage” class=“contactMessage newTheme textarea” }} </div> </div> </fieldset> <div class=“button-wrapper”> {{input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn btn primary-btn large-btn cancel-icon” value=“Cancel” action=clearForm role=“button” }} {{input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn btn primary-btn large-btn submit-icon” value=“Submit” style=“background-color: blue; border: 1px solid #333;” action=submitForm role=“button” }} </div> <div class=“error”><span class=“error-icon”></span><p>Hey you didn’t fill some stuff out!</p></div> <div class=“success”><span class=“success-icon”></span><p>Success! Form sent!</p></div> {{/form}} </div> <script>
  • 21. 1. Lack of knowledge
  • 22. 2. Lack of process
  • 23. 3. Lack of testing
  • 24. 4. Lack of standards
  • 25. 5. Delaying Code Refactoring
  • 26.
  • 27.
  • 28.
  • 29. Is this code still necessary?
  • 30.
  • 31.
  • 32. <div class=“form-wrapper”> {{form id=“contactForm1” class=“form contact newTheme”}} {{input class=“input” placeholder=“Joe” value=nameValue required }} <div class=“error”><span class=“error-icon”></span><p>Error: This field is required!</p></div> </div><div class=“label-input-inline-wrapper”> {{label “contactEmail” “Email” }} {{input type=“text” id=“contactEmail” class=“contactInput newTheme input” placeholder=“joe@me.com” value=emailValue required }} <div class=“error”><span class=“error-icon”></span><p>Error: This field is required!</p></div> </div><div class=“label-message-inline-wrapper”> {{<label “contactMessage” “Message” }} {{textarea id=“contactMesage” class=“contactMessage newTheme textarea” }} </div> </div> </fieldset> <div class=“button-wrapper”> {{input type=“button” id=“cancelBtn” class=“cancelBtn newThemeBtn btn primary-btn large-btn cancel-icon” value=“Cancel” action=clearForm role=“button” }} {{input type=“submit” id=“submitBtn” class=“submitBtn newThemeBtn btn primary-btn large-btn submit-icon” value=“Submit” style=“background-color: blue; border: 1px solid #333;” action=submitForm role=“button” }} </div> <div class=“error”><span class=“error-icon”></span><p>Hey you didn’t fill some stuff out!</p></div> <div class=“success”><span class=“success-icon”></span><p>Success! Form sent!</p></div> {{/form}} </div> <script> $(document).ready(function() { $("#submitBtn").click(function() { var name = $("#contactName").val(); var email = $("#contactEmail").val(); if (name == '' || email == '') { alert("Please Fill Required Fields");
  • 33. {{form class=“contact”}} {{input class=“contactName” placeholder=“Name” value=nameValue required }} {{input class=“contactEmail” placeholder=“email@me.com” value=emailValue required }} {{textarea}} {{button class=“cancelBtn” value=“Cancel” action=clearForm}} {{input class=“submitBtn” value=“Submit” action=submitForm }} {{/form}} <script>
  • 34. {{form class=“contact”}} {{input class=“contactName” placeholder=“Name” value=nameValue required }} {{input class=“contactEmail” placeholder=“email@me.com” value=emailValue required }} {{textarea}} {{button class=“cancelBtn” value=“Cancel” action=clearForm}} {{input class=“submitBtn” value=“Submit” action=submitForm }} {{/form}} <script> $(”form .submitBtn").click(function() { var name = $(”.contactName").val(); var email = $(“.contactEmail").val(); if (name == '' || email == '') { alert("Please Fill Required Fields"); } else { // send the form } }); functionsAndStuff.js
  • 35.
  • 36.
  • 37.
  • 38.
  • 42. Knowing the code better == fixing bugs faster
  • 43. Explain the fix, but let them do it
  • 44.
  • 45.
  • 46. Kacey Coughlin Web Developer / Designer @kaceykaso

Editor's Notes

  1. Hey guys, I’m Kacey Coughlin, I’m a web developer / designer at LinkedIn. Lets talk about technical debt! I know its not sexy, and a lot of this might be glaringly obvious to some people, but ….
  2. …in case your one of the few that’s been too afraid to ask “Hey, WTF is tech debt?”, or you mistakenly wandered in here in a hungover stooper, OR you’re somehow still here from last night, then THIS talk is for YOU!
  3. So in this beautiful time we have together, what will we be talking about? Well here’s a list! The basic who, what, where, when, and how. Don’t worry there’s no quiz at the end……OR IS THERE?!
  4. What is technical debt? Well it turns out it’s a lot of things generally, and a few things specifically.
  5. First of, it’s a metaphor created to help explain these issues to non-technical people
  6. Referring to the eventual consequences of any program or system. Eventual because its usually not obvious at first, and that’s when most people get around to it. EVENTUALLY.
  7. Its clean up work. Usually due to taking shortcuts, like using a hack to get the product shipped faster, and then writing the more elegant solution after launch. Essentially, you are delaying v2 in favor of expediting v1. This isn’t always the cause of tech debt, but it is a biggie.
  8. You see, when a mommy and daddy love each other very much, they will introduce a change into the codebase. And when that happens, it will often require other changes be made elsewhere in the program. Also docs. These triggered changes, if left ignored, can grow up to be tech debt!
  9. And so on and so forth! For every modification, the level of complexity in a program inherently grows, and with it, its entropy. Tech debt begets software entropy.
  10. AND what is software entropy? It’s the measure of a system or program’s disorder or complexity. The thing is though, you can’t really reduce its entropy, only curb it, or increase it.
  11. At a 2012 Agile Research Forum, Ipek Ozkaya explained it this way: A little debt speeds up development, and be beneficial as long as the debt is paid back promptly with a rewrite that reduces complexity and streamlines future enhancements. This really sums it up nicely. If you’re going to push forward, know what you’re asking. Know what will be needed in the time after launch.
  12. A study recently published by SEI at Carnegie Mellon, asked 1831 developers and engineers about technical debt. The results for an the question of what most contributes to technical debt, I though were very interesting. Keeping in mind, the participants on average had more than 6 years experience. Far and away, it appears most developers see architecture choices as the biggest contributor to tech debt; such as module dependencies, external dependencies, or even other team dependencies.
  13. And diving into that a little deeper, asking the participants about specific architectural elements being among the most significant sources of tech debt. Again, bad choices in general taking the lead, but then we see inadequate testing, lack of documentation, and obsolete technology as big factors contributing to tech debt. So if we can just stop making bad choices, guys, I think we’ll all be better off!
  14. An interesting article by Frances Lash, called “The Short Term Memory of Lessons Learned in Technical Debt”, touched on some pretty interesting things: ----- Meeting Notes (9/16/15 23:27) ----- And this brings up a good point. What are "computer glitchs" or "technical issues" really referring to? You could say they are just bugs, but usually bugs don't just happen out of no where and for no reason. Bugs come up because people were in a hurry, code wasn't reviewed, changes were made that caused other changes and no tests caught it. This could all be boiled down to technical debt.
  15. Let’s take a look at a quick example of this. It’s not the NYSE, but it’ll do. Here is a very simple contact form. Now if I were the PM on this, I might be more concerned with cost and time, than elegance and sustainability, or even extensibility. And since this works, we’ll go with it. It just needs to work and that’s it. But NOW the designer wants to change the whole look and feel, SOOO I need new styles.
  16. OK, so I hire a new kid to implement the new theme as quickly as possible. Lets say he is new to web dev, but said he could get it done. He just added some new classes for the new theme, said he had some trouble getting the submit button to change, so he just wrote some inline styles, no big deal, because it still works, and now I have my new theme and EVERYTHING IS AWESOME! I saved sooooooo much money and time! But WAIT, I keep getting emails with no names! I need to FORCE people to fill out the name field in order to submit this form, so I need some form validation in there somewhere…
  17. BAM! Some form validation! But wait….
  18. ……NOW I want to move to handlebars! Lets make it a template now!
  19. NOW I want it to be semantic! But I don’t know what that means, so I’ll just add roles to the buttons. And it works SO WHO CARES?! Ship it! SO now, I’ve fired my designer, and we’re adding Bootstrap!
  20. Annnnnnd yea. Ok, this is still a fairly simple and easy form, but already it’s gotten fairly complex, and there’s a TON we can cut out at this point. We can make this so much more lightweight, and readable! This form is bloated, ugly, probably pretty slow. Most of what is in red can be stripped down, or even removed entirely at this point. We’re not using half those classes anymore. SO WHY does this happen?
  21. This can and does happen for a number of reasons. Perhaps the programmer or engineer just doesn’t know. Maybe you hired someone more backend and they just don’t know how to write CSS, so now you have a lot of inline styles, and maybe Bootstrap.
  22. Maybe there’s a gap in the process. Perhaps the business side is unaware of what tech debt is, and is pressuring the engineers to move on. Making decisions without considering future needs and implications, will almost always come back to haunt you. So the devs are writing code faster than they can review, or being forced to ship with forced hacks instead of clean, testable code.
  23. Speaking of tests!! Did you write unit tests? I know, I know, its my least favorite part of the job, too. BUT testing beforehand ensures your code runs as you’d expect, and can uncover bugs BEFORE you ship! Think about that! This becomes doubley handy if you are developing your frontend and backend in parallel, thus making sure both sides are synced up. ----- Meeting Notes (9/16/15 22:42) ----- -Under time crunch, teams run both sides in parallel -Both sides finish and commit code -Get to product review before launch, find out holes in communication -Oh you needed that to trigger an email? -Oh you wanted tracking codes on ALL those? -We were going to do WAHT in a cookie?
  24. Are you using industry standards? Are you using open source libraries or rolling your own? Most of these things will have to happen eventually, so if you are not doing them at the beginning, or at least making time, then it’s going to be tech debt later. Taking advantage of open source libraries saves time, in that your not writing it all yourself, and there’s a good chance most of the bugs have already been ironed out. And if you decide to use a library later, it will most likely be much more difficult to shoehorn into your codebase, without causing a lot more debt, as we saw with the example.
  25. AND finally, delaying the inevitable. Remember that code cleanup you said you were going to do RIGHT AFTER launch? That ticket for “spring cleaning” that you’ve been ignoring, or pushing off until a later date? Yea, you should get on that. ----- Meeting Notes (9/16/15 22:42) ----- But make sure its the right code that you are cleaning up. Sometimes, once a code cleanup is finially picked up, it might be something trivial that doesnt have as big a benefit. Make sure when you DO sit down to refactor your code, its code that will have the biggest effect in terms of paying down debt. You could worry about reducing the number of nesting levels in your Sass files, OR you could replace all your jquery animates with CSS transitions. The latter will be much more beneficial in the short term.
  26. Though it may seem like it, keeping up with tech debt is not a losing battle. There’s a lot you can do to keep it at bay. In a lot of circumstances, YOU will have to be the advocate for it. You may have to stand up, push back, and say “LOOK! This code is messy, or old, and should be taken care of before we do anything!”
  27. Just saying it works is not enough. I know we ALL do this. I do it. QA comes at you with something, and you can’t replicate it, so you tell them its fine in dev, or worse, it works on YOUR box so maybe they should go back and try again! They hate that, and you should be better than that. Own your code! And hold others to the same standard!
  28. SO lets talk about code refactoring. What does that mean exactly?
  29. Code refactoring is the effort to keep entropy to a minimum. It’s clean up. It’s you going back through the code you, or someone else, wrote, and removing anything that’s no longer needed or being used. That goes for everything. Something as simple as removing a class from a button, on up to an entire library. Are you REALLY using Jquery UI? Or can that just be dumped? Probably. ----- Meeting Notes (9/16/15 22:42) ----- And this can actually be done at any time. Personally, WHENEVER I'm fixing a bug, or adding a new feature, or I'm in existing code for some reason, and I see something, I do something about it. You know, call 311, because if you see something, say something! Even little stuff, like hoisting variables, or using CSS shorthand instead of writing 3 extra lines. It all helps, and little by little, you are making progress.
  30. A lot of times, if there a part of the program that isn’t touched on a regular basis, that can be a good place to start. How’s that 404 page looking? Is there still a function in your codebase written by one of the founders 14 years ago?! I hope not, who would do that, that’d be weird ha ha ha….
  31. Code refactoring should only restructure the existing code, without changing its external behavior. Improving readability of the code, reducing unneeded or unnecessary complexity, having adequate separation of concerns, this all should lead to more maintainable and testable code, AS WELL AS less tech debt.
  32. So lets take another look at that example of ours. How could we make this cleaner? Well, there’s a lot, believe it or not.
  33. We can remove a lot of the classes, wrapper divs, leverage placeholder text instead of labels maybe? We don’t need nearly that many IDs, or classes in general. With Handlebars, text type inputs are default, so we can remove that. Likewise, the submit type is default. ----- Meeting Notes (9/16/15 22:42) ----- Personally, I try to keep markup to a bare minimum. You rarely need IDs, and I don't but classes on things unless I really need to.
  34. And then we put our logic in a separate javascript file…look at that! So fresh and so clean!
  35. A lot of code can be made cleaner by NOT over thinking it, not over-engineering it. Spoiler alert: If no one can understand your code, you ARE NOT a badass. There’s a saying: Testing is twice as hard as writing the code; so if you write your code to be as clever as you are, then you’ll never be able to debug it.
  36. So now that we kinda know what to look for, how can we track it? How can we know that we’re doing it right, and paying down the debt? Well, most people make Jira or bug tickets, or inline TODOs in the code. If you’re in an Agile/Scrum world, you will usually have these tickets in a backlog, to either be pulled in when there’s time (ie NEVER), or towards the end of an epic or year. These tickets or TODOs can be anything that comes to mind, and I will usually try to create them as I’m thinking about them. In a decorator with particularly long method names? Maybe shoot a quick ticket to the team to clean that up when they get a chance. Maybe make a whole epic that’s just cleaning up tech debt, and add tickets to that. Some things will be constants: software upgrades for examples. Some tech debt may not even be exposed until a new, more experienced person joins the team. Then you’re fucked.
  37. And that brings us to everyone’s favorite: DOCUMENTATION!
  38. For some reason it seems much harder to write the document that explains your code, than it is to actually WRITE THE CODE! It’s like doing the laundry or cleaning up your room, its not nearly as fun as writing the app and finally solving that weird routing issue that’s been driving you insane for the last 6 hours!...but it has to be done nonetheless. And despite the small minority of folks that do enjoy docs, they actually benefit everyone, and might save you some debt in the future! HOW, you ask? A couple key ways that I found:
  39. 1.) Planning….obviously! Take that extra couple of days, HELL take a WHOLE SPRINT, and really plan out how long a project is going to take. Now inflate those numbers, and add in another sprint for code refactoring!!!! Ideally, if you account for that time on the frontend, you will save more (and stress) on the backend. Worst case scenario, your project goes over, because of environmental issues, and you can use that extra time you added in for refactoring for getting the job done. And then refactor after.
  40. 2.) Scope creep! We ALLLLL have had, or have, a PM/client/director/whatever that has adjusted or added in, or just blown up, the product scope you were working on. You don’t need me to tell you it sucks when that happens, and I’m not saying having documentation will save you from this, BUT! If the original product spec is clearly explained, sometimes that’s enough backup for you to fend them off, and push back any new “improvements” to v2. Other times, I have had to show proof of changes and new features and constant revisions to the spec, to be able to effectively push back.
  41. And finally….3.) Defining ownership! I cannot tell you how many times I have had to go into some code, and not be able to track down an owner. Not because they left the company, but because the code has changed hands, and no one really knows who is working on it now, and there’s no doc, or wiki for that service….. Knowing who owns what service or part of the codebase benefits you in two ways…
  42. If you’re trying to fix a bug in someone’s code, being able to talk to the owner is obviously ideal so they can walk you through it. Ideal situation, I know, not always possible.
  43. But more importantly, if you are that owner, you can shove off your work on someone else! Let them fix your bugs! It’s a win win!
  44. SO to wrap all this up, I want to just point out that I realize all this may sound obvious, or not apply to everyone. I know I live and work in Silicon Valley, were most situations are far different than those at smaller companies, or companies not rooted in tech. We can’t all have a n/n-1 browser policy, I know!
  45. But be good owners, do what you can, implement what you can. Go forth and change lives….and codebases! I believe in you!
  46. My name is Kacey Coughlin. I work at LinkedIn. I’m Kaceykaso on Twitter. Google me.