patterns, code smells, and the pragmattic programmer

66
Patterns, Code Smells, and The Pragmatic Programmer

Upload: jason-mccreary

Post on 06-Aug-2015

84 views

Category:

Software


6 download

TRANSCRIPT

Page 1: Patterns, Code Smells, and The Pragmattic Programmer

Patterns, Code Smells, and The Pragmatic

Programmer

Page 2: Patterns, Code Smells, and The Pragmattic Programmer

JMac@gonedark

Page 3: Patterns, Code Smells, and The Pragmattic Programmer

The journey from apprentice to craftsman

Page 4: Patterns, Code Smells, and The Pragmattic Programmer

JMac != expert

Page 5: Patterns, Code Smells, and The Pragmattic Programmer

JMac == craftsman

Page 6: Patterns, Code Smells, and The Pragmattic Programmer

– @gonedark

“In programming, communication is king.”

Page 7: Patterns, Code Smells, and The Pragmattic Programmer

– @Selkirk

“The Reading List”

Page 8: Patterns, Code Smells, and The Pragmattic Programmer

Agile Software Development

Agile Testing

Analysis Patterns

Art of Capacity Planning

Art of Software Testing

Clean Code

Code Complete 2

Continuous Delivery

Continuous Integration

Design Patterns

Domain Driven Design

Even Faster Web Sites

Experiences of Test Automation

Extreme Programming Explained: Embrace Change

Founders at Work

Fundamentals of Object Oriented Design in UML

Growing Object-Oriented Software Guided by Tests

High Performance MySQL

High Performance Web Sites

Implementation Patterns

JavaScript The Good Parts

The Reading List

http://bit.ly/1bbslO0

Page 9: Patterns, Code Smells, and The Pragmattic Programmer
Page 10: Patterns, Code Smells, and The Pragmattic Programmer

The Pragmatic Programmer

Andrew Hunt David Thomas

Page 11: Patterns, Code Smells, and The Pragmattic Programmer

Tips

• “Always use source control”

• “Don’t live with broken windows”

• “Don’t program by coincidence”

• “Work with a user to think like a user”

Page 12: Patterns, Code Smells, and The Pragmattic Programmer

Stories

• Tracer Bullets

• Stone Soup and Boiled Frogs

• Rubber Ducking

Page 13: Patterns, Code Smells, and The Pragmattic Programmer

– TA from CS 181

“Please stop coming to me saying, ‘gcc is broken’. It’s not. gcc has been compiling C for 30 years. You have for a month. Your code is

broken.”

Page 14: Patterns, Code Smells, and The Pragmattic Programmer

– Tip #26 from The Pragmatic Programmer

“‘select’ isn’t broken.”

Page 15: Patterns, Code Smells, and The Pragmattic Programmer

Invest in your Knowledge Portfolio

• Learn a new language every year

• Read books related to your field

• Be active in your community

• Experiment with new technology

• Stay current

Page 16: Patterns, Code Smells, and The Pragmattic Programmer

Design Patterns

Elements of Reusable Object-Oriented Software

Erich Gamma Richard Helm

Ralph Johnson John Vlissides

Page 17: Patterns, Code Smells, and The Pragmattic Programmer

Catalog of Patterns

• Creational Patterns: Builder, Singleton, Factory…

• Structural Patterns: Adapter, Facade, Decorator…

• Behavioral Patterns: Command, Iterator, Observer…

Page 18: Patterns, Code Smells, and The Pragmattic Programmer

– @DHH

“It becomes quite compelling to apply these fancy ever more complicated patterns to

something… and it works, but the code isn’t better. And by ‘better’ I mean ‘clear’.”

Page 19: Patterns, Code Smells, and The Pragmattic Programmer

– @gonedark

“Don’t play design pattern bingo.”

Page 20: Patterns, Code Smells, and The Pragmattic Programmer

• Router

• Controller

• DataManager

• DataCreator

• JobQueue

• Job

• Repository

• Model

Page 21: Patterns, Code Smells, and The Pragmattic Programmer

“…there’s a big conversation about decompiling everything and nothing should

depend on any concrete class and everything should be talking through narrow interfaces

because you just never know when you’ll need to swap out your database for an API so your

application should be ignorant of that and blah blah blah.” – @AdamWathan

Page 22: Patterns, Code Smells, and The Pragmattic Programmer

– YAGNI a principle of Extreme Programming

“You aren't gonna need it.”

Page 23: Patterns, Code Smells, and The Pragmattic Programmer

Refactoring Improving the Design of

Existing CodeMartin Fowler

Page 24: Patterns, Code Smells, and The Pragmattic Programmer

Code Smells

Page 25: Patterns, Code Smells, and The Pragmattic Programmer

• Duplicate Code

• Long Method

• Feature Envy

• Primitive Obsession

• Lazy Class

• Speculative Generality

Page 26: Patterns, Code Smells, and The Pragmattic Programmer

Refactoring

Page 27: Patterns, Code Smells, and The Pragmattic Programmer

– Martin Fowler

“Refactoring is the process of changing a software system in such a way that it does not

alter the external behavior of the code yet improves its internal structure.”

Page 28: Patterns, Code Smells, and The Pragmattic Programmer

– Martin Fowler

“Refactoring is the process of changing a software system in such a way that it does not

alter the external behavior of the code yet improves its internal structure.”

Page 29: Patterns, Code Smells, and The Pragmattic Programmer

– Martin Fowler

“… the program works. Is [refactoring] not just an aesthetic judgement, a dislike of ugly code? It is, until we want to change the system. The

compiler doesn't care whether the code is ugly or clean. But when we want to change the

system, there is a human involved, and humans do care.”

Page 30: Patterns, Code Smells, and The Pragmattic Programmer

Refactor Process

• small change

• test

• repeat

Page 31: Patterns, Code Smells, and The Pragmattic Programmer

Decompose Conditional

if (date.before(x) || date.after(y)) { charge = quantity * winterRate } else { charge = quantity * summerRate }

Page 32: Patterns, Code Smells, and The Pragmattic Programmer

Decompose Conditional

if (isWinter(date)) { charge = winterCharge() } else { charge = summerCharge() }

Page 33: Patterns, Code Smells, and The Pragmattic Programmer

Implementation Patterns

Kent Beck

Page 34: Patterns, Code Smells, and The Pragmattic Programmer

Programming Values

• Communication

• Simplicity

• Flexibility

Page 35: Patterns, Code Smells, and The Pragmattic Programmer

Programming Principles• Local Consequence

• Minimize Repetition

• Logic and Data Together

• Symmetry

• Declarative Expression

• Rate of Change

Page 36: Patterns, Code Smells, and The Pragmattic Programmer

Symmetry

process() { input() count++ output() }

Page 37: Patterns, Code Smells, and The Pragmattic Programmer

Symmetry

process() { input() increment() output() }

Page 38: Patterns, Code Smells, and The Pragmattic Programmer

Symmetry

process() { input() tally() output() }

Page 39: Patterns, Code Smells, and The Pragmattic Programmer

Rate of Change

setAmount(value, currency) { this.value = value this.currency = currency }

Page 40: Patterns, Code Smells, and The Pragmattic Programmer

Rate of Change

setAmount(value, currency) { this.amount = new Money(val, cur) }

Page 41: Patterns, Code Smells, and The Pragmattic Programmer

Programming Costs

cost[total] = cost[develop] + cost[maintain]

cost[maintain] = cost[understand] + cost[change]

+ cost[test]

+ cost[deploy]

Page 42: Patterns, Code Smells, and The Pragmattic Programmer

– Kent Beck

“Programmers read more code than they write.”

Page 43: Patterns, Code Smells, and The Pragmattic Programmer

– Kent Beck

“Programming would be more effective if programmers spent less time on the mundane,

repetitive parts of their job so they had more time to spend doing a good job of solving truly

unique problems.”

Page 44: Patterns, Code Smells, and The Pragmattic Programmer

– The Audience

“Cool book report. So, what now?”

Page 45: Patterns, Code Smells, and The Pragmattic Programmer

4 simple practices

Page 46: Patterns, Code Smells, and The Pragmattic Programmer

#1 Adopt a Coding Standard

Page 47: Patterns, Code Smells, and The Pragmattic Programmer

– @gonedark

“A coding standard is not about curly brace placement or spaces versus tabs. It’s about

signal versus noise.”

Page 48: Patterns, Code Smells, and The Pragmattic Programmer

XXXXXX X XXXXXXXX XXXXXXXXXX

Page 49: Patterns, Code Smells, and The Pragmattic Programmer

XXXXXX X XXXXXXXX X XXXXXXXXXX XXXXXXXXXXX X XXXXXXXXXX XXXXXXXXXXXXXX

Page 50: Patterns, Code Smells, and The Pragmattic Programmer

XX XXXXXXXXXXXXXXX XXXXXX X XXXXXXXX XXXX XXXXXX X XXXXXXXX

Page 51: Patterns, Code Smells, and The Pragmattic Programmer

XX XXXXXXXXXXXXXXX XXXXXX X XXXXXXXX

XXXX XXXXXX X XXXXXXXX

Page 52: Patterns, Code Smells, and The Pragmattic Programmer

XXXXXX XXXXXXXX XXXXX XX XXXXX XXXX XXXXXX X XXXXXXXX XXXX XXXXXX X XXXXXXXX

Page 53: Patterns, Code Smells, and The Pragmattic Programmer

XXXXXX XXXXXXXX XXXXX XX XXXXX XXXX

XXXXXX X XXXXXXXX XXXX XXXXXX X XXXXXXXX

Page 54: Patterns, Code Smells, and The Pragmattic Programmer

#2 Write Good Enough Software

Page 55: Patterns, Code Smells, and The Pragmattic Programmer

– Antoine de Saint Exupéry

“…perfection is attained not when there is nothing more to add, but when there is nothing

more to remove.”

Page 56: Patterns, Code Smells, and The Pragmattic Programmer

#3 Remove Comments

Page 57: Patterns, Code Smells, and The Pragmattic Programmer
Page 58: Patterns, Code Smells, and The Pragmattic Programmer

“[comments are] a delicate matter, requiring taste and judgment. I tend to err on the side of

eliminating comments, for several reasons. First, if the code is clear, and uses good type names and variable names, it should explain

itself. Second, comments aren’t checked by the compiler, so there is no guarantee they’re right,

especially after the code is modified. A misleading comment can be very confusion.

Third, the issue of typography: comments clutter code.”

– Rob Pike

Page 59: Patterns, Code Smells, and The Pragmattic Programmer

#4 Avoid else

Page 60: Patterns, Code Smells, and The Pragmattic Programmer

testFunc(expr) { ret = false if (expr) { ret = true } else { ret = false }

return ret }

Page 61: Patterns, Code Smells, and The Pragmattic Programmer

testFunc(expr) { ret = false if (expr) { ret = true } else { ret = false }

return ret }

Page 62: Patterns, Code Smells, and The Pragmattic Programmer

testFunc(expr) { ret = false if (expr) { ret = true }

return ret }

Page 63: Patterns, Code Smells, and The Pragmattic Programmer

testFunc(expr) { if (expr) { return true }

return false }

Page 64: Patterns, Code Smells, and The Pragmattic Programmer

testFunc(expr) { return !!expr }

Page 65: Patterns, Code Smells, and The Pragmattic Programmer

– @gonedark

“In programming, communication is king.”

Page 66: Patterns, Code Smells, and The Pragmattic Programmer

Resources• The Reading List - http://bit.ly/1bbslO0

• What is good code? - http://bit.ly/1C535D7

• Ineffective Coding Habits - http://bit.ly/1HGgipm

• Removing Comments - http://bit.ly/1JG8n8J

• Basically anything I’ve tweeted in the last month - @gonedark